@lynn123411/dsh-chat-translate 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.5/node_modules/@deepseek-ai/cosmokit/lib/index.js", "../node_modules/.pnpm/@deepseek-ai+schemastery@3.18.4/node_modules/@deepseek-ai/schemastery/lib/index.mjs", "../src/server/config.ts", "../src/server/credentials.ts", "../src/server/cache.ts", "../node_modules/.pnpm/@deepseek-ai+dsh-home-paths@0.1.7-rc.2_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-home-paths/lib/index.js", "../src/server/prompt-revision.ts", "../src/describe-error.ts", "../src/server/adapters/openai.ts", "../src/server/pipeline/blocks.ts", "../src/server/pipeline/segments.ts", "../src/server/dispatcher.ts", "../src/server/router.ts", "../src/index.ts"],
4
- "sourcesContent": ["//#region lib/types/misc.js\n/** No-op callback returning `undefined` at runtime and `any` at type level. */\nfunction noop() {}\n/** Return true when a value is `null` or `undefined`. */\nfunction isNullable(value) {\n\treturn value === null || value === void 0;\n}\n/** Return true when a value is neither `null` nor `undefined`. */\nfunction isNonNullable(value) {\n\treturn !isNullable(value);\n}\n/** Return true for non-array object values. */\nfunction isPlainObject(data) {\n\treturn data && typeof data === \"object\" && !Array.isArray(data);\n}\n/** Filter object entries and return a new object. */\nfunction filterKeys(object, filter) {\n\treturn Object.fromEntries(Object.entries(object).filter(([key, value]) => filter(key, value)));\n}\n/** Map object values while preserving the original key set. */\nfunction mapValues(object, transform) {\n\treturn Object.fromEntries(Object.entries(object).map(([key, value]) => [key, transform(value, key)]));\n}\n/** Pick selected keys from an object, optionally including `undefined` values. */\nfunction pick(source, keys, forced) {\n\tif (!keys) return { ...source };\n\tconst result = {};\n\tfor (const key of keys) if (forced || source[key] !== void 0) result[key] = source[key];\n\treturn result;\n}\n/** Omit selected keys from a shallow object copy. */\nfunction omit(source, keys) {\n\tif (!keys) return { ...source };\n\tconst result = { ...source };\n\tfor (const key of keys) Reflect.deleteProperty(result, key);\n\treturn result;\n}\n/** Define a non-enumerable writable property and return the object. */\nfunction defineProperty(object, key, value) {\n\treturn Object.defineProperty(object, key, {\n\t\twritable: true,\n\t\tvalue,\n\t\tenumerable: false\n\t});\n}\n//#endregion\n//#region lib/types/array.js\n/** Return true when every item in `array2` is present in `array1`. */\nfunction contain(array1, array2) {\n\treturn array2.every((item) => array1.includes(item));\n}\n/** Return items that appear in both arrays. */\nfunction intersection(array1, array2) {\n\treturn array1.filter((item) => array2.includes(item));\n}\n/** Return items from `array1` that do not appear in `array2`. */\nfunction difference(array1, array2) {\n\treturn array1.filter((item) => !array2.includes(item));\n}\n/** Return the set-union of two arrays while preserving first occurrence order. */\nfunction union(array1, array2) {\n\treturn Array.from(new Set([...array1, ...array2]));\n}\n/** Remove duplicate values while preserving first occurrence order. */\nfunction deduplicate(array) {\n\treturn [...new Set(array)];\n}\n/** Remove one item from an array and report whether it was found. */\nfunction remove(list, item) {\n\tconst index = list?.indexOf(item);\n\tif (index >= 0) {\n\t\tlist.splice(index, 1);\n\t\treturn true;\n\t} else return false;\n}\n/** Normalize nullish, scalar, or array input to an array. */\nfunction makeArray(source) {\n\treturn Array.isArray(source) ? source : isNullable(source) ? [] : [source];\n}\n//#endregion\n//#region lib/types/volatile.js\n/** Shared config references used by schema validators and plugin runtimes. */\nconst write = Symbol.for(\"cosmokit.volatile.write\");\nfunction snapshot(value, ancestors = /* @__PURE__ */ new Set()) {\n\tif (typeof value === \"function\") throw new TypeError(\"volatile config cannot contain functions\");\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (ancestors.has(value)) throw new TypeError(\"volatile config cannot contain cycles\");\n\tancestors.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) return Object.freeze(value.map((item) => snapshot(item, ancestors)));\n\t\tif (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) throw new TypeError(\"volatile config objects must be plain objects or arrays\");\n\t\treturn Object.freeze(Object.fromEntries(Object.entries(value).map(([key, item]) => [key, snapshot(item, ancestors)])));\n\t} finally {\n\t\tancestors.delete(value);\n\t}\n}\n/**\n* Create a detached reference containing an immutable copy of the supplied data.\n* @param value - validated config data; class instances and functions are unsupported.\n* @returns a reference whose value is updated only by its owning runtime.\n*/\nfunction createVolatile(value) {\n\tlet current = snapshot(value);\n\treturn Object.freeze({\n\t\tget: () => current,\n\t\t[write]: (value) => {\n\t\t\tcurrent = value;\n\t\t}\n\t});\n}\n/**\n* Identify references across ESM/CJS copies of the shared library.\n* @param value - a parsed config value.\n* @returns whether the value implements the shared reference protocol.\n*/\nfunction isVolatile(value) {\n\treturn typeof value === \"object\" && value !== null && write in value;\n}\n/**\n* Collect config references without descending into their snapshots or opaque objects.\n* @internal\n* @param value - parsed config; cyclic ordinary fields are visited once per path.\n* @returns references and their object-key paths, including an empty path for a root reference.\n*/\nfunction volatileEntries(value) {\n\tconst ancestors = /* @__PURE__ */ new Set();\n\tfunction visit(value, path) {\n\t\tif (isVolatile(value)) return [{\n\t\t\tpath,\n\t\t\tref: value\n\t\t}];\n\t\tif (!value || typeof value !== \"object\" || ancestors.has(value)) return [];\n\t\tif (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) return [];\n\t\tancestors.add(value);\n\t\ttry {\n\t\t\treturn Object.entries(value).flatMap(([key, child]) => visit(child, [...path, key]));\n\t\t} finally {\n\t\t\tancestors.delete(value);\n\t\t}\n\t}\n\treturn visit(value, []);\n}\n/**\n* Commit an already validated immutable snapshot from another reference.\n* @internal\n* @param target - the owning plugin's stable reference.\n* @param source - a newly parsed candidate reference.\n*/\nfunction updateVolatile(target, source) {\n\ttarget[write](source.get());\n}\n//#endregion\n//#region lib/types/types.js\n/** Test values using `instanceof` with a `toStringTag` fallback. */\nfunction is(type, value) {\n\tif (arguments.length === 1) return (value) => is(type, value);\n\treturn type in globalThis && value instanceof globalThis[type] || Object.prototype.toString.call(value).slice(8, -1) === type;\n}\nfunction isArrayBufferLike(value) {\n\treturn is(\"ArrayBuffer\", value) || is(\"SharedArrayBuffer\", value);\n}\nfunction isArrayBufferSource(value) {\n\treturn isArrayBufferLike(value) || ArrayBuffer.isView(value);\n}\n/** Binary source detection and base64/hex conversion helpers. */\nvar Binary;\n(function(Binary) {\n\tBinary.is = isArrayBufferLike;\n\tBinary.isSource = isArrayBufferSource;\n\tfunction fromSource(source) {\n\t\tif (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n\t\telse return source;\n\t}\n\tBinary.fromSource = fromSource;\n\tfunction toBase64(source) {\n\t\tsource = fromSource(source);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(source).toString(\"base64\");\n\t\tlet binary = \"\";\n\t\tconst bytes = new Uint8Array(source);\n\t\tfor (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]);\n\t\treturn btoa(binary);\n\t}\n\tBinary.toBase64 = toBase64;\n\tfunction fromBase64(source) {\n\t\tif (typeof Buffer !== \"undefined\") return fromSource(Buffer.from(source, \"base64\"));\n\t\treturn Uint8Array.from(atob(source), (c) => c.charCodeAt(0));\n\t}\n\tBinary.fromBase64 = fromBase64;\n\tfunction toHex(source) {\n\t\tsource = fromSource(source);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(source).toString(\"hex\");\n\t\treturn Array.from(new Uint8Array(source), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\t}\n\tBinary.toHex = toHex;\n\tfunction fromHex(source) {\n\t\tif (typeof Buffer !== \"undefined\") return fromSource(Buffer.from(source, \"hex\"));\n\t\tconst hex = source.length % 2 === 0 ? source : source.slice(0, source.length - 1);\n\t\tconst buffer = [];\n\t\tfor (let i = 0; i < hex.length; i += 2) buffer.push(parseInt(`${hex[i]}${hex[i + 1]}`, 16));\n\t\treturn Uint8Array.from(buffer).buffer;\n\t}\n\tBinary.fromHex = fromHex;\n})(Binary || (Binary = {}));\n/** Decode a base64 string into binary data. */\nconst base64ToArrayBuffer = Binary.fromBase64;\n/** Encode binary data as base64. */\nconst arrayBufferToBase64 = Binary.toBase64;\n/** Decode a hex string into binary data. */\nconst hexToArrayBuffer = Binary.fromHex;\n/** Encode binary data as hex. */\nconst arrayBufferToHex = Binary.toHex;\n/** Deep-clone common JavaScript values while preserving prototypes and cycles. */\nfunction clone(source, refs = /* @__PURE__ */ new Map()) {\n\tif (!source || typeof source !== \"object\") return source;\n\tif (is(\"Date\", source)) return new Date(source.valueOf());\n\tif (is(\"RegExp\", source)) return new RegExp(source.source, source.flags);\n\tif (isArrayBufferLike(source)) return source.slice(0);\n\tif (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n\tconst cached = refs.get(source);\n\tif (cached) return cached;\n\tif (Array.isArray(source)) {\n\t\tconst result = [];\n\t\trefs.set(source, result);\n\t\tsource.forEach((value, index) => {\n\t\t\tresult[index] = Reflect.apply(clone, null, [value, refs]);\n\t\t});\n\t\treturn result;\n\t}\n\tconst result = Object.create(Object.getPrototypeOf(source));\n\trefs.set(source, result);\n\tfor (const key of Reflect.ownKeys(source)) {\n\t\tconst descriptor = { ...Reflect.getOwnPropertyDescriptor(source, key) };\n\t\tif (\"value\" in descriptor) descriptor.value = Reflect.apply(clone, null, [descriptor.value, refs]);\n\t\tReflect.defineProperty(result, key, descriptor);\n\t}\n\treturn result;\n}\n/**\n* Compare values recursively, treating two volatile references as equal regardless of value.\n* Strict comparison distinguishes null/undefined, treats opaque objects by identity,\n* compares URLs by normalized href, treats array holes as undefined, and considers distinct cyclic structures unequal.\n* @param a - first value.\n* @param b - second value.\n* @param strict - whether to require strict data equality outside volatile references.\n* @returns whether the values compare equal.\n*/\nfunction deepEqual(a, b, strict) {\n\tconst ancestors = /* @__PURE__ */ new Set();\n\tfunction compare(a, b) {\n\t\tif (a === b) return true;\n\t\tif (isVolatile(a) || isVolatile(b)) return isVolatile(a) && isVolatile(b);\n\t\tif (!strict && isNullable(a) && isNullable(b)) return true;\n\t\tif (typeof a !== typeof b || typeof a !== \"object\" || !a || !b) return false;\n\t\tif (ancestors.has(a)) return false;\n\t\tfunction check(test, then) {\n\t\t\treturn test(a) ? test(b) ? then(a, b) : false : test(b) ? false : void 0;\n\t\t}\n\t\tancestors.add(a);\n\t\ttry {\n\t\t\treturn check(Array.isArray, (a, b) => {\n\t\t\t\tif (a.length !== b.length) return false;\n\t\t\t\tfor (let index = 0; index < a.length; index++) if (!compare(a[index], b[index])) return false;\n\t\t\t\treturn true;\n\t\t\t}) ?? check(is(\"Date\"), (a, b) => a.valueOf() === b.valueOf()) ?? check(is(\"URL\"), (a, b) => a.href === b.href) ?? check(is(\"RegExp\"), (a, b) => a.source === b.source && a.flags === b.flags) ?? check(isArrayBufferLike, (a, b) => {\n\t\t\t\tif (a.byteLength !== b.byteLength) return false;\n\t\t\t\tconst viewA = new Uint8Array(a);\n\t\t\t\tconst viewB = new Uint8Array(b);\n\t\t\t\tfor (let i = 0; i < viewA.length; i++) if (viewA[i] !== viewB[i]) return false;\n\t\t\t\treturn true;\n\t\t\t}) ?? ((!strict || [a, b].every((value) => Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)) && Object.keys({\n\t\t\t\t...a,\n\t\t\t\t...b\n\t\t\t}).every((key) => compare(a[key], b[key])));\n\t\t} finally {\n\t\t\tancestors.delete(a);\n\t\t}\n\t}\n\treturn compare(a, b);\n}\n//#endregion\n//#region lib/types/string.js\n/** Uppercase the first character of a string. */\nfunction capitalize(source) {\n\treturn source.charAt(0).toUpperCase() + source.slice(1);\n}\n/** Lowercase the first character of a string. */\nfunction uncapitalize(source) {\n\treturn source.charAt(0).toLowerCase() + source.slice(1);\n}\n/** Convert dash or underscore delimited text to camelCase. */\nfunction camelCase(source) {\n\treturn source.replace(/[_-][a-z]/g, (str) => str.slice(1).toUpperCase());\n}\nfunction tokenize(source, delimiters, delimiter) {\n\tconst output = [];\n\tlet state = 0;\n\tfor (let i = 0; i < source.length; i++) {\n\t\tconst code = source.charCodeAt(i);\n\t\tif (code >= 65 && code <= 90) {\n\t\t\tif (state === 1) {\n\t\t\t\tconst next = source.charCodeAt(i + 1);\n\t\t\t\tif (next >= 97 && next <= 122) output.push(delimiter);\n\t\t\t\toutput.push(code + 32);\n\t\t\t} else {\n\t\t\t\tif (state !== 0) output.push(delimiter);\n\t\t\t\toutput.push(code + 32);\n\t\t\t}\n\t\t\tstate = 1;\n\t\t} else if (code >= 97 && code <= 122) {\n\t\t\toutput.push(code);\n\t\t\tstate = 2;\n\t\t} else if (delimiters.includes(code)) {\n\t\t\tif (state !== 0) output.push(delimiter);\n\t\t\tstate = 0;\n\t\t} else output.push(code);\n\t}\n\treturn String.fromCharCode(...output);\n}\n/** Convert text to dash-delimited parameter case. */\nfunction paramCase(source) {\n\treturn tokenize(source, [45, 95], 45);\n}\n/** Convert text to underscore-delimited snake case. */\nfunction snakeCase(source) {\n\treturn tokenize(source, [45, 95], 95);\n}\n/** Runtime alias for `camelCase`. */\nconst camelize = camelCase;\n/** Runtime alias for `paramCase`. */\nconst hyphenate = paramCase;\n/** Format a property key as a JavaScript member access suffix. */\nfunction formatProperty(key) {\n\tif (typeof key !== \"string\") return `[${key.toString()}]`;\n\treturn /^[a-z_$][\\w$]*$/i.test(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n/** Remove one trailing slash from a path string. */\nfunction trimSlash(source) {\n\treturn source.replace(/\\/$/, \"\");\n}\n/** Ensure a path starts with `/` and has no trailing slash. */\nfunction sanitize(source) {\n\tif (!source.startsWith(\"/\")) source = \"/\" + source;\n\treturn trimSlash(source);\n}\n//#endregion\n//#region lib/types/time.js\n/** Time constants plus parsing and formatting helpers. */\nvar Time;\n(function(Time) {\n\tTime.millisecond = 1;\n\tTime.second = 1e3;\n\tTime.minute = Time.second * 60;\n\tTime.hour = Time.minute * 60;\n\tTime.day = Time.hour * 24;\n\tTime.week = Time.day * 7;\n\tlet timezoneOffset = (/* @__PURE__ */ new Date()).getTimezoneOffset();\n\tfunction setTimezoneOffset(offset) {\n\t\ttimezoneOffset = offset;\n\t}\n\tTime.setTimezoneOffset = setTimezoneOffset;\n\tfunction getTimezoneOffset() {\n\t\treturn timezoneOffset;\n\t}\n\tTime.getTimezoneOffset = getTimezoneOffset;\n\tfunction getDateNumber(date = /* @__PURE__ */ new Date(), offset) {\n\t\tif (typeof date === \"number\") date = new Date(date);\n\t\tif (offset === void 0) offset = timezoneOffset;\n\t\treturn Math.floor((date.valueOf() / Time.minute - offset) / 1440);\n\t}\n\tTime.getDateNumber = getDateNumber;\n\tfunction fromDateNumber(value, offset) {\n\t\tconst date = new Date(value * Time.day);\n\t\tif (offset === void 0) offset = timezoneOffset;\n\t\treturn new Date(+date + offset * Time.minute);\n\t}\n\tTime.fromDateNumber = fromDateNumber;\n\tconst numeric = /\\d+(?:\\.\\d+)?/.source;\n\tconst timeRegExp = new RegExp(`^${[\n\t\t\"w(?:eek(?:s)?)?\",\n\t\t\"d(?:ay(?:s)?)?\",\n\t\t\"h(?:our(?:s)?)?\",\n\t\t\"m(?:in(?:ute)?(?:s)?)?\",\n\t\t\"s(?:ec(?:ond)?(?:s)?)?\"\n\t].map((unit) => `(${numeric}${unit})?`).join(\"\")}$`);\n\tfunction parseTime(source) {\n\t\tconst capture = timeRegExp.exec(source);\n\t\tif (!capture) return 0;\n\t\treturn (parseFloat(capture[1]) * Time.week || 0) + (parseFloat(capture[2]) * Time.day || 0) + (parseFloat(capture[3]) * Time.hour || 0) + (parseFloat(capture[4]) * Time.minute || 0) + (parseFloat(capture[5]) * Time.second || 0);\n\t}\n\tTime.parseTime = parseTime;\n\tfunction parseDate(date) {\n\t\tconst parsed = parseTime(date);\n\t\tif (parsed) date = Date.now() + parsed;\n\t\telse if (/^\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).toLocaleDateString()}-${date}`;\n\t\telse if (/^\\d{1,2}-\\d{1,2}-\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).getFullYear()}-${date}`;\n\t\treturn date ? new Date(date) : /* @__PURE__ */ new Date();\n\t}\n\tTime.parseDate = parseDate;\n\tfunction format(ms) {\n\t\tconst abs = Math.abs(ms);\n\t\tif (abs >= Time.day - Time.hour / 2) return Math.round(ms / Time.day) + \"d\";\n\t\telse if (abs >= Time.hour - Time.minute / 2) return Math.round(ms / Time.hour) + \"h\";\n\t\telse if (abs >= Time.minute - Time.second / 2) return Math.round(ms / Time.minute) + \"m\";\n\t\telse if (abs >= Time.second) return Math.round(ms / Time.second) + \"s\";\n\t\treturn ms + \"ms\";\n\t}\n\tTime.format = format;\n\tfunction toDigits(source, length = 2) {\n\t\treturn source.toString().padStart(length, \"0\");\n\t}\n\tTime.toDigits = toDigits;\n\tfunction template(template, time = /* @__PURE__ */ new Date()) {\n\t\treturn template.replace(\"yyyy\", time.getFullYear().toString()).replace(\"yy\", time.getFullYear().toString().slice(2)).replace(\"MM\", toDigits(time.getMonth() + 1)).replace(\"dd\", toDigits(time.getDate())).replace(\"hh\", toDigits(time.getHours())).replace(\"mm\", toDigits(time.getMinutes())).replace(\"ss\", toDigits(time.getSeconds())).replace(\"SSS\", toDigits(time.getMilliseconds(), 3));\n\t}\n\tTime.template = template;\n})(Time || (Time = {}));\n//#endregion\nexport { Binary, Time, arrayBufferToBase64, arrayBufferToHex, base64ToArrayBuffer, camelCase, camelize, capitalize, clone, contain, createVolatile, deduplicate, deepEqual, defineProperty, difference, filterKeys, formatProperty, hexToArrayBuffer, hyphenate, intersection, is, isNonNullable, isNullable, isPlainObject, isVolatile, makeArray, mapValues, mapValues as valueMap, noop, omit, paramCase, pick, remove, sanitize, snakeCase, trimSlash, uncapitalize, union, updateVolatile, volatileEntries };\n", "import { Binary, clone, createVolatile, deepEqual, filterKeys, isNullable, isPlainObject, isVolatile, pick, valueMap } from \"@deepseek-ai/cosmokit\";\n//#region lib/types/index.js\nconst kSchema = Symbol.for(\"schemastery\");\nconst kValidationError = Symbol.for(\"ValidationError\");\nglobalThis.__schemastery_index__ ??= 0;\nglobalThis.__schemastery_refs__ = void 0;\nvar ValidationError = class extends TypeError {\n\toptions;\n\tname = \"ValidationError\";\n\tconstructor(message, options) {\n\t\tlet prefix = \"$\";\n\t\tfor (const segment of options.path || []) if (typeof segment === \"string\") prefix += \".\" + segment;\n\t\telse if (typeof segment === \"number\") prefix += \"[\" + segment + \"]\";\n\t\telse if (typeof segment === \"symbol\") prefix += `[Symbol(${segment.toString()})]`;\n\t\tif (prefix.startsWith(\".\")) prefix = prefix.slice(1);\n\t\tsuper((prefix === \"$\" ? \"\" : `${prefix} `) + message);\n\t\tthis.options = options;\n\t}\n\tstatic is(error) {\n\t\treturn !!error?.[kValidationError];\n\t}\n};\nObject.defineProperty(ValidationError.prototype, kValidationError, { value: true });\nconst Schema = function(options) {\n\tconst schema = function(data, options = {}) {\n\t\treturn Schema.resolve(data, schema, options)[0];\n\t};\n\tif (options.refs) {\n\t\tconst refs = valueMap(options.refs, (options) => new Schema(options));\n\t\tconst getRef = (uid) => refs[uid];\n\t\tfor (const key in refs) {\n\t\t\tconst options = refs[key];\n\t\t\toptions.sKey = getRef(options.sKey);\n\t\t\toptions.inner = getRef(options.inner);\n\t\t\toptions.list = options.list && options.list.map(getRef);\n\t\t\toptions.dict = options.dict && valueMap(options.dict, getRef);\n\t\t}\n\t\treturn refs[options.uid];\n\t}\n\tObject.assign(schema, options);\n\tif (typeof schema.callback === \"string\") try {\n\t\tschema.callback = new Function(\"return \" + schema.callback)();\n\t} catch {}\n\tObject.defineProperty(schema, \"uid\", { value: globalThis.__schemastery_index__++ });\n\tObject.setPrototypeOf(schema, Schema.prototype);\n\tschema.meta ||= {};\n\tschema.toString = schema.toString.bind(schema);\n\treturn schema;\n};\nSchema.prototype = Object.create(Function.prototype);\nSchema.prototype[kSchema] = true;\nObject.defineProperty(Schema.prototype, \"~standard\", { get() {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: \"schemastery\",\n\t\tvalidate: (value) => {\n\t\t\ttry {\n\t\t\t\treturn { value: Schema.resolve(value, this, {})[0] };\n\t\t\t} catch (error) {\n\t\t\t\tif (ValidationError.is(error)) return { issues: [{\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tpath: error.options.path\n\t\t\t\t}] };\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n} });\nSchema.ValidationError = ValidationError;\nSchema.prototype.toJSON = function toJSON() {\n\tif (globalThis.__schemastery_refs__) {\n\t\tglobalThis.__schemastery_refs__[this.uid] ??= JSON.parse(JSON.stringify({ ...this }));\n\t\treturn this.uid;\n\t}\n\tglobalThis.__schemastery_refs__ = { [this.uid]: { ...this } };\n\tglobalThis.__schemastery_refs__[this.uid] = JSON.parse(JSON.stringify({ ...this }));\n\tconst result = {\n\t\tuid: this.uid,\n\t\trefs: globalThis.__schemastery_refs__\n\t};\n\tglobalThis.__schemastery_refs__ = void 0;\n\treturn result;\n};\nSchema.prototype.set = function set(key, value) {\n\tthis.dict[key] = value;\n\treturn this;\n};\nSchema.prototype.push = function push(value) {\n\tthis.list.push(value);\n\treturn this;\n};\nfunction mergeDesc(original, messages) {\n\tconst result = typeof original === \"string\" ? { \"\": original } : { ...original };\n\tfor (const locale in messages) {\n\t\tconst value = messages[locale];\n\t\tif (value?.$description || value?.$desc) result[locale] = value.$description || value.$desc;\n\t\telse if (typeof value === \"string\") result[locale] = value;\n\t}\n\treturn result;\n}\nfunction getInner(value) {\n\treturn value?.$value ?? value?.$inner;\n}\nfunction extractKeys(data) {\n\treturn filterKeys(data ?? {}, (key) => !key.startsWith(\"$\"));\n}\nSchema.prototype.i18n = function i18n(messages) {\n\tconst schema = Schema(this);\n\tconst desc = mergeDesc(schema.meta.description, messages);\n\tif (Object.keys(desc).length) schema.meta.description = desc;\n\tif (schema.dict) schema.dict = valueMap(schema.dict, (inner, key) => {\n\t\treturn inner.i18n(valueMap(messages, (data) => getInner(data)?.[key] ?? data?.[key]));\n\t});\n\tif (schema.list) schema.list = schema.list.map((inner, index) => {\n\t\treturn inner.i18n(valueMap(messages, (data = {}) => {\n\t\t\tif (Array.isArray(getInner(data))) return getInner(data)[index];\n\t\t\tif (Array.isArray(data)) return data[index];\n\t\t\treturn extractKeys(data);\n\t\t}));\n\t});\n\tif (schema.inner) schema.inner = schema.inner.i18n(valueMap(messages, (data) => {\n\t\tif (getInner(data)) return getInner(data);\n\t\treturn extractKeys(data);\n\t}));\n\tif (schema.sKey) schema.sKey = schema.sKey.i18n(valueMap(messages, (data) => data?.$key));\n\treturn schema;\n};\nSchema.prototype.extra = function extra(key, value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"required\",\n\t\"disabled\",\n\t\"collapse\",\n\t\"hidden\",\n\t\"loose\"\n]) Object.assign(Schema.prototype, { [key](value = true) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nSchema.prototype.deprecated = function deprecated() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"deprecated\",\n\t\ttype: \"danger\"\n\t});\n\treturn schema;\n};\nSchema.prototype.experimental = function experimental() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"experimental\",\n\t\ttype: \"warning\"\n\t});\n\treturn schema;\n};\nSchema.prototype.pattern = function pattern(regexp) {\n\tconst schema = Schema(this);\n\tconst pattern = pick(regexp, [\"source\", \"flags\"]);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\tpattern\n\t};\n\treturn schema;\n};\nSchema.prototype.simplify = function simplify(value) {\n\tif (isVolatile(value)) value = value.get();\n\tif (deepEqual(value, this.meta.default, this.type === \"dict\")) return null;\n\tif (isNullable(value)) return value;\n\tif (this.type === \"object\" || this.type === \"dict\") {\n\t\tconst result = {};\n\t\tfor (const key in value) {\n\t\t\tconst item = (this.type === \"object\" ? this.dict[key] : this.inner)?.simplify(value[key]);\n\t\t\tif (this.type === \"dict\" || !isNullable(item)) result[key] = item;\n\t\t}\n\t\tif (deepEqual(result, this.meta.default, this.type === \"dict\")) return null;\n\t\treturn result;\n\t} else if (this.type === \"array\" || this.type === \"tuple\") {\n\t\tconst result = [];\n\t\tvalue.forEach((value, index) => {\n\t\t\tconst schema = this.type === \"array\" ? this.inner : this.list[index];\n\t\t\tconst item = schema ? schema.simplify(value) : value;\n\t\t\tresult.push(item);\n\t\t});\n\t\treturn result;\n\t} else if (this.type === \"intersect\") {\n\t\tconst result = {};\n\t\tfor (const item of this.list) Object.assign(result, item.simplify(value));\n\t\treturn result;\n\t} else if (this.type === \"union\") for (const schema of this.list) try {\n\t\tSchema.resolve(value, schema, {});\n\t\treturn schema.simplify(value);\n\t} catch {}\n\treturn value;\n};\nSchema.prototype.toString = function toString(inline) {\n\treturn formatters[this.type]?.(this, inline) ?? `Schema<${this.type}>`;\n};\nSchema.prototype.role = function role(role, extra) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\trole,\n\t\textra\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"default\",\n\t\"link\",\n\t\"comment\",\n\t\"description\",\n\t\"max\",\n\t\"min\",\n\t\"step\"\n]) Object.assign(Schema.prototype, { [key](value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nSchema.prototype.volatile = function volatile() {\n\tif (this.meta.volatile) throw new TypeError(\"volatile schema is already wrapped\");\n\treturn this.extra(\"volatile\", true);\n};\nconst resolvers = {};\nconst checkedVolatile = Symbol(\"checked-volatile-schema\");\nfunction validateVolatileSchema(schema, path = [], blocked = false, seen = /* @__PURE__ */ new Map()) {\n\tconst states = seen.get(schema) ?? /* @__PURE__ */ new Set();\n\tif (states.has(blocked)) return;\n\tstates.add(blocked);\n\tseen.set(schema, states);\n\tif (schema.meta?.volatile && blocked) throw new ValidationError(\"volatile fields require a fixed object path without an enclosing volatile field\", { path });\n\tconst nested = blocked || !!schema.meta?.volatile;\n\tif (schema.dict) for (const [key, child] of Object.entries(schema.dict)) validateVolatileSchema(child, [...path, key], nested, seen);\n\tif (schema.sKey) validateVolatileSchema(schema.sKey, [...path, \"<key>\"], true, seen);\n\tif (schema.inner && (schema.type !== \"lazy\" || schema.inner[kSchema])) validateVolatileSchema(schema.inner, [...path, \"*\"], true, seen);\n\tif (schema.list) for (let index = 0; index < schema.list.length; index++) validateVolatileSchema(schema.list[index], [...path, String(index)], true, seen);\n}\nSchema.extend = function extend(type, resolve) {\n\tresolvers[type] = resolve;\n};\nSchema.resolve = function resolve(data, schema, options = {}, strict = false) {\n\tif (!schema) return [data];\n\tif (!options[checkedVolatile]) {\n\t\tvalidateVolatileSchema(schema, options.path);\n\t\toptions = {\n\t\t\t...options,\n\t\t\t[checkedVolatile]: true\n\t\t};\n\t}\n\tif (schema.meta?.volatile) {\n\t\tconst inner = Schema(schema);\n\t\tinner.meta = {\n\t\t\t...schema.meta,\n\t\t\tvolatile: false\n\t\t};\n\t\tconst [value, adapted] = Schema.resolve(data, inner, options, strict);\n\t\ttry {\n\t\t\treturn [createVolatile(value), adapted];\n\t\t} catch (error) {\n\t\t\tthrow new ValidationError(error instanceof Error ? error.message : String(error), options);\n\t\t}\n\t}\n\tif (options.ignore?.(data, schema)) return [data];\n\tif (isNullable(data) && schema.type !== \"lazy\") {\n\t\tif (schema.meta.required) throw new ValidationError(`missing required value`, options);\n\t\tlet current = schema;\n\t\tlet fallback = schema.meta.default;\n\t\twhile (current?.type === \"intersect\" && isNullable(fallback)) {\n\t\t\tcurrent = current.list[0];\n\t\t\tfallback = current?.meta.default;\n\t\t}\n\t\tif (isNullable(fallback)) return [data];\n\t\tdata = clone(fallback);\n\t}\n\tconst callback = resolvers[schema.type];\n\tif (!callback) throw new ValidationError(`unsupported type \"${schema.type}\"`, options);\n\ttry {\n\t\treturn callback(data, schema, options, strict);\n\t} catch (error) {\n\t\tif (!schema.meta.loose) throw error;\n\t\treturn [schema.meta.default];\n\t}\n};\nSchema.from = function from(source) {\n\tif (isNullable(source)) return Schema.any();\n\telse if ([\n\t\t\"string\",\n\t\t\"number\",\n\t\t\"boolean\"\n\t].includes(typeof source)) return Schema.const(source).required();\n\telse if (source[kSchema]) return source;\n\telse if (typeof source === \"function\") switch (source) {\n\t\tcase String: return Schema.string().required();\n\t\tcase Number: return Schema.number().required();\n\t\tcase Boolean: return Schema.boolean().required();\n\t\tcase Function: return Schema.function().required();\n\t\tdefault: return Schema.is(source).required();\n\t}\n\telse throw new TypeError(`cannot infer schema from ${source}`);\n};\nSchema.lazy = function lazy(builder) {\n\tconst toJSON = () => {\n\t\tif (!schema.inner[kSchema]) {\n\t\t\tschema.inner = schema.builder();\n\t\t\tschema.inner.meta = {\n\t\t\t\t...schema.meta,\n\t\t\t\t...schema.inner.meta\n\t\t\t};\n\t\t}\n\t\treturn schema.inner.toJSON();\n\t};\n\tconst schema = new Schema({\n\t\ttype: \"lazy\",\n\t\tbuilder,\n\t\tinner: { toJSON }\n\t});\n\treturn schema;\n};\nSchema.natural = function natural() {\n\treturn Schema.number().step(1).min(0);\n};\nSchema.percent = function percent() {\n\treturn Schema.number().step(.01).min(0).max(1).role(\"slider\");\n};\nSchema.date = function date() {\n\treturn Schema.union([Schema.is(Date), Schema.transform(Schema.string().role(\"datetime\"), (value, options) => {\n\t\tconst date = new Date(value);\n\t\tif (isNaN(+date)) throw new ValidationError(`invalid date \"${value}\"`, options);\n\t\treturn date;\n\t}, true)]);\n};\nSchema.regExp = function regExp(flag = \"\") {\n\treturn Schema.union([Schema.is(RegExp), Schema.transform(Schema.string().role(\"regexp\", { flag }), (value, options) => {\n\t\ttry {\n\t\t\treturn new RegExp(value, flag);\n\t\t} catch (e) {\n\t\t\tthrow new ValidationError(e.message, options);\n\t\t}\n\t}, true)]);\n};\nSchema.arrayBuffer = function arrayBuffer(encoding) {\n\treturn Schema.union([\n\t\tSchema.is(ArrayBuffer),\n\t\tSchema.is(SharedArrayBuffer),\n\t\tSchema.transform(Schema.any(), (value, options) => {\n\t\t\tif (Binary.isSource(value)) return Binary.fromSource(value);\n\t\t\tthrow new ValidationError(`expected ArrayBufferSource but got ${value}`, options);\n\t\t}, true),\n\t\t...encoding ? [Schema.transform(Schema.string(), (value, options) => {\n\t\t\ttry {\n\t\t\t\treturn encoding === \"base64\" ? Binary.fromBase64(value) : Binary.fromHex(value);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new ValidationError(e.message, options);\n\t\t\t}\n\t\t}, true)] : []\n\t]);\n};\nSchema.extend(\"lazy\", (data, schema, options, strict) => {\n\tif (!schema.inner[kSchema]) {\n\t\tschema.inner = schema.builder();\n\t\tschema.inner.meta = {\n\t\t\t...schema.meta,\n\t\t\t...schema.inner.meta\n\t\t};\n\t\tvalidateVolatileSchema(schema.inner, options.path, true);\n\t}\n\treturn Schema.resolve(data, schema.inner, options, strict);\n});\nSchema.extend(\"any\", (data) => {\n\treturn [data];\n});\nSchema.extend(\"never\", (data, _, options) => {\n\tthrow new ValidationError(`expected nullable but got ${data}`, options);\n});\nSchema.extend(\"const\", (data, { value }, options) => {\n\tif (deepEqual(data, value)) return [value];\n\tthrow new ValidationError(`expected ${value} but got ${data}`, options);\n});\nfunction checkWithinRange(data, meta, description, options, skipMin = false) {\n\tconst { max = Infinity, min = -Infinity } = meta;\n\tif (data > max) throw new ValidationError(`expected ${description} <= ${max} but got ${data}`, options);\n\tif (data < min && !skipMin) throw new ValidationError(`expected ${description} >= ${min} but got ${data}`, options);\n}\nSchema.extend(\"string\", (data, { meta }, options) => {\n\tif (typeof data !== \"string\") throw new ValidationError(`expected string but got ${data}`, options);\n\tif (meta.pattern) {\n\t\tconst regexp = new RegExp(meta.pattern.source, meta.pattern.flags);\n\t\tif (!regexp.test(data)) throw new ValidationError(`expect string to match regexp ${regexp}`, options);\n\t}\n\tcheckWithinRange(data.length, meta, \"string length\", options);\n\treturn [data];\n});\nfunction decimalShift(data, digits) {\n\tconst str = data.toString();\n\tif (str.includes(\"e\")) return data * Math.pow(10, digits);\n\tconst index = str.indexOf(\".\");\n\tif (index === -1) return data * Math.pow(10, digits);\n\tconst frac = str.slice(index + 1);\n\tconst integer = str.slice(0, index);\n\tif (frac.length <= digits) return +(integer + frac.padEnd(digits, \"0\"));\n\treturn +(integer + frac.slice(0, digits) + \".\" + frac.slice(digits));\n}\nfunction isMultipleOf(data, min, step) {\n\tstep = Math.abs(step);\n\tif (!/^\\d+\\.\\d+$/.test(step.toString())) return (data - min) % step === 0;\n\tconst index = step.toString().indexOf(\".\");\n\tconst digits = step.toString().slice(index + 1).length;\n\treturn Math.abs(decimalShift(data, digits) - decimalShift(min, digits)) % decimalShift(step, digits) === 0;\n}\nSchema.extend(\"number\", (data, { meta }, options) => {\n\tif (typeof data !== \"number\") throw new ValidationError(`expected number but got ${data}`, options);\n\tcheckWithinRange(data, meta, \"number\", options);\n\tconst { step } = meta;\n\tif (step && !isMultipleOf(data, meta.min ?? 0, step)) throw new ValidationError(`expected number multiple of ${step} but got ${data}`, options);\n\treturn [data];\n});\nSchema.extend(\"boolean\", (data, _, options) => {\n\tif (typeof data === \"boolean\") return [data];\n\tthrow new ValidationError(`expected boolean but got ${data}`, options);\n});\nSchema.extend(\"bitset\", (data, { bits, meta }, options) => {\n\tlet value = 0, keys = [];\n\tif (typeof data === \"number\") {\n\t\tvalue = data;\n\t\tfor (const key in bits) if (data & bits[key]) keys.push(key);\n\t} else if (Array.isArray(data)) {\n\t\tkeys = data;\n\t\tfor (const key of keys) {\n\t\t\tif (typeof key !== \"string\") throw new ValidationError(`expected string but got ${key}`, options);\n\t\t\tif (key in bits) value |= bits[key];\n\t\t}\n\t} else throw new ValidationError(`expected number or array but got ${data}`, options);\n\tif (value === meta.default) return [value];\n\treturn [value, keys];\n});\nSchema.extend(\"function\", (data, _, options) => {\n\tif (typeof data === \"function\") return [data];\n\tthrow new ValidationError(`expected function but got ${data}`, options);\n});\nSchema.extend(\"is\", (data, { constructor }, options) => {\n\tif (typeof constructor === \"function\") {\n\t\tif (data instanceof constructor) return [data];\n\t\tthrow new ValidationError(`expected ${constructor.name} but got ${data}`, options);\n\t} else {\n\t\tif (isNullable(data)) throw new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t\tlet prototype = Object.getPrototypeOf(data);\n\t\twhile (prototype) {\n\t\t\tif (prototype.constructor?.name === constructor) return [data];\n\t\t\tprototype = Object.getPrototypeOf(prototype);\n\t\t}\n\t\tthrow new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t}\n});\nfunction property(data, key, schema, options) {\n\ttry {\n\t\tconst [value, adapted] = Schema.resolve(data[key], schema, {\n\t\t\t...options,\n\t\t\tpath: [...options.path || [], key]\n\t\t});\n\t\tif (adapted !== void 0) data[key] = adapted;\n\t\treturn value;\n\t} catch (e) {\n\t\tif (!options?.autofix) throw e;\n\t\tdelete data[key];\n\t\treturn schema.meta.volatile ? createVolatile(schema.meta.default) : schema.meta.default;\n\t}\n}\nSchema.extend(\"array\", (data, { inner, meta }, options) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tcheckWithinRange(data.length, meta, \"array length\", options, !isNullable(inner.meta.default));\n\treturn [data.map((_, index) => property(data, index, inner, options))];\n});\nSchema.extend(\"dict\", (data, { inner, sKey }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in data) {\n\t\tlet rKey;\n\t\ttry {\n\t\t\trKey = Schema.resolve(key, sKey, options)[0];\n\t\t} catch (error) {\n\t\t\tif (strict) continue;\n\t\t\tthrow error;\n\t\t}\n\t\tresult[rKey] = property(data, key, inner, options);\n\t\tdata[rKey] = data[key];\n\t\tif (key !== rKey) delete data[key];\n\t}\n\treturn [result];\n});\nSchema.extend(\"tuple\", (data, { list }, options, strict) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tconst result = list.map((inner, index) => property(data, index, inner, options));\n\tif (strict) return [result];\n\tresult.push(...data.slice(list.length));\n\treturn [result];\n});\nfunction merge(result, data) {\n\tfor (const key in data) {\n\t\tif (key in result) continue;\n\t\tresult[key] = data[key];\n\t}\n}\nSchema.extend(\"object\", (data, { dict }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in dict) {\n\t\tconst value = property(data, key, dict[key], options);\n\t\tif (!isNullable(value) || key in data) result[key] = value;\n\t}\n\tif (!strict) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"union\", (data, { list, toString }, options, strict) => {\n\tconst messages = [];\n\tfor (const inner of list) try {\n\t\treturn Schema.resolve(data, inner, options, strict);\n\t} catch (error) {\n\t\tmessages.push(error);\n\t}\n\tthrow new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n});\nSchema.extend(\"intersect\", (data, { list, toString }, options, strict) => {\n\tif (!list.length) return [data];\n\tlet result;\n\tfor (const inner of list) {\n\t\tconst value = Schema.resolve(data, inner, options, true)[0];\n\t\tif (isNullable(value)) continue;\n\t\tif (isNullable(result)) result = value;\n\t\telse if (typeof result !== typeof value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t\telse if (typeof value === \"object\") merge(result ??= {}, value);\n\t\telse if (result !== value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t}\n\tif (!strict && isPlainObject(data)) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"transform\", (data, { inner, callback, preserve }, options) => {\n\tconst [result, adapted = data] = Schema.resolve(data, inner, options, true);\n\tif (preserve) return [callback(result)];\n\telse return [callback(result), callback(adapted)];\n});\nconst formatters = {};\nfunction defineMethod(name, keys, format) {\n\tformatters[name] = format;\n\tObject.assign(Schema, { [name](...args) {\n\t\tconst schema = new Schema({ type: name });\n\t\tkeys.forEach((key, index) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase \"sKey\":\n\t\t\t\t\tschema.sKey = args[index] ?? Schema.string();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"inner\":\n\t\t\t\t\tschema.inner = Schema.from(args[index]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"list\":\n\t\t\t\t\tschema.list = args[index].map(Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dict\":\n\t\t\t\t\tschema.dict = valueMap(args[index], Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bits\":\n\t\t\t\t\tschema.bits = {};\n\t\t\t\t\tfor (const key in args[index]) {\n\t\t\t\t\t\tif (typeof args[index][key] !== \"number\") continue;\n\t\t\t\t\t\tschema.bits[key] = args[index][key];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"callback\": {\n\t\t\t\t\tconst callback = schema.callback = args[index];\n\t\t\t\t\tcallback[\"toJSON\"] ||= () => callback.toString();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"constructor\": {\n\t\t\t\t\tconst constructor = schema.constructor = args[index];\n\t\t\t\t\tif (typeof constructor === \"function\") constructor[\"toJSON\"] ||= () => constructor[\"name\"];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: schema[key] = args[index];\n\t\t\t}\n\t\t});\n\t\tif (name === \"object\" || name === \"dict\") schema.meta.default = {};\n\t\telse if (name === \"array\" || name === \"tuple\") schema.meta.default = [];\n\t\telse if (name === \"bitset\") schema.meta.default = 0;\n\t\treturn schema;\n\t} });\n}\ndefineMethod(\"is\", [\"constructor\"], ({ constructor }) => {\n\tif (typeof constructor === \"function\") return constructor.name;\n\telse return constructor;\n});\ndefineMethod(\"any\", [], () => \"any\");\ndefineMethod(\"never\", [], () => \"never\");\ndefineMethod(\"const\", [\"value\"], ({ value }) => typeof value === \"string\" ? JSON.stringify(value) : value);\ndefineMethod(\"string\", [], () => \"string\");\ndefineMethod(\"number\", [], () => \"number\");\ndefineMethod(\"boolean\", [], () => \"boolean\");\ndefineMethod(\"bitset\", [\"bits\"], () => \"bitset\");\ndefineMethod(\"function\", [], () => \"function\");\ndefineMethod(\"array\", [\"inner\"], ({ inner }) => `${inner.toString(true)}[]`);\ndefineMethod(\"dict\", [\"inner\", \"sKey\"], ({ inner, sKey }) => `{ [key: ${sKey.toString()}]: ${inner.toString()} }`);\ndefineMethod(\"tuple\", [\"list\"], ({ list }) => `[${list.map((inner) => inner.toString()).join(\", \")}]`);\ndefineMethod(\"object\", [\"dict\"], ({ dict }) => {\n\tif (Object.keys(dict).length === 0) return \"{}\";\n\treturn `{ ${Object.entries(dict).map(([key, inner]) => {\n\t\treturn `${key}${inner.meta.required ? \"\" : \"?\"}: ${inner.toString()}`;\n\t}).join(\", \")} }`;\n});\ndefineMethod(\"union\", [\"list\"], ({ list }, inline) => {\n\tconst result = list.map(({ toString: format }) => format()).join(\" | \");\n\treturn inline ? `(${result})` : result;\n});\ndefineMethod(\"intersect\", [\"list\"], ({ list }) => {\n\treturn `${list.map((inner) => inner.toString(true)).join(\" & \")}`;\n});\ndefineMethod(\"transform\", [\n\t\"inner\",\n\t\"callback\",\n\t\"preserve\"\n], ({ inner }, isInner) => inner.toString(isInner));\n//#endregion\nexport { Schema as default };\n", "import type { Volatile } from '@deepseek-ai/cordis';\nimport type { PluginConfig } from './types.ts';\nimport type { CredentialsReader } from './credentials.ts';\n\n/**\n * Bounds for the AI channel request timeout. One request carries a packed run\n * of whole reply blocks, and a local model can take minutes on that much\n * prose, so the budget is sized for long-form output.\n */\nexport const AI_TIMEOUT_MIN = 500;\nexport const AI_TIMEOUT_MAX = 900000;\n\n/**\n * The settings namespace this plugin owns. A namespace IS the Profile entry\n * id, so the user-editable layer is the `config` row of `dsh-chat-translate`\n * in the active profile's patch (`~/.dsh/profiles/<profile>/cordis.patch.yml`).\n */\nexport const SETTINGS_NAMESPACE = 'dsh-chat-translate';\n\nexport const DEFAULT_CONFIG: PluginConfig = {\n enabled: true,\n aiTimeoutMs: 600000,\n baseUrl: '',\n model: '',\n};\n\n/**\n * Live read face of this plugin's own Config, as `ConfigManager` consumes it.\n *\n * Keeping this structural (instead of importing the DSH packages) lets tests\n * inject an in-memory fake and keeps the host bundle free of service code. The\n * plugin has no write face of its own: an accepted edit is written by the\n * browser configuration form into the profile patch, and DSH commits the new\n * value into the `Volatile` refs this source reads.\n */\nexport interface ConfigSourceLike {\n /** Resolved value: schema defaults, then composition base, then user layer. */\n get(): PluginConfig;\n /** Observe committed live edits; returns the disposer. */\n watch(listener: (config: PluginConfig) => void): () => void;\n}\n\n/**\n * Fields of this plugin's Config as the runtime resolved them. Every field is\n * declared `volatile()`, so each one is a stable ref DSH commits a live edit\n * into rather than a snapshot taken at apply time.\n */\nexport interface PluginConfigRefs {\n readonly enabled: Volatile<boolean>;\n readonly aiTimeoutMs: Volatile<number>;\n readonly baseUrl: Volatile<string>;\n readonly model: Volatile<string>;\n}\n\n/**\n * Read the current committed value of every Config field.\n * @param refs - the runtime-resolved Config object.\n * @returns A detached plain config value.\n */\nexport function readPluginConfig(refs: PluginConfigRefs): PluginConfig {\n return {\n enabled: refs.enabled.get(),\n aiTimeoutMs: refs.aiTimeoutMs.get(),\n baseUrl: refs.baseUrl.get(),\n model: refs.model.get(),\n };\n}\n\n/**\n * Adapt this plugin's runtime-resolved Config into the live source\n * {@link ConfigManager} consumes.\n *\n * DSH commits an accepted live edit into the `Volatile` refs in place, then\n * emits `loader/volatile-update` on the owning fiber \u2014 the listener is scoped\n * to this plugin's own entry, so one subscription covers every field.\n *\n * @param onVolatileUpdate - subscribes to this plugin's volatile-commit event.\n * @param refs - the runtime-resolved Config object.\n * @returns The live read/watch source.\n */\nexport function createLiveConfigSource(\n onVolatileUpdate: (listener: () => void) => () => void,\n refs: PluginConfigRefs\n): ConfigSourceLike {\n return {\n get: () => readPluginConfig(refs),\n watch: (listener) => onVolatileUpdate(() => listener(readPluginConfig(refs))),\n };\n}\n\n/**\n * Config facade over this plugin's own live Config. This module does no file\n * I/O: persistence, atomic writes, external-edit hot reload and the\n * browser-facing edit API are all owned by DSH itself.\n */\nexport class ConfigManager {\n private source: ConfigSourceLike;\n private credentials: CredentialsReader;\n\n constructor(source: ConfigSourceLike, credentials: CredentialsReader) {\n this.source = source;\n this.credentials = credentials;\n }\n\n getConfig(): PluginConfig {\n return this.source.get();\n }\n\n /** Whether the AI channel has every required piece: baseUrl, model and key. */\n isAiConfigured(): boolean {\n const config = this.getConfig();\n return Boolean(\n config.baseUrl.trim() &&\n config.model.trim() &&\n this.credentials.getApiKey()\n );\n }\n\n onConfigChange(listener: (config: PluginConfig) => void): () => void {\n return this.source.watch(listener);\n }\n}\n", "/**\n * API-key access through the DSH `ctx.credentials` service.\n *\n * The service owns ~/.dsh/.credentials.yaml (refs section, 0600 perms, env\n * shadowing, cross-process locking): reads go through `resolve`, writes through\n * `set`/`unset`, and the host's `credentials/reference-updated` event keeps\n * the sync cache warm.\n */\n\n/** Refs key that holds the translation API key. */\nexport const TRANSLATE_API_KEY_REF = 'TRANSLATE_API_KEY';\n\n/** The sync read face the hot translation path needs. */\nexport interface KeyReader {\n getApiKey(): string;\n}\n\n/** Minimal structural shape of the DSH `ctx.credentials` service. */\nexport interface CredentialsServiceLike {\n /** Resolve a ref to its stored/inherited value; undefined when absent. */\n resolve(ref: string): Promise<{ value: string; source?: string } | undefined>;\n /** Status-only view \u2014 never returns the plaintext value. */\n describe(ref: string): Promise<{ configured: boolean; source?: string; writable: boolean }>;\n /** Store a non-empty value under the ref. */\n set(ref: string, value: string): Promise<void>;\n /** Remove the ref from the document. */\n unset(ref: string): Promise<void>;\n}\n\nexport class CredentialsReader implements KeyReader {\n private service: CredentialsServiceLike;\n private cachedKey = '';\n private refreshing: Promise<void> | null = null;\n\n constructor(service: CredentialsServiceLike) {\n this.service = service;\n }\n\n /** Load the API key once; safe to call multiple times. */\n async init(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Re-read the key from the credentials service. Used at startup and on\n * `credentials/reference-updated` events so an external edit or a write\n * from another surface takes effect immediately.\n */\n async refresh(): Promise<void> {\n if (this.refreshing) return this.refreshing;\n this.refreshing = (async () => {\n try {\n const resolved = await this.service.resolve(TRANSLATE_API_KEY_REF);\n this.cachedKey = (resolved?.value ?? '').trim();\n } catch (err) {\n console.warn('[dsh-chat-translate] Failed to resolve TRANSLATE_API_KEY:', err);\n } finally {\n this.refreshing = null;\n }\n })();\n return this.refreshing;\n }\n\n /** Synchronous cached read \u2014 the hot translation path stays sync. */\n getApiKey(): string {\n return this.cachedKey;\n }\n\n /**\n * Status-only view of the ref (plaintext never crosses the wire).\n *\n * @internal Test-only. The settings UI reads key status through the\n * `credentials` Remote API with its own client-side shape, so nothing in\n * `src/` calls this host-side method; only `scripts/test-*.mjs` do.\n */\n async describe(): Promise<{ configured: boolean; writable: boolean }> {\n try {\n const info = await this.service.describe(TRANSLATE_API_KEY_REF);\n return { configured: info.configured, writable: info.writable };\n } catch {\n return { configured: false, writable: false };\n }\n }\n\n /** Write (or clear) the ref through the DSH credentials service. */\n async setApiKey(apiKey: string): Promise<void> {\n const normalized = apiKey.trim();\n if (normalized) {\n await this.service.set(TRANSLATE_API_KEY_REF, normalized);\n } else {\n await this.service.unset(TRANSLATE_API_KEY_REF);\n }\n // The write committed: set the cache synchronously so the hot path never\n // reads a stale key even if a concurrent refresh() is still in flight,\n // then confirm from the service (which also fans reference-updated).\n this.cachedKey = normalized;\n await this.refresh();\n }\n}\n", "import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { dshHomePath } from '@deepseek-ai/dsh-home-paths';\nimport { PROMPT_REVISION } from './prompt-revision.ts';\n\n/** Entries older than this are treated as expired. */\nconst TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\ninterface CacheEntry {\n t: number; // epoch ms, written at set()\n v: string;\n}\n\n/**\n * The on-disk document: the prompt revision that wrote it, then the pool.\n * A document whose `rev` is not the current revision belongs to a superseded\n * prompt semantics and is dropped whole on load \u2014 replaying stale\n * translations into a new policy is exactly how a prompt fix \"does nothing\".\n */\ninterface CacheDocument {\n rev: string;\n entries: Record<string, CacheEntry>;\n}\n\nexport class LruDiskCache {\n private cache = new Map<string, CacheEntry>();\n private maxEntries: number;\n private filePath: string;\n private revision: string;\n private saveTimer: NodeJS.Timeout | null = null;\n private dirty = false;\n\n constructor(maxEntries = 1000, fileName = 'cache.json', revision = PROMPT_REVISION) {\n this.maxEntries = maxEntries;\n this.revision = revision;\n // Follow the DSH convention of component-owned home subdirectories\n // (sessions/, storages/, attachments/) instead of polluting ~/.dsh.\n // dshHomePath mirrors resolveDshHome exactly: explicit configured home,\n // then $DSH_HOME (tilde-expanded), then ~/.dsh.\n this.filePath = dshHomePath('dsh-chat-translate', fileName);\n }\n\n async init(): Promise<void> {\n try {\n const content = await fs.readFile(this.filePath, 'utf-8');\n const doc = JSON.parse(content) as unknown;\n if (\n doc &&\n typeof doc === 'object' &&\n (doc as CacheDocument).rev === this.revision &&\n typeof (doc as CacheDocument).entries === 'object' &&\n (doc as CacheDocument).entries !== null\n ) {\n this.loadEntries((doc as CacheDocument).entries as Record<string, unknown>);\n }\n // Any other document \u2014 missing, corrupt, or a superseded revision \u2014\n // leaves the pool empty; the next flush rewrites it under this revision.\n } catch {\n // Ignore missing or corrupt cache file\n }\n }\n\n /** Adopt loaded entries, dropping malformed ones. */\n private loadEntries(raw: Record<string, unknown>): void {\n for (const [k, entry] of Object.entries(raw)) {\n const value = entry as CacheEntry | undefined;\n // The document on disk outlives the process: only well-formed entries\n // (a finite timestamp and a string translation) are served again.\n if (\n value &&\n typeof value === 'object' &&\n typeof value.v === 'string' &&\n typeof value.t === 'number' &&\n Number.isFinite(value.t)\n ) {\n this.cache.set(k, value);\n }\n }\n }\n\n get(key: string): string | undefined {\n const entry = this.cache.get(key);\n if (entry === undefined) return undefined;\n if (Date.now() - entry.t > TTL_MS) {\n this.cache.delete(key);\n return undefined;\n }\n // Refresh key in LRU order (re-insert at the end)\n this.cache.delete(key);\n this.cache.set(key, entry);\n return entry.v;\n }\n\n set(key: string, value: string): void {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n } else if (this.cache.size >= this.maxEntries) {\n // Remove least recently used entry (first in Map iterator)\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n this.cache.set(key, { t: Date.now(), v: value });\n this.dirty = true;\n this.scheduleSave();\n }\n\n private scheduleSave(): void {\n if (this.saveTimer) return;\n this.saveTimer = setTimeout(() => {\n this.saveTimer = null;\n if (this.dirty) {\n // flush() owns the dirty flag: cleared only on a committed write, so\n // a failure keeps it set and schedules its own retry.\n this.flush().catch((err) => {\n console.warn('[dsh-chat-translate] Failed to flush cache to disk:', err);\n });\n }\n }, 5000);\n }\n\n async flush(): Promise<void> {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n const tmpPath = `${this.filePath}.tmp.${Date.now()}.${Math.random().toString(36).slice(2)}`;\n try {\n const entries: Record<string, CacheEntry> = {};\n for (const [k, v] of this.cache.entries()) {\n entries[k] = v;\n }\n const doc: CacheDocument = { rev: this.revision, entries };\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(tmpPath, JSON.stringify(doc, null, 2), 'utf-8');\n await fs.rename(tmpPath, this.filePath);\n // Only clear the dirty flag once the write actually committed; a failed\n // flush must not silently drop pending entries.\n this.dirty = false;\n } catch (err) {\n console.warn('[dsh-chat-translate] Failed to write cache file atomically:', err);\n try {\n await fs.unlink(tmpPath);\n } catch {}\n // Schedule one retry so a transient disk failure does not lose the\n // pending entries; dispose() is the only caller that must not reschedule.\n if (this.dirty) {\n this.scheduleSave();\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n if (this.dirty) {\n await this.flush();\n }\n }\n}\n", "import { opendir, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n//#region lib/types/index.js\n/**\n* Shared filesystem path helpers for DeepSeek Harness user data.\n*\n* @module @deepseek-ai/dsh-home-paths\n*/\n/** Directory name for the default DeepSeek Harness home under the OS home. */\nconst DSH_HOME_DIR_NAME = \".dsh\";\n/** Stable user-facing display form for the default DeepSeek Harness home. */\nconst DEFAULT_DSH_HOME_DISPLAY = `~/${DSH_HOME_DIR_NAME}`;\n/** Environment variable that overrides the default DeepSeek Harness home. */\nconst DSH_HOME_ENV = \"DSH_HOME\";\n/**\n* Give a native filesystem watcher one canonical spelling of a path, even\n* when its final components do not exist yet. The deepest existing ancestor\n* is resolved through {@link realpath}; when a suffix is missing, that\n* ancestor is also proved to be an enumerable directory before the suffix is\n* restored. This prevents Windows from treating a regular-file ancestor as\n* ordinary absence, and prevents short-name aliases from being mixed with\n* long paths emitted by the native watcher backend.\n* @param path - Watch target or root, resolved against the current directory.\n* @returns the target with its existing ancestor canonicalized.\n* @throws when ancestor traversal encounters an error other than absence, or\n* the existing ancestor of a missing suffix is not an enumerable directory.\n*/\nasync function canonicalizeWatchPath(path) {\n\tlet current = resolve(path);\n\tconst missing = [];\n\twhile (true) try {\n\t\tconst canonical = await realpath(current);\n\t\tif (missing.length > 0) await (await opendir(canonical)).close();\n\t\treturn join(canonical, ...missing.reverse());\n\t} catch (error) {\n\t\tif (error.code !== \"ENOENT\") throw error;\n\t\tconst parent = dirname(current);\n\t\t/* v8 ignore next -- a filesystem root exists, so traversal resolves before this guard */\n\t\tif (parent === current) throw error;\n\t\tmissing.push(basename(current));\n\t\tcurrent = parent;\n\t}\n}\n/**\n* Resolve the default DeepSeek Harness home using Node's platform path rules.\n* @returns the absolute default harness home path.\n*/\nfunction defaultDshHome() {\n\treturn join(homedir(), DSH_HOME_DIR_NAME);\n}\n/**\n* Expand supported tilde prefixes against the operating-system home.\n* @param path - configured path that may begin with `~`, `~/`, or `~\\`.\n* @returns the expanded path, or the original value when no supported prefix is present.\n*/\nfunction expandHomePath(path) {\n\tif (path === \"~\") return homedir();\n\tif (path.startsWith(\"~/\") || path.startsWith(\"~\\\\\")) return join(homedir(), path.slice(2));\n\treturn path;\n}\n/**\n* Resolve the single-root DeepSeek Harness home.\n*\n* Precedence, highest first: an explicit configured path, `$DSH_HOME`, then\n* `~/.dsh`. The harness keeps all user data under one root. An empty or\n* whitespace-only `$DSH_HOME` is treated as unset, so a blank override never\n* resolves the home to the current working directory.\n* @param configured - explicit harness-home override, which has highest precedence.\n* @param env - environment mapping used to read `DSH_HOME`.\n* @returns the normalized absolute harness home path.\n*/\nfunction resolveDshHome(configured, env = process.env) {\n\tconst fromEnv = env[DSH_HOME_ENV];\n\treturn resolve(expandHomePath(configured ?? (fromEnv !== void 0 && fromEnv.trim().length > 0 ? fromEnv : defaultDshHome())));\n}\n/**\n* Join path segments onto the resolved DeepSeek Harness home.\n* @param segments - path segments appended to the Harness home; an empty list returns the home itself.\n* @returns the normalized absolute joined path.\n*/\nfunction dshHomePath(...segments) {\n\treturn join(resolveDshHome(), ...segments);\n}\n/**\n* Join path segments onto the resolved Harness home's `cache` directory without creating it; no arguments returns the directory itself.\n* @param optionsOrSegment - explicit home override, or the first path segment; omission uses the default home resolution.\n* @param segments - additional path segments after the first child, if any.\n* @returns the normalized absolute cache path.\n*/\nfunction dshCachePath(optionsOrSegment = {}, ...segments) {\n\tif (typeof optionsOrSegment === \"string\") return dshHomePath(\"cache\", optionsOrSegment, ...segments);\n\treturn join(resolveDshHome(optionsOrSegment.dshHome), \"cache\", ...segments);\n}\n/**\n* Describe a resolved harness home symbolically for user-facing display.\n*\n* It never returns an absolute machine path: the default home is labelled\n* `~/.dsh`, and any configured home is labelled `$DSH_HOME`.\n* @param resolvedHome - the absolute path returned by {@link resolveDshHome}.\n* @returns `~/.dsh` for the default home, otherwise `$DSH_HOME`.\n*/\nfunction dshHomeDisplay(resolvedHome) {\n\treturn resolvedHome === resolve(defaultDshHome()) ? DEFAULT_DSH_HOME_DISPLAY : `$${DSH_HOME_ENV}`;\n}\n//#endregion\nexport { DEFAULT_DSH_HOME_DISPLAY, DSH_HOME_DIR_NAME, DSH_HOME_ENV, canonicalizeWatchPath, defaultDshHome, dshCachePath, dshHomeDisplay, dshHomePath, expandHomePath, resolveDshHome };\n", "/**\n * The single registration of the translation prompt's semantic revision.\n *\n * The reply cache stores results keyed by source text; a cache document\n * written under a different prompt semantics would replay stale translations\n * into a new policy (the exact poisoning that makes \"already-Chinese blocks\n * look untranslated\" persist for a TTL after a prompt change). The document\n * therefore carries this revision, and a load whose revision differs starts\n * from an empty pool.\n *\n * Bump it \u2014 and only here \u2014 whenever the prompt below `buildSystemPrompt`\n * changes what the model is asked to do. Copy-only edits may ride.\n */\nexport const PROMPT_REVISION = 'r2';\n", "/**\n * \u628A fetch / \u7F51\u7EDC\u5931\u8D25\u7684\u53EF\u8BFB\u539F\u56E0\u5C55\u5F00\u6210\u5355\u884C\u6587\u672C\uFF08\u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u5171\u7528\uFF09\u3002\n *\n * \u80CC\u666F\uFF1ANode 18+ \u4E0E\u6D4F\u89C8\u5668\u7684 fetch \u5728\u7F51\u7EDC\u5C42\u5931\u8D25\u65F6\u53EA\u7ED9\u4E00\u53E5 `TypeError: fetch failed`\n * \uFF08\u6D4F\u89C8\u5668\u662F `Failed to fetch`\uFF09\uFF0C\u771F\u5B9E\u539F\u56E0\u85CF\u5728 `err.cause` \u91CC\u2014\u2014\u4F8B\u5982\n * `connect ENETUNREACH 172.24.52.126:8081`\u3001`other side closed [UND_ERR_SOCKET]`\u3001\n * `getaddrinfo ENOTFOUND`\u3002\u53EA\u4E0A\u62A5 `err.message` \u4F1A\u8BA9\u300C\u7AEF\u70B9\u4E0D\u53EF\u8FBE / \u88AB\u4EE3\u7406\u65AD\u5F00\u300D\u548C\n * \u300C\u63D2\u4EF6\u81EA\u8EAB\u51FA\u9519\u300D\u957F\u5F97\u4E00\u6A21\u4E00\u6837\uFF1A\u7528\u6237\u53EA\u770B\u5230\u65E0\u4FE1\u606F\u91CF\u7684 fetch failed\uFF0C\u65E0\u4ECE\u5224\u65AD\u8BE5\u6539\u4EC0\u4E48\u3002\n *\n * \u8FD9\u91CC\u628A message \u4E0E cause \u94FE\uFF08\u542B AggregateError \u7684\u591A\u5730\u5740\u5931\u8D25\uFF09\u62FC\u6210 `A \u2190 B \u2190 C`\u3002\n */\nexport function describeError(err: unknown): string {\n if (err === null || err === undefined) return String(err);\n const parts: string[] = [];\n const push = (s: string): void => {\n const t = String(s || '').trim();\n if (t && !parts.includes(t)) parts.push(t);\n };\n const head = (err as { message?: string }).message || String(err);\n push(head);\n const headCode = (err as { code?: string }).code;\n if (headCode && !head.includes(headCode)) push('[' + headCode + ']');\n let cause = (err as { cause?: unknown }).cause as\n | { message?: string; code?: string; cause?: unknown; errors?: unknown }\n | undefined;\n for (let depth = 0; cause && depth < 4; depth++) {\n const label = cause.message || String(cause);\n push(cause.code && !label.includes(cause.code) ? label + ' [' + cause.code + ']' : label);\n // AggregateError\uFF1A\u591A\u5730\u5740\u5168\u90E8\u5931\u8D25\uFF08happy-eyeballs \u53CC\u6808\u5E38\u89C1\uFF09\uFF0C\u5C55\u5F00\u524D\u51E0\u6761\n if (Array.isArray(cause.errors)) {\n for (const sub of (cause.errors as { message?: string; code?: string }[]).slice(0, 3)) {\n if (sub) push(sub.code || sub.message || String(sub));\n }\n }\n cause = cause.cause as typeof cause;\n }\n return parts.join(' \u2190 ');\n}", "import type {\n ITranslationAdapter,\n PluginConfig,\n TranslateAdapterOptions,\n} from './base.ts';\nimport type { KeyReader } from '../credentials.ts';\n\n/**\n * OpenAI-compatible Chat Completions translation channel.\n *\n * Talks to `POST {baseUrl}/chat/completions` with a Bearer token read from\n * ~/.dsh/.credentials.yaml (refs.TRANSLATE_API_KEY). Works with OpenAI,\n * DeepSeek, Qwen, Ollama and any other service exposing the standard endpoint.\n */\n\n/**\n * The translator instruction. Code fences are cut out before the model ever\n * sees the message (pipeline/segments.ts), so there is nothing here about\n * them beyond the fence-shaped batch markers, which are described by bracket\n * shape alone: naming any of their characters gives a small model something\n * to echo.\n *\n * Every passage is processed, including passages already in Chinese: weak\n * models write stiff machine-flavored Chinese (\"\u7845\u57FA\u4E2D\u6587\"), and that is the\n * same defect translation fixes, so Chinese gets a polishing pass too. Input\n * is reply Markdown and output is re-rendered as Markdown by the client. The\n * host repairs the answer's shape back to the source (block alignment, marker\n * prefixes, blank-line layout, link targets) and, when it cannot, still shows\n * the translation rather than vetoing it \u2014 so the instruction asks the model\n * to keep the structure line by line (line counts, indentation, block markers,\n * table pipes, links) because closer output means less repair, never because a\n * mismatch fails. It also tells the model link targets must be copied verbatim\n * (the host restores them anyway; the rule keeps the parentheses intact).\n * Inline code is styling, not structure: its contents may be translated and\n * the backticks may drift without veto.\n *\n * Prompt semantics are registered in `prompt-revision.ts`; changing what this\n * prompt asks the model to do means bumping that revision with it.\n */\nconst TARGET_LANGUAGE = 'Simplified Chinese';\n\nfunction buildSystemPrompt(mode: 'plain' | 'blocks'): string {\n const base =\n `You are a professional translator and editor. ` +\n `Rewrite the user's message as natural, idiomatic ${TARGET_LANGUAGE} the way a ` +\n `native writer would produce it. ` +\n `This applies to every passage, including passages already written in ` +\n `${TARGET_LANGUAGE}: smooth out stiff or machine-translated phrasing while ` +\n `keeping the meaning, tone, proper names, numbers and technical terms ` +\n `unchanged. Never drop content and never add content. ` +\n `The message is Markdown that will be re-rendered as Markdown, and its ` +\n `structure is verified line by line: keep the same number of lines, the ` +\n `same indentation, the same heading, quote and list markers, the same ` +\n `table rows and pipe counts, and the same number of links. Inline code ` +\n `contents may stay as they are or be translated where that reads better. ` +\n `For a link ` +\n `[text](target), translate only the text and copy the target inside the ` +\n `parentheses character-for-character. Never add, remove, reorder or nest ` +\n `Markdown syntax of your own. ` +\n `Output ONLY the resulting text \u2014 no explanations, no quotation marks, no extra words, ` +\n `no code fence around the whole answer.`;\n if (mode === 'plain') return base;\n return (\n base +\n ` The message is a sequence of parts. Each part starts with its own line ` +\n `holding a marker: an index between the bracket characters U+27EA and ` +\n `U+27EB. For every part, output its marker line unchanged, then that ` +\n `part's rewrite on the following lines. Rewrite each part on its ` +\n `own, keep the parts in the original order, and never merge two parts ` +\n `into one answer.`\n );\n}\n\nexport class OpenAiCompatibleAdapter implements ITranslationAdapter {\n readonly id = 'openai';\n readonly name = 'OpenAI \u517C\u5BB9 (Chat Completions)';\n\n private credentials: KeyReader;\n\n constructor(credentials: KeyReader) {\n this.credentials = credentials;\n }\n\n isAvailable(config: PluginConfig): boolean {\n return Boolean(config.baseUrl?.trim() && config.model?.trim() && this.credentials.getApiKey());\n }\n\n async translate(\n text: string,\n signal: AbortSignal,\n config: PluginConfig,\n options?: TranslateAdapterOptions\n ): Promise<string> {\n const apiKey = this.credentials.getApiKey();\n if (!apiKey) {\n throw new Error(`TRANSLATE_API_KEY is not configured in ~/.dsh/.credentials.yaml`);\n }\n const baseUrl = (config.baseUrl || '').trim().replace(/\\/+$/, '');\n const model = (config.model || '').trim();\n if (!baseUrl || !model) {\n throw new Error('OpenAI channel: baseUrl or model is not configured');\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n ...(options?.maxTokens === undefined ? {} : { max_tokens: options.maxTokens }),\n messages: [\n { role: 'system', content: buildSystemPrompt(options?.mode ?? 'plain') },\n { role: 'user', content: text },\n ],\n }),\n signal,\n });\n\n if (!response.ok) {\n let detail = '';\n try {\n const errBody = (await response.json()) as { error?: { message?: string }; message?: string };\n detail = errBody?.error?.message || errBody?.message || '';\n } catch {\n // ignore body parse errors\n }\n throw new Error(`OpenAI-compatible API responded with ${response.status}${detail ? `: ${detail}` : ''}`);\n }\n\n const data = (await response.json()) as { choices?: Array<{ message?: { content?: string } }> };\n const content = data?.choices?.[0]?.message?.content;\n const translated = typeof content === 'string' ? content.trim() : '';\n if (!translated) {\n throw new Error('OpenAI-compatible API returned empty content');\n }\n return translated;\n }\n}\n", "\n/** \u6BCF\u6B21\u6253\u5305\u8BF7\u6C42\u91CD\u63B7\u7684 4 \u5B57\u6BCD\u968F\u673A id\uFF1A\u8BA9\u6807\u8BB0\u65E0\u6CD5\u88AB\u5F53\u6210\u8BCD\u3001\u4E5F\u4E0D\u4F1A\u8DE8\u8BF7\u6C42\u649E\u8F66\u3002 */\nfunction randomTokenId(): string {\n let out = '';\n for (let i = 0; i < 4; i++) {\n out += 'abcdefghijklmnopqrstuvwxyz'[Math.floor(Math.random() * 26)];\n }\n return out;\n}\n\n/**\n * \u56DE\u7B54\u6B63\u6587\u7FFB\u8BD1\u7684\u8BF7\u6C42\u9884\u7B97\u3002\u6BCF\u6B21\u8BF7\u6C42\u7684\u8F93\u5165\u4F30\u7B97 token \u4E0A\u9650\uFF0C\u4E0E\u672C\u5730\u670D\u52A1\u7684\n * prefill \u6279\u6B21\uFF08MAX_NUM_BATCHED_TOKENS\uFF09\u4FDD\u6301\u540C\u4E00\u91CF\u7EA7\uFF1B\u8F93\u51FA\u4E0A\u9650\u5199\u8FDB\u8BF7\u6C42\u4F53\u7684\n * max_tokens\uFF0C\u907F\u514D\u957F\u6587\u672C\u628A\u5269\u4F59\u4E0A\u4E0B\u6587\u5168\u90E8\u82B1\u5728\u751F\u6210\u4E0A\u3002\n */\nexport const REPLY_MAX_INPUT_TOKENS = 4096;\nexport const REPLY_MAX_OUTPUT_TOKENS = 8192;\n\n/** \u6C49\u5B57\u4E0E\u5168\u89D2\u6807\u70B9\u6309\u4E00\u5B57\u4E00 token \u8BA1\u3002 */\nconst CJK_CHAR = /[\\u3400-\\u4dbf\\u4e00-\\u9fff\\uf900-\\ufaff\\u3000-\\u303f\\uff00-\\uffef]/;\n\n/**\n * \u4FDD\u5B88\u4F30\u7B97\u4E00\u6BB5\u6587\u672C\u5360\u7528\u7684 token \u6570\uFF1A\u6C49\u5B57\u4E00\u5B57\u4E00 token\uFF0C\u5176\u4F59\u6BCF\u4E09\u4E2A\u5B57\u7B26\u4E00 token\u3002\n * \u5B9E\u6D4B\u672C\u673A hy-mt2-1.8b \u7684\u82F1\u6587\u8BED\u6599\u7EA6\u4E3A\u6BCF 3.3 \u5B57\u7B26\u4E00 token\uFF0C\u8FD9\u91CC\u53D6 3 \u4F5C\u4E3A\u4E0A\u754C\uFF0C\n * \u5B81\u53EF\u628A\u8BF7\u6C42\u5207\u5F97\u6BD4\u5B9E\u9645\u9700\u8981\u66F4\u788E\uFF0C\u4E5F\u4E0D\u8BA9\u670D\u52A1\u7AEF\u6536\u5230\u8D85\u51FA\u9884\u671F\u7684 prefill\u3002\n */\nexport function estimateTokens(text: string): number {\n let cjk = 0;\n for (const char of text) {\n if (CJK_CHAR.test(char)) cjk += 1;\n }\n return cjk + Math.ceil((text.length - cjk) / 3);\n}\n\n/** \u6309\u6355\u83B7\u7EC4\u5206\u9694\u7B26\u5207\u5206\uFF0C\u5E76\u8BA9\u5206\u9694\u7B26\u7559\u5728\u524D\u4E00\u4E2A\u7247\u6BB5\u672B\u5C3E\u3002 */\nfunction splitKeepingSeparator(text: string, pattern: RegExp): string[] {\n const parts = text.split(pattern);\n const chunks: string[] = [];\n for (let index = 0; index < parts.length; index += 2) {\n const content = parts[index] ?? '';\n const separator = parts[index + 1] ?? '';\n if (content === '' && separator === '') continue;\n chunks.push(content + separator);\n }\n return chunks;\n}\n\n/** \u6309\u53E5\u672B\u6807\u70B9\u5207\u5206\uFF0C\u4F5C\u4E3A\u7A7A\u884C\u4E0E\u5355\u884C\u90FD\u5207\u4E0D\u5F00\u65F6\u7684\u6700\u540E\u4E00\u6863\u3002 */\nfunction sentenceChunks(text: string): string[] {\n const chunks = text.match(/[^.!?\u3002\uFF01\uFF1F\\n]+[.!?\u3002\uFF01\uFF1F]*[ \\t]*\\n?/g);\n return chunks === null ? [text] : chunks.filter((chunk) => chunk.length > 0);\n}\n\n/** \u5355\u5757\u5185\u90E8\u627E\u4E0D\u5230\u81EA\u7136\u8FB9\u754C\u65F6\u7684\u515C\u5E95\uFF1A\u6309\u4F30\u7B97 token \u786C\u5207\u3002 */\nfunction hardSlice(text: string, maxTokens: number): string[] {\n const out: string[] = [];\n let current = '';\n let tokens = 0;\n for (const char of text) {\n const cost = CJK_CHAR.test(char) ? 1 : 1 / 3;\n if (current !== '' && tokens + cost > maxTokens) {\n out.push(current);\n current = '';\n tokens = 0;\n }\n current += char;\n tokens += cost;\n }\n if (current !== '') out.push(current);\n return out;\n}\n\n/**\n * \u628A\u4E00\u4E2A\u5757\u5207\u6210\u4E0D\u8D85\u8FC7\u4E0A\u9650\u7684\u7247\u6BB5\uFF1A\u4F18\u5148\u7A7A\u884C\uFF0C\u5176\u6B21\u5355\u884C\uFF0C\u518D\u6B21\u53E5\u672B\uFF0C\u6700\u540E\u786C\u5207\u3002\n * \u7247\u6BB5\u6309\u539F\u987A\u5E8F\u62FC\u56DE\u5373\u4E3A\u8BE5\u5757\u7684\u5B8C\u6574\u8BD1\u6587\u3002\n */\nexport function splitOversizedBlock(\n text: string,\n maxTokens: number = REPLY_MAX_INPUT_TOKENS\n): string[] {\n if (estimateTokens(text) <= maxTokens) return [text];\n\n let chunks = splitKeepingSeparator(text, /(\\n{2,})/);\n if (chunks.length <= 1) chunks = splitKeepingSeparator(text, /(\\n)/);\n if (chunks.length <= 1) chunks = sentenceChunks(text);\n\n const out: string[] = [];\n let current = '';\n for (const chunk of chunks) {\n if (estimateTokens(chunk) > maxTokens) {\n if (current !== '') {\n out.push(current);\n current = '';\n }\n out.push(...hardSlice(chunk, maxTokens));\n continue;\n }\n if (current !== '' && estimateTokens(current + chunk) > maxTokens) {\n out.push(current);\n current = '';\n }\n current += chunk;\n }\n if (current !== '') out.push(current);\n return out;\n}\n\n/** \u628A\u7247\u6BB5\u6309\u539F\u987A\u5E8F\u6253\u5305\u6210\u5C3D\u91CF\u5C11\u7684\u8BF7\u6C42\uFF0C\u4E14\u6BCF\u6279\u4E0D\u8D85\u8FC7\u8F93\u5165\u4E0A\u9650\u3002 */\nexport function packPieces<T extends { text: string }>(\n pieces: T[],\n maxTokens: number = REPLY_MAX_INPUT_TOKENS\n): T[][] {\n const batches: T[][] = [];\n let current: T[] = [];\n let tokens = 0;\n for (const piece of pieces) {\n const cost = estimateTokens(piece.text);\n if (current.length > 0 && tokens + cost > maxTokens) {\n batches.push(current);\n current = [];\n tokens = 0;\n }\n current.push(piece);\n tokens += cost;\n }\n if (current.length > 0) batches.push(current);\n return batches;\n}\n\n/**\n * \u6253\u5305\u6807\u8BB0\uFF1A`\u27EA<4 letters><index>\u27EB`\u2014\u2014\u6253\u5305\u8BF7\u6C42\u7684\u6846\u67B6\uFF0C\u6BCF\u6BB5\u4EE5\u6807\u8BB0\u884C\u5F00\u5934\u3002\n * \u5B83\u53EA\u6D3B\u5728\u4E00\u6B21\u8BF7\u6C42\u7684\u8D1F\u8F7D\u91CC\uFF1B\u8BD1\u6587\u6B8B\u7559 \u27EA\u2026\u27EB \u7531\u5BBF\u4E3B\u76F4\u63A5\u5265\u9664\uFF0C\u4E0D\u6210\u8D25\u56E0\u3002\n */\nexport interface BatchFormat {\n id: string;\n token: (index: number) => string;\n}\n\nexport function createBatchFormat(): BatchFormat {\n const id = randomTokenId();\n return {\n id,\n token: (index: number) => `\u27EA${id}${index}\u27EB`,\n };\n}\n\n/** \u6807\u8BB0\u51FA\u73B0\u5728\u88AB\u7FFB\u8BD1\u6587\u672C\u91CC\u7684\u901A\u7528\u5F62\u72B6\uFF0C\u4E0D\u95EE id\u3002 */\nconst BATCH_TOKEN_PATTERN_SOURCE = '\u27EA([a-z]{4})(\\\\d+)\u27EB';\n\n/** \u6BCF\u4E2A\u7247\u6BB5\u4EE5\u5355\u72EC\u4E00\u884C\u6807\u8BB0\u5F00\u5934\uFF0C\u6BB5\u4E0E\u6BB5\u4E4B\u95F4\u7A7A\u4E00\u884C\u3002 */\nexport function buildBatchPayload(pieces: string[], format: BatchFormat): string {\n return pieces.map((text, index) => `${format.token(index)}\\n${text}`).join('\\n\\n');\n}\n\n/**\n * \u6309\u6807\u8BB0\u628A\u6574\u6279\u8BD1\u6587\u5207\u56DE\u6BCF\u4E2A\u7247\u6BB5\u3002\n *\n * \u5E8F\u53F7\u5FC5\u987B\u6070\u597D\u51FA\u73B0\u4E00\u6B21\u3001\u6309 0..count-1 \u5347\u5E8F\u3001\u6BCF\u6BB5\u975E\u7A7A\uFF0C\u4E14\u4E0D\u5F97\u6DF7\u5165\u5176\u5B83\u6279\u6B21\n * \u7684\u6807\u8BB0\uFF1B\u4EFB\u4F55\u4E00\u6761\u4E0D\u6EE1\u8DB3\u90FD\u8FD4\u56DE null\uFF0C\u7531\u8C03\u7528\u65B9\u4F5C\u5E9F\u6574\u6279\u5E76\u9000\u56DE\u5355\u5757\u91CD\u8BD5\u3002\n */\nexport function splitBatchTranslation(\n translated: string,\n format: BatchFormat,\n count: number\n): string[] | null {\n const pattern = new RegExp(BATCH_TOKEN_PATTERN_SOURCE, 'gu');\n const found: Array<{ index: number; start: number; end: number }> = [];\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(translated)) !== null) {\n if (match[1].toLowerCase() !== format.id.toLowerCase()) return null;\n const index = Number.parseInt(match[2] ?? '', 10);\n if (Number.isNaN(index)) return null;\n found.push({ index, start: match.index, end: match.index + match[0].length });\n }\n if (found.length !== count) return null;\n\n const parts: string[] = [];\n for (let index = 0; index < count; index++) {\n const entry = found[index]!;\n if (entry.index !== index) return null;\n const next = found[index + 1];\n const body = translated.slice(entry.end, next === undefined ? translated.length : next.start).trim();\n if (body === '') return null;\n parts.push(body);\n }\n return parts;\n}\n\n/**\n * \u5265\u9664\u8BD1\u6587\u91CC\u6B8B\u7559\u7684 \u27EA\u2026\u27EB \u6253\u5305\u6807\u8BB0\uFF1A\u6807\u8BB0\u53EA\u662F\u8BF7\u6C42\u811A\u624B\u67B6\uFF0C\u6A21\u578B\u5E26\u56DE\u6765\u5C31\u5220\u6389\u2014\u2014\n * \u5F62\u72B6\u95EE\u9898\u4E0D\u5426\u51B3\u5185\u5BB9\uFF0C\u6B8B\u7559\u4E5F\u4E0D\u518D\u662F\u62D2\u6536\u7406\u7531\u3002\n */\nexport function stripBatchMarkers(text: string): string {\n return text.replace(new RegExp(BATCH_TOKEN_PATTERN_SOURCE, 'gu'), '');\n}\n", "/**\n * \u7ED3\u6784\u91CD\u88C5\u914D\uFF1A\u6B63\u6587\u5757\u7684 markdown \u6309\u7ED3\u6784\u5207\u5F00\uFF0C\u4EE3\u7801\u56F4\u680F\u9010\u5B57\u4FDD\u7559\uFF0C\u6563\u6587\u6BB5\u9001\u6A21\u578B\uFF0C\n * \u56DE\u6765\u540E**\u6309\u539F\u7ED3\u6784\u62FC\u56DE**\u2014\u2014\u300C\u7FFB\u8BD1\u540E markdown \u8BED\u6CD5\u6CA1\u95EE\u9898\u300D\u7531\u6784\u9020\u4E0E\u5F62\u72B6\u6838\u5BF9\u4FDD\u8BC1\uFF1A\n * \u6A21\u578B\u4ECE\u6765\u89C1\u4E0D\u5230\u5360\u4F4D\u7B26\uFF0C\u4E5F\u5C31\u8C08\u4E0D\u4E0A\u5E26\u4E0D\u5E26\u56DE\u3002\n *\n * \u4E09\u4EF6\u4E8B\uFF1A\n * 1. `splitMarkdownSegments`\uFF1A\u628A\u5757\u5207\u6210 code / prose \u6BB5\u7684\u6709\u5E8F\u6E05\u5355\uFF0C\u62FC\u63A5\u6052\u7B49\u4E8E\u539F\u6587\u3002\n * code \u6BB5\uFF08``` \u6216 ~~~ \u56F4\u680F\uFF0C\u542B\u672A\u95ED\u5408\u7684\u5230\u5757\u5C3E\uFF09\u6C38\u4E0D\u9001\u6A21\u578B\uFF1B4 \u7A7A\u683C\u7F29\u8FDB\u4EE3\u7801\u4E0D\n * \u5355\u72EC\u8BC6\u522B\uFF08\u804A\u5929\u6B63\u6587\u91CC\u51E0\u4E4E\u4E0D\u51FA\u73B0\uFF0C\u65E0\u8BB0\u53F7\u884C\u7684\u884C\u9996\u7F29\u8FDB\u7531\u5F62\u72B6\u7B7E\u540D\u515C\u4F4F\uFF0C\n * \u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u5219\u968F\u524D\u7F00\u4FEE\u56DE\uFF09\u3002\n * 2. `lineSignature`\uFF1A\u4E00\u884C markdown \u7684\u7ED3\u6784\u7B7E\u540D\u2014\u2014\u5757\u8BB0\u53F7\u7684**\u7C7B\u522B**\uFF08\u6807\u9898 h\u3001\n * \u5F15\u7528 q\u3001\u65E0\u5E8F\u5217\u8868 l\u3001\u6709\u5E8F\u5217\u8868 n\uFF09\u3001\u65E0\u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u5BBD\u3001\u8868\u683C\u7AD6\u7EBF\u6570\u3001\u94FE\u63A5\u4E2A\u6570\u3002\n * \u8BB0\u53F7\u7684\u5C42\u7EA7\u3001\u5B57\u7B26\u3001\u5E8F\u53F7\u4E0E\u5217\u8868\u7F29\u8FDB\u4E0D\u8FDB\u7B7E\u540D\u2014\u2014\u6E32\u67D3\u7B49\u4EF7\u7684\u6F02\u79FB\u4EA4\u7ED9 repairShape\n * \u4FEE\u56DE\uFF0C\u800C\u4E0D\u662F\u628A\u6574\u5757\u957F\u56DE\u7B54\u4E00\u7968\u5426\u51B3\u3002\u771F\u7834\u6E32\u67D3\u7684\u4ECD\u662F\uFF1A\u6B63\u6587\u884C\u5E76\u62E2/\u62C6\u5F00\u3001\u8868\u683C\n * \u5217\u9519\u4F4D\u3001\u8BB0\u53F7\u6574\u4E2A\u4E22\uFF08\u5217\u8868\u53D8\u6BB5\u843D\uFF09\u3001\u94FE\u63A5\u4E22\u6CA1\u3001\u65E0\u8BB0\u53F7\u884C\u7F29\u8FDB\u6F02\u79FB\uFF08\u53D8\u4EE3\u7801\u5757\uFF09\u3002\n * 3. `restoreLinkTargets`\uFF1A\u94FE\u63A5\u6309\u51FA\u73B0\u5E8F\u5BF9\u9F50\u540E\uFF0C\u628A\u539F\u6587\u7684 URL \u9010\u4E2A\u62FC\u56DE\u8BD1\u6587\u2014\u2014\n * \u6A21\u578B\u53EA\u8BD1 `[\u6587\u5B57]`\uFF0C`(URL)` \u7531\u6784\u9020\u4FDD\u4F4F\u3002\u4E2A\u6570\u4E0D\u7B49\u5728\u7B7E\u540D\u6838\u5BF9\u91CC\u5DF2\u7ECF\u51FA\u5C40\u3002\n * \u5F15\u7528\u5F0F\u5B9A\u4E49\u884C `[id]: URL` \u540C\u8D26\uFF1A\u8BA1\u6570\u8FDB\u7B7E\u540D\u3001\u76EE\u6807\u7531\u56DE\u586B\u4FDD\u4F4F\u3002\n * 4. `repairShape`\uFF1A\u6838\u5BF9\u4E0E\u4FEE\u5F62\u4E00\u6B21\u8FC7\u2014\u2014\u7A7A\u884C\u6F02\u79FB\u6309\u539F\u6587\u5E03\u5C40\u91CD\u6392\uFF08\u5F31\u6A21\u578B\u6700\u7231\n * \u541E\u7A7A\u884C\uFF0C\u975E\u7A7A\u884C\u7B7E\u540D\u5BF9\u5F97\u4E0A\u5C31\u4E0D\u7B97\u7834\u635F\uFF09\uFF0C\u884C\u9996\u300C\u524D\u5BFC\u7A7A\u767D + \u5757\u8BB0\u53F7\u300D\u9010\u884C\u6362\n * \u56DE\u539F\u6587\u540C\u6B3E\uFF08`##`\u2192`###`\u3001`-`\u2192`*`\u3001\u5E8F\u53F7\u3001\u5F15\u7528\u6DF1\u5EA6\u3001\u5217\u8868\u7F29\u8FDB\u7684\u6F02\u79FB\u5C31\u6B64\n * \u6D88\u5931\uFF09\u3002\u4FEE\u4E0D\u4E86\u624D\u56DE\u62A5\u9519\u8BEF\u884C\u4E0E\u7406\u7531\uFF0C\u8FDB content \u8D25\u56E0\u7684\u60AC\u505C\u6587\u6848\u3002\n */\n\nexport interface MarkdownSegment {\n readonly kind: 'prose' | 'code';\n readonly text: string;\n}\n\nconst FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})/;\n// \\r \u5BB9\u5FCD\uFF1ACRLF \u6B63\u6587\u7684\u95ED\u5408\u56F4\u680F\u884C\u4EE5 \\r\\n \u7ED3\u675F\uFF0C\u4E0D\u5BB9\u5B83\u4F1A\u628A ``` \u4E4B\u540E\u6574\u5757\u8BEF\u5224\u6210\n// \u300C\u672A\u95ED\u5408\u5230\u5757\u5C3E\u300D\u9010\u5B57\u4FDD\u7559\u2014\u2014\u6563\u6587\u6CA1\u9001\u6A21\u578B\u8FD8\u65E0\u4EBA\u62A5\u8B66\uFF08\u5BA1\u67E5\u5B9E\u6D4B\u7684\u5751\uFF09\u3002\nconst FENCE_CLOSE = /^ {0,3}(`{3,}|~{3,})[ \\t]*\\r?$/;\n\n/** CommonMark \u7684\u95ED\u5408\u56F4\u680F\uFF1A\u540C\u79CD\u5B57\u7B26\u3001\u4E0D\u77ED\u4E8E\u5F00\u5934\u3002 */\nfunction closesFence(open: string, line: string): boolean {\n const close = FENCE_CLOSE.exec(line);\n if (!close) return false;\n const marker = close[1] ?? '';\n return marker[0] === open[0] && marker.length >= open.length;\n}\n\n/**\n * \u628A\u5757\u5207\u6210\u6709\u5E8F\u6BB5\u6E05\u5355\uFF1B`segments.map(s => s.text).join('') === text` \u6052\u6210\u7ACB\u3002\n * \u6BCF\u6BB5\u5E26\u7740\u81EA\u5DF1\u884C\u5C3E\u7684\u6362\u884C\u7ED3\u675F\uFF08\u6BB5\u4E0E\u6BB5\u4E4B\u95F4\u4E0D\u5B58\u5728\u4E22\u5931\u7684\u5206\u9694\u7B26\uFF09\uFF0C\u6240\u4EE5\u6563\u6587\u6BB5\u7684\n * \u5934\u5C3E\u7A7A\u767D\u5929\u7136\u5305\u542B\u6BB5\u95F4\u8DDD\uFF0C\u91CD\u88C5\u914D\u9010\u5B57\u62FC\u5F97\u56DE\u3002\n */\nexport function splitMarkdownSegments(text: string): MarkdownSegment[] {\n const segments: MarkdownSegment[] = [];\n const lines = text.split('\\n');\n let start = 0;\n let offset = 0;\n let fence: string | null = null;\n let kind: 'prose' | 'code' = 'prose';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const last = i === lines.length - 1;\n const lineEnd = offset + line.length + (last ? 0 : 1);\n if (fence === null) {\n const open = FENCE_OPEN.exec(line);\n if (open) {\n if (offset > start) segments.push({ kind: 'prose', text: text.slice(start, offset) });\n start = offset;\n kind = 'code';\n fence = open[1] ?? '```';\n }\n } else if (closesFence(fence, line)) {\n segments.push({ kind: 'code', text: text.slice(start, lineEnd) });\n start = lineEnd;\n kind = 'prose';\n fence = null;\n }\n offset = lineEnd;\n }\n if (text.length > start) segments.push({ kind, text: text.slice(start) });\n return segments;\n}\n\n// \u884C\u9996\u5F62\u72B6\u524D\u7F00\uFF08\u5168\u5339\u914D = \u524D\u5BFC\u7A7A\u767D + \u5757\u8BB0\u53F7\uFF0C\u6355\u83B7\u7EC4 = \u8BB0\u53F7\u672C\u4F53\uFF09\uFF1A\u5D4C\u5957\u5217\u8868\u7684\n// \u7F29\u8FDB\u8BB0\u53F7\u884C\u4E5F\u8BA4\u2014\u2014\u7B7E\u540D\u6309\u7C7B\u522B\u653E\u884C\uFF0C\u7F29\u8FDB\u968F\u524D\u7F00\u4E00\u8D77\u4FEE\u56DE\u3002\nconst LINE_SHAPE_PREFIX = /^[ \\t]*(#{1,6}[ \\t]|>+[ \\t]?|[-*+][ \\t]|\\d{1,3}[.)][ \\t])/;\n// \u94FE\u63A5\u76EE\u6807\u5141\u8BB8\u4E00\u5C42\u5E73\u8861\u62EC\u53F7\uFF08CommonMark \u88F8\u76EE\u6807\u89C4\u5219\uFF09\uFF0C\u6355\u83B7\u7EC4\u53D6\u5230\u5B8C\u6574 URL\u3002\nconst LINK_SPAN = /\\[[^\\]]*\\]\\(((?:[^()]|\\([^()]*\\))*)\\)/g;\n// \u5F15\u7528\u5F0F\u5B9A\u4E49\u884C `[id]: URL`\uFF1A\u4E0E\u5185\u8054\u94FE\u63A5\u540C\u8D26\u2014\u2014\u8BA1\u6570\u8FDB\u7B7E\u540D\u3001\u76EE\u6807\u7531\u56DE\u586B\u4FDD\u4F4F\u3002\nconst LINK_DEF_LINE = /^( {0,3}\\[[^\\]]+\\]:[ \\t]*)(\\S+)([ \\t]*\\r?)$/;\n\n/** \u8BB0\u53F7\u7C7B\u522B\uFF1A\u6807\u9898 h\u3001\u5F15\u7528 q\u3001\u65E0\u5E8F\u5217\u8868 l\u3001\u6709\u5E8F\u5217\u8868 n\uFF1B\u5C42\u7EA7\u4E0E\u5B57\u7B26\u4E0D\u8FDB\u7C7B\u522B\u3002 */\nfunction markerClass(marker: string): string {\n if (marker === '') return '';\n const head = marker[0]!;\n if (head === '#') return 'h';\n if (head === '>') return 'q';\n if (head === '-' || head === '*' || head === '+') return 'l';\n return 'n';\n}\n\n/**\n * \u4E00\u884C\u7684\u7ED3\u6784\u7B7E\u540D\uFF1B\u4E24\u884C\u7B7E\u540D\u76F8\u7B49 \u21D4 \u7ED3\u6784\u89D2\u8272\u76F8\u7B49\u3002\n * \u53CD\u5F15\u53F7\u4E0D\u5728\u7B7E\u540D\u91CC\uFF1A\u884C\u5185\u4EE3\u7801\u662F\u6837\u5F0F\u4E0D\u662F\u9AA8\u67B6\uFF0C\u589E\u51CF\u4E00\u5BF9\u4E0D\u7834\u6E32\u67D3\uFF08\u70B9\u539F\u6587\u4E00\u952E\n * \u53EF\u56DE\uFF09\uFF0C\u62E6\u5B83\u53EA\u4F1A\u628A\u80FD\u770B\u7684\u8BD1\u6587\u6253\u6210\u7EA2\u7EBF\u3002\u884C\u5C3E \\r \u540C\u6837\u4E0D\u8FDB\u7B7E\u540D\u2014\u2014\u6A21\u578B\u628A\n * CRLF \u5F52\u4E00\u6210 LF \u662F\u6E32\u67D3\u65E0\u611F\u7684\u6539\u5199\uFF0C\u4E0D\u8BE5\u62E6\u3002\u5757\u8BB0\u53F7\u53EA\u8BA4\u7C7B\u522B\uFF1A`##`\u2192`###`\u3001\n * `-`\u2192`*`\u3001\u5E8F\u53F7\u4E0E\u5F15\u7528\u6DF1\u5EA6\u7684\u6F02\u79FB\u7531 restoreLineShapes \u62FC\u56DE\u539F\u6837\uFF0C\u4E0D\u503C\u5F97\u62D2\u6536\n * \u6574\u5757\uFF1B\u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u4E5F\u4E0D\u8FDB\u7B7E\u540D\uFF08\u5B83\u5C5E\u4E8E\u4F1A\u88AB\u4FEE\u56DE\u7684\u524D\u7F00\uFF09\uFF0C\u65E0\u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u4ECD\u662F\n * \u786C\u5224\u636E\u2014\u2014\u51ED\u7A7A\u591A\u51FA\u56DB\u4E2A\u7A7A\u683C\u4F1A\u628A\u6BB5\u843D\u53D8\u6210\u4EE3\u7801\u5757\u3002\n */\nfunction lineSignature(line: string): string {\n const marker = LINE_SHAPE_PREFIX.exec(line)?.[1]?.trim() ?? '';\n const cls = markerClass(marker);\n const indent =\n cls === '' ? (/^[ \\t]*/.exec(line) ?? [''])[0].replace(/\\t/g, ' ').length : 'i';\n const pipes = (line.match(/\\|/g) ?? []).length;\n const links = (line.match(LINK_SPAN) ?? []).length + (LINK_DEF_LINE.test(line) ? 1 : 0);\n return `${indent}|${cls}|${pipes}|${links}`;\n}\n\n/** \u5F62\u72B6\u6838\u5BF9\u7684\u53EA\u8BFB\u9519\u8BEF\u89C6\u56FE\uFF1ArepairShape \u7684 error \u4FA7\u3002null = \u53EF\u6210\u7ACB\u3002 */\nexport function shapeMismatch(original: string, translated: string): string | null {\n return repairShape(original, translated).error;\n}\n\nexport interface ShapeRepair {\n /** \u4FEE\u597D\u7684\u6587\u672C\uFF1A\u539F\u6587\u9AA8\u67B6\uFF08\u7A7A\u884C\u5E03\u5C40 + \u884C\u9996\u524D\u7F00\uFF09+ \u8BD1\u6587\u6B63\u6587\uFF1Bnull = \u4FEE\u4E0D\u4E86\u3002 */\n text: string | null;\n /** \u4FEE\u4E0D\u4E86\u65F6\u7684\u4E00\u53E5\u7406\u7531\uFF0C\u76F4\u63A5\u8FDB\u60AC\u505C\u6587\u6848\u3002 */\n error: string | null;\n}\n\nfunction isBlankLine(line: string): boolean {\n return line.trim() === '';\n}\n\nfunction indentWidth(line: string): number {\n return (/^[ \\t]*/.exec(line) ?? [''])[0].replace(/\\t/g, ' ').length;\n}\n\n/**\n * \u7ED3\u6784\u884C = \u4E0D\u53EF\u91CD\u6392\u7684\u884C\uFF1A\u5E26\u5757\u8BB0\u53F7\uFF08\u6807\u9898/\u5F15\u7528/\u5217\u8868\uFF09\u3001\u542B\u7AD6\u7EBF\uFF08\u8868\u683C\u884C\uFF09\u3001\n * \u5F15\u7528\u5F0F\u5B9A\u4E49\u884C\u3001\u7F29\u8FDB >3 \u7684\u7F29\u8FDB\u4EE3\u7801\u3002\u5176\u4F59\u975E\u7A7A\u884C\u662F\u6563\u6587\u884C\u2014\u2014\u8F6F\u6362\u884C\u5BF9\u6E32\u67D3\n * \u4E0D\u53EF\u89C1\uFF0C\u8BD1\u6587\u7231\u5E76\u6210\u4E00\u884C\u8FD8\u662F\u62C6\u6210\u51E0\u884C\u90FD\u968F\u5B83\u3002\n */\nfunction isStructuralLine(line: string): boolean {\n if (isBlankLine(line)) return false;\n return (\n LINE_SHAPE_PREFIX.test(line) ||\n line.includes('|') ||\n LINK_DEF_LINE.test(line) ||\n indentWidth(line) > 3\n );\n}\n\n/** \u8FDE\u7EED\u975E\u7A7A\u884C = \u4E00\u4E2A\u6BB5\u843D\u5757\uFF1B\u5757\u7684\u6570\u91CF\u4E0E\u987A\u5E8F\u5C31\u662F markdown \u7684\u9AA8\u67B6\u3002 */\nfunction paragraphBlocks(text: string): string[][] {\n const blocks: string[][] = [];\n let cur: string[] | null = null;\n for (const line of text.split('\\n')) {\n if (isBlankLine(line)) {\n if (cur !== null) blocks.push(cur);\n cur = null;\n } else {\n (cur ??= []).push(line);\n }\n }\n if (cur !== null) blocks.push(cur);\n return blocks;\n}\n\nfunction blockLinks(block: readonly string[]): number {\n let n = 0;\n for (const line of block) {\n n += (line.match(LINK_SPAN) ?? []).length + (LINK_DEF_LINE.test(line) ? 1 : 0);\n }\n return n;\n}\n\n/** \u5355\u884C\u4FEE\u5F62\uFF1A\u7B7E\u540D\u6838\u5BF9\u5DF2\u4FDD\u8BC1\u4E24\u4FA7\u540C\u89D2\u8272\uFF0C\u628A\u8BD1\u6587\u884C\u9996\u6362\u6210\u539F\u6587\u540C\u6B3E\u524D\u7F00\u3002 */\nfunction spliceLineShape(want: string, got: string): string {\n const w = LINE_SHAPE_PREFIX.exec(want);\n if (w === null) return got;\n const g = LINE_SHAPE_PREFIX.exec(got);\n if (g === null || markerClass((w[1] ?? '').trim()) !== markerClass((g[1] ?? '').trim())) {\n return got;\n }\n return `${w[0]}${got.slice(g[0].length)}`;\n}\n\n/**\n * \u5F62\u72B6\u4FEE\u590D\uFF1A\u6838\u5BF9\u4E0E\u4FEE\u5F62\u4E00\u6B21\u8FC7\uFF0C\u80FD\u4FEE\u7684\u7EDD\u4E0D\u6210\u8D25\u56E0\u3002\u9AA8\u67B6\u6309**\u6BB5\u843D\u5757**\u5BF9\u9F50\u2014\u2014\n * 1. \u5757\u6570\u5FC5\u987B\u76F8\u7B49\uFF08\u6A21\u578B\u628A\u4E24\u6BB5\u5E76\u62E2\u3001\u6216\u628A\u4E00\u6BB5\u5288\u5F00\uFF0C\u624D\u662F\u771F\u7834\u635F\uFF09\uFF1B\u7A7A\u884C\u5E03\u5C40\n * \u4E00\u5F8B\u53D6\u539F\u6587\u2014\u2014\u6A21\u578B\u541E\u7A7A\u884C\u3001\u591A\u7A7A\u884C\u90FD\u88AB\u91CD\u6392\u6D88\u5316\u3002\n * 2. \u5757\u5185**\u7ED3\u6784\u884C**\u9010\u4E00\u5BF9\u9F50\uFF08\u8BB0\u53F7\u7C7B\u522B\u3001\u8868\u683C\u7AD6\u7EBF\u6570\u3001\u94FE\u63A5\u4E2A\u6570\u3001\u7F29\u8FDB\u4EE3\u7801\u7684\n * \u7F29\u8FDB\uFF09\uFF0C\u884C\u9996\u524D\u7F00\u4FEE\u56DE\u539F\u6587\u540C\u6B3E\uFF1A`##`\u2192`###`\u3001`-`\u2192`*`\u3001\u5E8F\u53F7\u3001\u5F15\u7528\u6DF1\u5EA6\u3001\n * \u5217\u8868\u7F29\u8FDB\u7684\u6F02\u79FB\u5C31\u6B64\u6D88\u5931\u3002\n * 3. \u5757\u5185**\u6563\u6587\u884C\u81EA\u7531\u91CD\u6392**\uFF1A\u5F31\u6A21\u578B\u628A\u786C\u6298\u884C\u7684\u82F1\u6587\u6BB5\u843D\u8BD1\u6210\u4E00\u6574\u884C\u4E2D\u6587\u662F\u5E38\u6001\uFF0C\n * \u8F6F\u6362\u884C\u6E32\u67D3\u65E0\u611F\uFF1B\u53EA\u67E5\u6574\u5757\u7684\u94FE\u63A5\u603B\u6570\u4E0D\u4E22\u2014\u2014\u91CD\u6392\u541E\u4E0D\u6389 `[\u6587\u5B57](URL)`\u3002\n * 4. \u5757\u9996\u884C\u7684\u7ED3\u6784/\u6563\u6587\u5C5E\u6027\u4E0D\u5F97\u4E92\u6362\uFF1A\u6BB5\u843D\u88AB\u5E76\u8FDB\u5217\u8868\u9879\uFF08\u6216\u53CD\u4E4B\uFF09\u662F\u6E32\u67D3\u7834\u635F\u3002\n */\nexport function repairShape(original: string, translated: string): ShapeRepair {\n const wantLines = original.split('\\n');\n const gotLines = translated.split('\\n');\n const wantBlocks = paragraphBlocks(original);\n let gotBlocks = paragraphBlocks(translated);\n if (wantBlocks.length !== gotBlocks.length) {\n // \u7A7A\u884C\u6F02\u79FB\u6539\u4E86\u5757\u6570\uFF1A\u975E\u7A7A\u884C\u82E5\u9010\u884C\u7B7E\u540D 1:1 \u5BF9\u5F97\u4E0A\uFF0C\u6309\u539F\u6587\u7684\u975E\u7A7A\u884C\u4F4D\u91CD\u6392\u3002\n const wantFilled = wantLines.filter((line) => !isBlankLine(line));\n const gotFilled = gotLines.filter((line) => !isBlankLine(line));\n if (wantFilled.length !== gotFilled.length) {\n return { text: null, error: `line count changed (${wantLines.length} -> ${gotLines.length})` };\n }\n for (let index = 0; index < wantFilled.length; index++) {\n const sw = lineSignature(wantFilled[index] ?? '');\n const sg = lineSignature(gotFilled[index] ?? '');\n if (sw !== sg) {\n return { text: null, error: `structure changed at line ${index + 1} (${sw} -> ${sg})` };\n }\n }\n let cursor = 0;\n gotBlocks = wantBlocks.map((block) => block.map(() => gotFilled[cursor++] ?? ''));\n }\n // \u9010\u5757\u6838\u5BF9 + \u4FEE\u5F62\u3002hint \u662F\u539F\u6587\u884C\u6807\u6E38\u6807\uFF0C\u6307\u5411\u5F53\u524D\u5757\u9996\u884C\u3002\n const repaired: string[][] = [];\n let hint = 0;\n for (let index = 0; index < wantBlocks.length; index++) {\n const wb = wantBlocks[index]!;\n const gb = gotBlocks[index] ?? [];\n while (hint < wantLines.length && wantLines[hint] !== wb[0]) hint++;\n const start = hint + 1;\n const wStruct = wb.filter(isStructuralLine);\n const gStruct = gb.filter(isStructuralLine);\n if (wStruct.length !== gStruct.length) {\n return { text: null, error: `structure changed at line ${start} (markers ${wStruct.length} -> ${gStruct.length})` };\n }\n if (isStructuralLine(wb[0] ?? '') !== isStructuralLine(gb[0] ?? '')) {\n return { text: null, error: `structure changed at line ${start} (block start swapped)` };\n }\n if (blockLinks(wb) !== blockLinks(gb)) {\n return { text: null, error: `structure changed at line ${start} (links ${blockLinks(wb)} -> ${blockLinks(gb)})` };\n }\n for (let k = 0; k < wStruct.length; k++) {\n const sw = lineSignature(wStruct[k] ?? '');\n const sg = lineSignature(gStruct[k] ?? '');\n if (sw !== sg) {\n return { text: null, error: `structure changed at line ${start} (${sw} -> ${sg})` };\n }\n }\n let cursor = 0;\n repaired.push(\n gb.map((line) => {\n if (!isStructuralLine(line)) return line;\n return spliceLineShape(wStruct[cursor++] ?? line, line);\n })\n );\n hint += wb.length;\n }\n // \u91CD\u88C5\u914D\uFF1A\u7A7A\u884C\u5E03\u5C40\u53D6\u539F\u6587\uFF0C\u6B63\u6587\u5757\u6309\u5E8F\u653E\u4FEE\u597D\u7684\u8BD1\u6587\u884C\u3002\n const out: string[] = [];\n let bi = 0;\n let inBlock = false;\n for (const line of wantLines) {\n if (isBlankLine(line)) {\n inBlock = false;\n out.push(line);\n continue;\n }\n if (!inBlock) {\n out.push(...(repaired[bi++] ?? [line]));\n inBlock = true;\n }\n }\n return { text: out.join('\\n'), error: null };\n}\n\n/**\n * \u628A\u539F\u6587\u7684\u94FE\u63A5\u76EE\u6807\u9010\u4E2A\u62FC\u56DE\u8BD1\u6587\uFF1A\u5185\u8054 `[\u6587\u5B57](URL)` \u4E0E\u5F15\u7528\u5F0F\u5B9A\u4E49\u884C `[id]: URL`\n * \u90FD\u7B97\u2014\u2014\u4E24\u4FA7\u5DF2\u6309\u7B7E\u540D\u6838\u5BF9\u786E\u8BA4\u7B49\u6570\uFF0C\u6309\u51FA\u73B0\u5E8F\u5BF9\u9F50\uFF0C\u8BD1\u6587\u53EA\u8D21\u732E `[\u6587\u5B57]` \u4E0E\u6392\u7248\u3002\n */\nexport function restoreLinkTargets(original: string, translated: string): string {\n const urls: string[] = [];\n for (const match of original.matchAll(LINK_SPAN)) urls.push(match[1] ?? '');\n let out = translated;\n if (urls.length > 0) {\n let cursor = 0;\n out = out.replace(LINK_SPAN, (span: string) => {\n // \u76EE\u6807\u6BB5\u7684\u5F00\u62EC\u53F7\u951A\u5728 `]` \u4E4B\u540E\uFF1AURL \u91CC\u5E26\u62EC\u53F7\u65F6 lastIndexOf('(') \u4F1A\u54AC\u8FDB\n // URL \u5185\u90E8\uFF0C\u628A\u56DE\u586B\u53D8\u6210\u62FC\u63A5\u3002\n const open = span.indexOf('(', span.lastIndexOf(']'));\n const close = span.lastIndexOf(')');\n const url = urls[cursor++] ?? '';\n return `${span.slice(0, open + 1)}${url}${span.slice(close)}`;\n });\n }\n const defs: string[] = [];\n for (const line of original.split('\\n')) {\n const def = LINK_DEF_LINE.exec(line);\n if (def) defs.push(def[2] ?? '');\n }\n if (defs.length > 0) {\n let cursor = 0;\n out = out\n .split('\\n')\n .map((line: string) => {\n const def = LINK_DEF_LINE.exec(line);\n if (!def) return line;\n return `${def[1] ?? ''}${defs[cursor++] ?? def[2] ?? ''}${def[3] ?? ''}`;\n })\n .join('\\n');\n }\n return out;\n}\n\n/**\n * \u4E24\u4FA7\u94FE\u63A5\u603B\u6570\u662F\u5426\u76F8\u7B49\u2014\u2014\u56DE\u586B\u7684\u524D\u7F6E\u6761\u4EF6\uFF1A\u7B49\u6570\u624D\u8C08\u5F97\u4E0A\u6309\u51FA\u73B0\u5E8F\u5BF9\u9F50\uFF1B\n * \u4E0D\u7B49\u65F6\u56DE\u586B\u4F1A\u628A\u539F\u6587 URL \u4E32\u5230\u9519\u7684\u94FE\u63A5\u4E0A\uFF0C\u5B81\u53EF\u4E0D\u56DE\u586B\u3002\n */\nexport function linkCountsMatch(a: string, b: string): boolean {\n return blockLinks(a.split('\\n')) === blockLinks(b.split('\\n'));\n}\n\n/**\n * \u53EA\u4FEE\u5F62\u4E0D\u6838\u5BF9\u7684\u65E7\u53E3\uFF1A\u8F6C\u624B repairShape\u2014\u2014\u884C\u9996\u524D\u7F00\u4FEE\u56DE\u4E0E\u7A7A\u884C\u91CD\u6392\u90FD\u5728\u90A3\u91CC\u3002\n * \u4FEE\u4E0D\u4E86\u65F6\u539F\u6837\u8FD4\u56DE\uFF08\u8C03\u7528\u65B9\u81EA\u5DF1\u5148\u770B repairShape \u7684 error\uFF09\u3002\n */\nexport function restoreLineShapes(original: string, translated: string): string {\n return repairShape(original, translated).text ?? translated;\n}\n", "import { describeError } from '../describe-error.ts';\nimport type {\n ITranslationAdapter,\n PluginConfig,\n ReplyBlockResult,\n} from './types.ts';\nimport type { ConfigManager } from './config.ts';\nimport { LruDiskCache } from './cache.ts';\nimport type { KeyReader } from './credentials.ts';\nimport { OpenAiCompatibleAdapter } from './adapters/openai.ts';\nimport {\n buildBatchPayload,\n createBatchFormat,\n packPieces,\n splitBatchTranslation,\n splitOversizedBlock,\n stripBatchMarkers,\n REPLY_MAX_OUTPUT_TOKENS,\n} from './pipeline/blocks.ts';\nimport {\n linkCountsMatch,\n repairShape,\n restoreLinkTargets,\n splitMarkdownSegments,\n} from './pipeline/segments.ts';\n\n/**\n * The one and only channel id for the reply path: the adapter registry keys on\n * it, so a test can swap the adapter without the reply path losing track of\n * which adapter serves it.\n */\nconst CHANNEL_ID = 'openai';\n\n/**\n * \u6B63\u6587\u7684\u4E00\u4E2A\u5F85\u7FFB\u8BD1\u7247\u6BB5\uFF1A\u6240\u5C5E\u5757\u3001\u5757\u5185\u7247\u6BB5\u5E8F\u53F7\uFF0C\u4EE5\u53CA\u62C6\u51FA\u6765\u7684\u5934\u5C3E\u7A7A\u767D\u4E0E\u6838\u5FC3\u6587\u672C\n * \uFF08`text` \u5373\u6838\u5FC3\uFF0C\u4E0E\u6253\u5305\u5668\u7684\u9884\u7B97\u5B57\u6BB5\u540C\u540D\uFF09\u3002\u5934\u5C3E\u7A7A\u767D\u7531\u91CD\u88C5\u914D\u539F\u6837\u62FC\u56DE\u2014\u2014\u6A21\u578B\n * \u7231\u541E\u884C\u5C3E\u7A7A\u884C\uFF0C\u6BB5\u95F4\u8DDD\u4E0D\u80FD\u6307\u671B\u5B83\u5E26\u56DE\uFF1B\u9001\u6A21\u578B\u4E0E\u505A\u5F62\u72B6\u6838\u5BF9\u7684\u90FD\u53EA\u6709 `text`\u3002\n */\ninterface ReplyPiece {\n block: number;\n index: number;\n text: string;\n head: string;\n tail: string;\n}\n\n/** \u7247\u6BB5\u5728\u7ED3\u679C\u6620\u5C04\u91CC\u7684\u952E\u3002 */\nfunction replyPieceKey(piece: { block: number; index: number }): string {\n return `${piece.block}:${piece.index}`;\n}\n\n/** \u5757\u7684\u4E00\u4E2A\u62FC\u88C5\u90E8\u4EF6\uFF1A\u9010\u5B57\u4FDD\u7559\u6BB5\uFF08\u4EE3\u7801\u56F4\u680F\u3001\u7EAF\u7A7A\u767D\u6BB5\u3001\u7247\u6BB5\u5934\u5C3E\u53E6\u5B58\uFF09\u6216\u7247\u6BB5\u5F15\u7528\u3002 */\ntype BlockPart = { verbatim: string } | { piece: number };\n\n/**\n * \u7247\u6BB5\u5931\u8D25\u8D26\u672C\uFF1ApieceKey \u2192 \u4E00\u53E5\u6280\u672F\u7EC6\u8282\uFF08\u8FDB\u60AC\u505C\u6587\u6848\uFF09\u3002\u53EA\u6709\u901A\u9053\u4F24\u4F1A\u7559\u8D26\u2014\u2014\n * \u8BD1\u6587\u5F62\u72B6\u95EE\u9898\u7531\u4FEE\u590D\u3001\u91CD\u63B7\u3001\u7167\u6536\u4E09\u5C42\u6D88\u5316\uFF0C\u4E0D\u518D\u662F\u5426\u51B3\u7406\u7531\u3002\u4ECE\u672A\u8BB0\u8D26\u7684\u7F3A\u5931\n * \u515C\u5E95\u4E3A\u300C\u6CA1\u8BD1\u56DE\u6765\u300D\uFF0C\u56E0\u4E3A\u8BF4\u4E0D\u51FA\u7EC6\u8282\u65F6\u8FD9\u5C31\u662F\u6700\u8BDA\u5B9E\u7684\u63CF\u8FF0\u3002\n */\ntype FailureLedger = Map<string, string>;\n\nfunction recordLedgerFailure(ledger: FailureLedger, keys: readonly string[], detail: string): void {\n for (const key of keys) {\n if (!ledger.has(key)) ledger.set(key, detail);\n }\n}\n\n/** \u5757\u8D25\u56E0\u7EC6\u8282\uFF1A\u53D6\u7B2C\u4E00\u4E2A\u8BF4\u5F97\u51FA\u8BDD\u7684\u7F3A\u5931\u7247\u6BB5\u3002 */\nfunction blockFailureDetail(ledger: FailureLedger, block: number, missing: readonly number[]): string {\n for (const index of missing) {\n const detail = ledger.get(replyPieceKey({ block, index }));\n if (detail !== undefined) return detail;\n }\n return 'no translation came back';\n}\n\n/** \u628A\u4E00\u6BB5\u6587\u672C\u62C6\u6210 {head, core, tail}\uFF1Bcore \u4E3A\u5168\u7A7A\u767D\u65F6\u8FD4\u56DE null\uFF08\u6574\u6BB5\u9010\u5B57\u4FDD\u7559\uFF09\u3002 */\nfunction stripEdges(chunk: string): { core: string; head: string; tail: string } | null {\n const head = /^[ \\t\\r\\n]*/.exec(chunk)![0];\n if (head.length >= chunk.length) return null;\n const body = chunk.slice(head.length);\n const tail = /[ \\t\\r\\n]*$/.exec(body)![0];\n const core = body.slice(0, body.length - tail.length);\n return core === '' ? null : { core, head, tail };\n}\n\nexport class TranslationDispatcher {\n private configManager: ConfigManager;\n private cache: LruDiskCache;\n private adapters = new Map<string, ITranslationAdapter>();\n /** \u6B63\u6587\u8BF7\u6C42\u7684\u4E32\u884C\u961F\u5217\u5C3E\uFF0C\u4FDD\u8BC1\u540C\u65F6\u6700\u591A\u4E00\u4E2A\u5728\u9014\u8BF7\u6C42\u3002 */\n private replyTail: Promise<void> = Promise.resolve();\n\n constructor(configManager: ConfigManager, cache: LruDiskCache, credentials?: KeyReader) {\n this.configManager = configManager;\n this.cache = cache;\n\n // \u6B63\u6587\u53EA\u6709\u4E00\u6761\u901A\u9053\u3002map \u4ECD\u6309 id \u7D22\u5F15\uFF0C\u6D4B\u8BD5\u53EF\u4EE5\u6362\u6210\u540C id \u7684\u5047\u9002\u914D\u5668\u3002\n this.registerAdapter(new OpenAiCompatibleAdapter(credentials ?? { getApiKey: () => '' }));\n }\n\n private registerAdapter(adapter: ITranslationAdapter): void {\n this.adapters.set(adapter.id, adapter);\n }\n\n /**\n * \u7FFB\u8BD1\u56DE\u7B54\u6B63\u6587\u7684\u5757\uFF1A\u672C\u6B21\u552F\u4E00\u7684\u7FFB\u8BD1\u5165\u53E3\u3002\n *\n * \u6BCF\u4E2A\u5757\u5148\u6309 markdown \u7ED3\u6784\u5207\u6210\u6BB5\uFF1A\u4EE3\u7801\u56F4\u680F\u4E0E\u7EAF\u7A7A\u767D\u6BB5**\u9010\u5B57\u4FDD\u7559\u3001\u6C38\u4E0D\u9001\n * \u6A21\u578B**\uFF1B\u6563\u6587\u6BB5\u518D\u6309\u8F93\u5165\u4E0A\u9650\u5207\u7247\u3001\u5404\u81EA\u6210\u7247\u6BB5\u3002\u76F8\u90BB\u7247\u6BB5\u6253\u5305\u6210\u4E00\u4E2A\u8BF7\u6C42\uFF1B\u6574\u6279\n * \u5931\u8D25\u65F6\u9000\u56DE\u9010\u7247\u6BB5\u5355\u53D1\u3002\u6BCF\u4E2A\u7247\u6BB5\u7684\u8BD1\u6587\u8FC7 `repairShape`\uFF08\u6BB5\u843D\u5757\u5BF9\u9F50 + \u524D\u7F00\n * \u4FEE\u56DE + \u7A7A\u884C\u91CD\u6392\uFF09\u5E76\u901A\u8FC7\u94FE\u63A5\u76EE\u6807\u56DE\u586B\u624D\u7B97\u4FEE\u597D\u3002\n *\n * **\u5F62\u72B6\u95EE\u9898\u4E0D\u5426\u51B3\u5185\u5BB9**\uFF1A\u4FEE\u4E0D\u597D\u7684\u7247\u6BB5\u81EA\u52A8\u91CD\u63B7\u4E00\u6B21\uFF1B\u518D\u4FEE\u4E0D\u597D\u5C31\u7167\u6536\u6A21\u578B\u7684\n * \u8BD1\u6587\uFF08\u94FE\u63A5\u6570\u4E0D\u7B49\u65F6\u4E0D\u56DE\u586B\uFF0C\u5176\u4F59\u539F\u6837\uFF09\u2014\u2014\u539F\u6587\u4E00\u952E\u53EF\u56DE\uFF0C\u53EF\u8BFB\u7684\u8BD1\u6587\u4F18\u5148\u4E8E\n * \u4E00\u6839\u7EA2\u7EBF\u3002\u5931\u8D25\u53EA\u5269\u901A\u9053\u4F24\u4E00\u79CD\uFF1A\u8D85\u65F6\u3001\u65AD\u6D41\u3001\u7A7A\u8FD4\u56DE\uFF0C\u7EA2\u5B9E\u7EBF + \u60AC\u505C\u62A5\u7EC6\u8282\uFF0C\n * \u6551\u6D3B\u7531\u7528\u6237\u7684\u70B9\u51FB\u53D1\u8D77\u3002\n *\n * \u8C03\u7528\u65B9\u4F20\u8FDB\u6765\u7684\u6BCF\u4E2A\u5757\u8981\u4E48\u6574\u5757\u8BD1\u51FA\u3001\u8981\u4E48\u6574\u5757\u4FDD\u6301\u539F\u6587\uFF1A\u4EFB\u4E00\u7247\u6BB5\u7F3A\u5931\u90FD\u8BA9\u8BE5\u5757\n * \u4F5C\u5E9F\uFF0C\u907F\u514D\u534A\u4E2D\u534A\u82F1\u7684\u6BB5\u843D\uFF1B\u5931\u8D25\u5757\u5E26 `detail` \u4E00\u53E5\u6280\u672F\u7EC6\u8282\u3002\u6BCF\u884C\u53EA\u8DD1\u9996\u8DD1\n * \u4E00\u6B21\uFF0C\u901A\u9053\u6062\u590D\u540E\u7531\u70B9\u51FB\u6551\u6D3B\u3002\n *\n * \u5BA2\u6237\u7AEF\u6309\u4E0E\u5BBF\u4E3B\u540C\u6E90\u7684 4096 \u4F30\u7B97 token \u5207\u6279\uFF0C\u6240\u4EE5\u4E00\u4E2A markdown \u5757\u53EF\u80FD\u8DE8\u591A\u6B21\n * \u8C03\u7528\uFF1B\u6BCF\u6B21\u8C03\u7528\u90FD\u72EC\u7ACB\u51B3\u5B9A\u6210\u8D25\uFF0C\u4E0D\u4F1A\u51FA\u73B0\u300C\u524D\u4E00\u6BB5\u5DF2\u6302\u8BD1\u6587\u3001\u540E\u4E00\u6BB5\u5931\u8D25\u300D\u7684\n * \u534A\u622A\u7ED3\u679C\u3002\n */\n async translateReplyBlocks(blocks: string[]): Promise<ReplyBlockResult[]> {\n const results: ReplyBlockResult[] = blocks.map((original) => ({\n original,\n translated: original,\n ok: false,\n cached: false,\n }));\n\n const config = this.configManager.getConfig();\n if (!config.enabled) return results;\n\n // The channel id is fixed: the reply path has exactly one channel.\n const adapter = this.adapters.get(CHANNEL_ID);\n if (!adapter || !adapter.isAvailable(config)) return results;\n\n return this.serveReplyBlocks(blocks, results, adapter, config);\n }\n\n /** \u901A\u9053\u53EF\u7528\u4E4B\u540E\u7684\u6B63\u6587\u6267\u884C\u6BB5\uFF1A\u5207\u6BB5\u3001\u6253\u5305\u3001\u8BF7\u6C42\u3001\u62FC\u88C5\u3002 */\n private async serveReplyBlocks(\n blocks: string[],\n results: ReplyBlockResult[],\n adapter: ITranslationAdapter,\n config: PluginConfig\n ): Promise<ReplyBlockResult[]> {\n const pieces: ReplyPiece[] = [];\n const partsByBlock = new Map<number, BlockPart[]>();\n\n for (let block = 0; block < blocks.length; block++) {\n const raw = blocks[block] ?? '';\n if (raw.trim() === '') continue;\n const cached = this.cache.get(raw.trim().toLowerCase());\n if (cached) {\n results[block] = { original: raw, translated: cached, ok: true, cached: true };\n continue;\n }\n const parts: BlockPart[] = [];\n let count = 0;\n for (const segment of splitMarkdownSegments(raw)) {\n const edges = segment.kind === 'code' ? null : stripEdges(segment.text);\n if (edges === null) {\n // \u4EE3\u7801\u56F4\u680F\u6216\u7EAF\u7A7A\u767D\u6BB5\uFF1A\u9010\u5B57\u4FDD\u7559\uFF0C\u4E0D\u8FDB\u8BF7\u6C42\u3002\n parts.push({ verbatim: segment.text });\n continue;\n }\n for (const chunk of splitOversizedBlock(segment.text)) {\n const pieceEdges = stripEdges(chunk);\n if (pieceEdges === null) {\n parts.push({ verbatim: chunk });\n continue;\n }\n parts.push({ piece: count });\n pieces.push({ block, index: count, text: pieceEdges.core, head: pieceEdges.head, tail: pieceEdges.tail });\n count += 1;\n }\n }\n partsByBlock.set(block, parts);\n }\n\n const ledger: FailureLedger = new Map();\n const translated = new Map<string, string>();\n for (const batch of packPieces(pieces)) {\n const outcome = await this.runReplySerial(() =>\n this.translateReplyBatch(adapter, batch, config, ledger)\n );\n for (const [key, value] of outcome) translated.set(key, value);\n }\n\n for (const block of partsByBlock.keys()) {\n const parts: string[] = [];\n const missing: number[] = [];\n for (const part of partsByBlock.get(block) ?? []) {\n if ('verbatim' in part) {\n parts.push(part.verbatim);\n continue;\n }\n const value = translated.get(replyPieceKey({ block, index: part.piece }));\n if (value === undefined) {\n missing.push(part.piece);\n continue;\n }\n parts.push(value);\n }\n if (missing.length > 0) {\n results[block].detail = blockFailureDetail(ledger, block, missing);\n continue;\n }\n // \u5168\u56F4\u680F\u5757\uFF08\u96F6\u7247\u6BB5\uFF09\u4E5F\u8D70\u5230\u8FD9\u91CC\uFF1A\u62FC\u56DE\u5373\u539F\u6587\uFF0C\u6309\u300C\u5DF2\u662F\u6700\u7EC8\u5F62\u6001\u300D\u8BB0\u6210\u529F\n // \u6302\u84DD\u7EBF\u2014\u2014\u4E0E\u300C\u6A21\u578B\u539F\u6837\u8FD4\u56DE\u4E5F\u7B97\u7FFB\u8FC7\u300D\u540C\u4E00\u8BED\u4E49\uFF0C\u4E0D\u53E6\u9020\u7B2C\u4E09\u79CD\u72B6\u6001\u3002\n const original = blocks[block]!;\n const finalText = parts.join('');\n this.cache.set(original.trim().toLowerCase(), finalText);\n results[block] = {\n original,\n translated: finalText,\n ok: true,\n cached: false,\n };\n }\n\n return results;\n }\n\n /**\n * \u4E00\u6574\u6279\u4E00\u6B21\u8BF7\u6C42\uFF1B\u6279\u5185\u4FEE\u4E0D\u597D\u7684\u7247\u6BB5\u4E0E\u6574\u6279\u7684\u5931\u8D25\u90FD\u9000\u56DE\u9010\u7247\u6BB5\u5355\u53D1\u3002\u5355\u53D1\u4ECD\n * \u4FEE\u4E0D\u597D\u7684**\u7167\u6536**\uFF08\u89C1 {@link translateReplyBlocks}\uFF09\u2014\u2014\u53EA\u6709\u901A\u9053\u4F24\u624D\u8BA9\u7247\u6BB5\n * \u7F3A\u5931\uFF0C\u5931\u8D25\u7684\u7247\u6BB5\u4E0D\u8FDB\u7F13\u5B58\u3002\n *\n * \u6BCF\u6B21\u901A\u9053\u5931\u8D25\u90FD\u8BB0\u8FDB\u7247\u6BB5\u8D26\u672C\uFF08{@link FailureLedger}\uFF09\uFF1A\u6279\u8BF7\u6C42\u7684\u5931\u8D25\u644A\u5230\n * \u6279\u5185\u6BCF\u4E2A\u7247\u6BB5\uFF0C\u5355\u53D1\u7684\u5931\u8D25\u53EA\u8BB0\u8BE5\u7247\u6BB5\uFF1B\u5757\u7EA7\u7EC6\u8282\u7531\u7F3A\u5931\u7247\u6BB5\u7684\u8D26\u672C\u5408\u6210\u3002\n */\n private async translateReplyBatch(\n adapter: ITranslationAdapter,\n batch: ReplyPiece[],\n config: PluginConfig,\n ledger: FailureLedger\n ): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n const stragglers: ReplyPiece[] = [];\n try {\n const answers = await this.fetchReplyAnswers(adapter, batch, config);\n batch.forEach((piece, index) => {\n const answer = answers[index] ?? '';\n const repair = repairShape(piece.text, answer);\n if (repair.text !== null) {\n out.set(replyPieceKey(piece), this.assemble(piece, repair.text, true));\n } else {\n stragglers.push(piece);\n }\n });\n } catch (err) {\n recordLedgerFailure(ledger, batch.map((piece) => replyPieceKey(piece)), describeError(err));\n console.warn(\n `[dsh-chat-translate] reply batch of ${batch.length} failed, retrying per block: ${describeError(err)}`\n );\n stragglers.push(...batch);\n }\n\n for (const piece of stragglers) {\n const key = replyPieceKey(piece);\n if (out.has(key)) continue;\n let answer: string | null = null;\n // \u4FEE\u4E0D\u597D\u7684\u5F62\u72B6\u81EA\u52A8\u91CD\u63B7\u4E00\u6B21\uFF1A\u5F31\u6A21\u578B\u7684\u6F02\u79FB\u662F\u968F\u673A\u7684\uFF0C\u518D\u95EE\u4E00\u6B21\u5E38\u5E38\u5C31\u9F50\u4E86\u3002\n // \u901A\u9053\u4F24\u4E0D\u91CD\u63B7\u2014\u2014\u65AD\u4E86\u5C31\u65AD\u4E86\uFF0C\u91CD\u8BD5\u53EA\u662F\u767D\u70E7\u6D41\u91CF\uFF0C\u6551\u6D3B\u5F52\u7528\u6237\u7684\u70B9\u51FB\u3002\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n answer = (await this.fetchReplyAnswers(adapter, [piece], config))[0] ?? '';\n } catch (err) {\n if (answer === null) {\n recordLedgerFailure(ledger, [key], describeError(err));\n console.warn(\n `[dsh-chat-translate] reply block ${piece.block} #${piece.index} failed, keeping the original: ${describeError(err)}`\n );\n }\n break;\n }\n if (repairShape(piece.text, answer).text !== null) break;\n }\n if (answer === null) continue;\n const repair = repairShape(piece.text, answer);\n if (repair.text !== null) {\n out.set(key, this.assemble(piece, repair.text, true));\n continue;\n }\n // \u7B2C\u4E09\u5C42\u9632\u7EBF\uFF1A\u7167\u6536\u3002\u7ED3\u6784\u6CA1\u4FEE\u9F50\u4E5F\u5C55\u793A\u6A21\u578B\u7684\u8BD1\u6587\u2014\u2014\u94FE\u63A5\u6570\u4E0D\u7B49\u65F6\u4E0D\u56DE\u586B\n // \uFF08\u56DE\u586B\u4F1A\u628A URL \u4E32\u5230\u9519\u7684\u94FE\u63A5\u4E0A\uFF09\uFF0C\u5176\u4F59\u539F\u6837\uFF1B\u8BFB\u4E0D\u987A\u8FD8\u6709\u539F\u6587\u4E00\u952E\u53EF\u56DE\u3002\n console.warn(\n `[dsh-chat-translate] reply block ${piece.block} #${piece.index} shape kept as the model wrote it: ${repair.error}`\n );\n out.set(key, this.assemble(piece, answer, linkCountsMatch(piece.text, answer)));\n }\n return out;\n }\n\n /** \u7247\u6BB5\u7684\u6700\u7EC8\u62FC\u88C5\uFF1A\u5934\u5C3E\u7A7A\u767D + \uFF08\u53EF\u9009\uFF09\u94FE\u63A5\u56DE\u586B + \u8BD1\u6587\u3002 */\n private assemble(piece: ReplyPiece, text: string, restoreLinks: boolean): string {\n return piece.head + (restoreLinks ? restoreLinkTargets(piece.text, text) : text) + piece.tail;\n }\n\n /**\n * \u53D1\u51FA\u4E00\u6B21\u6B63\u6587\u8BF7\u6C42\uFF0C\u8FD4\u56DE\u9010\u7247\u6BB5\u7684\u88F8\u7B54\u6848\uFF08\u6253\u5305\u6807\u8BB0\u5DF2\u5265\u9664\u3001\u9996\u5C3E\u5DF2 trim\uFF09\u3002\n * \u7A7A\u8FD4\u56DE\u4E0E\u6253\u5305\u62C6\u4E0D\u56DE\u90FD\u6309\u901A\u9053\u5931\u8D25\u629B\u51FA\u2014\u2014\u5F62\u72B6\u5BF9\u4E0D\u5BF9\u5728\u8FD9\u91CC\u4E0D\u7B97\u8D25\u56E0\u3002\n */\n private async fetchReplyAnswers(\n adapter: ITranslationAdapter,\n batch: ReplyPiece[],\n config: PluginConfig\n ): Promise<string[]> {\n const timeout = config.aiTimeoutMs || 600000;\n const abortCtrl = new AbortController();\n const timer = setTimeout(() => abortCtrl.abort(), timeout);\n let answers: string[];\n try {\n if (batch.length === 1) {\n answers = [\n await adapter.translate(batch[0]!.text, abortCtrl.signal, config, {\n maxTokens: REPLY_MAX_OUTPUT_TOKENS,\n mode: 'plain',\n }),\n ];\n } else {\n const format = createBatchFormat();\n const answer = await adapter.translate(\n buildBatchPayload(\n batch.map((piece) => piece.text),\n format\n ),\n abortCtrl.signal,\n config,\n { maxTokens: REPLY_MAX_OUTPUT_TOKENS, mode: 'blocks' }\n );\n const parts = splitBatchTranslation(answer, format, batch.length);\n if (parts === null) {\n throw new Error('batch markers did not survive the answer');\n }\n answers = parts;\n }\n } catch (err) {\n // \u8D85\u65F6\u6253\u65AD\u7684\u539F\u59CB\u62A5\u9519\uFF08AbortError \u4E00\u7C7B\uFF09\u8BF4\u4E0D\u51FA\u300C\u8D85\u65F6\u300D\u4E8C\u5B57\uFF0C\u5C31\u5730\u6362\u6210\n // \u80FD\u8FDB\u60AC\u505C\u6587\u6848\u7684\u8BF4\u6CD5\u3002\n if (abortCtrl.signal.aborted) {\n throw new Error(`channel timed out after ${timeout}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n const stripped = answers.map((answer) => stripBatchMarkers(answer).trim());\n if (stripped.some((answer) => answer === '')) {\n throw new Error('translation came back empty');\n }\n return stripped;\n }\n\n /** \u4E32\u884C\u6267\u884C\u5668\uFF1A\u540C\u65F6\u6700\u591A\u4E00\u4E2A\u5728\u9014\u8BF7\u6C42\u3002 */\n private runReplySerial<T>(task: () => Promise<T>): Promise<T> {\n const next = this.replyTail.then(task, task);\n this.replyTail = next.then(\n () => undefined,\n () => undefined\n );\n return next;\n }\n\n /**\n * \u901A\u9053\u63A2\u9488\uFF1A\u8BBE\u7F6E\u9762\u677F\u7684\u300C\u6D4B\u8BD5 AI \u901A\u9053\u300D\u6309\u94AE\u8D70\u8FD9\u91CC\u3002\u63A2\u6D4B\u6587\u672C\u7528\u4E00\u53E5\u82F1\u6587\u6B63\u6587\uFF0C\n * \u4E0E\u771F\u5B9E\u8BF7\u6C42\u540C\u5F62\uFF1B\u5B83\u4E00\u6B21\u8BF7\u6C42\u90FD\u4E0D\u5199\u6B63\u6587\u8D26\u672C\uFF0C\u6B63\u6587\u7684\u6210\u8D25\u4E5F\u4E0D\u5F71\u54CD\u6309\u94AE\u3002\n */\n async testChannel(channelId: string): Promise<{ ok: boolean; latencyMs: number; error?: string }> {\n const adapter = this.adapters.get(channelId);\n const config = this.configManager.getConfig();\n if (!adapter) {\n return { ok: false, latencyMs: 0, error: `Channel ${channelId} not found` };\n }\n if (!adapter.isAvailable(config)) {\n return { ok: false, latencyMs: 0, error: `Channel ${channelId} is not configured or disabled` };\n }\n const testText = 'Here is what I changed.';\n const start = Date.now();\n try {\n const timeout = Math.min(config.aiTimeoutMs || 30000, 30000);\n const abortCtrl = new AbortController();\n const timer = setTimeout(() => abortCtrl.abort(), timeout);\n let res = '';\n try {\n res = await adapter.translate(testText, abortCtrl.signal, config);\n } finally {\n clearTimeout(timer);\n }\n\n const latencyMs = Date.now() - start;\n if (res && res.trim()) {\n return { ok: true, latencyMs };\n }\n return { ok: false, latencyMs, error: 'Empty translation returned' };\n } catch (err: any) {\n return { ok: false, latencyMs: Date.now() - start, error: describeError(err) };\n }\n }\n}\n", "import type { ConnectionFetchRoute } from '@deepseek-ai/dsh-client-connection';\nimport { describeError } from '../describe-error.ts';\nimport type { TranslationDispatcher } from './dispatcher.ts';\n\n/**\n * Translation proxy surface, carried by Connection's exact Fetch routes below\n * the shared `/api` channel.\n *\n * Config and credentials have no HTTP endpoints: the settings panel reads and\n * writes through DSH's own channels \u2014 the shared configuration form\n * (`ctx.configForms`) over the profile entry, and the `credentials` Remote API\n * for the key \u2014 so the plugin owns exactly two routes: reply-body block\n * translation, and the channel probe.\n */\n\n/** Reply-body block translation route path. */\nexport const REPLY_ROUTE_PATH = '/api/dsh-chat-translate/translate-reply';\n\n/** Single-channel probe route path. */\nexport const TEST_CHANNEL_ROUTE_PATH = '/api/dsh-chat-translate/test-channel';\n\nfunction sendJson(status: number, body: unknown): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\n });\n}\n\n/**\n * Decode one buffered JSON request body.\n * @returns the parsed value, or the 400 response the caller must return.\n */\nasync function readJson(request: Request): Promise<\n { ok: true; value: any } | { ok: false; response: Response }\n> {\n try {\n return { ok: true, value: await request.json() };\n } catch {\n return { ok: false, response: sendJson(400, { ok: false, error: 'Invalid JSON body' }) };\n }\n}\n\n/**\n * Build the plugin's exact Fetch routes.\n * @param dispatcher - translation coordinator the routes proxy to.\n * @param ready - settles once host-side async resources are usable; every\n * request waits for it before touching the dispatcher.\n */\nexport function createFetchRoutes(\n dispatcher: TranslationDispatcher,\n ready: Promise<unknown> = Promise.resolve()\n): ConnectionFetchRoute[] {\n const reply: ConnectionFetchRoute = {\n path: REPLY_ROUTE_PATH,\n methods: ['POST'],\n requestBody: 'buffered',\n fetch: async (request) => {\n await ready;\n try {\n const body = await readJson(request);\n if (!body.ok) return body.response;\n const rawBlocks: unknown = body.value?.blocks;\n const blocks = Array.isArray(rawBlocks)\n ? rawBlocks.filter((block): block is string => typeof block === 'string')\n : [];\n if (blocks.length === 0) {\n return sendJson(200, { ok: true, results: [] });\n }\n const results = await dispatcher.translateReplyBlocks(blocks);\n return sendJson(200, { ok: true, results });\n } catch (err: any) {\n return sendJson(500, { ok: false, error: describeError(err) });\n }\n },\n };\n\n const testChannel: ConnectionFetchRoute = {\n path: TEST_CHANNEL_ROUTE_PATH,\n methods: ['POST'],\n requestBody: 'buffered',\n fetch: async (request) => {\n await ready;\n try {\n const body = await readJson(request);\n if (!body.ok) return body.response;\n const channelId = typeof body.value.channel === 'string' ? body.value.channel : '';\n const result = await dispatcher.testChannel(channelId);\n return sendJson(200, result);\n } catch (err: any) {\n return sendJson(500, { ok: false, error: describeError(err) });\n }\n },\n };\n\n return [reply, testChannel];\n}\n", "import type { HostConnectionHandle } from '@deepseek-ai/dsh-client-connection';\nimport z from '@deepseek-ai/schemastery';\nimport {\n ConfigManager,\n createLiveConfigSource,\n DEFAULT_CONFIG,\n AI_TIMEOUT_MIN,\n AI_TIMEOUT_MAX,\n type PluginConfigRefs,\n} from './server/config.ts';\nimport { CredentialsReader, TRANSLATE_API_KEY_REF } from './server/credentials.ts';\nimport { LruDiskCache } from './server/cache.ts';\nimport { TranslationDispatcher } from './server/dispatcher.ts';\nimport { createFetchRoutes } from './server/router.ts';\n\n/** Stable Cordis loader name. */\nexport const name = 'dsh-chat-translate';\n\n/**\n * Hard dependencies: credentials is the DSH-owned secret surface this plugin\n * rides on, and settings carries the entry's automatic-page policy. The\n * plugin's own values arrive as its resolved Config. The translation routes\n * register through the connection service when a Web carrier composes it, so\n * apply takes that service through ctx.inject and the plugin still loads in\n * compositions without one.\n */\nexport const inject = ['settings', 'credentials'];\n\n/**\n * This plugin's live configuration: defaults plus bounds, resolved by DSH\n * itself. Every field is `volatile()` \u2014 the browser configuration form\n * derives its fields from this schema, and an accepted edit is committed into\n * these refs without remounting the plugin, so {@link apply} always reads the\n * current value instead of a snapshot taken at load.\n */\nexport const Config = z.object({\n enabled: z.boolean().default(DEFAULT_CONFIG.enabled).volatile(),\n aiTimeoutMs: z\n .number()\n .min(AI_TIMEOUT_MIN)\n .max(AI_TIMEOUT_MAX)\n .default(DEFAULT_CONFIG.aiTimeoutMs)\n .volatile(),\n baseUrl: z.string().default(DEFAULT_CONFIG.baseUrl).volatile(),\n model: z.string().default(DEFAULT_CONFIG.model).volatile(),\n});\n\ninterface HostContext {\n connection: HostConnectionHandle;\n fiber: unknown;\n settings: {\n /** Register this entry's automatic-page policy; `auto: false` opts out. */\n configure(presentation: { auto?: boolean }, owner?: unknown): () => void;\n };\n credentials: {\n resolve(ref: string): Promise<{ value: string; source?: string } | undefined>;\n describe(ref: string): Promise<{ configured: boolean; source?: string; writable: boolean }>;\n set(ref: string, value: string): Promise<void>;\n unset(ref: string): Promise<void>;\n };\n on(event: string, listener: (...args: any[]) => void): () => void;\n effect(factory: () => void | (() => void), label?: string): unknown;\n /** Optional-service injection: the callback runs once connection is present. */\n inject(names: string[], callback: (ctx: HostContext) => void | (() => void)): void;\n}\n\n/**\n * Mount the host half; provides the translation proxy and rides this plugin's\n * live Config.\n * @param ctx - DSH Host context.\n * @param config - this plugin's runtime-resolved Config (every field a live ref).\n */\nexport function apply(ctx: HostContext, config: PluginConfigRefs): void {\n const credentials = new CredentialsReader(ctx.credentials);\n const configManager = new ConfigManager(\n // DSH commits an accepted live edit into the Config refs and notifies this\n // plugin's own fiber through `loader/volatile-update`.\n createLiveConfigSource((listener) => ctx.on('loader/volatile-update', listener), config),\n credentials\n );\n const cache = new LruDiskCache(1000);\n const dispatcher = new TranslationDispatcher(configManager, cache, credentials);\n\n // The \u9605\u8BFB\u4F53\u9A8C card is this entry's settings surface, so DSH must not also\n // derive a Plugins-page form for the same fields.\n ctx.inject(['settings'], (child) => {\n child.effect(\n () => child.settings.configure({ auto: false }, child.fiber),\n 'dsh-chat-translate: settings page policy'\n );\n });\n\n // Initialize async resources: the credential cache and the reply cache pool.\n const initPromise = Promise.all([credentials.init(), cache.init()]).catch((err) => {\n console.warn('[dsh-chat-translate] Initialization error:', err);\n });\n\n // Keep the synchronous key cache warm: the credentials service fans this\n // event out after every committed write or external reload.\n ctx.on('credentials/reference-updated', (ref: unknown) => {\n if (ref === TRANSLATE_API_KEY_REF) {\n void credentials.refresh();\n }\n });\n\n // The routes ride Connection's authenticated /api transport, which a Web\n // carrier composes; a composition without one keeps the plugin loaded and\n // simply has no translation endpoint.\n ctx.inject(['connection'], (connectionCtx) => {\n const disposers = createFetchRoutes(dispatcher, initPromise).map((route) =>\n connectionCtx.connection.fetch.register(route)\n );\n return () => {\n void Promise.all(disposers.map((dispose) => dispose()))\n .then(() => cache.dispose())\n .catch((err) => {\n console.warn('[dsh-chat-translate] Dispose translation routes error:', err);\n });\n };\n });\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.5/node_modules/@deepseek-ai/cosmokit/lib/index.js", "../node_modules/.pnpm/@deepseek-ai+schemastery@3.18.4/node_modules/@deepseek-ai/schemastery/lib/index.mjs", "../src/server/config.ts", "../src/server/credentials.ts", "../src/server/cache.ts", "../node_modules/.pnpm/@deepseek-ai+dsh-home-paths@0.2.0-rc.2_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-home-paths/lib/index.js", "../src/server/prompt-revision.ts", "../src/describe-error.ts", "../src/server/adapters/openai.ts", "../src/server/pipeline/blocks.ts", "../src/server/pipeline/segments.ts", "../src/server/dispatcher.ts", "../src/server/router.ts", "../src/index.ts"],
4
+ "sourcesContent": ["//#region lib/types/misc.js\n/** No-op callback returning `undefined` at runtime and `any` at type level. */\nfunction noop() {}\n/** Return true when a value is `null` or `undefined`. */\nfunction isNullable(value) {\n\treturn value === null || value === void 0;\n}\n/** Return true when a value is neither `null` nor `undefined`. */\nfunction isNonNullable(value) {\n\treturn !isNullable(value);\n}\n/** Return true for non-array object values. */\nfunction isPlainObject(data) {\n\treturn data && typeof data === \"object\" && !Array.isArray(data);\n}\n/** Filter object entries and return a new object. */\nfunction filterKeys(object, filter) {\n\treturn Object.fromEntries(Object.entries(object).filter(([key, value]) => filter(key, value)));\n}\n/** Map object values while preserving the original key set. */\nfunction mapValues(object, transform) {\n\treturn Object.fromEntries(Object.entries(object).map(([key, value]) => [key, transform(value, key)]));\n}\n/** Pick selected keys from an object, optionally including `undefined` values. */\nfunction pick(source, keys, forced) {\n\tif (!keys) return { ...source };\n\tconst result = {};\n\tfor (const key of keys) if (forced || source[key] !== void 0) result[key] = source[key];\n\treturn result;\n}\n/** Omit selected keys from a shallow object copy. */\nfunction omit(source, keys) {\n\tif (!keys) return { ...source };\n\tconst result = { ...source };\n\tfor (const key of keys) Reflect.deleteProperty(result, key);\n\treturn result;\n}\n/** Define a non-enumerable writable property and return the object. */\nfunction defineProperty(object, key, value) {\n\treturn Object.defineProperty(object, key, {\n\t\twritable: true,\n\t\tvalue,\n\t\tenumerable: false\n\t});\n}\n//#endregion\n//#region lib/types/array.js\n/** Return true when every item in `array2` is present in `array1`. */\nfunction contain(array1, array2) {\n\treturn array2.every((item) => array1.includes(item));\n}\n/** Return items that appear in both arrays. */\nfunction intersection(array1, array2) {\n\treturn array1.filter((item) => array2.includes(item));\n}\n/** Return items from `array1` that do not appear in `array2`. */\nfunction difference(array1, array2) {\n\treturn array1.filter((item) => !array2.includes(item));\n}\n/** Return the set-union of two arrays while preserving first occurrence order. */\nfunction union(array1, array2) {\n\treturn Array.from(new Set([...array1, ...array2]));\n}\n/** Remove duplicate values while preserving first occurrence order. */\nfunction deduplicate(array) {\n\treturn [...new Set(array)];\n}\n/** Remove one item from an array and report whether it was found. */\nfunction remove(list, item) {\n\tconst index = list?.indexOf(item);\n\tif (index >= 0) {\n\t\tlist.splice(index, 1);\n\t\treturn true;\n\t} else return false;\n}\n/** Normalize nullish, scalar, or array input to an array. */\nfunction makeArray(source) {\n\treturn Array.isArray(source) ? source : isNullable(source) ? [] : [source];\n}\n//#endregion\n//#region lib/types/volatile.js\n/** Shared config references used by schema validators and plugin runtimes. */\nconst write = Symbol.for(\"cosmokit.volatile.write\");\nfunction snapshot(value, ancestors = /* @__PURE__ */ new Set()) {\n\tif (typeof value === \"function\") throw new TypeError(\"volatile config cannot contain functions\");\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (ancestors.has(value)) throw new TypeError(\"volatile config cannot contain cycles\");\n\tancestors.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) return Object.freeze(value.map((item) => snapshot(item, ancestors)));\n\t\tif (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) throw new TypeError(\"volatile config objects must be plain objects or arrays\");\n\t\treturn Object.freeze(Object.fromEntries(Object.entries(value).map(([key, item]) => [key, snapshot(item, ancestors)])));\n\t} finally {\n\t\tancestors.delete(value);\n\t}\n}\n/**\n* Create a detached reference containing an immutable copy of the supplied data.\n* @param value - validated config data; class instances and functions are unsupported.\n* @returns a reference whose value is updated only by its owning runtime.\n*/\nfunction createVolatile(value) {\n\tlet current = snapshot(value);\n\treturn Object.freeze({\n\t\tget: () => current,\n\t\t[write]: (value) => {\n\t\t\tcurrent = value;\n\t\t}\n\t});\n}\n/**\n* Identify references across ESM/CJS copies of the shared library.\n* @param value - a parsed config value.\n* @returns whether the value implements the shared reference protocol.\n*/\nfunction isVolatile(value) {\n\treturn typeof value === \"object\" && value !== null && write in value;\n}\n/**\n* Collect config references without descending into their snapshots or opaque objects.\n* @internal\n* @param value - parsed config; cyclic ordinary fields are visited once per path.\n* @returns references and their object-key paths, including an empty path for a root reference.\n*/\nfunction volatileEntries(value) {\n\tconst ancestors = /* @__PURE__ */ new Set();\n\tfunction visit(value, path) {\n\t\tif (isVolatile(value)) return [{\n\t\t\tpath,\n\t\t\tref: value\n\t\t}];\n\t\tif (!value || typeof value !== \"object\" || ancestors.has(value)) return [];\n\t\tif (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) return [];\n\t\tancestors.add(value);\n\t\ttry {\n\t\t\treturn Object.entries(value).flatMap(([key, child]) => visit(child, [...path, key]));\n\t\t} finally {\n\t\t\tancestors.delete(value);\n\t\t}\n\t}\n\treturn visit(value, []);\n}\n/**\n* Commit an already validated immutable snapshot from another reference.\n* @internal\n* @param target - the owning plugin's stable reference.\n* @param source - a newly parsed candidate reference.\n*/\nfunction updateVolatile(target, source) {\n\ttarget[write](source.get());\n}\n//#endregion\n//#region lib/types/types.js\n/** Test values using `instanceof` with a `toStringTag` fallback. */\nfunction is(type, value) {\n\tif (arguments.length === 1) return (value) => is(type, value);\n\treturn type in globalThis && value instanceof globalThis[type] || Object.prototype.toString.call(value).slice(8, -1) === type;\n}\nfunction isArrayBufferLike(value) {\n\treturn is(\"ArrayBuffer\", value) || is(\"SharedArrayBuffer\", value);\n}\nfunction isArrayBufferSource(value) {\n\treturn isArrayBufferLike(value) || ArrayBuffer.isView(value);\n}\n/** Binary source detection and base64/hex conversion helpers. */\nvar Binary;\n(function(Binary) {\n\tBinary.is = isArrayBufferLike;\n\tBinary.isSource = isArrayBufferSource;\n\tfunction fromSource(source) {\n\t\tif (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n\t\telse return source;\n\t}\n\tBinary.fromSource = fromSource;\n\tfunction toBase64(source) {\n\t\tsource = fromSource(source);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(source).toString(\"base64\");\n\t\tlet binary = \"\";\n\t\tconst bytes = new Uint8Array(source);\n\t\tfor (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]);\n\t\treturn btoa(binary);\n\t}\n\tBinary.toBase64 = toBase64;\n\tfunction fromBase64(source) {\n\t\tif (typeof Buffer !== \"undefined\") return fromSource(Buffer.from(source, \"base64\"));\n\t\treturn Uint8Array.from(atob(source), (c) => c.charCodeAt(0));\n\t}\n\tBinary.fromBase64 = fromBase64;\n\tfunction toHex(source) {\n\t\tsource = fromSource(source);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(source).toString(\"hex\");\n\t\treturn Array.from(new Uint8Array(source), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\t}\n\tBinary.toHex = toHex;\n\tfunction fromHex(source) {\n\t\tif (typeof Buffer !== \"undefined\") return fromSource(Buffer.from(source, \"hex\"));\n\t\tconst hex = source.length % 2 === 0 ? source : source.slice(0, source.length - 1);\n\t\tconst buffer = [];\n\t\tfor (let i = 0; i < hex.length; i += 2) buffer.push(parseInt(`${hex[i]}${hex[i + 1]}`, 16));\n\t\treturn Uint8Array.from(buffer).buffer;\n\t}\n\tBinary.fromHex = fromHex;\n})(Binary || (Binary = {}));\n/** Decode a base64 string into binary data. */\nconst base64ToArrayBuffer = Binary.fromBase64;\n/** Encode binary data as base64. */\nconst arrayBufferToBase64 = Binary.toBase64;\n/** Decode a hex string into binary data. */\nconst hexToArrayBuffer = Binary.fromHex;\n/** Encode binary data as hex. */\nconst arrayBufferToHex = Binary.toHex;\n/** Deep-clone common JavaScript values while preserving prototypes and cycles. */\nfunction clone(source, refs = /* @__PURE__ */ new Map()) {\n\tif (!source || typeof source !== \"object\") return source;\n\tif (is(\"Date\", source)) return new Date(source.valueOf());\n\tif (is(\"RegExp\", source)) return new RegExp(source.source, source.flags);\n\tif (isArrayBufferLike(source)) return source.slice(0);\n\tif (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n\tconst cached = refs.get(source);\n\tif (cached) return cached;\n\tif (Array.isArray(source)) {\n\t\tconst result = [];\n\t\trefs.set(source, result);\n\t\tsource.forEach((value, index) => {\n\t\t\tresult[index] = Reflect.apply(clone, null, [value, refs]);\n\t\t});\n\t\treturn result;\n\t}\n\tconst result = Object.create(Object.getPrototypeOf(source));\n\trefs.set(source, result);\n\tfor (const key of Reflect.ownKeys(source)) {\n\t\tconst descriptor = { ...Reflect.getOwnPropertyDescriptor(source, key) };\n\t\tif (\"value\" in descriptor) descriptor.value = Reflect.apply(clone, null, [descriptor.value, refs]);\n\t\tReflect.defineProperty(result, key, descriptor);\n\t}\n\treturn result;\n}\n/**\n* Compare values recursively, treating two volatile references as equal regardless of value.\n* Strict comparison distinguishes null/undefined, treats opaque objects by identity,\n* compares URLs by normalized href, treats array holes as undefined, and considers distinct cyclic structures unequal.\n* @param a - first value.\n* @param b - second value.\n* @param strict - whether to require strict data equality outside volatile references.\n* @returns whether the values compare equal.\n*/\nfunction deepEqual(a, b, strict) {\n\tconst ancestors = /* @__PURE__ */ new Set();\n\tfunction compare(a, b) {\n\t\tif (a === b) return true;\n\t\tif (isVolatile(a) || isVolatile(b)) return isVolatile(a) && isVolatile(b);\n\t\tif (!strict && isNullable(a) && isNullable(b)) return true;\n\t\tif (typeof a !== typeof b || typeof a !== \"object\" || !a || !b) return false;\n\t\tif (ancestors.has(a)) return false;\n\t\tfunction check(test, then) {\n\t\t\treturn test(a) ? test(b) ? then(a, b) : false : test(b) ? false : void 0;\n\t\t}\n\t\tancestors.add(a);\n\t\ttry {\n\t\t\treturn check(Array.isArray, (a, b) => {\n\t\t\t\tif (a.length !== b.length) return false;\n\t\t\t\tfor (let index = 0; index < a.length; index++) if (!compare(a[index], b[index])) return false;\n\t\t\t\treturn true;\n\t\t\t}) ?? check(is(\"Date\"), (a, b) => a.valueOf() === b.valueOf()) ?? check(is(\"URL\"), (a, b) => a.href === b.href) ?? check(is(\"RegExp\"), (a, b) => a.source === b.source && a.flags === b.flags) ?? check(isArrayBufferLike, (a, b) => {\n\t\t\t\tif (a.byteLength !== b.byteLength) return false;\n\t\t\t\tconst viewA = new Uint8Array(a);\n\t\t\t\tconst viewB = new Uint8Array(b);\n\t\t\t\tfor (let i = 0; i < viewA.length; i++) if (viewA[i] !== viewB[i]) return false;\n\t\t\t\treturn true;\n\t\t\t}) ?? ((!strict || [a, b].every((value) => Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)) && Object.keys({\n\t\t\t\t...a,\n\t\t\t\t...b\n\t\t\t}).every((key) => compare(a[key], b[key])));\n\t\t} finally {\n\t\t\tancestors.delete(a);\n\t\t}\n\t}\n\treturn compare(a, b);\n}\n//#endregion\n//#region lib/types/string.js\n/** Uppercase the first character of a string. */\nfunction capitalize(source) {\n\treturn source.charAt(0).toUpperCase() + source.slice(1);\n}\n/** Lowercase the first character of a string. */\nfunction uncapitalize(source) {\n\treturn source.charAt(0).toLowerCase() + source.slice(1);\n}\n/** Convert dash or underscore delimited text to camelCase. */\nfunction camelCase(source) {\n\treturn source.replace(/[_-][a-z]/g, (str) => str.slice(1).toUpperCase());\n}\nfunction tokenize(source, delimiters, delimiter) {\n\tconst output = [];\n\tlet state = 0;\n\tfor (let i = 0; i < source.length; i++) {\n\t\tconst code = source.charCodeAt(i);\n\t\tif (code >= 65 && code <= 90) {\n\t\t\tif (state === 1) {\n\t\t\t\tconst next = source.charCodeAt(i + 1);\n\t\t\t\tif (next >= 97 && next <= 122) output.push(delimiter);\n\t\t\t\toutput.push(code + 32);\n\t\t\t} else {\n\t\t\t\tif (state !== 0) output.push(delimiter);\n\t\t\t\toutput.push(code + 32);\n\t\t\t}\n\t\t\tstate = 1;\n\t\t} else if (code >= 97 && code <= 122) {\n\t\t\toutput.push(code);\n\t\t\tstate = 2;\n\t\t} else if (delimiters.includes(code)) {\n\t\t\tif (state !== 0) output.push(delimiter);\n\t\t\tstate = 0;\n\t\t} else output.push(code);\n\t}\n\treturn String.fromCharCode(...output);\n}\n/** Convert text to dash-delimited parameter case. */\nfunction paramCase(source) {\n\treturn tokenize(source, [45, 95], 45);\n}\n/** Convert text to underscore-delimited snake case. */\nfunction snakeCase(source) {\n\treturn tokenize(source, [45, 95], 95);\n}\n/** Runtime alias for `camelCase`. */\nconst camelize = camelCase;\n/** Runtime alias for `paramCase`. */\nconst hyphenate = paramCase;\n/** Format a property key as a JavaScript member access suffix. */\nfunction formatProperty(key) {\n\tif (typeof key !== \"string\") return `[${key.toString()}]`;\n\treturn /^[a-z_$][\\w$]*$/i.test(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n/** Remove one trailing slash from a path string. */\nfunction trimSlash(source) {\n\treturn source.replace(/\\/$/, \"\");\n}\n/** Ensure a path starts with `/` and has no trailing slash. */\nfunction sanitize(source) {\n\tif (!source.startsWith(\"/\")) source = \"/\" + source;\n\treturn trimSlash(source);\n}\n//#endregion\n//#region lib/types/time.js\n/** Time constants plus parsing and formatting helpers. */\nvar Time;\n(function(Time) {\n\tTime.millisecond = 1;\n\tTime.second = 1e3;\n\tTime.minute = Time.second * 60;\n\tTime.hour = Time.minute * 60;\n\tTime.day = Time.hour * 24;\n\tTime.week = Time.day * 7;\n\tlet timezoneOffset = (/* @__PURE__ */ new Date()).getTimezoneOffset();\n\tfunction setTimezoneOffset(offset) {\n\t\ttimezoneOffset = offset;\n\t}\n\tTime.setTimezoneOffset = setTimezoneOffset;\n\tfunction getTimezoneOffset() {\n\t\treturn timezoneOffset;\n\t}\n\tTime.getTimezoneOffset = getTimezoneOffset;\n\tfunction getDateNumber(date = /* @__PURE__ */ new Date(), offset) {\n\t\tif (typeof date === \"number\") date = new Date(date);\n\t\tif (offset === void 0) offset = timezoneOffset;\n\t\treturn Math.floor((date.valueOf() / Time.minute - offset) / 1440);\n\t}\n\tTime.getDateNumber = getDateNumber;\n\tfunction fromDateNumber(value, offset) {\n\t\tconst date = new Date(value * Time.day);\n\t\tif (offset === void 0) offset = timezoneOffset;\n\t\treturn new Date(+date + offset * Time.minute);\n\t}\n\tTime.fromDateNumber = fromDateNumber;\n\tconst numeric = /\\d+(?:\\.\\d+)?/.source;\n\tconst timeRegExp = new RegExp(`^${[\n\t\t\"w(?:eek(?:s)?)?\",\n\t\t\"d(?:ay(?:s)?)?\",\n\t\t\"h(?:our(?:s)?)?\",\n\t\t\"m(?:in(?:ute)?(?:s)?)?\",\n\t\t\"s(?:ec(?:ond)?(?:s)?)?\"\n\t].map((unit) => `(${numeric}${unit})?`).join(\"\")}$`);\n\tfunction parseTime(source) {\n\t\tconst capture = timeRegExp.exec(source);\n\t\tif (!capture) return 0;\n\t\treturn (parseFloat(capture[1]) * Time.week || 0) + (parseFloat(capture[2]) * Time.day || 0) + (parseFloat(capture[3]) * Time.hour || 0) + (parseFloat(capture[4]) * Time.minute || 0) + (parseFloat(capture[5]) * Time.second || 0);\n\t}\n\tTime.parseTime = parseTime;\n\tfunction parseDate(date) {\n\t\tconst parsed = parseTime(date);\n\t\tif (parsed) date = Date.now() + parsed;\n\t\telse if (/^\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).toLocaleDateString()}-${date}`;\n\t\telse if (/^\\d{1,2}-\\d{1,2}-\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).getFullYear()}-${date}`;\n\t\treturn date ? new Date(date) : /* @__PURE__ */ new Date();\n\t}\n\tTime.parseDate = parseDate;\n\tfunction format(ms) {\n\t\tconst abs = Math.abs(ms);\n\t\tif (abs >= Time.day - Time.hour / 2) return Math.round(ms / Time.day) + \"d\";\n\t\telse if (abs >= Time.hour - Time.minute / 2) return Math.round(ms / Time.hour) + \"h\";\n\t\telse if (abs >= Time.minute - Time.second / 2) return Math.round(ms / Time.minute) + \"m\";\n\t\telse if (abs >= Time.second) return Math.round(ms / Time.second) + \"s\";\n\t\treturn ms + \"ms\";\n\t}\n\tTime.format = format;\n\tfunction toDigits(source, length = 2) {\n\t\treturn source.toString().padStart(length, \"0\");\n\t}\n\tTime.toDigits = toDigits;\n\tfunction template(template, time = /* @__PURE__ */ new Date()) {\n\t\treturn template.replace(\"yyyy\", time.getFullYear().toString()).replace(\"yy\", time.getFullYear().toString().slice(2)).replace(\"MM\", toDigits(time.getMonth() + 1)).replace(\"dd\", toDigits(time.getDate())).replace(\"hh\", toDigits(time.getHours())).replace(\"mm\", toDigits(time.getMinutes())).replace(\"ss\", toDigits(time.getSeconds())).replace(\"SSS\", toDigits(time.getMilliseconds(), 3));\n\t}\n\tTime.template = template;\n})(Time || (Time = {}));\n//#endregion\nexport { Binary, Time, arrayBufferToBase64, arrayBufferToHex, base64ToArrayBuffer, camelCase, camelize, capitalize, clone, contain, createVolatile, deduplicate, deepEqual, defineProperty, difference, filterKeys, formatProperty, hexToArrayBuffer, hyphenate, intersection, is, isNonNullable, isNullable, isPlainObject, isVolatile, makeArray, mapValues, mapValues as valueMap, noop, omit, paramCase, pick, remove, sanitize, snakeCase, trimSlash, uncapitalize, union, updateVolatile, volatileEntries };\n", "import { Binary, clone, createVolatile, deepEqual, filterKeys, isNullable, isPlainObject, isVolatile, pick, valueMap } from \"@deepseek-ai/cosmokit\";\n//#region lib/types/index.js\nconst kSchema = Symbol.for(\"schemastery\");\nconst kValidationError = Symbol.for(\"ValidationError\");\nglobalThis.__schemastery_index__ ??= 0;\nglobalThis.__schemastery_refs__ = void 0;\nvar ValidationError = class extends TypeError {\n\toptions;\n\tname = \"ValidationError\";\n\tconstructor(message, options) {\n\t\tlet prefix = \"$\";\n\t\tfor (const segment of options.path || []) if (typeof segment === \"string\") prefix += \".\" + segment;\n\t\telse if (typeof segment === \"number\") prefix += \"[\" + segment + \"]\";\n\t\telse if (typeof segment === \"symbol\") prefix += `[Symbol(${segment.toString()})]`;\n\t\tif (prefix.startsWith(\".\")) prefix = prefix.slice(1);\n\t\tsuper((prefix === \"$\" ? \"\" : `${prefix} `) + message);\n\t\tthis.options = options;\n\t}\n\tstatic is(error) {\n\t\treturn !!error?.[kValidationError];\n\t}\n};\nObject.defineProperty(ValidationError.prototype, kValidationError, { value: true });\nconst Schema = function(options) {\n\tconst schema = function(data, options = {}) {\n\t\treturn Schema.resolve(data, schema, options)[0];\n\t};\n\tif (options.refs) {\n\t\tconst refs = valueMap(options.refs, (options) => new Schema(options));\n\t\tconst getRef = (uid) => refs[uid];\n\t\tfor (const key in refs) {\n\t\t\tconst options = refs[key];\n\t\t\toptions.sKey = getRef(options.sKey);\n\t\t\toptions.inner = getRef(options.inner);\n\t\t\toptions.list = options.list && options.list.map(getRef);\n\t\t\toptions.dict = options.dict && valueMap(options.dict, getRef);\n\t\t}\n\t\treturn refs[options.uid];\n\t}\n\tObject.assign(schema, options);\n\tif (typeof schema.callback === \"string\") try {\n\t\tschema.callback = new Function(\"return \" + schema.callback)();\n\t} catch {}\n\tObject.defineProperty(schema, \"uid\", { value: globalThis.__schemastery_index__++ });\n\tObject.setPrototypeOf(schema, Schema.prototype);\n\tschema.meta ||= {};\n\tschema.toString = schema.toString.bind(schema);\n\treturn schema;\n};\nSchema.prototype = Object.create(Function.prototype);\nSchema.prototype[kSchema] = true;\nObject.defineProperty(Schema.prototype, \"~standard\", { get() {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: \"schemastery\",\n\t\tvalidate: (value) => {\n\t\t\ttry {\n\t\t\t\treturn { value: Schema.resolve(value, this, {})[0] };\n\t\t\t} catch (error) {\n\t\t\t\tif (ValidationError.is(error)) return { issues: [{\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tpath: error.options.path\n\t\t\t\t}] };\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n} });\nSchema.ValidationError = ValidationError;\nSchema.prototype.toJSON = function toJSON() {\n\tif (globalThis.__schemastery_refs__) {\n\t\tglobalThis.__schemastery_refs__[this.uid] ??= JSON.parse(JSON.stringify({ ...this }));\n\t\treturn this.uid;\n\t}\n\tglobalThis.__schemastery_refs__ = { [this.uid]: { ...this } };\n\tglobalThis.__schemastery_refs__[this.uid] = JSON.parse(JSON.stringify({ ...this }));\n\tconst result = {\n\t\tuid: this.uid,\n\t\trefs: globalThis.__schemastery_refs__\n\t};\n\tglobalThis.__schemastery_refs__ = void 0;\n\treturn result;\n};\nSchema.prototype.set = function set(key, value) {\n\tthis.dict[key] = value;\n\treturn this;\n};\nSchema.prototype.push = function push(value) {\n\tthis.list.push(value);\n\treturn this;\n};\nfunction mergeDesc(original, messages) {\n\tconst result = typeof original === \"string\" ? { \"\": original } : { ...original };\n\tfor (const locale in messages) {\n\t\tconst value = messages[locale];\n\t\tif (value?.$description || value?.$desc) result[locale] = value.$description || value.$desc;\n\t\telse if (typeof value === \"string\") result[locale] = value;\n\t}\n\treturn result;\n}\nfunction getInner(value) {\n\treturn value?.$value ?? value?.$inner;\n}\nfunction extractKeys(data) {\n\treturn filterKeys(data ?? {}, (key) => !key.startsWith(\"$\"));\n}\nSchema.prototype.i18n = function i18n(messages) {\n\tconst schema = Schema(this);\n\tconst desc = mergeDesc(schema.meta.description, messages);\n\tif (Object.keys(desc).length) schema.meta.description = desc;\n\tif (schema.dict) schema.dict = valueMap(schema.dict, (inner, key) => {\n\t\treturn inner.i18n(valueMap(messages, (data) => getInner(data)?.[key] ?? data?.[key]));\n\t});\n\tif (schema.list) schema.list = schema.list.map((inner, index) => {\n\t\treturn inner.i18n(valueMap(messages, (data = {}) => {\n\t\t\tif (Array.isArray(getInner(data))) return getInner(data)[index];\n\t\t\tif (Array.isArray(data)) return data[index];\n\t\t\treturn extractKeys(data);\n\t\t}));\n\t});\n\tif (schema.inner) schema.inner = schema.inner.i18n(valueMap(messages, (data) => {\n\t\tif (getInner(data)) return getInner(data);\n\t\treturn extractKeys(data);\n\t}));\n\tif (schema.sKey) schema.sKey = schema.sKey.i18n(valueMap(messages, (data) => data?.$key));\n\treturn schema;\n};\nSchema.prototype.extra = function extra(key, value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"required\",\n\t\"disabled\",\n\t\"collapse\",\n\t\"hidden\",\n\t\"loose\"\n]) Object.assign(Schema.prototype, { [key](value = true) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nSchema.prototype.deprecated = function deprecated() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"deprecated\",\n\t\ttype: \"danger\"\n\t});\n\treturn schema;\n};\nSchema.prototype.experimental = function experimental() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"experimental\",\n\t\ttype: \"warning\"\n\t});\n\treturn schema;\n};\nSchema.prototype.pattern = function pattern(regexp) {\n\tconst schema = Schema(this);\n\tconst pattern = pick(regexp, [\"source\", \"flags\"]);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\tpattern\n\t};\n\treturn schema;\n};\nSchema.prototype.simplify = function simplify(value) {\n\tif (isVolatile(value)) value = value.get();\n\tif (deepEqual(value, this.meta.default, this.type === \"dict\")) return null;\n\tif (isNullable(value)) return value;\n\tif (this.type === \"object\" || this.type === \"dict\") {\n\t\tconst result = {};\n\t\tfor (const key in value) {\n\t\t\tconst item = (this.type === \"object\" ? this.dict[key] : this.inner)?.simplify(value[key]);\n\t\t\tif (this.type === \"dict\" || !isNullable(item)) result[key] = item;\n\t\t}\n\t\tif (deepEqual(result, this.meta.default, this.type === \"dict\")) return null;\n\t\treturn result;\n\t} else if (this.type === \"array\" || this.type === \"tuple\") {\n\t\tconst result = [];\n\t\tvalue.forEach((value, index) => {\n\t\t\tconst schema = this.type === \"array\" ? this.inner : this.list[index];\n\t\t\tconst item = schema ? schema.simplify(value) : value;\n\t\t\tresult.push(item);\n\t\t});\n\t\treturn result;\n\t} else if (this.type === \"intersect\") {\n\t\tconst result = {};\n\t\tfor (const item of this.list) Object.assign(result, item.simplify(value));\n\t\treturn result;\n\t} else if (this.type === \"union\") for (const schema of this.list) try {\n\t\tSchema.resolve(value, schema, {});\n\t\treturn schema.simplify(value);\n\t} catch {}\n\treturn value;\n};\nSchema.prototype.toString = function toString(inline) {\n\treturn formatters[this.type]?.(this, inline) ?? `Schema<${this.type}>`;\n};\nSchema.prototype.role = function role(role, extra) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\trole,\n\t\textra\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"default\",\n\t\"link\",\n\t\"comment\",\n\t\"description\",\n\t\"max\",\n\t\"min\",\n\t\"step\"\n]) Object.assign(Schema.prototype, { [key](value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nSchema.prototype.volatile = function volatile() {\n\tif (this.meta.volatile) throw new TypeError(\"volatile schema is already wrapped\");\n\treturn this.extra(\"volatile\", true);\n};\nconst resolvers = {};\nconst checkedVolatile = Symbol(\"checked-volatile-schema\");\nfunction validateVolatileSchema(schema, path = [], blocked = false, seen = /* @__PURE__ */ new Map()) {\n\tconst states = seen.get(schema) ?? /* @__PURE__ */ new Set();\n\tif (states.has(blocked)) return;\n\tstates.add(blocked);\n\tseen.set(schema, states);\n\tif (schema.meta?.volatile && blocked) throw new ValidationError(\"volatile fields require a fixed object path without an enclosing volatile field\", { path });\n\tconst nested = blocked || !!schema.meta?.volatile;\n\tif (schema.dict) for (const [key, child] of Object.entries(schema.dict)) validateVolatileSchema(child, [...path, key], nested, seen);\n\tif (schema.sKey) validateVolatileSchema(schema.sKey, [...path, \"<key>\"], true, seen);\n\tif (schema.inner && (schema.type !== \"lazy\" || schema.inner[kSchema])) validateVolatileSchema(schema.inner, [...path, \"*\"], true, seen);\n\tif (schema.list) for (let index = 0; index < schema.list.length; index++) validateVolatileSchema(schema.list[index], [...path, String(index)], true, seen);\n}\nSchema.extend = function extend(type, resolve) {\n\tresolvers[type] = resolve;\n};\nSchema.resolve = function resolve(data, schema, options = {}, strict = false) {\n\tif (!schema) return [data];\n\tif (!options[checkedVolatile]) {\n\t\tvalidateVolatileSchema(schema, options.path);\n\t\toptions = {\n\t\t\t...options,\n\t\t\t[checkedVolatile]: true\n\t\t};\n\t}\n\tif (schema.meta?.volatile) {\n\t\tconst inner = Schema(schema);\n\t\tinner.meta = {\n\t\t\t...schema.meta,\n\t\t\tvolatile: false\n\t\t};\n\t\tconst [value, adapted] = Schema.resolve(data, inner, options, strict);\n\t\ttry {\n\t\t\treturn [createVolatile(value), adapted];\n\t\t} catch (error) {\n\t\t\tthrow new ValidationError(error instanceof Error ? error.message : String(error), options);\n\t\t}\n\t}\n\tif (options.ignore?.(data, schema)) return [data];\n\tif (isNullable(data) && schema.type !== \"lazy\") {\n\t\tif (schema.meta.required) throw new ValidationError(`missing required value`, options);\n\t\tlet current = schema;\n\t\tlet fallback = schema.meta.default;\n\t\twhile (current?.type === \"intersect\" && isNullable(fallback)) {\n\t\t\tcurrent = current.list[0];\n\t\t\tfallback = current?.meta.default;\n\t\t}\n\t\tif (isNullable(fallback)) return [data];\n\t\tdata = clone(fallback);\n\t}\n\tconst callback = resolvers[schema.type];\n\tif (!callback) throw new ValidationError(`unsupported type \"${schema.type}\"`, options);\n\ttry {\n\t\treturn callback(data, schema, options, strict);\n\t} catch (error) {\n\t\tif (!schema.meta.loose) throw error;\n\t\treturn [schema.meta.default];\n\t}\n};\nSchema.from = function from(source) {\n\tif (isNullable(source)) return Schema.any();\n\telse if ([\n\t\t\"string\",\n\t\t\"number\",\n\t\t\"boolean\"\n\t].includes(typeof source)) return Schema.const(source).required();\n\telse if (source[kSchema]) return source;\n\telse if (typeof source === \"function\") switch (source) {\n\t\tcase String: return Schema.string().required();\n\t\tcase Number: return Schema.number().required();\n\t\tcase Boolean: return Schema.boolean().required();\n\t\tcase Function: return Schema.function().required();\n\t\tdefault: return Schema.is(source).required();\n\t}\n\telse throw new TypeError(`cannot infer schema from ${source}`);\n};\nSchema.lazy = function lazy(builder) {\n\tconst toJSON = () => {\n\t\tif (!schema.inner[kSchema]) {\n\t\t\tschema.inner = schema.builder();\n\t\t\tschema.inner.meta = {\n\t\t\t\t...schema.meta,\n\t\t\t\t...schema.inner.meta\n\t\t\t};\n\t\t}\n\t\treturn schema.inner.toJSON();\n\t};\n\tconst schema = new Schema({\n\t\ttype: \"lazy\",\n\t\tbuilder,\n\t\tinner: { toJSON }\n\t});\n\treturn schema;\n};\nSchema.natural = function natural() {\n\treturn Schema.number().step(1).min(0);\n};\nSchema.percent = function percent() {\n\treturn Schema.number().step(.01).min(0).max(1).role(\"slider\");\n};\nSchema.date = function date() {\n\treturn Schema.union([Schema.is(Date), Schema.transform(Schema.string().role(\"datetime\"), (value, options) => {\n\t\tconst date = new Date(value);\n\t\tif (isNaN(+date)) throw new ValidationError(`invalid date \"${value}\"`, options);\n\t\treturn date;\n\t}, true)]);\n};\nSchema.regExp = function regExp(flag = \"\") {\n\treturn Schema.union([Schema.is(RegExp), Schema.transform(Schema.string().role(\"regexp\", { flag }), (value, options) => {\n\t\ttry {\n\t\t\treturn new RegExp(value, flag);\n\t\t} catch (e) {\n\t\t\tthrow new ValidationError(e.message, options);\n\t\t}\n\t}, true)]);\n};\nSchema.arrayBuffer = function arrayBuffer(encoding) {\n\treturn Schema.union([\n\t\tSchema.is(ArrayBuffer),\n\t\tSchema.is(SharedArrayBuffer),\n\t\tSchema.transform(Schema.any(), (value, options) => {\n\t\t\tif (Binary.isSource(value)) return Binary.fromSource(value);\n\t\t\tthrow new ValidationError(`expected ArrayBufferSource but got ${value}`, options);\n\t\t}, true),\n\t\t...encoding ? [Schema.transform(Schema.string(), (value, options) => {\n\t\t\ttry {\n\t\t\t\treturn encoding === \"base64\" ? Binary.fromBase64(value) : Binary.fromHex(value);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new ValidationError(e.message, options);\n\t\t\t}\n\t\t}, true)] : []\n\t]);\n};\nSchema.extend(\"lazy\", (data, schema, options, strict) => {\n\tif (!schema.inner[kSchema]) {\n\t\tschema.inner = schema.builder();\n\t\tschema.inner.meta = {\n\t\t\t...schema.meta,\n\t\t\t...schema.inner.meta\n\t\t};\n\t\tvalidateVolatileSchema(schema.inner, options.path, true);\n\t}\n\treturn Schema.resolve(data, schema.inner, options, strict);\n});\nSchema.extend(\"any\", (data) => {\n\treturn [data];\n});\nSchema.extend(\"never\", (data, _, options) => {\n\tthrow new ValidationError(`expected nullable but got ${data}`, options);\n});\nSchema.extend(\"const\", (data, { value }, options) => {\n\tif (deepEqual(data, value)) return [value];\n\tthrow new ValidationError(`expected ${value} but got ${data}`, options);\n});\nfunction checkWithinRange(data, meta, description, options, skipMin = false) {\n\tconst { max = Infinity, min = -Infinity } = meta;\n\tif (data > max) throw new ValidationError(`expected ${description} <= ${max} but got ${data}`, options);\n\tif (data < min && !skipMin) throw new ValidationError(`expected ${description} >= ${min} but got ${data}`, options);\n}\nSchema.extend(\"string\", (data, { meta }, options) => {\n\tif (typeof data !== \"string\") throw new ValidationError(`expected string but got ${data}`, options);\n\tif (meta.pattern) {\n\t\tconst regexp = new RegExp(meta.pattern.source, meta.pattern.flags);\n\t\tif (!regexp.test(data)) throw new ValidationError(`expect string to match regexp ${regexp}`, options);\n\t}\n\tcheckWithinRange(data.length, meta, \"string length\", options);\n\treturn [data];\n});\nfunction decimalShift(data, digits) {\n\tconst str = data.toString();\n\tif (str.includes(\"e\")) return data * Math.pow(10, digits);\n\tconst index = str.indexOf(\".\");\n\tif (index === -1) return data * Math.pow(10, digits);\n\tconst frac = str.slice(index + 1);\n\tconst integer = str.slice(0, index);\n\tif (frac.length <= digits) return +(integer + frac.padEnd(digits, \"0\"));\n\treturn +(integer + frac.slice(0, digits) + \".\" + frac.slice(digits));\n}\nfunction isMultipleOf(data, min, step) {\n\tstep = Math.abs(step);\n\tif (!/^\\d+\\.\\d+$/.test(step.toString())) return (data - min) % step === 0;\n\tconst index = step.toString().indexOf(\".\");\n\tconst digits = step.toString().slice(index + 1).length;\n\treturn Math.abs(decimalShift(data, digits) - decimalShift(min, digits)) % decimalShift(step, digits) === 0;\n}\nSchema.extend(\"number\", (data, { meta }, options) => {\n\tif (typeof data !== \"number\") throw new ValidationError(`expected number but got ${data}`, options);\n\tcheckWithinRange(data, meta, \"number\", options);\n\tconst { step } = meta;\n\tif (step && !isMultipleOf(data, meta.min ?? 0, step)) throw new ValidationError(`expected number multiple of ${step} but got ${data}`, options);\n\treturn [data];\n});\nSchema.extend(\"boolean\", (data, _, options) => {\n\tif (typeof data === \"boolean\") return [data];\n\tthrow new ValidationError(`expected boolean but got ${data}`, options);\n});\nSchema.extend(\"bitset\", (data, { bits, meta }, options) => {\n\tlet value = 0, keys = [];\n\tif (typeof data === \"number\") {\n\t\tvalue = data;\n\t\tfor (const key in bits) if (data & bits[key]) keys.push(key);\n\t} else if (Array.isArray(data)) {\n\t\tkeys = data;\n\t\tfor (const key of keys) {\n\t\t\tif (typeof key !== \"string\") throw new ValidationError(`expected string but got ${key}`, options);\n\t\t\tif (key in bits) value |= bits[key];\n\t\t}\n\t} else throw new ValidationError(`expected number or array but got ${data}`, options);\n\tif (value === meta.default) return [value];\n\treturn [value, keys];\n});\nSchema.extend(\"function\", (data, _, options) => {\n\tif (typeof data === \"function\") return [data];\n\tthrow new ValidationError(`expected function but got ${data}`, options);\n});\nSchema.extend(\"is\", (data, { constructor }, options) => {\n\tif (typeof constructor === \"function\") {\n\t\tif (data instanceof constructor) return [data];\n\t\tthrow new ValidationError(`expected ${constructor.name} but got ${data}`, options);\n\t} else {\n\t\tif (isNullable(data)) throw new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t\tlet prototype = Object.getPrototypeOf(data);\n\t\twhile (prototype) {\n\t\t\tif (prototype.constructor?.name === constructor) return [data];\n\t\t\tprototype = Object.getPrototypeOf(prototype);\n\t\t}\n\t\tthrow new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t}\n});\nfunction property(data, key, schema, options) {\n\ttry {\n\t\tconst [value, adapted] = Schema.resolve(data[key], schema, {\n\t\t\t...options,\n\t\t\tpath: [...options.path || [], key]\n\t\t});\n\t\tif (adapted !== void 0) data[key] = adapted;\n\t\treturn value;\n\t} catch (e) {\n\t\tif (!options?.autofix) throw e;\n\t\tdelete data[key];\n\t\treturn schema.meta.volatile ? createVolatile(schema.meta.default) : schema.meta.default;\n\t}\n}\nSchema.extend(\"array\", (data, { inner, meta }, options) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tcheckWithinRange(data.length, meta, \"array length\", options, !isNullable(inner.meta.default));\n\treturn [data.map((_, index) => property(data, index, inner, options))];\n});\nSchema.extend(\"dict\", (data, { inner, sKey }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in data) {\n\t\tlet rKey;\n\t\ttry {\n\t\t\trKey = Schema.resolve(key, sKey, options)[0];\n\t\t} catch (error) {\n\t\t\tif (strict) continue;\n\t\t\tthrow error;\n\t\t}\n\t\tresult[rKey] = property(data, key, inner, options);\n\t\tdata[rKey] = data[key];\n\t\tif (key !== rKey) delete data[key];\n\t}\n\treturn [result];\n});\nSchema.extend(\"tuple\", (data, { list }, options, strict) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tconst result = list.map((inner, index) => property(data, index, inner, options));\n\tif (strict) return [result];\n\tresult.push(...data.slice(list.length));\n\treturn [result];\n});\nfunction merge(result, data) {\n\tfor (const key in data) {\n\t\tif (key in result) continue;\n\t\tresult[key] = data[key];\n\t}\n}\nSchema.extend(\"object\", (data, { dict }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in dict) {\n\t\tconst value = property(data, key, dict[key], options);\n\t\tif (!isNullable(value) || key in data) result[key] = value;\n\t}\n\tif (!strict) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"union\", (data, { list, toString }, options, strict) => {\n\tconst messages = [];\n\tfor (const inner of list) try {\n\t\treturn Schema.resolve(data, inner, options, strict);\n\t} catch (error) {\n\t\tmessages.push(error);\n\t}\n\tthrow new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n});\nSchema.extend(\"intersect\", (data, { list, toString }, options, strict) => {\n\tif (!list.length) return [data];\n\tlet result;\n\tfor (const inner of list) {\n\t\tconst value = Schema.resolve(data, inner, options, true)[0];\n\t\tif (isNullable(value)) continue;\n\t\tif (isNullable(result)) result = value;\n\t\telse if (typeof result !== typeof value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t\telse if (typeof value === \"object\") merge(result ??= {}, value);\n\t\telse if (result !== value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t}\n\tif (!strict && isPlainObject(data)) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"transform\", (data, { inner, callback, preserve }, options) => {\n\tconst [result, adapted = data] = Schema.resolve(data, inner, options, true);\n\tif (preserve) return [callback(result)];\n\telse return [callback(result), callback(adapted)];\n});\nconst formatters = {};\nfunction defineMethod(name, keys, format) {\n\tformatters[name] = format;\n\tObject.assign(Schema, { [name](...args) {\n\t\tconst schema = new Schema({ type: name });\n\t\tkeys.forEach((key, index) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase \"sKey\":\n\t\t\t\t\tschema.sKey = args[index] ?? Schema.string();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"inner\":\n\t\t\t\t\tschema.inner = Schema.from(args[index]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"list\":\n\t\t\t\t\tschema.list = args[index].map(Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dict\":\n\t\t\t\t\tschema.dict = valueMap(args[index], Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bits\":\n\t\t\t\t\tschema.bits = {};\n\t\t\t\t\tfor (const key in args[index]) {\n\t\t\t\t\t\tif (typeof args[index][key] !== \"number\") continue;\n\t\t\t\t\t\tschema.bits[key] = args[index][key];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"callback\": {\n\t\t\t\t\tconst callback = schema.callback = args[index];\n\t\t\t\t\tcallback[\"toJSON\"] ||= () => callback.toString();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"constructor\": {\n\t\t\t\t\tconst constructor = schema.constructor = args[index];\n\t\t\t\t\tif (typeof constructor === \"function\") constructor[\"toJSON\"] ||= () => constructor[\"name\"];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: schema[key] = args[index];\n\t\t\t}\n\t\t});\n\t\tif (name === \"object\" || name === \"dict\") schema.meta.default = {};\n\t\telse if (name === \"array\" || name === \"tuple\") schema.meta.default = [];\n\t\telse if (name === \"bitset\") schema.meta.default = 0;\n\t\treturn schema;\n\t} });\n}\ndefineMethod(\"is\", [\"constructor\"], ({ constructor }) => {\n\tif (typeof constructor === \"function\") return constructor.name;\n\telse return constructor;\n});\ndefineMethod(\"any\", [], () => \"any\");\ndefineMethod(\"never\", [], () => \"never\");\ndefineMethod(\"const\", [\"value\"], ({ value }) => typeof value === \"string\" ? JSON.stringify(value) : value);\ndefineMethod(\"string\", [], () => \"string\");\ndefineMethod(\"number\", [], () => \"number\");\ndefineMethod(\"boolean\", [], () => \"boolean\");\ndefineMethod(\"bitset\", [\"bits\"], () => \"bitset\");\ndefineMethod(\"function\", [], () => \"function\");\ndefineMethod(\"array\", [\"inner\"], ({ inner }) => `${inner.toString(true)}[]`);\ndefineMethod(\"dict\", [\"inner\", \"sKey\"], ({ inner, sKey }) => `{ [key: ${sKey.toString()}]: ${inner.toString()} }`);\ndefineMethod(\"tuple\", [\"list\"], ({ list }) => `[${list.map((inner) => inner.toString()).join(\", \")}]`);\ndefineMethod(\"object\", [\"dict\"], ({ dict }) => {\n\tif (Object.keys(dict).length === 0) return \"{}\";\n\treturn `{ ${Object.entries(dict).map(([key, inner]) => {\n\t\treturn `${key}${inner.meta.required ? \"\" : \"?\"}: ${inner.toString()}`;\n\t}).join(\", \")} }`;\n});\ndefineMethod(\"union\", [\"list\"], ({ list }, inline) => {\n\tconst result = list.map(({ toString: format }) => format()).join(\" | \");\n\treturn inline ? `(${result})` : result;\n});\ndefineMethod(\"intersect\", [\"list\"], ({ list }) => {\n\treturn `${list.map((inner) => inner.toString(true)).join(\" & \")}`;\n});\ndefineMethod(\"transform\", [\n\t\"inner\",\n\t\"callback\",\n\t\"preserve\"\n], ({ inner }, isInner) => inner.toString(isInner));\n//#endregion\nexport { Schema as default };\n", "import type { Volatile } from '@deepseek-ai/cordis';\nimport type { PluginConfig } from './types.ts';\nimport type { CredentialsReader } from './credentials.ts';\n\n/**\n * Bounds for the AI channel request timeout. One request carries a packed run\n * of whole reply blocks, and a local model can take minutes on that much\n * prose, so the budget is sized for long-form output.\n */\nexport const AI_TIMEOUT_MIN = 500;\nexport const AI_TIMEOUT_MAX = 900000;\n\n/**\n * The settings namespace this plugin owns. A namespace IS the Profile entry\n * id, so the user-editable layer is the `config` row of `dsh-chat-translate`\n * in the active profile's patch (`~/.dsh/profiles/<profile>/cordis.patch.yml`).\n */\nexport const SETTINGS_NAMESPACE = 'dsh-chat-translate';\n\nexport const DEFAULT_CONFIG: PluginConfig = {\n enabled: true,\n aiTimeoutMs: 600000,\n baseUrl: '',\n model: '',\n};\n\n/**\n * Live read face of this plugin's own Config, as `ConfigManager` consumes it.\n *\n * Keeping this structural (instead of importing the DSH packages) lets tests\n * inject an in-memory fake and keeps the host bundle free of service code. The\n * plugin has no write face of its own: an accepted edit is written by the\n * browser configuration form into the profile patch, and DSH commits the new\n * value into the `Volatile` refs this source reads.\n */\nexport interface ConfigSourceLike {\n /** Resolved value: schema defaults, then composition base, then user layer. */\n get(): PluginConfig;\n /** Observe committed live edits; returns the disposer. */\n watch(listener: (config: PluginConfig) => void): () => void;\n}\n\n/**\n * Fields of this plugin's Config as the runtime resolved them. Every field is\n * declared `volatile()`, so each one is a stable ref DSH commits a live edit\n * into rather than a snapshot taken at apply time.\n */\nexport interface PluginConfigRefs {\n readonly enabled: Volatile<boolean>;\n readonly aiTimeoutMs: Volatile<number>;\n readonly baseUrl: Volatile<string>;\n readonly model: Volatile<string>;\n}\n\n/**\n * Read the current committed value of every Config field.\n * @param refs - the runtime-resolved Config object.\n * @returns A detached plain config value.\n */\nexport function readPluginConfig(refs: PluginConfigRefs): PluginConfig {\n return {\n enabled: refs.enabled.get(),\n aiTimeoutMs: refs.aiTimeoutMs.get(),\n baseUrl: refs.baseUrl.get(),\n model: refs.model.get(),\n };\n}\n\n/**\n * Adapt this plugin's runtime-resolved Config into the live source\n * {@link ConfigManager} consumes.\n *\n * DSH commits an accepted live edit into the `Volatile` refs in place, then\n * emits `loader/volatile-update` on the owning fiber \u2014 the listener is scoped\n * to this plugin's own entry, so one subscription covers every field.\n *\n * @param onVolatileUpdate - subscribes to this plugin's volatile-commit event.\n * @param refs - the runtime-resolved Config object.\n * @returns The live read/watch source.\n */\nexport function createLiveConfigSource(\n onVolatileUpdate: (listener: () => void) => () => void,\n refs: PluginConfigRefs\n): ConfigSourceLike {\n return {\n get: () => readPluginConfig(refs),\n watch: (listener) => onVolatileUpdate(() => listener(readPluginConfig(refs))),\n };\n}\n\n/**\n * Config facade over this plugin's own live Config. This module does no file\n * I/O: persistence, atomic writes, external-edit hot reload and the\n * browser-facing edit API are all owned by DSH itself.\n */\nexport class ConfigManager {\n private source: ConfigSourceLike;\n private credentials: CredentialsReader;\n\n constructor(source: ConfigSourceLike, credentials: CredentialsReader) {\n this.source = source;\n this.credentials = credentials;\n }\n\n getConfig(): PluginConfig {\n return this.source.get();\n }\n\n /** Whether the AI channel has every required piece: baseUrl, model and key. */\n isAiConfigured(): boolean {\n const config = this.getConfig();\n return Boolean(\n config.baseUrl.trim() &&\n config.model.trim() &&\n this.credentials.getApiKey()\n );\n }\n\n onConfigChange(listener: (config: PluginConfig) => void): () => void {\n return this.source.watch(listener);\n }\n}\n", "/**\n * API-key access through the DSH `ctx.credentials` service.\n *\n * The service owns ~/.dsh/.credentials.yaml (refs section, 0600 perms, env\n * shadowing, cross-process locking): reads go through `resolve`, writes through\n * `set`/`unset`, and the host's `credentials/reference-updated` event keeps\n * the sync cache warm.\n */\n\n/** Refs key that holds the translation API key. */\nexport const TRANSLATE_API_KEY_REF = 'TRANSLATE_API_KEY';\n\n/** The sync read face the hot translation path needs. */\nexport interface KeyReader {\n getApiKey(): string;\n}\n\n/** Minimal structural shape of the DSH `ctx.credentials` service. */\nexport interface CredentialsServiceLike {\n /** Resolve a ref to its stored/inherited value; undefined when absent. */\n resolve(ref: string): Promise<{ value: string; source?: string } | undefined>;\n /** Status-only view \u2014 never returns the plaintext value. */\n describe(ref: string): Promise<{ configured: boolean; source?: string; writable: boolean }>;\n /** Store a non-empty value under the ref. */\n set(ref: string, value: string): Promise<void>;\n /** Remove the ref from the document. */\n unset(ref: string): Promise<void>;\n}\n\nexport class CredentialsReader implements KeyReader {\n private service: CredentialsServiceLike;\n private cachedKey = '';\n private refreshing: Promise<void> | null = null;\n\n constructor(service: CredentialsServiceLike) {\n this.service = service;\n }\n\n /** Load the API key once; safe to call multiple times. */\n async init(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Re-read the key from the credentials service. Used at startup and on\n * `credentials/reference-updated` events so an external edit or a write\n * from another surface takes effect immediately.\n */\n async refresh(): Promise<void> {\n if (this.refreshing) return this.refreshing;\n this.refreshing = (async () => {\n try {\n const resolved = await this.service.resolve(TRANSLATE_API_KEY_REF);\n this.cachedKey = (resolved?.value ?? '').trim();\n } catch (err) {\n console.warn('[dsh-chat-translate] Failed to resolve TRANSLATE_API_KEY:', err);\n } finally {\n this.refreshing = null;\n }\n })();\n return this.refreshing;\n }\n\n /** Synchronous cached read \u2014 the hot translation path stays sync. */\n getApiKey(): string {\n return this.cachedKey;\n }\n\n /**\n * Status-only view of the ref (plaintext never crosses the wire).\n *\n * @internal Test-only. The settings UI reads key status through the\n * `credentials` Remote API with its own client-side shape, so nothing in\n * `src/` calls this host-side method; only `scripts/test-*.mjs` do.\n */\n async describe(): Promise<{ configured: boolean; writable: boolean }> {\n try {\n const info = await this.service.describe(TRANSLATE_API_KEY_REF);\n return { configured: info.configured, writable: info.writable };\n } catch {\n return { configured: false, writable: false };\n }\n }\n\n /** Write (or clear) the ref through the DSH credentials service. */\n async setApiKey(apiKey: string): Promise<void> {\n const normalized = apiKey.trim();\n if (normalized) {\n await this.service.set(TRANSLATE_API_KEY_REF, normalized);\n } else {\n await this.service.unset(TRANSLATE_API_KEY_REF);\n }\n // The write committed: set the cache synchronously so the hot path never\n // reads a stale key even if a concurrent refresh() is still in flight,\n // then confirm from the service (which also fans reference-updated).\n this.cachedKey = normalized;\n await this.refresh();\n }\n}\n", "import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { dshHomePath } from '@deepseek-ai/dsh-home-paths';\nimport { PROMPT_REVISION } from './prompt-revision.ts';\n\n/** Entries older than this are treated as expired. */\nconst TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\ninterface CacheEntry {\n t: number; // epoch ms, written at set()\n v: string;\n}\n\n/**\n * The on-disk document: the prompt revision that wrote it, then the pool.\n * A document whose `rev` is not the current revision belongs to a superseded\n * prompt semantics and is dropped whole on load \u2014 replaying stale\n * translations into a new policy is exactly how a prompt fix \"does nothing\".\n */\ninterface CacheDocument {\n rev: string;\n entries: Record<string, CacheEntry>;\n}\n\nexport class LruDiskCache {\n private cache = new Map<string, CacheEntry>();\n private maxEntries: number;\n private filePath: string;\n private revision: string;\n private saveTimer: NodeJS.Timeout | null = null;\n private dirty = false;\n\n constructor(maxEntries = 1000, fileName = 'cache.json', revision = PROMPT_REVISION) {\n this.maxEntries = maxEntries;\n this.revision = revision;\n // Follow the DSH convention of component-owned home subdirectories\n // (sessions/, storages/, attachments/) instead of polluting ~/.dsh.\n // dshHomePath mirrors resolveDshHome exactly: explicit configured home,\n // then $DSH_HOME (tilde-expanded), then ~/.dsh.\n this.filePath = dshHomePath('dsh-chat-translate', fileName);\n }\n\n async init(): Promise<void> {\n try {\n const content = await fs.readFile(this.filePath, 'utf-8');\n const doc = JSON.parse(content) as unknown;\n if (\n doc &&\n typeof doc === 'object' &&\n (doc as CacheDocument).rev === this.revision &&\n typeof (doc as CacheDocument).entries === 'object' &&\n (doc as CacheDocument).entries !== null\n ) {\n this.loadEntries((doc as CacheDocument).entries as Record<string, unknown>);\n }\n // Any other document \u2014 missing, corrupt, or a superseded revision \u2014\n // leaves the pool empty; the next flush rewrites it under this revision.\n } catch {\n // Ignore missing or corrupt cache file\n }\n }\n\n /** Adopt loaded entries, dropping malformed ones. */\n private loadEntries(raw: Record<string, unknown>): void {\n for (const [k, entry] of Object.entries(raw)) {\n const value = entry as CacheEntry | undefined;\n // The document on disk outlives the process: only well-formed entries\n // (a finite timestamp and a string translation) are served again.\n if (\n value &&\n typeof value === 'object' &&\n typeof value.v === 'string' &&\n typeof value.t === 'number' &&\n Number.isFinite(value.t)\n ) {\n this.cache.set(k, value);\n }\n }\n }\n\n get(key: string): string | undefined {\n const entry = this.cache.get(key);\n if (entry === undefined) return undefined;\n if (Date.now() - entry.t > TTL_MS) {\n this.cache.delete(key);\n return undefined;\n }\n // Refresh key in LRU order (re-insert at the end)\n this.cache.delete(key);\n this.cache.set(key, entry);\n return entry.v;\n }\n\n set(key: string, value: string): void {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n } else if (this.cache.size >= this.maxEntries) {\n // Remove least recently used entry (first in Map iterator)\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n this.cache.set(key, { t: Date.now(), v: value });\n this.dirty = true;\n this.scheduleSave();\n }\n\n private scheduleSave(): void {\n if (this.saveTimer) return;\n this.saveTimer = setTimeout(() => {\n this.saveTimer = null;\n if (this.dirty) {\n // flush() owns the dirty flag: cleared only on a committed write, so\n // a failure keeps it set and schedules its own retry.\n this.flush().catch((err) => {\n console.warn('[dsh-chat-translate] Failed to flush cache to disk:', err);\n });\n }\n }, 5000);\n }\n\n async flush(): Promise<void> {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n const tmpPath = `${this.filePath}.tmp.${Date.now()}.${Math.random().toString(36).slice(2)}`;\n try {\n const entries: Record<string, CacheEntry> = {};\n for (const [k, v] of this.cache.entries()) {\n entries[k] = v;\n }\n const doc: CacheDocument = { rev: this.revision, entries };\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(tmpPath, JSON.stringify(doc, null, 2), 'utf-8');\n await fs.rename(tmpPath, this.filePath);\n // Only clear the dirty flag once the write actually committed; a failed\n // flush must not silently drop pending entries.\n this.dirty = false;\n } catch (err) {\n console.warn('[dsh-chat-translate] Failed to write cache file atomically:', err);\n try {\n await fs.unlink(tmpPath);\n } catch {}\n // Schedule one retry so a transient disk failure does not lose the\n // pending entries; dispose() is the only caller that must not reschedule.\n if (this.dirty) {\n this.scheduleSave();\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n if (this.dirty) {\n await this.flush();\n }\n }\n}\n", "import { opendir, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n//#region lib/types/index.js\n/**\n* Shared filesystem path helpers for DeepSeek Harness user data.\n*\n* @module @deepseek-ai/dsh-home-paths\n*/\n/** Directory name for the default DeepSeek Harness home under the OS home. */\nconst DSH_HOME_DIR_NAME = \".dsh\";\n/** Stable user-facing display form for the default DeepSeek Harness home. */\nconst DEFAULT_DSH_HOME_DISPLAY = `~/${DSH_HOME_DIR_NAME}`;\n/** Environment variable that overrides the default DeepSeek Harness home. */\nconst DSH_HOME_ENV = \"DSH_HOME\";\n/**\n* Give a native filesystem watcher one canonical spelling of a path, even\n* when its final components do not exist yet. The deepest existing ancestor\n* is resolved through {@link realpath}; when a suffix is missing, that\n* ancestor is also proved to be an enumerable directory before the suffix is\n* restored. This prevents Windows from treating a regular-file ancestor as\n* ordinary absence, and prevents short-name aliases from being mixed with\n* long paths emitted by the native watcher backend.\n* @param path - Watch target or root, resolved against the current directory.\n* @returns the target with its existing ancestor canonicalized.\n* @throws when ancestor traversal encounters an error other than absence, or\n* the existing ancestor of a missing suffix is not an enumerable directory.\n*/\nasync function canonicalizeWatchPath(path) {\n\tlet current = resolve(path);\n\tconst missing = [];\n\twhile (true) try {\n\t\tconst canonical = await realpath(current);\n\t\tif (missing.length > 0) await (await opendir(canonical)).close();\n\t\treturn join(canonical, ...missing.reverse());\n\t} catch (error) {\n\t\tif (error.code !== \"ENOENT\") throw error;\n\t\tconst parent = dirname(current);\n\t\t/* v8 ignore next -- a filesystem root exists, so traversal resolves before this guard */\n\t\tif (parent === current) throw error;\n\t\tmissing.push(basename(current));\n\t\tcurrent = parent;\n\t}\n}\n/**\n* Resolve the default DeepSeek Harness home using Node's platform path rules.\n* @returns the absolute default harness home path.\n*/\nfunction defaultDshHome() {\n\treturn join(homedir(), DSH_HOME_DIR_NAME);\n}\n/**\n* Expand supported tilde prefixes against the operating-system home.\n* @param path - configured path that may begin with `~`, `~/`, or `~\\`.\n* @returns the expanded path, or the original value when no supported prefix is present.\n*/\nfunction expandHomePath(path) {\n\tif (path === \"~\") return homedir();\n\tif (path.startsWith(\"~/\") || path.startsWith(\"~\\\\\")) return join(homedir(), path.slice(2));\n\treturn path;\n}\n/**\n* Resolve the single-root DeepSeek Harness home.\n*\n* Precedence, highest first: an explicit configured path, `$DSH_HOME`, then\n* `~/.dsh`. The harness keeps all user data under one root. An empty or\n* whitespace-only `$DSH_HOME` is treated as unset, so a blank override never\n* resolves the home to the current working directory.\n* @param configured - explicit harness-home override, which has highest precedence.\n* @param env - environment mapping used to read `DSH_HOME`.\n* @returns the normalized absolute harness home path.\n*/\nfunction resolveDshHome(configured, env = process.env) {\n\tconst fromEnv = env[DSH_HOME_ENV];\n\treturn resolve(expandHomePath(configured ?? (fromEnv !== void 0 && fromEnv.trim().length > 0 ? fromEnv : defaultDshHome())));\n}\n/**\n* Join path segments onto the resolved DeepSeek Harness home.\n* @param segments - path segments appended to the Harness home; an empty list returns the home itself.\n* @returns the normalized absolute joined path.\n*/\nfunction dshHomePath(...segments) {\n\treturn join(resolveDshHome(), ...segments);\n}\n/**\n* Join path segments onto the resolved Harness home's `cache` directory without creating it; no arguments returns the directory itself.\n* @param optionsOrSegment - explicit home override, or the first path segment; omission uses the default home resolution.\n* @param segments - additional path segments after the first child, if any.\n* @returns the normalized absolute cache path.\n*/\nfunction dshCachePath(optionsOrSegment = {}, ...segments) {\n\tif (typeof optionsOrSegment === \"string\") return dshHomePath(\"cache\", optionsOrSegment, ...segments);\n\treturn join(resolveDshHome(optionsOrSegment.dshHome), \"cache\", ...segments);\n}\n/**\n* Describe a resolved harness home symbolically for user-facing display.\n*\n* It never returns an absolute machine path: the default home is labelled\n* `~/.dsh`, and any configured home is labelled `$DSH_HOME`.\n* @param resolvedHome - the absolute path returned by {@link resolveDshHome}.\n* @returns `~/.dsh` for the default home, otherwise `$DSH_HOME`.\n*/\nfunction dshHomeDisplay(resolvedHome) {\n\treturn resolvedHome === resolve(defaultDshHome()) ? DEFAULT_DSH_HOME_DISPLAY : `$${DSH_HOME_ENV}`;\n}\n//#endregion\nexport { DEFAULT_DSH_HOME_DISPLAY, DSH_HOME_DIR_NAME, DSH_HOME_ENV, canonicalizeWatchPath, defaultDshHome, dshCachePath, dshHomeDisplay, dshHomePath, expandHomePath, resolveDshHome };\n", "/**\n * The single registration of the translation prompt's semantic revision.\n *\n * The reply cache stores results keyed by source text; a cache document\n * written under a different prompt semantics would replay stale translations\n * into a new policy (the exact poisoning that makes \"already-Chinese blocks\n * look untranslated\" persist for a TTL after a prompt change). The document\n * therefore carries this revision, and a load whose revision differs starts\n * from an empty pool.\n *\n * Bump it \u2014 and only here \u2014 whenever the prompt below `buildSystemPrompt`\n * changes what the model is asked to do. Copy-only edits may ride.\n */\nexport const PROMPT_REVISION = 'r2';\n", "/**\n * \u628A fetch / \u7F51\u7EDC\u5931\u8D25\u7684\u53EF\u8BFB\u539F\u56E0\u5C55\u5F00\u6210\u5355\u884C\u6587\u672C\uFF08\u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u5171\u7528\uFF09\u3002\n *\n * \u80CC\u666F\uFF1ANode 18+ \u4E0E\u6D4F\u89C8\u5668\u7684 fetch \u5728\u7F51\u7EDC\u5C42\u5931\u8D25\u65F6\u53EA\u7ED9\u4E00\u53E5 `TypeError: fetch failed`\n * \uFF08\u6D4F\u89C8\u5668\u662F `Failed to fetch`\uFF09\uFF0C\u771F\u5B9E\u539F\u56E0\u85CF\u5728 `err.cause` \u91CC\u2014\u2014\u4F8B\u5982\n * `connect ENETUNREACH 172.24.52.126:8081`\u3001`other side closed [UND_ERR_SOCKET]`\u3001\n * `getaddrinfo ENOTFOUND`\u3002\u53EA\u4E0A\u62A5 `err.message` \u4F1A\u8BA9\u300C\u7AEF\u70B9\u4E0D\u53EF\u8FBE / \u88AB\u4EE3\u7406\u65AD\u5F00\u300D\u548C\n * \u300C\u63D2\u4EF6\u81EA\u8EAB\u51FA\u9519\u300D\u957F\u5F97\u4E00\u6A21\u4E00\u6837\uFF1A\u7528\u6237\u53EA\u770B\u5230\u65E0\u4FE1\u606F\u91CF\u7684 fetch failed\uFF0C\u65E0\u4ECE\u5224\u65AD\u8BE5\u6539\u4EC0\u4E48\u3002\n *\n * \u8FD9\u91CC\u628A message \u4E0E cause \u94FE\uFF08\u542B AggregateError \u7684\u591A\u5730\u5740\u5931\u8D25\uFF09\u62FC\u6210 `A \u2190 B \u2190 C`\u3002\n */\nexport function describeError(err: unknown): string {\n if (err === null || err === undefined) return String(err);\n const parts: string[] = [];\n const push = (s: string): void => {\n const t = String(s || '').trim();\n if (t && !parts.includes(t)) parts.push(t);\n };\n const head = (err as { message?: string }).message || String(err);\n push(head);\n const headCode = (err as { code?: string }).code;\n if (headCode && !head.includes(headCode)) push('[' + headCode + ']');\n let cause = (err as { cause?: unknown }).cause as\n | { message?: string; code?: string; cause?: unknown; errors?: unknown }\n | undefined;\n for (let depth = 0; cause && depth < 4; depth++) {\n const label = cause.message || String(cause);\n push(cause.code && !label.includes(cause.code) ? label + ' [' + cause.code + ']' : label);\n // AggregateError\uFF1A\u591A\u5730\u5740\u5168\u90E8\u5931\u8D25\uFF08happy-eyeballs \u53CC\u6808\u5E38\u89C1\uFF09\uFF0C\u5C55\u5F00\u524D\u51E0\u6761\n if (Array.isArray(cause.errors)) {\n for (const sub of (cause.errors as { message?: string; code?: string }[]).slice(0, 3)) {\n if (sub) push(sub.code || sub.message || String(sub));\n }\n }\n cause = cause.cause as typeof cause;\n }\n return parts.join(' \u2190 ');\n}", "import type {\n ITranslationAdapter,\n PluginConfig,\n TranslateAdapterOptions,\n} from './base.ts';\nimport type { KeyReader } from '../credentials.ts';\n\n/**\n * OpenAI-compatible Chat Completions translation channel.\n *\n * Talks to `POST {baseUrl}/chat/completions` with a Bearer token read from\n * ~/.dsh/.credentials.yaml (refs.TRANSLATE_API_KEY). Works with OpenAI,\n * DeepSeek, Qwen, Ollama and any other service exposing the standard endpoint.\n */\n\n/**\n * The translator instruction. Code fences are cut out before the model ever\n * sees the message (pipeline/segments.ts), so there is nothing here about\n * them beyond the fence-shaped batch markers, which are described by bracket\n * shape alone: naming any of their characters gives a small model something\n * to echo.\n *\n * Every passage is processed, including passages already in Chinese: weak\n * models write stiff machine-flavored Chinese (\"\u7845\u57FA\u4E2D\u6587\"), and that is the\n * same defect translation fixes, so Chinese gets a polishing pass too. Input\n * is reply Markdown and output is re-rendered as Markdown by the client. The\n * host repairs the answer's shape back to the source (block alignment, marker\n * prefixes, blank-line layout, link targets) and, when it cannot, still shows\n * the translation rather than vetoing it \u2014 so the instruction asks the model\n * to keep the structure line by line (line counts, indentation, block markers,\n * table pipes, links) because closer output means less repair, never because a\n * mismatch fails. It also tells the model link targets must be copied verbatim\n * (the host restores them anyway; the rule keeps the parentheses intact).\n * Inline code is styling, not structure: its contents may be translated and\n * the backticks may drift without veto.\n *\n * Prompt semantics are registered in `prompt-revision.ts`; changing what this\n * prompt asks the model to do means bumping that revision with it.\n */\nconst TARGET_LANGUAGE = 'Simplified Chinese';\n\nfunction buildSystemPrompt(mode: 'plain' | 'blocks'): string {\n const base =\n `You are a professional translator and editor. ` +\n `Rewrite the user's message as natural, idiomatic ${TARGET_LANGUAGE} the way a ` +\n `native writer would produce it. ` +\n `This applies to every passage, including passages already written in ` +\n `${TARGET_LANGUAGE}: smooth out stiff or machine-translated phrasing while ` +\n `keeping the meaning, tone, proper names, numbers and technical terms ` +\n `unchanged. Never drop content and never add content. ` +\n `The message is Markdown that will be re-rendered as Markdown, and its ` +\n `structure is verified line by line: keep the same number of lines, the ` +\n `same indentation, the same heading, quote and list markers, the same ` +\n `table rows and pipe counts, and the same number of links. Inline code ` +\n `contents may stay as they are or be translated where that reads better. ` +\n `For a link ` +\n `[text](target), translate only the text and copy the target inside the ` +\n `parentheses character-for-character. Never add, remove, reorder or nest ` +\n `Markdown syntax of your own. ` +\n `Output ONLY the resulting text \u2014 no explanations, no quotation marks, no extra words, ` +\n `no code fence around the whole answer.`;\n if (mode === 'plain') return base;\n return (\n base +\n ` The message is a sequence of parts. Each part starts with its own line ` +\n `holding a marker: an index between the bracket characters U+27EA and ` +\n `U+27EB. For every part, output its marker line unchanged, then that ` +\n `part's rewrite on the following lines. Rewrite each part on its ` +\n `own, keep the parts in the original order, and never merge two parts ` +\n `into one answer.`\n );\n}\n\nexport class OpenAiCompatibleAdapter implements ITranslationAdapter {\n readonly id = 'openai';\n readonly name = 'OpenAI \u517C\u5BB9 (Chat Completions)';\n\n private credentials: KeyReader;\n\n constructor(credentials: KeyReader) {\n this.credentials = credentials;\n }\n\n isAvailable(config: PluginConfig): boolean {\n return Boolean(config.baseUrl?.trim() && config.model?.trim() && this.credentials.getApiKey());\n }\n\n async translate(\n text: string,\n signal: AbortSignal,\n config: PluginConfig,\n options?: TranslateAdapterOptions\n ): Promise<string> {\n const apiKey = this.credentials.getApiKey();\n if (!apiKey) {\n throw new Error(`TRANSLATE_API_KEY is not configured in ~/.dsh/.credentials.yaml`);\n }\n const baseUrl = (config.baseUrl || '').trim().replace(/\\/+$/, '');\n const model = (config.model || '').trim();\n if (!baseUrl || !model) {\n throw new Error('OpenAI channel: baseUrl or model is not configured');\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n ...(options?.maxTokens === undefined ? {} : { max_tokens: options.maxTokens }),\n messages: [\n { role: 'system', content: buildSystemPrompt(options?.mode ?? 'plain') },\n { role: 'user', content: text },\n ],\n }),\n signal,\n });\n\n if (!response.ok) {\n let detail = '';\n try {\n const errBody = (await response.json()) as { error?: { message?: string }; message?: string };\n detail = errBody?.error?.message || errBody?.message || '';\n } catch {\n // ignore body parse errors\n }\n throw new Error(`OpenAI-compatible API responded with ${response.status}${detail ? `: ${detail}` : ''}`);\n }\n\n const data = (await response.json()) as { choices?: Array<{ message?: { content?: string } }> };\n const content = data?.choices?.[0]?.message?.content;\n const translated = typeof content === 'string' ? content.trim() : '';\n if (!translated) {\n throw new Error('OpenAI-compatible API returned empty content');\n }\n return translated;\n }\n}\n", "\n/** \u6BCF\u6B21\u6253\u5305\u8BF7\u6C42\u91CD\u63B7\u7684 4 \u5B57\u6BCD\u968F\u673A id\uFF1A\u8BA9\u6807\u8BB0\u65E0\u6CD5\u88AB\u5F53\u6210\u8BCD\u3001\u4E5F\u4E0D\u4F1A\u8DE8\u8BF7\u6C42\u649E\u8F66\u3002 */\nfunction randomTokenId(): string {\n let out = '';\n for (let i = 0; i < 4; i++) {\n out += 'abcdefghijklmnopqrstuvwxyz'[Math.floor(Math.random() * 26)];\n }\n return out;\n}\n\n/**\n * \u56DE\u7B54\u6B63\u6587\u7FFB\u8BD1\u7684\u8BF7\u6C42\u9884\u7B97\u3002\u6BCF\u6B21\u8BF7\u6C42\u7684\u8F93\u5165\u4F30\u7B97 token \u4E0A\u9650\uFF0C\u4E0E\u672C\u5730\u670D\u52A1\u7684\n * prefill \u6279\u6B21\uFF08MAX_NUM_BATCHED_TOKENS\uFF09\u4FDD\u6301\u540C\u4E00\u91CF\u7EA7\uFF1B\u8F93\u51FA\u4E0A\u9650\u5199\u8FDB\u8BF7\u6C42\u4F53\u7684\n * max_tokens\uFF0C\u907F\u514D\u957F\u6587\u672C\u628A\u5269\u4F59\u4E0A\u4E0B\u6587\u5168\u90E8\u82B1\u5728\u751F\u6210\u4E0A\u3002\n */\nexport const REPLY_MAX_INPUT_TOKENS = 4096;\nexport const REPLY_MAX_OUTPUT_TOKENS = 8192;\n\n/** \u6C49\u5B57\u4E0E\u5168\u89D2\u6807\u70B9\u6309\u4E00\u5B57\u4E00 token \u8BA1\u3002 */\nconst CJK_CHAR = /[\\u3400-\\u4dbf\\u4e00-\\u9fff\\uf900-\\ufaff\\u3000-\\u303f\\uff00-\\uffef]/;\n\n/**\n * \u4FDD\u5B88\u4F30\u7B97\u4E00\u6BB5\u6587\u672C\u5360\u7528\u7684 token \u6570\uFF1A\u6C49\u5B57\u4E00\u5B57\u4E00 token\uFF0C\u5176\u4F59\u6BCF\u4E09\u4E2A\u5B57\u7B26\u4E00 token\u3002\n * \u5B9E\u6D4B\u672C\u673A hy-mt2-1.8b \u7684\u82F1\u6587\u8BED\u6599\u7EA6\u4E3A\u6BCF 3.3 \u5B57\u7B26\u4E00 token\uFF0C\u8FD9\u91CC\u53D6 3 \u4F5C\u4E3A\u4E0A\u754C\uFF0C\n * \u5B81\u53EF\u628A\u8BF7\u6C42\u5207\u5F97\u6BD4\u5B9E\u9645\u9700\u8981\u66F4\u788E\uFF0C\u4E5F\u4E0D\u8BA9\u670D\u52A1\u7AEF\u6536\u5230\u8D85\u51FA\u9884\u671F\u7684 prefill\u3002\n */\nexport function estimateTokens(text: string): number {\n let cjk = 0;\n for (const char of text) {\n if (CJK_CHAR.test(char)) cjk += 1;\n }\n return cjk + Math.ceil((text.length - cjk) / 3);\n}\n\n/** \u6309\u6355\u83B7\u7EC4\u5206\u9694\u7B26\u5207\u5206\uFF0C\u5E76\u8BA9\u5206\u9694\u7B26\u7559\u5728\u524D\u4E00\u4E2A\u7247\u6BB5\u672B\u5C3E\u3002 */\nfunction splitKeepingSeparator(text: string, pattern: RegExp): string[] {\n const parts = text.split(pattern);\n const chunks: string[] = [];\n for (let index = 0; index < parts.length; index += 2) {\n const content = parts[index] ?? '';\n const separator = parts[index + 1] ?? '';\n if (content === '' && separator === '') continue;\n chunks.push(content + separator);\n }\n return chunks;\n}\n\n/** \u6309\u53E5\u672B\u6807\u70B9\u5207\u5206\uFF0C\u4F5C\u4E3A\u7A7A\u884C\u4E0E\u5355\u884C\u90FD\u5207\u4E0D\u5F00\u65F6\u7684\u6700\u540E\u4E00\u6863\u3002 */\nfunction sentenceChunks(text: string): string[] {\n const chunks = text.match(/[^.!?\u3002\uFF01\uFF1F\\n]+[.!?\u3002\uFF01\uFF1F]*[ \\t]*\\n?/g);\n return chunks === null ? [text] : chunks.filter((chunk) => chunk.length > 0);\n}\n\n/** \u5355\u5757\u5185\u90E8\u627E\u4E0D\u5230\u81EA\u7136\u8FB9\u754C\u65F6\u7684\u515C\u5E95\uFF1A\u6309\u4F30\u7B97 token \u786C\u5207\u3002 */\nfunction hardSlice(text: string, maxTokens: number): string[] {\n const out: string[] = [];\n let current = '';\n let tokens = 0;\n for (const char of text) {\n const cost = CJK_CHAR.test(char) ? 1 : 1 / 3;\n if (current !== '' && tokens + cost > maxTokens) {\n out.push(current);\n current = '';\n tokens = 0;\n }\n current += char;\n tokens += cost;\n }\n if (current !== '') out.push(current);\n return out;\n}\n\n/**\n * \u628A\u4E00\u4E2A\u5757\u5207\u6210\u4E0D\u8D85\u8FC7\u4E0A\u9650\u7684\u7247\u6BB5\uFF1A\u4F18\u5148\u7A7A\u884C\uFF0C\u5176\u6B21\u5355\u884C\uFF0C\u518D\u6B21\u53E5\u672B\uFF0C\u6700\u540E\u786C\u5207\u3002\n * \u7247\u6BB5\u6309\u539F\u987A\u5E8F\u62FC\u56DE\u5373\u4E3A\u8BE5\u5757\u7684\u5B8C\u6574\u8BD1\u6587\u3002\n */\nexport function splitOversizedBlock(\n text: string,\n maxTokens: number = REPLY_MAX_INPUT_TOKENS\n): string[] {\n if (estimateTokens(text) <= maxTokens) return [text];\n\n let chunks = splitKeepingSeparator(text, /(\\n{2,})/);\n if (chunks.length <= 1) chunks = splitKeepingSeparator(text, /(\\n)/);\n if (chunks.length <= 1) chunks = sentenceChunks(text);\n\n const out: string[] = [];\n let current = '';\n for (const chunk of chunks) {\n if (estimateTokens(chunk) > maxTokens) {\n if (current !== '') {\n out.push(current);\n current = '';\n }\n out.push(...hardSlice(chunk, maxTokens));\n continue;\n }\n if (current !== '' && estimateTokens(current + chunk) > maxTokens) {\n out.push(current);\n current = '';\n }\n current += chunk;\n }\n if (current !== '') out.push(current);\n return out;\n}\n\n/** \u628A\u7247\u6BB5\u6309\u539F\u987A\u5E8F\u6253\u5305\u6210\u5C3D\u91CF\u5C11\u7684\u8BF7\u6C42\uFF0C\u4E14\u6BCF\u6279\u4E0D\u8D85\u8FC7\u8F93\u5165\u4E0A\u9650\u3002 */\nexport function packPieces<T extends { text: string }>(\n pieces: T[],\n maxTokens: number = REPLY_MAX_INPUT_TOKENS\n): T[][] {\n const batches: T[][] = [];\n let current: T[] = [];\n let tokens = 0;\n for (const piece of pieces) {\n const cost = estimateTokens(piece.text);\n if (current.length > 0 && tokens + cost > maxTokens) {\n batches.push(current);\n current = [];\n tokens = 0;\n }\n current.push(piece);\n tokens += cost;\n }\n if (current.length > 0) batches.push(current);\n return batches;\n}\n\n/**\n * \u6253\u5305\u6807\u8BB0\uFF1A`\u27EA<4 letters><index>\u27EB`\u2014\u2014\u6253\u5305\u8BF7\u6C42\u7684\u6846\u67B6\uFF0C\u6BCF\u6BB5\u4EE5\u6807\u8BB0\u884C\u5F00\u5934\u3002\n * \u5B83\u53EA\u6D3B\u5728\u4E00\u6B21\u8BF7\u6C42\u7684\u8D1F\u8F7D\u91CC\uFF1B\u8BD1\u6587\u6B8B\u7559 \u27EA\u2026\u27EB \u7531\u5BBF\u4E3B\u76F4\u63A5\u5265\u9664\uFF0C\u4E0D\u6210\u8D25\u56E0\u3002\n */\nexport interface BatchFormat {\n id: string;\n token: (index: number) => string;\n}\n\nexport function createBatchFormat(): BatchFormat {\n const id = randomTokenId();\n return {\n id,\n token: (index: number) => `\u27EA${id}${index}\u27EB`,\n };\n}\n\n/** \u6807\u8BB0\u51FA\u73B0\u5728\u88AB\u7FFB\u8BD1\u6587\u672C\u91CC\u7684\u901A\u7528\u5F62\u72B6\uFF0C\u4E0D\u95EE id\u3002 */\nconst BATCH_TOKEN_PATTERN_SOURCE = '\u27EA([a-z]{4})(\\\\d+)\u27EB';\n\n/** \u6BCF\u4E2A\u7247\u6BB5\u4EE5\u5355\u72EC\u4E00\u884C\u6807\u8BB0\u5F00\u5934\uFF0C\u6BB5\u4E0E\u6BB5\u4E4B\u95F4\u7A7A\u4E00\u884C\u3002 */\nexport function buildBatchPayload(pieces: string[], format: BatchFormat): string {\n return pieces.map((text, index) => `${format.token(index)}\\n${text}`).join('\\n\\n');\n}\n\n/**\n * \u6309\u6807\u8BB0\u628A\u6574\u6279\u8BD1\u6587\u5207\u56DE\u6BCF\u4E2A\u7247\u6BB5\u3002\n *\n * \u5E8F\u53F7\u5FC5\u987B\u6070\u597D\u51FA\u73B0\u4E00\u6B21\u3001\u6309 0..count-1 \u5347\u5E8F\u3001\u6BCF\u6BB5\u975E\u7A7A\uFF0C\u4E14\u4E0D\u5F97\u6DF7\u5165\u5176\u5B83\u6279\u6B21\n * \u7684\u6807\u8BB0\uFF1B\u4EFB\u4F55\u4E00\u6761\u4E0D\u6EE1\u8DB3\u90FD\u8FD4\u56DE null\uFF0C\u7531\u8C03\u7528\u65B9\u4F5C\u5E9F\u6574\u6279\u5E76\u9000\u56DE\u5355\u5757\u91CD\u8BD5\u3002\n */\nexport function splitBatchTranslation(\n translated: string,\n format: BatchFormat,\n count: number\n): string[] | null {\n const pattern = new RegExp(BATCH_TOKEN_PATTERN_SOURCE, 'gu');\n const found: Array<{ index: number; start: number; end: number }> = [];\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(translated)) !== null) {\n if (match[1].toLowerCase() !== format.id.toLowerCase()) return null;\n const index = Number.parseInt(match[2] ?? '', 10);\n if (Number.isNaN(index)) return null;\n found.push({ index, start: match.index, end: match.index + match[0].length });\n }\n if (found.length !== count) return null;\n\n const parts: string[] = [];\n for (let index = 0; index < count; index++) {\n const entry = found[index]!;\n if (entry.index !== index) return null;\n const next = found[index + 1];\n const body = translated.slice(entry.end, next === undefined ? translated.length : next.start).trim();\n if (body === '') return null;\n parts.push(body);\n }\n return parts;\n}\n\n/**\n * \u5265\u9664\u8BD1\u6587\u91CC\u6B8B\u7559\u7684 \u27EA\u2026\u27EB \u6253\u5305\u6807\u8BB0\uFF1A\u6807\u8BB0\u53EA\u662F\u8BF7\u6C42\u811A\u624B\u67B6\uFF0C\u6A21\u578B\u5E26\u56DE\u6765\u5C31\u5220\u6389\u2014\u2014\n * \u5F62\u72B6\u95EE\u9898\u4E0D\u5426\u51B3\u5185\u5BB9\uFF0C\u6B8B\u7559\u4E5F\u4E0D\u518D\u662F\u62D2\u6536\u7406\u7531\u3002\n */\nexport function stripBatchMarkers(text: string): string {\n return text.replace(new RegExp(BATCH_TOKEN_PATTERN_SOURCE, 'gu'), '');\n}\n", "/**\n * \u7ED3\u6784\u91CD\u88C5\u914D\uFF1A\u6B63\u6587\u5757\u7684 markdown \u6309\u7ED3\u6784\u5207\u5F00\uFF0C\u4EE3\u7801\u56F4\u680F\u9010\u5B57\u4FDD\u7559\uFF0C\u6563\u6587\u6BB5\u9001\u6A21\u578B\uFF0C\n * \u56DE\u6765\u540E**\u6309\u539F\u7ED3\u6784\u62FC\u56DE**\u2014\u2014\u300C\u7FFB\u8BD1\u540E markdown \u8BED\u6CD5\u6CA1\u95EE\u9898\u300D\u7531\u6784\u9020\u4E0E\u5F62\u72B6\u6838\u5BF9\u4FDD\u8BC1\uFF1A\n * \u6A21\u578B\u4ECE\u6765\u89C1\u4E0D\u5230\u5360\u4F4D\u7B26\uFF0C\u4E5F\u5C31\u8C08\u4E0D\u4E0A\u5E26\u4E0D\u5E26\u56DE\u3002\n *\n * \u4E09\u4EF6\u4E8B\uFF1A\n * 1. `splitMarkdownSegments`\uFF1A\u628A\u5757\u5207\u6210 code / prose \u6BB5\u7684\u6709\u5E8F\u6E05\u5355\uFF0C\u62FC\u63A5\u6052\u7B49\u4E8E\u539F\u6587\u3002\n * code \u6BB5\uFF08``` \u6216 ~~~ \u56F4\u680F\uFF0C\u542B\u672A\u95ED\u5408\u7684\u5230\u5757\u5C3E\uFF09\u6C38\u4E0D\u9001\u6A21\u578B\uFF1B4 \u7A7A\u683C\u7F29\u8FDB\u4EE3\u7801\u4E0D\n * \u5355\u72EC\u8BC6\u522B\uFF08\u804A\u5929\u6B63\u6587\u91CC\u51E0\u4E4E\u4E0D\u51FA\u73B0\uFF0C\u65E0\u8BB0\u53F7\u884C\u7684\u884C\u9996\u7F29\u8FDB\u7531\u5F62\u72B6\u7B7E\u540D\u515C\u4F4F\uFF0C\n * \u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u5219\u968F\u524D\u7F00\u4FEE\u56DE\uFF09\u3002\n * 2. `lineSignature`\uFF1A\u4E00\u884C markdown \u7684\u7ED3\u6784\u7B7E\u540D\u2014\u2014\u5757\u8BB0\u53F7\u7684**\u7C7B\u522B**\uFF08\u6807\u9898 h\u3001\n * \u5F15\u7528 q\u3001\u65E0\u5E8F\u5217\u8868 l\u3001\u6709\u5E8F\u5217\u8868 n\uFF09\u3001\u65E0\u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u5BBD\u3001\u8868\u683C\u7AD6\u7EBF\u6570\u3001\u94FE\u63A5\u4E2A\u6570\u3002\n * \u8BB0\u53F7\u7684\u5C42\u7EA7\u3001\u5B57\u7B26\u3001\u5E8F\u53F7\u4E0E\u5217\u8868\u7F29\u8FDB\u4E0D\u8FDB\u7B7E\u540D\u2014\u2014\u6E32\u67D3\u7B49\u4EF7\u7684\u6F02\u79FB\u4EA4\u7ED9 repairShape\n * \u4FEE\u56DE\uFF0C\u800C\u4E0D\u662F\u628A\u6574\u5757\u957F\u56DE\u7B54\u4E00\u7968\u5426\u51B3\u3002\u771F\u7834\u6E32\u67D3\u7684\u4ECD\u662F\uFF1A\u6B63\u6587\u884C\u5E76\u62E2/\u62C6\u5F00\u3001\u8868\u683C\n * \u5217\u9519\u4F4D\u3001\u8BB0\u53F7\u6574\u4E2A\u4E22\uFF08\u5217\u8868\u53D8\u6BB5\u843D\uFF09\u3001\u94FE\u63A5\u4E22\u6CA1\u3001\u65E0\u8BB0\u53F7\u884C\u7F29\u8FDB\u6F02\u79FB\uFF08\u53D8\u4EE3\u7801\u5757\uFF09\u3002\n * 3. `restoreLinkTargets`\uFF1A\u94FE\u63A5\u6309\u51FA\u73B0\u5E8F\u5BF9\u9F50\u540E\uFF0C\u628A\u539F\u6587\u7684 URL \u9010\u4E2A\u62FC\u56DE\u8BD1\u6587\u2014\u2014\n * \u6A21\u578B\u53EA\u8BD1 `[\u6587\u5B57]`\uFF0C`(URL)` \u7531\u6784\u9020\u4FDD\u4F4F\u3002\u4E2A\u6570\u4E0D\u7B49\u5728\u7B7E\u540D\u6838\u5BF9\u91CC\u5DF2\u7ECF\u51FA\u5C40\u3002\n * \u5F15\u7528\u5F0F\u5B9A\u4E49\u884C `[id]: URL` \u540C\u8D26\uFF1A\u8BA1\u6570\u8FDB\u7B7E\u540D\u3001\u76EE\u6807\u7531\u56DE\u586B\u4FDD\u4F4F\u3002\n * 4. `repairShape`\uFF1A\u6838\u5BF9\u4E0E\u4FEE\u5F62\u4E00\u6B21\u8FC7\u2014\u2014\u7A7A\u884C\u6F02\u79FB\u6309\u539F\u6587\u5E03\u5C40\u91CD\u6392\uFF08\u5F31\u6A21\u578B\u6700\u7231\n * \u541E\u7A7A\u884C\uFF0C\u975E\u7A7A\u884C\u7B7E\u540D\u5BF9\u5F97\u4E0A\u5C31\u4E0D\u7B97\u7834\u635F\uFF09\uFF0C\u884C\u9996\u300C\u524D\u5BFC\u7A7A\u767D + \u5757\u8BB0\u53F7\u300D\u9010\u884C\u6362\n * \u56DE\u539F\u6587\u540C\u6B3E\uFF08`##`\u2192`###`\u3001`-`\u2192`*`\u3001\u5E8F\u53F7\u3001\u5F15\u7528\u6DF1\u5EA6\u3001\u5217\u8868\u7F29\u8FDB\u7684\u6F02\u79FB\u5C31\u6B64\n * \u6D88\u5931\uFF09\u3002\u4FEE\u4E0D\u4E86\u624D\u56DE\u62A5\u9519\u8BEF\u884C\u4E0E\u7406\u7531\uFF0C\u8FDB content \u8D25\u56E0\u7684\u60AC\u505C\u6587\u6848\u3002\n */\n\nexport interface MarkdownSegment {\n readonly kind: 'prose' | 'code';\n readonly text: string;\n}\n\nconst FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})/;\n// \\r \u5BB9\u5FCD\uFF1ACRLF \u6B63\u6587\u7684\u95ED\u5408\u56F4\u680F\u884C\u4EE5 \\r\\n \u7ED3\u675F\uFF0C\u4E0D\u5BB9\u5B83\u4F1A\u628A ``` \u4E4B\u540E\u6574\u5757\u8BEF\u5224\u6210\n// \u300C\u672A\u95ED\u5408\u5230\u5757\u5C3E\u300D\u9010\u5B57\u4FDD\u7559\u2014\u2014\u6563\u6587\u6CA1\u9001\u6A21\u578B\u8FD8\u65E0\u4EBA\u62A5\u8B66\uFF08\u5BA1\u67E5\u5B9E\u6D4B\u7684\u5751\uFF09\u3002\nconst FENCE_CLOSE = /^ {0,3}(`{3,}|~{3,})[ \\t]*\\r?$/;\n\n/** CommonMark \u7684\u95ED\u5408\u56F4\u680F\uFF1A\u540C\u79CD\u5B57\u7B26\u3001\u4E0D\u77ED\u4E8E\u5F00\u5934\u3002 */\nfunction closesFence(open: string, line: string): boolean {\n const close = FENCE_CLOSE.exec(line);\n if (!close) return false;\n const marker = close[1] ?? '';\n return marker[0] === open[0] && marker.length >= open.length;\n}\n\n/**\n * \u628A\u5757\u5207\u6210\u6709\u5E8F\u6BB5\u6E05\u5355\uFF1B`segments.map(s => s.text).join('') === text` \u6052\u6210\u7ACB\u3002\n * \u6BCF\u6BB5\u5E26\u7740\u81EA\u5DF1\u884C\u5C3E\u7684\u6362\u884C\u7ED3\u675F\uFF08\u6BB5\u4E0E\u6BB5\u4E4B\u95F4\u4E0D\u5B58\u5728\u4E22\u5931\u7684\u5206\u9694\u7B26\uFF09\uFF0C\u6240\u4EE5\u6563\u6587\u6BB5\u7684\n * \u5934\u5C3E\u7A7A\u767D\u5929\u7136\u5305\u542B\u6BB5\u95F4\u8DDD\uFF0C\u91CD\u88C5\u914D\u9010\u5B57\u62FC\u5F97\u56DE\u3002\n */\nexport function splitMarkdownSegments(text: string): MarkdownSegment[] {\n const segments: MarkdownSegment[] = [];\n const lines = text.split('\\n');\n let start = 0;\n let offset = 0;\n let fence: string | null = null;\n let kind: 'prose' | 'code' = 'prose';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const last = i === lines.length - 1;\n const lineEnd = offset + line.length + (last ? 0 : 1);\n if (fence === null) {\n const open = FENCE_OPEN.exec(line);\n if (open) {\n if (offset > start) segments.push({ kind: 'prose', text: text.slice(start, offset) });\n start = offset;\n kind = 'code';\n fence = open[1] ?? '```';\n }\n } else if (closesFence(fence, line)) {\n segments.push({ kind: 'code', text: text.slice(start, lineEnd) });\n start = lineEnd;\n kind = 'prose';\n fence = null;\n }\n offset = lineEnd;\n }\n if (text.length > start) segments.push({ kind, text: text.slice(start) });\n return segments;\n}\n\n// \u884C\u9996\u5F62\u72B6\u524D\u7F00\uFF08\u5168\u5339\u914D = \u524D\u5BFC\u7A7A\u767D + \u5757\u8BB0\u53F7\uFF0C\u6355\u83B7\u7EC4 = \u8BB0\u53F7\u672C\u4F53\uFF09\uFF1A\u5D4C\u5957\u5217\u8868\u7684\n// \u7F29\u8FDB\u8BB0\u53F7\u884C\u4E5F\u8BA4\u2014\u2014\u7B7E\u540D\u6309\u7C7B\u522B\u653E\u884C\uFF0C\u7F29\u8FDB\u968F\u524D\u7F00\u4E00\u8D77\u4FEE\u56DE\u3002\nconst LINE_SHAPE_PREFIX = /^[ \\t]*(#{1,6}[ \\t]|>+[ \\t]?|[-*+][ \\t]|\\d{1,3}[.)][ \\t])/;\n// \u94FE\u63A5\u76EE\u6807\u5141\u8BB8\u4E00\u5C42\u5E73\u8861\u62EC\u53F7\uFF08CommonMark \u88F8\u76EE\u6807\u89C4\u5219\uFF09\uFF0C\u6355\u83B7\u7EC4\u53D6\u5230\u5B8C\u6574 URL\u3002\nconst LINK_SPAN = /\\[[^\\]]*\\]\\(((?:[^()]|\\([^()]*\\))*)\\)/g;\n// \u5F15\u7528\u5F0F\u5B9A\u4E49\u884C `[id]: URL`\uFF1A\u4E0E\u5185\u8054\u94FE\u63A5\u540C\u8D26\u2014\u2014\u8BA1\u6570\u8FDB\u7B7E\u540D\u3001\u76EE\u6807\u7531\u56DE\u586B\u4FDD\u4F4F\u3002\nconst LINK_DEF_LINE = /^( {0,3}\\[[^\\]]+\\]:[ \\t]*)(\\S+)([ \\t]*\\r?)$/;\n\n/** \u8BB0\u53F7\u7C7B\u522B\uFF1A\u6807\u9898 h\u3001\u5F15\u7528 q\u3001\u65E0\u5E8F\u5217\u8868 l\u3001\u6709\u5E8F\u5217\u8868 n\uFF1B\u5C42\u7EA7\u4E0E\u5B57\u7B26\u4E0D\u8FDB\u7C7B\u522B\u3002 */\nfunction markerClass(marker: string): string {\n if (marker === '') return '';\n const head = marker[0]!;\n if (head === '#') return 'h';\n if (head === '>') return 'q';\n if (head === '-' || head === '*' || head === '+') return 'l';\n return 'n';\n}\n\n/**\n * \u4E00\u884C\u7684\u7ED3\u6784\u7B7E\u540D\uFF1B\u4E24\u884C\u7B7E\u540D\u76F8\u7B49 \u21D4 \u7ED3\u6784\u89D2\u8272\u76F8\u7B49\u3002\n * \u53CD\u5F15\u53F7\u4E0D\u5728\u7B7E\u540D\u91CC\uFF1A\u884C\u5185\u4EE3\u7801\u662F\u6837\u5F0F\u4E0D\u662F\u9AA8\u67B6\uFF0C\u589E\u51CF\u4E00\u5BF9\u4E0D\u7834\u6E32\u67D3\uFF08\u70B9\u539F\u6587\u4E00\u952E\n * \u53EF\u56DE\uFF09\uFF0C\u62E6\u5B83\u53EA\u4F1A\u628A\u80FD\u770B\u7684\u8BD1\u6587\u6253\u6210\u7EA2\u7EBF\u3002\u884C\u5C3E \\r \u540C\u6837\u4E0D\u8FDB\u7B7E\u540D\u2014\u2014\u6A21\u578B\u628A\n * CRLF \u5F52\u4E00\u6210 LF \u662F\u6E32\u67D3\u65E0\u611F\u7684\u6539\u5199\uFF0C\u4E0D\u8BE5\u62E6\u3002\u5757\u8BB0\u53F7\u53EA\u8BA4\u7C7B\u522B\uFF1A`##`\u2192`###`\u3001\n * `-`\u2192`*`\u3001\u5E8F\u53F7\u4E0E\u5F15\u7528\u6DF1\u5EA6\u7684\u6F02\u79FB\u7531 restoreLineShapes \u62FC\u56DE\u539F\u6837\uFF0C\u4E0D\u503C\u5F97\u62D2\u6536\n * \u6574\u5757\uFF1B\u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u4E5F\u4E0D\u8FDB\u7B7E\u540D\uFF08\u5B83\u5C5E\u4E8E\u4F1A\u88AB\u4FEE\u56DE\u7684\u524D\u7F00\uFF09\uFF0C\u65E0\u8BB0\u53F7\u884C\u7684\u7F29\u8FDB\u4ECD\u662F\n * \u786C\u5224\u636E\u2014\u2014\u51ED\u7A7A\u591A\u51FA\u56DB\u4E2A\u7A7A\u683C\u4F1A\u628A\u6BB5\u843D\u53D8\u6210\u4EE3\u7801\u5757\u3002\n */\nfunction lineSignature(line: string): string {\n const marker = LINE_SHAPE_PREFIX.exec(line)?.[1]?.trim() ?? '';\n const cls = markerClass(marker);\n const indent =\n cls === '' ? (/^[ \\t]*/.exec(line) ?? [''])[0].replace(/\\t/g, ' ').length : 'i';\n const pipes = (line.match(/\\|/g) ?? []).length;\n const links = (line.match(LINK_SPAN) ?? []).length + (LINK_DEF_LINE.test(line) ? 1 : 0);\n return `${indent}|${cls}|${pipes}|${links}`;\n}\n\n/** \u5F62\u72B6\u6838\u5BF9\u7684\u53EA\u8BFB\u9519\u8BEF\u89C6\u56FE\uFF1ArepairShape \u7684 error \u4FA7\u3002null = \u53EF\u6210\u7ACB\u3002 */\nexport function shapeMismatch(original: string, translated: string): string | null {\n return repairShape(original, translated).error;\n}\n\nexport interface ShapeRepair {\n /** \u4FEE\u597D\u7684\u6587\u672C\uFF1A\u539F\u6587\u9AA8\u67B6\uFF08\u7A7A\u884C\u5E03\u5C40 + \u884C\u9996\u524D\u7F00\uFF09+ \u8BD1\u6587\u6B63\u6587\uFF1Bnull = \u4FEE\u4E0D\u4E86\u3002 */\n text: string | null;\n /** \u4FEE\u4E0D\u4E86\u65F6\u7684\u4E00\u53E5\u7406\u7531\uFF0C\u76F4\u63A5\u8FDB\u60AC\u505C\u6587\u6848\u3002 */\n error: string | null;\n}\n\nfunction isBlankLine(line: string): boolean {\n return line.trim() === '';\n}\n\nfunction indentWidth(line: string): number {\n return (/^[ \\t]*/.exec(line) ?? [''])[0].replace(/\\t/g, ' ').length;\n}\n\n/**\n * \u7ED3\u6784\u884C = \u4E0D\u53EF\u91CD\u6392\u7684\u884C\uFF1A\u5E26\u5757\u8BB0\u53F7\uFF08\u6807\u9898/\u5F15\u7528/\u5217\u8868\uFF09\u3001\u542B\u7AD6\u7EBF\uFF08\u8868\u683C\u884C\uFF09\u3001\n * \u5F15\u7528\u5F0F\u5B9A\u4E49\u884C\u3001\u7F29\u8FDB >3 \u7684\u7F29\u8FDB\u4EE3\u7801\u3002\u5176\u4F59\u975E\u7A7A\u884C\u662F\u6563\u6587\u884C\u2014\u2014\u8F6F\u6362\u884C\u5BF9\u6E32\u67D3\n * \u4E0D\u53EF\u89C1\uFF0C\u8BD1\u6587\u7231\u5E76\u6210\u4E00\u884C\u8FD8\u662F\u62C6\u6210\u51E0\u884C\u90FD\u968F\u5B83\u3002\n */\nfunction isStructuralLine(line: string): boolean {\n if (isBlankLine(line)) return false;\n return (\n LINE_SHAPE_PREFIX.test(line) ||\n line.includes('|') ||\n LINK_DEF_LINE.test(line) ||\n indentWidth(line) > 3\n );\n}\n\n/** \u8FDE\u7EED\u975E\u7A7A\u884C = \u4E00\u4E2A\u6BB5\u843D\u5757\uFF1B\u5757\u7684\u6570\u91CF\u4E0E\u987A\u5E8F\u5C31\u662F markdown \u7684\u9AA8\u67B6\u3002 */\nfunction paragraphBlocks(text: string): string[][] {\n const blocks: string[][] = [];\n let cur: string[] | null = null;\n for (const line of text.split('\\n')) {\n if (isBlankLine(line)) {\n if (cur !== null) blocks.push(cur);\n cur = null;\n } else {\n (cur ??= []).push(line);\n }\n }\n if (cur !== null) blocks.push(cur);\n return blocks;\n}\n\nfunction blockLinks(block: readonly string[]): number {\n let n = 0;\n for (const line of block) {\n n += (line.match(LINK_SPAN) ?? []).length + (LINK_DEF_LINE.test(line) ? 1 : 0);\n }\n return n;\n}\n\n/** \u5355\u884C\u4FEE\u5F62\uFF1A\u7B7E\u540D\u6838\u5BF9\u5DF2\u4FDD\u8BC1\u4E24\u4FA7\u540C\u89D2\u8272\uFF0C\u628A\u8BD1\u6587\u884C\u9996\u6362\u6210\u539F\u6587\u540C\u6B3E\u524D\u7F00\u3002 */\nfunction spliceLineShape(want: string, got: string): string {\n const w = LINE_SHAPE_PREFIX.exec(want);\n if (w === null) return got;\n const g = LINE_SHAPE_PREFIX.exec(got);\n if (g === null || markerClass((w[1] ?? '').trim()) !== markerClass((g[1] ?? '').trim())) {\n return got;\n }\n return `${w[0]}${got.slice(g[0].length)}`;\n}\n\n/**\n * \u5F62\u72B6\u4FEE\u590D\uFF1A\u6838\u5BF9\u4E0E\u4FEE\u5F62\u4E00\u6B21\u8FC7\uFF0C\u80FD\u4FEE\u7684\u7EDD\u4E0D\u6210\u8D25\u56E0\u3002\u9AA8\u67B6\u6309**\u6BB5\u843D\u5757**\u5BF9\u9F50\u2014\u2014\n * 1. \u5757\u6570\u5FC5\u987B\u76F8\u7B49\uFF08\u6A21\u578B\u628A\u4E24\u6BB5\u5E76\u62E2\u3001\u6216\u628A\u4E00\u6BB5\u5288\u5F00\uFF0C\u624D\u662F\u771F\u7834\u635F\uFF09\uFF1B\u7A7A\u884C\u5E03\u5C40\n * \u4E00\u5F8B\u53D6\u539F\u6587\u2014\u2014\u6A21\u578B\u541E\u7A7A\u884C\u3001\u591A\u7A7A\u884C\u90FD\u88AB\u91CD\u6392\u6D88\u5316\u3002\n * 2. \u5757\u5185**\u7ED3\u6784\u884C**\u9010\u4E00\u5BF9\u9F50\uFF08\u8BB0\u53F7\u7C7B\u522B\u3001\u8868\u683C\u7AD6\u7EBF\u6570\u3001\u94FE\u63A5\u4E2A\u6570\u3001\u7F29\u8FDB\u4EE3\u7801\u7684\n * \u7F29\u8FDB\uFF09\uFF0C\u884C\u9996\u524D\u7F00\u4FEE\u56DE\u539F\u6587\u540C\u6B3E\uFF1A`##`\u2192`###`\u3001`-`\u2192`*`\u3001\u5E8F\u53F7\u3001\u5F15\u7528\u6DF1\u5EA6\u3001\n * \u5217\u8868\u7F29\u8FDB\u7684\u6F02\u79FB\u5C31\u6B64\u6D88\u5931\u3002\n * 3. \u5757\u5185**\u6563\u6587\u884C\u81EA\u7531\u91CD\u6392**\uFF1A\u5F31\u6A21\u578B\u628A\u786C\u6298\u884C\u7684\u82F1\u6587\u6BB5\u843D\u8BD1\u6210\u4E00\u6574\u884C\u4E2D\u6587\u662F\u5E38\u6001\uFF0C\n * \u8F6F\u6362\u884C\u6E32\u67D3\u65E0\u611F\uFF1B\u53EA\u67E5\u6574\u5757\u7684\u94FE\u63A5\u603B\u6570\u4E0D\u4E22\u2014\u2014\u91CD\u6392\u541E\u4E0D\u6389 `[\u6587\u5B57](URL)`\u3002\n * 4. \u5757\u9996\u884C\u7684\u7ED3\u6784/\u6563\u6587\u5C5E\u6027\u4E0D\u5F97\u4E92\u6362\uFF1A\u6BB5\u843D\u88AB\u5E76\u8FDB\u5217\u8868\u9879\uFF08\u6216\u53CD\u4E4B\uFF09\u662F\u6E32\u67D3\u7834\u635F\u3002\n */\nexport function repairShape(original: string, translated: string): ShapeRepair {\n const wantLines = original.split('\\n');\n const gotLines = translated.split('\\n');\n const wantBlocks = paragraphBlocks(original);\n let gotBlocks = paragraphBlocks(translated);\n if (wantBlocks.length !== gotBlocks.length) {\n // \u7A7A\u884C\u6F02\u79FB\u6539\u4E86\u5757\u6570\uFF1A\u975E\u7A7A\u884C\u82E5\u9010\u884C\u7B7E\u540D 1:1 \u5BF9\u5F97\u4E0A\uFF0C\u6309\u539F\u6587\u7684\u975E\u7A7A\u884C\u4F4D\u91CD\u6392\u3002\n const wantFilled = wantLines.filter((line) => !isBlankLine(line));\n const gotFilled = gotLines.filter((line) => !isBlankLine(line));\n if (wantFilled.length !== gotFilled.length) {\n return { text: null, error: `line count changed (${wantLines.length} -> ${gotLines.length})` };\n }\n for (let index = 0; index < wantFilled.length; index++) {\n const sw = lineSignature(wantFilled[index] ?? '');\n const sg = lineSignature(gotFilled[index] ?? '');\n if (sw !== sg) {\n return { text: null, error: `structure changed at line ${index + 1} (${sw} -> ${sg})` };\n }\n }\n let cursor = 0;\n gotBlocks = wantBlocks.map((block) => block.map(() => gotFilled[cursor++] ?? ''));\n }\n // \u9010\u5757\u6838\u5BF9 + \u4FEE\u5F62\u3002hint \u662F\u539F\u6587\u884C\u6807\u6E38\u6807\uFF0C\u6307\u5411\u5F53\u524D\u5757\u9996\u884C\u3002\n const repaired: string[][] = [];\n let hint = 0;\n for (let index = 0; index < wantBlocks.length; index++) {\n const wb = wantBlocks[index]!;\n const gb = gotBlocks[index] ?? [];\n while (hint < wantLines.length && wantLines[hint] !== wb[0]) hint++;\n const start = hint + 1;\n const wStruct = wb.filter(isStructuralLine);\n const gStruct = gb.filter(isStructuralLine);\n if (wStruct.length !== gStruct.length) {\n return { text: null, error: `structure changed at line ${start} (markers ${wStruct.length} -> ${gStruct.length})` };\n }\n if (isStructuralLine(wb[0] ?? '') !== isStructuralLine(gb[0] ?? '')) {\n return { text: null, error: `structure changed at line ${start} (block start swapped)` };\n }\n if (blockLinks(wb) !== blockLinks(gb)) {\n return { text: null, error: `structure changed at line ${start} (links ${blockLinks(wb)} -> ${blockLinks(gb)})` };\n }\n for (let k = 0; k < wStruct.length; k++) {\n const sw = lineSignature(wStruct[k] ?? '');\n const sg = lineSignature(gStruct[k] ?? '');\n if (sw !== sg) {\n return { text: null, error: `structure changed at line ${start} (${sw} -> ${sg})` };\n }\n }\n let cursor = 0;\n repaired.push(\n gb.map((line) => {\n if (!isStructuralLine(line)) return line;\n return spliceLineShape(wStruct[cursor++] ?? line, line);\n })\n );\n hint += wb.length;\n }\n // \u91CD\u88C5\u914D\uFF1A\u7A7A\u884C\u5E03\u5C40\u53D6\u539F\u6587\uFF0C\u6B63\u6587\u5757\u6309\u5E8F\u653E\u4FEE\u597D\u7684\u8BD1\u6587\u884C\u3002\n const out: string[] = [];\n let bi = 0;\n let inBlock = false;\n for (const line of wantLines) {\n if (isBlankLine(line)) {\n inBlock = false;\n out.push(line);\n continue;\n }\n if (!inBlock) {\n out.push(...(repaired[bi++] ?? [line]));\n inBlock = true;\n }\n }\n return { text: out.join('\\n'), error: null };\n}\n\n/**\n * \u628A\u539F\u6587\u7684\u94FE\u63A5\u76EE\u6807\u9010\u4E2A\u62FC\u56DE\u8BD1\u6587\uFF1A\u5185\u8054 `[\u6587\u5B57](URL)` \u4E0E\u5F15\u7528\u5F0F\u5B9A\u4E49\u884C `[id]: URL`\n * \u90FD\u7B97\u2014\u2014\u4E24\u4FA7\u5DF2\u6309\u7B7E\u540D\u6838\u5BF9\u786E\u8BA4\u7B49\u6570\uFF0C\u6309\u51FA\u73B0\u5E8F\u5BF9\u9F50\uFF0C\u8BD1\u6587\u53EA\u8D21\u732E `[\u6587\u5B57]` \u4E0E\u6392\u7248\u3002\n */\nexport function restoreLinkTargets(original: string, translated: string): string {\n const urls: string[] = [];\n for (const match of original.matchAll(LINK_SPAN)) urls.push(match[1] ?? '');\n let out = translated;\n if (urls.length > 0) {\n let cursor = 0;\n out = out.replace(LINK_SPAN, (span: string) => {\n // \u76EE\u6807\u6BB5\u7684\u5F00\u62EC\u53F7\u951A\u5728 `]` \u4E4B\u540E\uFF1AURL \u91CC\u5E26\u62EC\u53F7\u65F6 lastIndexOf('(') \u4F1A\u54AC\u8FDB\n // URL \u5185\u90E8\uFF0C\u628A\u56DE\u586B\u53D8\u6210\u62FC\u63A5\u3002\n const open = span.indexOf('(', span.lastIndexOf(']'));\n const close = span.lastIndexOf(')');\n const url = urls[cursor++] ?? '';\n return `${span.slice(0, open + 1)}${url}${span.slice(close)}`;\n });\n }\n const defs: string[] = [];\n for (const line of original.split('\\n')) {\n const def = LINK_DEF_LINE.exec(line);\n if (def) defs.push(def[2] ?? '');\n }\n if (defs.length > 0) {\n let cursor = 0;\n out = out\n .split('\\n')\n .map((line: string) => {\n const def = LINK_DEF_LINE.exec(line);\n if (!def) return line;\n return `${def[1] ?? ''}${defs[cursor++] ?? def[2] ?? ''}${def[3] ?? ''}`;\n })\n .join('\\n');\n }\n return out;\n}\n\n/**\n * \u4E24\u4FA7\u94FE\u63A5\u603B\u6570\u662F\u5426\u76F8\u7B49\u2014\u2014\u56DE\u586B\u7684\u524D\u7F6E\u6761\u4EF6\uFF1A\u7B49\u6570\u624D\u8C08\u5F97\u4E0A\u6309\u51FA\u73B0\u5E8F\u5BF9\u9F50\uFF1B\n * \u4E0D\u7B49\u65F6\u56DE\u586B\u4F1A\u628A\u539F\u6587 URL \u4E32\u5230\u9519\u7684\u94FE\u63A5\u4E0A\uFF0C\u5B81\u53EF\u4E0D\u56DE\u586B\u3002\n */\nexport function linkCountsMatch(a: string, b: string): boolean {\n return blockLinks(a.split('\\n')) === blockLinks(b.split('\\n'));\n}\n\n/**\n * \u53EA\u4FEE\u5F62\u4E0D\u6838\u5BF9\u7684\u65E7\u53E3\uFF1A\u8F6C\u624B repairShape\u2014\u2014\u884C\u9996\u524D\u7F00\u4FEE\u56DE\u4E0E\u7A7A\u884C\u91CD\u6392\u90FD\u5728\u90A3\u91CC\u3002\n * \u4FEE\u4E0D\u4E86\u65F6\u539F\u6837\u8FD4\u56DE\uFF08\u8C03\u7528\u65B9\u81EA\u5DF1\u5148\u770B repairShape \u7684 error\uFF09\u3002\n */\nexport function restoreLineShapes(original: string, translated: string): string {\n return repairShape(original, translated).text ?? translated;\n}\n", "import { describeError } from '../describe-error.ts';\nimport type {\n ITranslationAdapter,\n PluginConfig,\n ReplyBlockResult,\n} from './types.ts';\nimport type { ConfigManager } from './config.ts';\nimport { LruDiskCache } from './cache.ts';\nimport type { KeyReader } from './credentials.ts';\nimport { OpenAiCompatibleAdapter } from './adapters/openai.ts';\nimport {\n buildBatchPayload,\n createBatchFormat,\n packPieces,\n splitBatchTranslation,\n splitOversizedBlock,\n stripBatchMarkers,\n REPLY_MAX_OUTPUT_TOKENS,\n} from './pipeline/blocks.ts';\nimport {\n linkCountsMatch,\n repairShape,\n restoreLinkTargets,\n splitMarkdownSegments,\n} from './pipeline/segments.ts';\n\n/**\n * The one and only channel id for the reply path: the adapter registry keys on\n * it, so a test can swap the adapter without the reply path losing track of\n * which adapter serves it.\n */\nconst CHANNEL_ID = 'openai';\n\n/**\n * \u6B63\u6587\u7684\u4E00\u4E2A\u5F85\u7FFB\u8BD1\u7247\u6BB5\uFF1A\u6240\u5C5E\u5757\u3001\u5757\u5185\u7247\u6BB5\u5E8F\u53F7\uFF0C\u4EE5\u53CA\u62C6\u51FA\u6765\u7684\u5934\u5C3E\u7A7A\u767D\u4E0E\u6838\u5FC3\u6587\u672C\n * \uFF08`text` \u5373\u6838\u5FC3\uFF0C\u4E0E\u6253\u5305\u5668\u7684\u9884\u7B97\u5B57\u6BB5\u540C\u540D\uFF09\u3002\u5934\u5C3E\u7A7A\u767D\u7531\u91CD\u88C5\u914D\u539F\u6837\u62FC\u56DE\u2014\u2014\u6A21\u578B\n * \u7231\u541E\u884C\u5C3E\u7A7A\u884C\uFF0C\u6BB5\u95F4\u8DDD\u4E0D\u80FD\u6307\u671B\u5B83\u5E26\u56DE\uFF1B\u9001\u6A21\u578B\u4E0E\u505A\u5F62\u72B6\u6838\u5BF9\u7684\u90FD\u53EA\u6709 `text`\u3002\n */\ninterface ReplyPiece {\n block: number;\n index: number;\n text: string;\n head: string;\n tail: string;\n}\n\n/** \u7247\u6BB5\u5728\u7ED3\u679C\u6620\u5C04\u91CC\u7684\u952E\u3002 */\nfunction replyPieceKey(piece: { block: number; index: number }): string {\n return `${piece.block}:${piece.index}`;\n}\n\n/** \u5757\u7684\u4E00\u4E2A\u62FC\u88C5\u90E8\u4EF6\uFF1A\u9010\u5B57\u4FDD\u7559\u6BB5\uFF08\u4EE3\u7801\u56F4\u680F\u3001\u7EAF\u7A7A\u767D\u6BB5\u3001\u7247\u6BB5\u5934\u5C3E\u53E6\u5B58\uFF09\u6216\u7247\u6BB5\u5F15\u7528\u3002 */\ntype BlockPart = { verbatim: string } | { piece: number };\n\n/**\n * \u7247\u6BB5\u5931\u8D25\u8D26\u672C\uFF1ApieceKey \u2192 \u4E00\u53E5\u6280\u672F\u7EC6\u8282\uFF08\u8FDB\u60AC\u505C\u6587\u6848\uFF09\u3002\u53EA\u6709\u901A\u9053\u4F24\u4F1A\u7559\u8D26\u2014\u2014\n * \u8BD1\u6587\u5F62\u72B6\u95EE\u9898\u7531\u4FEE\u590D\u3001\u91CD\u63B7\u3001\u7167\u6536\u4E09\u5C42\u6D88\u5316\uFF0C\u4E0D\u518D\u662F\u5426\u51B3\u7406\u7531\u3002\u4ECE\u672A\u8BB0\u8D26\u7684\u7F3A\u5931\n * \u515C\u5E95\u4E3A\u300C\u6CA1\u8BD1\u56DE\u6765\u300D\uFF0C\u56E0\u4E3A\u8BF4\u4E0D\u51FA\u7EC6\u8282\u65F6\u8FD9\u5C31\u662F\u6700\u8BDA\u5B9E\u7684\u63CF\u8FF0\u3002\n */\ntype FailureLedger = Map<string, string>;\n\nfunction recordLedgerFailure(ledger: FailureLedger, keys: readonly string[], detail: string): void {\n for (const key of keys) {\n if (!ledger.has(key)) ledger.set(key, detail);\n }\n}\n\n/** \u5757\u8D25\u56E0\u7EC6\u8282\uFF1A\u53D6\u7B2C\u4E00\u4E2A\u8BF4\u5F97\u51FA\u8BDD\u7684\u7F3A\u5931\u7247\u6BB5\u3002 */\nfunction blockFailureDetail(ledger: FailureLedger, block: number, missing: readonly number[]): string {\n for (const index of missing) {\n const detail = ledger.get(replyPieceKey({ block, index }));\n if (detail !== undefined) return detail;\n }\n return 'no translation came back';\n}\n\n/** \u628A\u4E00\u6BB5\u6587\u672C\u62C6\u6210 {head, core, tail}\uFF1Bcore \u4E3A\u5168\u7A7A\u767D\u65F6\u8FD4\u56DE null\uFF08\u6574\u6BB5\u9010\u5B57\u4FDD\u7559\uFF09\u3002 */\nfunction stripEdges(chunk: string): { core: string; head: string; tail: string } | null {\n const head = /^[ \\t\\r\\n]*/.exec(chunk)![0];\n if (head.length >= chunk.length) return null;\n const body = chunk.slice(head.length);\n const tail = /[ \\t\\r\\n]*$/.exec(body)![0];\n const core = body.slice(0, body.length - tail.length);\n return core === '' ? null : { core, head, tail };\n}\n\nexport class TranslationDispatcher {\n private configManager: ConfigManager;\n private cache: LruDiskCache;\n private adapters = new Map<string, ITranslationAdapter>();\n /** \u6B63\u6587\u8BF7\u6C42\u7684\u4E32\u884C\u961F\u5217\u5C3E\uFF0C\u4FDD\u8BC1\u540C\u65F6\u6700\u591A\u4E00\u4E2A\u5728\u9014\u8BF7\u6C42\u3002 */\n private replyTail: Promise<void> = Promise.resolve();\n\n constructor(configManager: ConfigManager, cache: LruDiskCache, credentials?: KeyReader) {\n this.configManager = configManager;\n this.cache = cache;\n\n // \u6B63\u6587\u53EA\u6709\u4E00\u6761\u901A\u9053\u3002map \u4ECD\u6309 id \u7D22\u5F15\uFF0C\u6D4B\u8BD5\u53EF\u4EE5\u6362\u6210\u540C id \u7684\u5047\u9002\u914D\u5668\u3002\n this.registerAdapter(new OpenAiCompatibleAdapter(credentials ?? { getApiKey: () => '' }));\n }\n\n private registerAdapter(adapter: ITranslationAdapter): void {\n this.adapters.set(adapter.id, adapter);\n }\n\n /**\n * \u7FFB\u8BD1\u56DE\u7B54\u6B63\u6587\u7684\u5757\uFF1A\u672C\u6B21\u552F\u4E00\u7684\u7FFB\u8BD1\u5165\u53E3\u3002\n *\n * \u6BCF\u4E2A\u5757\u5148\u6309 markdown \u7ED3\u6784\u5207\u6210\u6BB5\uFF1A\u4EE3\u7801\u56F4\u680F\u4E0E\u7EAF\u7A7A\u767D\u6BB5**\u9010\u5B57\u4FDD\u7559\u3001\u6C38\u4E0D\u9001\n * \u6A21\u578B**\uFF1B\u6563\u6587\u6BB5\u518D\u6309\u8F93\u5165\u4E0A\u9650\u5207\u7247\u3001\u5404\u81EA\u6210\u7247\u6BB5\u3002\u76F8\u90BB\u7247\u6BB5\u6253\u5305\u6210\u4E00\u4E2A\u8BF7\u6C42\uFF1B\u6574\u6279\n * \u5931\u8D25\u65F6\u9000\u56DE\u9010\u7247\u6BB5\u5355\u53D1\u3002\u6BCF\u4E2A\u7247\u6BB5\u7684\u8BD1\u6587\u8FC7 `repairShape`\uFF08\u6BB5\u843D\u5757\u5BF9\u9F50 + \u524D\u7F00\n * \u4FEE\u56DE + \u7A7A\u884C\u91CD\u6392\uFF09\u5E76\u901A\u8FC7\u94FE\u63A5\u76EE\u6807\u56DE\u586B\u624D\u7B97\u4FEE\u597D\u3002\n *\n * **\u5F62\u72B6\u95EE\u9898\u4E0D\u5426\u51B3\u5185\u5BB9**\uFF1A\u4FEE\u4E0D\u597D\u7684\u7247\u6BB5\u81EA\u52A8\u91CD\u63B7\u4E00\u6B21\uFF1B\u518D\u4FEE\u4E0D\u597D\u5C31\u7167\u6536\u6A21\u578B\u7684\n * \u8BD1\u6587\uFF08\u94FE\u63A5\u6570\u4E0D\u7B49\u65F6\u4E0D\u56DE\u586B\uFF0C\u5176\u4F59\u539F\u6837\uFF09\u2014\u2014\u539F\u6587\u4E00\u952E\u53EF\u56DE\uFF0C\u53EF\u8BFB\u7684\u8BD1\u6587\u4F18\u5148\u4E8E\n * \u4E00\u6839\u7EA2\u7EBF\u3002\u5931\u8D25\u53EA\u5269\u901A\u9053\u4F24\u4E00\u79CD\uFF1A\u8D85\u65F6\u3001\u65AD\u6D41\u3001\u7A7A\u8FD4\u56DE\uFF0C\u7EA2\u5B9E\u7EBF + \u60AC\u505C\u62A5\u7EC6\u8282\uFF0C\n * \u6551\u6D3B\u7531\u7528\u6237\u7684\u70B9\u51FB\u53D1\u8D77\u3002\n *\n * \u8C03\u7528\u65B9\u4F20\u8FDB\u6765\u7684\u6BCF\u4E2A\u5757\u8981\u4E48\u6574\u5757\u8BD1\u51FA\u3001\u8981\u4E48\u6574\u5757\u4FDD\u6301\u539F\u6587\uFF1A\u4EFB\u4E00\u7247\u6BB5\u7F3A\u5931\u90FD\u8BA9\u8BE5\u5757\n * \u4F5C\u5E9F\uFF0C\u907F\u514D\u534A\u4E2D\u534A\u82F1\u7684\u6BB5\u843D\uFF1B\u5931\u8D25\u5757\u5E26 `detail` \u4E00\u53E5\u6280\u672F\u7EC6\u8282\u3002\u6BCF\u884C\u53EA\u8DD1\u9996\u8DD1\n * \u4E00\u6B21\uFF0C\u901A\u9053\u6062\u590D\u540E\u7531\u70B9\u51FB\u6551\u6D3B\u3002\n *\n * \u5BA2\u6237\u7AEF\u6309\u4E0E\u5BBF\u4E3B\u540C\u6E90\u7684 4096 \u4F30\u7B97 token \u5207\u6279\uFF0C\u6240\u4EE5\u4E00\u4E2A markdown \u5757\u53EF\u80FD\u8DE8\u591A\u6B21\n * \u8C03\u7528\uFF1B\u6BCF\u6B21\u8C03\u7528\u90FD\u72EC\u7ACB\u51B3\u5B9A\u6210\u8D25\uFF0C\u4E0D\u4F1A\u51FA\u73B0\u300C\u524D\u4E00\u6BB5\u5DF2\u6302\u8BD1\u6587\u3001\u540E\u4E00\u6BB5\u5931\u8D25\u300D\u7684\n * \u534A\u622A\u7ED3\u679C\u3002\n */\n async translateReplyBlocks(blocks: string[]): Promise<ReplyBlockResult[]> {\n const results: ReplyBlockResult[] = blocks.map((original) => ({\n original,\n translated: original,\n ok: false,\n cached: false,\n }));\n\n const config = this.configManager.getConfig();\n if (!config.enabled) return results;\n\n // The channel id is fixed: the reply path has exactly one channel.\n const adapter = this.adapters.get(CHANNEL_ID);\n if (!adapter || !adapter.isAvailable(config)) return results;\n\n return this.serveReplyBlocks(blocks, results, adapter, config);\n }\n\n /** \u901A\u9053\u53EF\u7528\u4E4B\u540E\u7684\u6B63\u6587\u6267\u884C\u6BB5\uFF1A\u5207\u6BB5\u3001\u6253\u5305\u3001\u8BF7\u6C42\u3001\u62FC\u88C5\u3002 */\n private async serveReplyBlocks(\n blocks: string[],\n results: ReplyBlockResult[],\n adapter: ITranslationAdapter,\n config: PluginConfig\n ): Promise<ReplyBlockResult[]> {\n const pieces: ReplyPiece[] = [];\n const partsByBlock = new Map<number, BlockPart[]>();\n\n for (let block = 0; block < blocks.length; block++) {\n const raw = blocks[block] ?? '';\n if (raw.trim() === '') continue;\n const cached = this.cache.get(raw.trim().toLowerCase());\n if (cached) {\n results[block] = { original: raw, translated: cached, ok: true, cached: true };\n continue;\n }\n const parts: BlockPart[] = [];\n let count = 0;\n for (const segment of splitMarkdownSegments(raw)) {\n const edges = segment.kind === 'code' ? null : stripEdges(segment.text);\n if (edges === null) {\n // \u4EE3\u7801\u56F4\u680F\u6216\u7EAF\u7A7A\u767D\u6BB5\uFF1A\u9010\u5B57\u4FDD\u7559\uFF0C\u4E0D\u8FDB\u8BF7\u6C42\u3002\n parts.push({ verbatim: segment.text });\n continue;\n }\n for (const chunk of splitOversizedBlock(segment.text)) {\n const pieceEdges = stripEdges(chunk);\n if (pieceEdges === null) {\n parts.push({ verbatim: chunk });\n continue;\n }\n parts.push({ piece: count });\n pieces.push({ block, index: count, text: pieceEdges.core, head: pieceEdges.head, tail: pieceEdges.tail });\n count += 1;\n }\n }\n partsByBlock.set(block, parts);\n }\n\n const ledger: FailureLedger = new Map();\n const translated = new Map<string, string>();\n for (const batch of packPieces(pieces)) {\n const outcome = await this.runReplySerial(() =>\n this.translateReplyBatch(adapter, batch, config, ledger)\n );\n for (const [key, value] of outcome) translated.set(key, value);\n }\n\n for (const block of partsByBlock.keys()) {\n const parts: string[] = [];\n const missing: number[] = [];\n for (const part of partsByBlock.get(block) ?? []) {\n if ('verbatim' in part) {\n parts.push(part.verbatim);\n continue;\n }\n const value = translated.get(replyPieceKey({ block, index: part.piece }));\n if (value === undefined) {\n missing.push(part.piece);\n continue;\n }\n parts.push(value);\n }\n if (missing.length > 0) {\n results[block].detail = blockFailureDetail(ledger, block, missing);\n continue;\n }\n // \u5168\u56F4\u680F\u5757\uFF08\u96F6\u7247\u6BB5\uFF09\u4E5F\u8D70\u5230\u8FD9\u91CC\uFF1A\u62FC\u56DE\u5373\u539F\u6587\uFF0C\u6309\u300C\u5DF2\u662F\u6700\u7EC8\u5F62\u6001\u300D\u8BB0\u6210\u529F\n // \u6302\u84DD\u7EBF\u2014\u2014\u4E0E\u300C\u6A21\u578B\u539F\u6837\u8FD4\u56DE\u4E5F\u7B97\u7FFB\u8FC7\u300D\u540C\u4E00\u8BED\u4E49\uFF0C\u4E0D\u53E6\u9020\u7B2C\u4E09\u79CD\u72B6\u6001\u3002\n const original = blocks[block]!;\n const finalText = parts.join('');\n this.cache.set(original.trim().toLowerCase(), finalText);\n results[block] = {\n original,\n translated: finalText,\n ok: true,\n cached: false,\n };\n }\n\n return results;\n }\n\n /**\n * \u4E00\u6574\u6279\u4E00\u6B21\u8BF7\u6C42\uFF1B\u6279\u5185\u4FEE\u4E0D\u597D\u7684\u7247\u6BB5\u4E0E\u6574\u6279\u7684\u5931\u8D25\u90FD\u9000\u56DE\u9010\u7247\u6BB5\u5355\u53D1\u3002\u5355\u53D1\u4ECD\n * \u4FEE\u4E0D\u597D\u7684**\u7167\u6536**\uFF08\u89C1 {@link translateReplyBlocks}\uFF09\u2014\u2014\u53EA\u6709\u901A\u9053\u4F24\u624D\u8BA9\u7247\u6BB5\n * \u7F3A\u5931\uFF0C\u5931\u8D25\u7684\u7247\u6BB5\u4E0D\u8FDB\u7F13\u5B58\u3002\n *\n * \u6BCF\u6B21\u901A\u9053\u5931\u8D25\u90FD\u8BB0\u8FDB\u7247\u6BB5\u8D26\u672C\uFF08{@link FailureLedger}\uFF09\uFF1A\u6279\u8BF7\u6C42\u7684\u5931\u8D25\u644A\u5230\n * \u6279\u5185\u6BCF\u4E2A\u7247\u6BB5\uFF0C\u5355\u53D1\u7684\u5931\u8D25\u53EA\u8BB0\u8BE5\u7247\u6BB5\uFF1B\u5757\u7EA7\u7EC6\u8282\u7531\u7F3A\u5931\u7247\u6BB5\u7684\u8D26\u672C\u5408\u6210\u3002\n */\n private async translateReplyBatch(\n adapter: ITranslationAdapter,\n batch: ReplyPiece[],\n config: PluginConfig,\n ledger: FailureLedger\n ): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n const stragglers: ReplyPiece[] = [];\n try {\n const answers = await this.fetchReplyAnswers(adapter, batch, config);\n batch.forEach((piece, index) => {\n const answer = answers[index] ?? '';\n const repair = repairShape(piece.text, answer);\n if (repair.text !== null) {\n out.set(replyPieceKey(piece), this.assemble(piece, repair.text, true));\n } else {\n stragglers.push(piece);\n }\n });\n } catch (err) {\n recordLedgerFailure(ledger, batch.map((piece) => replyPieceKey(piece)), describeError(err));\n console.warn(\n `[dsh-chat-translate] reply batch of ${batch.length} failed, retrying per block: ${describeError(err)}`\n );\n stragglers.push(...batch);\n }\n\n for (const piece of stragglers) {\n const key = replyPieceKey(piece);\n if (out.has(key)) continue;\n let answer: string | null = null;\n // \u4FEE\u4E0D\u597D\u7684\u5F62\u72B6\u81EA\u52A8\u91CD\u63B7\u4E00\u6B21\uFF1A\u5F31\u6A21\u578B\u7684\u6F02\u79FB\u662F\u968F\u673A\u7684\uFF0C\u518D\u95EE\u4E00\u6B21\u5E38\u5E38\u5C31\u9F50\u4E86\u3002\n // \u901A\u9053\u4F24\u4E0D\u91CD\u63B7\u2014\u2014\u65AD\u4E86\u5C31\u65AD\u4E86\uFF0C\u91CD\u8BD5\u53EA\u662F\u767D\u70E7\u6D41\u91CF\uFF0C\u6551\u6D3B\u5F52\u7528\u6237\u7684\u70B9\u51FB\u3002\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n answer = (await this.fetchReplyAnswers(adapter, [piece], config))[0] ?? '';\n } catch (err) {\n if (answer === null) {\n recordLedgerFailure(ledger, [key], describeError(err));\n console.warn(\n `[dsh-chat-translate] reply block ${piece.block} #${piece.index} failed, keeping the original: ${describeError(err)}`\n );\n }\n break;\n }\n if (repairShape(piece.text, answer).text !== null) break;\n }\n if (answer === null) continue;\n const repair = repairShape(piece.text, answer);\n if (repair.text !== null) {\n out.set(key, this.assemble(piece, repair.text, true));\n continue;\n }\n // \u7B2C\u4E09\u5C42\u9632\u7EBF\uFF1A\u7167\u6536\u3002\u7ED3\u6784\u6CA1\u4FEE\u9F50\u4E5F\u5C55\u793A\u6A21\u578B\u7684\u8BD1\u6587\u2014\u2014\u94FE\u63A5\u6570\u4E0D\u7B49\u65F6\u4E0D\u56DE\u586B\n // \uFF08\u56DE\u586B\u4F1A\u628A URL \u4E32\u5230\u9519\u7684\u94FE\u63A5\u4E0A\uFF09\uFF0C\u5176\u4F59\u539F\u6837\uFF1B\u8BFB\u4E0D\u987A\u8FD8\u6709\u539F\u6587\u4E00\u952E\u53EF\u56DE\u3002\n console.warn(\n `[dsh-chat-translate] reply block ${piece.block} #${piece.index} shape kept as the model wrote it: ${repair.error}`\n );\n out.set(key, this.assemble(piece, answer, linkCountsMatch(piece.text, answer)));\n }\n return out;\n }\n\n /** \u7247\u6BB5\u7684\u6700\u7EC8\u62FC\u88C5\uFF1A\u5934\u5C3E\u7A7A\u767D + \uFF08\u53EF\u9009\uFF09\u94FE\u63A5\u56DE\u586B + \u8BD1\u6587\u3002 */\n private assemble(piece: ReplyPiece, text: string, restoreLinks: boolean): string {\n return piece.head + (restoreLinks ? restoreLinkTargets(piece.text, text) : text) + piece.tail;\n }\n\n /**\n * \u53D1\u51FA\u4E00\u6B21\u6B63\u6587\u8BF7\u6C42\uFF0C\u8FD4\u56DE\u9010\u7247\u6BB5\u7684\u88F8\u7B54\u6848\uFF08\u6253\u5305\u6807\u8BB0\u5DF2\u5265\u9664\u3001\u9996\u5C3E\u5DF2 trim\uFF09\u3002\n * \u7A7A\u8FD4\u56DE\u4E0E\u6253\u5305\u62C6\u4E0D\u56DE\u90FD\u6309\u901A\u9053\u5931\u8D25\u629B\u51FA\u2014\u2014\u5F62\u72B6\u5BF9\u4E0D\u5BF9\u5728\u8FD9\u91CC\u4E0D\u7B97\u8D25\u56E0\u3002\n */\n private async fetchReplyAnswers(\n adapter: ITranslationAdapter,\n batch: ReplyPiece[],\n config: PluginConfig\n ): Promise<string[]> {\n const timeout = config.aiTimeoutMs || 600000;\n const abortCtrl = new AbortController();\n const timer = setTimeout(() => abortCtrl.abort(), timeout);\n let answers: string[];\n try {\n if (batch.length === 1) {\n answers = [\n await adapter.translate(batch[0]!.text, abortCtrl.signal, config, {\n maxTokens: REPLY_MAX_OUTPUT_TOKENS,\n mode: 'plain',\n }),\n ];\n } else {\n const format = createBatchFormat();\n const answer = await adapter.translate(\n buildBatchPayload(\n batch.map((piece) => piece.text),\n format\n ),\n abortCtrl.signal,\n config,\n { maxTokens: REPLY_MAX_OUTPUT_TOKENS, mode: 'blocks' }\n );\n const parts = splitBatchTranslation(answer, format, batch.length);\n if (parts === null) {\n throw new Error('batch markers did not survive the answer');\n }\n answers = parts;\n }\n } catch (err) {\n // \u8D85\u65F6\u6253\u65AD\u7684\u539F\u59CB\u62A5\u9519\uFF08AbortError \u4E00\u7C7B\uFF09\u8BF4\u4E0D\u51FA\u300C\u8D85\u65F6\u300D\u4E8C\u5B57\uFF0C\u5C31\u5730\u6362\u6210\n // \u80FD\u8FDB\u60AC\u505C\u6587\u6848\u7684\u8BF4\u6CD5\u3002\n if (abortCtrl.signal.aborted) {\n throw new Error(`channel timed out after ${timeout}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n const stripped = answers.map((answer) => stripBatchMarkers(answer).trim());\n if (stripped.some((answer) => answer === '')) {\n throw new Error('translation came back empty');\n }\n return stripped;\n }\n\n /** \u4E32\u884C\u6267\u884C\u5668\uFF1A\u540C\u65F6\u6700\u591A\u4E00\u4E2A\u5728\u9014\u8BF7\u6C42\u3002 */\n private runReplySerial<T>(task: () => Promise<T>): Promise<T> {\n const next = this.replyTail.then(task, task);\n this.replyTail = next.then(\n () => undefined,\n () => undefined\n );\n return next;\n }\n\n /**\n * \u901A\u9053\u63A2\u9488\uFF1A\u8BBE\u7F6E\u9762\u677F\u7684\u300C\u6D4B\u8BD5 AI \u901A\u9053\u300D\u6309\u94AE\u8D70\u8FD9\u91CC\u3002\u63A2\u6D4B\u6587\u672C\u7528\u4E00\u53E5\u82F1\u6587\u6B63\u6587\uFF0C\n * \u4E0E\u771F\u5B9E\u8BF7\u6C42\u540C\u5F62\uFF1B\u5B83\u4E00\u6B21\u8BF7\u6C42\u90FD\u4E0D\u5199\u6B63\u6587\u8D26\u672C\uFF0C\u6B63\u6587\u7684\u6210\u8D25\u4E5F\u4E0D\u5F71\u54CD\u6309\u94AE\u3002\n */\n async testChannel(channelId: string): Promise<{ ok: boolean; latencyMs: number; error?: string }> {\n const adapter = this.adapters.get(channelId);\n const config = this.configManager.getConfig();\n if (!adapter) {\n return { ok: false, latencyMs: 0, error: `Channel ${channelId} not found` };\n }\n if (!adapter.isAvailable(config)) {\n return { ok: false, latencyMs: 0, error: `Channel ${channelId} is not configured or disabled` };\n }\n const testText = 'Here is what I changed.';\n const start = Date.now();\n try {\n const timeout = Math.min(config.aiTimeoutMs || 30000, 30000);\n const abortCtrl = new AbortController();\n const timer = setTimeout(() => abortCtrl.abort(), timeout);\n let res = '';\n try {\n res = await adapter.translate(testText, abortCtrl.signal, config);\n } finally {\n clearTimeout(timer);\n }\n\n const latencyMs = Date.now() - start;\n if (res && res.trim()) {\n return { ok: true, latencyMs };\n }\n return { ok: false, latencyMs, error: 'Empty translation returned' };\n } catch (err: any) {\n return { ok: false, latencyMs: Date.now() - start, error: describeError(err) };\n }\n }\n}\n", "import type { ConnectionFetchRoute } from '@deepseek-ai/dsh-client-connection';\nimport { describeError } from '../describe-error.ts';\nimport type { TranslationDispatcher } from './dispatcher.ts';\n\n/**\n * Translation proxy surface, carried by Connection's exact Fetch routes below\n * the shared `/api` channel.\n *\n * Config and credentials have no HTTP endpoints: the settings panel reads and\n * writes through DSH's own channels \u2014 the shared configuration form\n * (`ctx.configForms`) over the profile entry, and the `credentials` Remote API\n * for the key \u2014 so the plugin owns exactly two routes: reply-body block\n * translation, and the channel probe.\n */\n\n/** Reply-body block translation route path. */\nexport const REPLY_ROUTE_PATH = '/api/dsh-chat-translate/translate-reply';\n\n/** Single-channel probe route path. */\nexport const TEST_CHANNEL_ROUTE_PATH = '/api/dsh-chat-translate/test-channel';\n\nfunction sendJson(status: number, body: unknown): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\n });\n}\n\n/**\n * Decode one buffered JSON request body.\n * @returns the parsed value, or the 400 response the caller must return.\n */\nasync function readJson(request: Request): Promise<\n { ok: true; value: any } | { ok: false; response: Response }\n> {\n try {\n return { ok: true, value: await request.json() };\n } catch {\n return { ok: false, response: sendJson(400, { ok: false, error: 'Invalid JSON body' }) };\n }\n}\n\n/**\n * Build the plugin's exact Fetch routes.\n * @param dispatcher - translation coordinator the routes proxy to.\n * @param ready - settles once host-side async resources are usable; every\n * request waits for it before touching the dispatcher.\n */\nexport function createFetchRoutes(\n dispatcher: TranslationDispatcher,\n ready: Promise<unknown> = Promise.resolve()\n): ConnectionFetchRoute[] {\n const reply: ConnectionFetchRoute = {\n path: REPLY_ROUTE_PATH,\n methods: ['POST'],\n requestBody: 'buffered',\n fetch: async (request) => {\n await ready;\n try {\n const body = await readJson(request);\n if (!body.ok) return body.response;\n const rawBlocks: unknown = body.value?.blocks;\n const blocks = Array.isArray(rawBlocks)\n ? rawBlocks.filter((block): block is string => typeof block === 'string')\n : [];\n if (blocks.length === 0) {\n return sendJson(200, { ok: true, results: [] });\n }\n const results = await dispatcher.translateReplyBlocks(blocks);\n return sendJson(200, { ok: true, results });\n } catch (err: any) {\n return sendJson(500, { ok: false, error: describeError(err) });\n }\n },\n };\n\n const testChannel: ConnectionFetchRoute = {\n path: TEST_CHANNEL_ROUTE_PATH,\n methods: ['POST'],\n requestBody: 'buffered',\n fetch: async (request) => {\n await ready;\n try {\n const body = await readJson(request);\n if (!body.ok) return body.response;\n const channelId = typeof body.value.channel === 'string' ? body.value.channel : '';\n const result = await dispatcher.testChannel(channelId);\n return sendJson(200, result);\n } catch (err: any) {\n return sendJson(500, { ok: false, error: describeError(err) });\n }\n },\n };\n\n return [reply, testChannel];\n}\n", "import type { HostConnectionHandle } from '@deepseek-ai/dsh-client-connection';\nimport z from '@deepseek-ai/schemastery';\nimport {\n ConfigManager,\n createLiveConfigSource,\n DEFAULT_CONFIG,\n AI_TIMEOUT_MIN,\n AI_TIMEOUT_MAX,\n type PluginConfigRefs,\n} from './server/config.ts';\nimport { CredentialsReader, TRANSLATE_API_KEY_REF } from './server/credentials.ts';\nimport { LruDiskCache } from './server/cache.ts';\nimport { TranslationDispatcher } from './server/dispatcher.ts';\nimport { createFetchRoutes } from './server/router.ts';\n\n/** Stable Cordis loader name. */\nexport const name = 'dsh-chat-translate';\n\n/**\n * Hard dependencies: credentials is the DSH-owned secret surface this plugin\n * rides on, and settings carries the entry's automatic-page policy. The\n * plugin's own values arrive as its resolved Config. The translation routes\n * register through the connection service when a Web carrier composes it, so\n * apply takes that service through ctx.inject and the plugin still loads in\n * compositions without one.\n */\nexport const inject = ['settings', 'credentials'];\n\n/**\n * This plugin's live configuration: defaults plus bounds, resolved by DSH\n * itself. Every field is `volatile()` \u2014 the browser configuration form\n * derives its fields from this schema, and an accepted edit is committed into\n * these refs without remounting the plugin, so {@link apply} always reads the\n * current value instead of a snapshot taken at load.\n */\nexport const Config = z.object({\n enabled: z.boolean().default(DEFAULT_CONFIG.enabled).volatile(),\n aiTimeoutMs: z\n .number()\n .min(AI_TIMEOUT_MIN)\n .max(AI_TIMEOUT_MAX)\n .default(DEFAULT_CONFIG.aiTimeoutMs)\n .volatile(),\n baseUrl: z.string().default(DEFAULT_CONFIG.baseUrl).volatile(),\n model: z.string().default(DEFAULT_CONFIG.model).volatile(),\n});\n\ninterface HostContext {\n connection: HostConnectionHandle;\n fiber: unknown;\n settings: {\n /** Register this entry's automatic-page policy; `auto: false` opts out. */\n configure(presentation: { auto?: boolean }, owner?: unknown): () => void;\n };\n credentials: {\n resolve(ref: string): Promise<{ value: string; source?: string } | undefined>;\n describe(ref: string): Promise<{ configured: boolean; source?: string; writable: boolean }>;\n set(ref: string, value: string): Promise<void>;\n unset(ref: string): Promise<void>;\n };\n on(event: string, listener: (...args: any[]) => void): () => void;\n effect(factory: () => void | (() => void), label?: string): unknown;\n /** Optional-service injection: the callback runs once connection is present. */\n inject(names: string[], callback: (ctx: HostContext) => void | (() => void)): void;\n}\n\n/**\n * Mount the host half; provides the translation proxy and rides this plugin's\n * live Config.\n * @param ctx - DSH Host context.\n * @param config - this plugin's runtime-resolved Config (every field a live ref).\n */\nexport function apply(ctx: HostContext, config: PluginConfigRefs): void {\n const credentials = new CredentialsReader(ctx.credentials);\n const configManager = new ConfigManager(\n // DSH commits an accepted live edit into the Config refs and notifies this\n // plugin's own fiber through `loader/volatile-update`.\n createLiveConfigSource((listener) => ctx.on('loader/volatile-update', listener), config),\n credentials\n );\n const cache = new LruDiskCache(1000);\n const dispatcher = new TranslationDispatcher(configManager, cache, credentials);\n\n // This entry's configuration surface is the card in the DSH **Plugins** page,\n // not a kernel-derived settings form, so DSH must not also derive one for the\n // same fields.\n ctx.inject(['settings'], (child) => {\n child.effect(\n () => child.settings.configure({ auto: false }, child.fiber),\n 'dsh-chat-translate: settings page policy'\n );\n });\n\n // Initialize async resources: the credential cache and the reply cache pool.\n const initPromise = Promise.all([credentials.init(), cache.init()]).catch((err) => {\n console.warn('[dsh-chat-translate] Initialization error:', err);\n });\n\n // Keep the synchronous key cache warm: the credentials service fans this\n // event out after every committed write or external reload.\n ctx.on('credentials/reference-updated', (ref: unknown) => {\n if (ref === TRANSLATE_API_KEY_REF) {\n void credentials.refresh();\n }\n });\n\n // The routes ride Connection's authenticated /api transport, which a Web\n // carrier composes; a composition without one keeps the plugin loaded and\n // simply has no translation endpoint.\n ctx.inject(['connection'], (connectionCtx) => {\n const disposers = createFetchRoutes(dispatcher, initPromise).map((route) =>\n connectionCtx.connection.fetch.register(route)\n );\n return () => {\n void Promise.all(disposers.map((dispose) => dispose()))\n .then(() => cache.dispose())\n .catch((err) => {\n console.warn('[dsh-chat-translate] Dispose translation routes error:', err);\n });\n };\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["value", "value", "Binary", "result", "a", "b", "Time", "date", "template", "options", "pattern", "value", "extra", "path", "resolve", "toJSON", "date", "toString", "name", "key", "resolve", "path", "resolve", "push", "pattern"]
7
7
  }