dsh-composer-ux 0.5.0 → 0.6.2

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": ["../../../../DeepSeek Harness/vendor/cosmokit/lib/index.js", "../../../../DeepSeek Harness/vendor/schemastery/lib/index.mjs", "../src/host.ts", "../src/terminal/discover.ts", "../src/terminal/contracts.ts", "../src/settings-contract.ts", "../src/terminal/host.ts", "../src/terminal/sandbox.ts", "../src/terminal/render.ts", "../src/terminal/tool.ts", "../src/restart.ts", "../src/optimizer-prompt.ts", "../src/quick-store.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/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/** Deeply compare arrays, dates, regexps, buffers, and plain object fields. */\nfunction deepEqual(a, b, strict) {\n\tif (a === b) return true;\n\tif (!strict && isNullable(a) && isNullable(b)) return true;\n\tif (typeof a !== typeof b) return false;\n\tif (typeof a !== \"object\") return false;\n\tif (!a || !b) return false;\n\tfunction check(test, then) {\n\t\treturn test(a) ? test(b) ? then(a, b) : false : test(b) ? false : void 0;\n\t}\n\treturn check(Array.isArray, (a, b) => a.length === b.length && a.every((item, index) => deepEqual(item, b[index]))) ?? check(is(\"Date\"), (a, b) => a.valueOf() === b.valueOf()) ?? check(is(\"RegExp\"), (a, b) => a.source === b.source && a.flags === b.flags) ?? check(isArrayBufferLike, (a, b) => {\n\t\tif (a.byteLength !== b.byteLength) return false;\n\t\tconst viewA = new Uint8Array(a);\n\t\tconst viewB = new Uint8Array(b);\n\t\tfor (let i = 0; i < viewA.length; i++) if (viewA[i] !== viewB[i]) return false;\n\t\treturn true;\n\t}) ?? Object.keys({\n\t\t...a,\n\t\t...b\n\t}).every((key) => deepEqual(a[key], b[key], strict));\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, deduplicate, deepEqual, defineProperty, difference, filterKeys, formatProperty, hexToArrayBuffer, hyphenate, intersection, is, isNonNullable, isNullable, isPlainObject, makeArray, mapValues, mapValues as valueMap, noop, omit, paramCase, pick, remove, sanitize, snakeCase, trimSlash, uncapitalize, union };\n", "import { Binary, clone, deepEqual, filterKeys, isNullable, isPlainObject, 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 (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} });\nconst resolvers = {};\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.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}\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.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", "/**\n * Host half\u3002\u4E24\u4EF6\u4E8B\uFF1A\n *\n * 1. \u5F53 settings \u670D\u52A1\u5B58\u5728\u65F6\uFF0C\u4E3A\u6D4F\u89C8\u5668\u4FA7\u6CE8\u518C\u300Ccomposer-ux\u300D\u8BBE\u7F6E\u533A\uFF08schema\uFF09\uFF1B\n * 2. \u628A\u8BBE\u7F6E\u9875\u7684\u300COpenCode \u8BF7\u6C42\u5934\u300D\u955C\u50CF\u8FDB llm-pi-ai \u7684 provider profile\u3002\n * \u5F15\u64CE/\u83DC\u5355\u884C\u4E3A\u4ECD\u5168\u90E8\u7531 client \u534A\u5B9E\u73B0\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8BF7\u6C42\u5934\u5FC5\u987B\u843D\u5728\u5BBF\u4E3B\u534A\uFF1A\u51FA\u7F51\u8BF7\u6C42\u7531\u5BBF\u4E3B\u7684\u6A21\u578B\u9002\u914D\u5668\u53D1\u51FA\uFF0C\u6D4F\u89C8\u5668\u4FA7\u78B0\u4E0D\u5230\u3002\n * \u800C DSH \u91CC\u552F\u4E00\u53D7\u652F\u6301\u7684\u8BF7\u6C42\u5934\u5165\u53E3\u5C31\u662F llm-pi-ai \u7684 `providers.<route>.headers`\n * \u2014\u2014 \u5B83\u4F5C\u4E3A pi-ai \u7684 optionsHeaders \u5728\u6700\u540E\u5408\u5E76\uFF08\u80FD\u8986\u76D6\u9ED8\u8BA4\u5934\uFF09\uFF0C\u4E14\u8BE5\u9002\u914D\u5668\u6BCF\u6B21\n * \u8BF7\u6C42\u90FD\u91CD\u8BFB\u914D\u7F6E\uFF0C\u6240\u4EE5\u300C\u6539\u5B8C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u5373\u751F\u6548\u3001\u4E0D\u7528\u91CD\u542F\u300D\u3002\n *\n * \u5199\u5165\u65B9\u5F0F\u7528 `settings.mutate` \u7684\u8DEF\u5F84\u5BFB\u5740\uFF1A\u53EA\u52A8\u6211\u4EEC\u81EA\u5DF1\u90A3\u4E00\u4E2A\u952E\uFF0C\n * \u65E2\u4E0D\u91CD\u8FF0\u4E5F\u4E0D\u5220\u9664\u7528\u6237\u5199\u5728\u540C\u4E00\u4E2A profile \u91CC\u7684\u5176\u5B83\u5B57\u6BB5\u3002\n */\nimport type { Context } from '@deepseek-ai/cordis'\nimport z from '@deepseek-ai/schemastery'\nimport { spawn } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport inspector from 'node:inspector'\nimport {\n DEFAULT_HEADER_NAME, DEFAULT_QUICK_PROMPTS, DEFAULT_SETTINGS, ENABLED_FIELD,\n KEYS_ENABLED_FIELD, MENU_ENABLED_FIELD, PANEL_ENABLED_FIELD, QUICK_ENABLED_FIELD,\n TERMINAL_ENABLED_FIELD,\n HEADER_APPLIED_NAME_FIELD,\n HEADER_APPLIED_VALUE_FIELD, HEADER_ENABLED_FIELD, HEADER_NAME_FIELD, HEADER_NAME_MAX,\n HEADER_ROUTES_FIELD, HEADER_STATUS_FIELD, HEADER_VALUE_FIELD, HEADER_VALUE_MAX,\n LLM_NAMESPACE, MENU_FIELDS, MENU_MODE_FIELD, MENU_NATIVE_FIELD, NAMESPACE, NEWLINE_KEY_FIELD,\n OPENCODE_HOSTS, OPENCODE_ROUTE_PREFIX, OPTIMIZE_OUTPUT_MAX, OPTIMIZE_TEXT_MAX,\n OPTIMIZER_API_PATH, OPTIMIZER_TIER_FIELD, PANEL_HEIGHT_FIELD, PANEL_RESIZE_FIELD,\n PANEL_SCROLL_FIELD, PANEL_WIDTH_FIELD, QUICK_PROMPTS_API_PATH, QUICK_PROMPTS_FIELD,\n RESTART_API_PATH,\n SEND_KEY_FIELD, defaultQuickBook, newSessionId, parseRouteList, sanitizeBook, DEFAULT_OPTIMIZER_TIER,\n type QuickPromptBook,\n} from './settings-contract.ts'\nimport {\n TERMINAL_BASH_PATH_FIELD, TERMINAL_CANDIDATES_FIELD, TERMINAL_EFFECTIVE_FIELD,\n TERMINAL_MODE_FIELD, TERMINAL_STATUS_FIELD,\n} from './terminal/contracts.ts'\nimport { installTerminalPolicy } from './terminal/host.ts'\nimport type { BashToolDeps } from './terminal/tool.ts'\nimport {\n RESTART_LOG_PREFIX, bootId, detectedDebugger, detectedSupervisor, gracefulStop, planRestart,\n scheduleRestart, servingPort, trustedRestartRequest,\n} from './restart.ts'\nimport type { RestartIo } from './restart.ts'\nimport { buildOptimizeSystem, buildOptimizeTemperature, buildOptimizeUser } from './optimizer-prompt.ts'\nimport { ensureQuickBook, quickStorePath, readQuickBook, writeQuickBook } from './quick-store.ts'\n\nexport const name = 'composer-ux'\n\n/** \u8BBE\u7F6E\u9762\u677F\u53EF\u8C03\u5C3A\u5BF8\u7684\u4E0A\u4E0B\u9650\uFF08\u4E0E client \u4FA7\u7684 clamp \u4FDD\u6301\u4E00\u81F4\uFF09\u3002 */\nconst PANEL_MIN = 560\nconst PANEL_MAX = 4000\n\n/** \u8DEF\u5F84\u5BFB\u5740\u5199\u5165\uFF1A\u4E0E settings \u670D\u52A1\u7684 SettingsPathOp \u7ED3\u6784\u4E00\u81F4\u3002 */\ntype PathOp =\n | { op: 'set'; path: readonly string[]; value: unknown }\n | { op: 'unset'; path: readonly string[] }\n\n/** \u672C\u63D2\u4EF6\u7528\u5230\u7684 settings \u80FD\u529B\uFF08\u4FDD\u6301\u7ED3\u6784\u6700\u5C0F\uFF0C\u907F\u514D\u4F9D\u8D56\u5177\u4F53\u5B9E\u73B0\u7C7B\uFF09\u3002 */\ninterface SettingsLike {\n get(ns: string): unknown\n mutate(ns: string, ops: readonly PathOp[]): Promise<void>\n}\n\n/** \u6536\u7A84\u6210\u666E\u901A\u5BF9\u8C61\uFF08\u6570\u7EC4\u4E0E null \u90FD\u4E0D\u7B97\uFF09\u3002 */\nfunction objectOf(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n}\n\n/** \u53EA\u63A5\u53D7\u5B57\u7B26\u4E32\uFF0C\u5176\u4F59\u4E00\u5F8B\u89C6\u4E3A\u7A7A\u4E32\u3002 */\nfunction textOf(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\n/** \u53D6\u5934\u503C\u7684\u7B2C\u4E00\u4E2A\uFF08Node \u5BF9\u91CD\u590D\u5934\u4F1A\u7ED9\u51FA\u6570\u7EC4\uFF09\u3002 */\nfunction firstHeaderValue(value: string | readonly string[] | undefined): string | undefined {\n if (value === undefined) return undefined\n return typeof value === 'string' ? value : value[0]\n}\n\n/**\n * \u4E66\u672C\u91CC\u6709\u6CA1\u6709\"\u975E\u5185\u7F6E\"\u7684\u5185\u5BB9 \u2014\u2014 \u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u8FC1\u79FB\u7684\u5224\u636E\uFF08\u89C1 apply \u91CC\u90A3\u6BB5\u8BF4\u660E\uFF09\u3002\n * @param book \u8BFB\u5230\u7684\u4E66\u672C\u3002\n * @returns \u4E0E\u5185\u7F6E\u9ED8\u8BA4\u672C\u4E0D\u540C\u5219\u4E3A true\u3002\n */\nfunction bookLooksCustom(book: QuickPromptBook): boolean {\n return JSON.stringify(sanitizeBook(book)) !== JSON.stringify(defaultQuickBook())\n}\n\n/** \u5934\u540D\u662F\u5426\u5408\u6CD5\uFF1A\u4E0E llm-pi-ai \u7684 assertValidHeaders \u540C\u89C4\u5219\uFF08Fetch \u63A5\u53D7\u624D\u7B97\uFF09\u3002 */\nfunction nameIsValid(name: string): boolean {\n if (name === '' || name.length > HEADER_NAME_MAX) return false\n try {\n new Headers([[name, 'probe']])\n return true\n } catch {\n return false\n }\n}\n\n/** \u5934\u503C\u662F\u5426\u5408\u6CD5\uFF1A\u975E\u7A7A\u3001\u4E0D\u8D85\u957F\u3001\u5355\u884C\u4E14\u53EF\u8868\u793A\u4E3A\u5B57\u8282\uFF08Fetch \u63A5\u53D7\u624D\u7B97\uFF09\u3002 */\nfunction valueIsValid(value: string): boolean {\n if (value === '' || value.length > HEADER_VALUE_MAX) return false\n try {\n new Headers([['x-dsh-probe', value]])\n return true\n } catch {\n return false\n }\n}\n\n/**\n * provider \u7684 baseURL \u662F\u5426\u6307\u5411 OpenCode\uFF08\u542B\u5B50\u57DF\uFF09\u3002\n * \u7528\u6237\u81EA\u5EFA\u8DEF\u7531\u7684\u540D\u5B57\u53EF\u4EE5\u662F\u4EFB\u610F\u5B57\u7B26\u4E32\uFF08\u4F8B\u5982 `go`\uFF09\uFF0C\u7AEF\u70B9\u5374\u4ECD\u662F OpenCode\uFF0C\n * \u6240\u4EE5\u300C\u6309 URL \u8BA4\u300D\u6BD4\u300C\u6309\u540D\u5B57\u8BA4\u300D\u53EF\u9760\uFF1BURL \u89E3\u6790\u5931\u8D25\u65F6\u9000\u56DE\u5B50\u4E32\u5224\u65AD\u3002\n */\nfunction isOpencodeBaseUrl(value: unknown): boolean {\n const raw = textOf(value).trim()\n if (raw === '') return false\n let host = ''\n try {\n host = new URL(raw).hostname.toLowerCase()\n } catch {\n return raw.toLowerCase().includes('opencode.ai')\n }\n return OPENCODE_HOSTS.some(name => host === name || host.endsWith(`.${name}`))\n}\n\n/**\n * \u672C\u6B21\u8981\u5199\u7684\u76EE\u6807\u8DEF\u7531\u3002\n * \u663E\u5F0F\u540D\u5355\u53EA\u4FDD\u7559 llm-pi-ai \u91CC**\u5DF2\u5B58\u5728**\u7684\u8DEF\u7531\u2014\u2014profile \u7684 `models` \u662F\u5FC5\u586B\u9879\uFF0C\n * \u51ED\u7A7A\u9020\u4E00\u4E2A\u53EA\u6709 headers \u7684 profile \u4F1A\u8BA9\u6574\u4EFD\u914D\u7F6E\u6821\u9A8C\u5931\u8D25\u3002\n * \u7559\u7A7A\u65F6\u7684\u81EA\u52A8\u5339\u914D\uFF1A\u8DEF\u7531\u540D\u4EE5 `opencode` \u5F00\u5934\uFF08\u5185\u7F6E `opencode-go` \u8D70\u8FD9\u6761\uFF0C\u5B83\u7684\n * baseURL \u7531 pi-ai \u76EE\u5F55\u5185\u7F6E\u3001\u914D\u7F6E\u91CC\u6CA1\u6709\uFF09\uFF0C**\u6216**\u8BE5\u8DEF\u7531\u7684 `baseURL` \u6307\u5411 opencode.ai\n * \uFF08\u81EA\u5EFA\u8DEF\u7531\u5E38\u8D77\u522B\u540D\uFF0C\u6309 URL \u8BA4\u66F4\u51C6\uFF09\u3002\n * @param providers - llm-pi-ai \u5F53\u524D\u7684 providers \u5B57\u5178\u3002\n * @param listed - \u8BBE\u7F6E\u91CC\u7684\u300C\u4F5C\u7528\u8DEF\u7531\u300D\u540D\u5355\uFF08\u7559\u7A7A\u8868\u793A\u81EA\u52A8\u5339\u914D\uFF09\u3002\n * @returns \u76EE\u6807\u8DEF\u7531\u540D\uFF0C\u987A\u5E8F\u8DDF\u968F providers \u7684\u952E\u987A\u5E8F\u3002\n */\nfunction pickRoutes(\n providers: Record<string, unknown>,\n listed: readonly string[],\n): readonly string[] {\n const keys = Object.keys(providers)\n if (listed.length === 0) {\n return keys.filter(key => key.startsWith(OPENCODE_ROUTE_PREFIX)\n || isOpencodeBaseUrl(objectOf(providers[key])?.baseURL))\n }\n return listed.filter(key => Object.prototype.hasOwnProperty.call(providers, key))\n}\n\n/** \u9519\u8BEF\u8F6C\u4E00\u884C\u53EF\u8BFB\u6587\u672C\uFF08\u5199\u8FDB headerStatus\uFF0C\u4F9B\u8BBE\u7F6E\u9875\u5C55\u793A\uFF09\u3002 */\nfunction errorText(error: unknown): string {\n if (error instanceof Error && error.message !== '') return error.message\n return String(error)\n}\n\n/**\n * \u628A\u300C\u8BF7\u6C42\u5934\u300D\u680F\u76EE\u5BF9\u9F50\u5230 llm-pi-ai \u914D\u7F6E\u3002\u5E42\u7B49\uFF1A\u7B97\u51FA\u7684\u76EE\u6807\u4E0E\u73B0\u72B6\u4E00\u81F4\u65F6\u4E0D\u5199\u4EFB\u4F55\u4E1C\u897F\uFF0C\n * \u56E0\u6B64\u672C\u51FD\u6570\u65E2\u53EF\u5728\u63D2\u4EF6\u542F\u52A8\u65F6\u8DD1\u4E00\u6B21\uFF0C\u4E5F\u53EF\u5728\u6BCF\u6B21 settings \u53D8\u66F4\u540E\u88AB\u53CD\u590D\u8C03\u7528\u3002\n * @param settings - settings \u670D\u52A1\u3002\n */\nasync function mirrorHeader(settings: SettingsLike): Promise<void> {\n const own = objectOf(settings.get(NAMESPACE))\n if (own === undefined) return\n\n const enabled = own[ENABLED_FIELD] === true && own[HEADER_ENABLED_FIELD] === true\n const name = textOf(own[HEADER_NAME_FIELD])\n const nameOk = nameIsValid(name)\n const routesText = parseRouteList(textOf(own[HEADER_ROUTES_FIELD]))\n\n // \u9996\u6B21\u542F\u7528\u4E14\u503C\u4E3A\u7A7A\uFF1A\u751F\u6210\u4E00\u4E2A\u7A33\u5B9A ID \u5E76\u843D\u76D8\uFF0C\u6B64\u540E\u6BCF\u6B21\u90FD\u7528\u540C\u4E00\u4E2A\u3002\n let value = textOf(own[HEADER_VALUE_FIELD])\n if (enabled && nameOk && value === '') {\n value = newSessionId()\n await settings.mutate(NAMESPACE, [{ op: 'set', path: [HEADER_VALUE_FIELD], value }])\n }\n\n const llm = objectOf(settings.get(LLM_NAMESPACE))\n const providers = llm === undefined ? undefined : objectOf(llm.providers)\n\n const writes: PathOp[] = []\n const applied: string[] = []\n let status = ''\n\n if (!enabled) {\n status = ''\n } else if (providers === undefined) {\n status = '\u672A\u6302\u8F7D llm-pi-ai\uFF08\u6A21\u578B\u8DEF\u7531\uFF09\u8BBE\u7F6E\uFF0C\u6682\u672A\u5199\u5165'\n } else if (!nameOk) {\n status = '\u5934\u540D\u4E0D\u5408\u6CD5\uFF0C\u672A\u5199\u5165'\n } else if (!valueIsValid(value)) {\n status = `\u5934\u503C\u4E0D\u5408\u6CD5\uFF08\u9700 1\u2013${HEADER_VALUE_MAX} \u5B57\u7B26\u4E14\u5355\u884C\uFF09\uFF0C\u672A\u5199\u5165`\n } else {\n for (const route of pickRoutes(providers, routesText)) {\n const headers = objectOf(objectOf(providers[route])?.headers)\n if (headers?.[name] !== value) {\n writes.push({ op: 'set', path: ['providers', route, 'headers', name], value })\n }\n applied.push(route)\n }\n status = applied.length === 0\n ? `\u5DF2\u542F\u7528\uFF0C\u4F46\u6CA1\u6709\u53EF\u5199\u5165\u7684\u8DEF\u7531\uFF08\u76EE\u6807\uFF1A${routesText.length === 0 ? `\u81EA\u52A8\uFF08\u540D\u5B57\u4EE5 ${OPENCODE_ROUTE_PREFIX} \u5F00\u5934\uFF0C\u6216 baseURL \u6307\u5411 opencode.ai\uFF09` : routesText.join('\u3001')}\uFF09`\n : `\u5DF2\u5199\u5165 ${applied.join('\u3001')}`\n }\n\n // \u64A4\u9500\uFF1A\u4E0A\u6B21\u5199\u5165\u8FC7\u3001\u8FD9\u6B21\u4E0D\u518D\u662F\u76EE\u6807\u7684\u4F4D\u7F6E\uFF08\u505C\u7528\u3001\u6539\u540D\u3001\u503C\u88AB\u6362\u3001\u8DEF\u7531\u88AB\u79FB\u9664\uFF09\u3002\n // \u53EA\u5220\u300C\u786E\u5B9E\u662F\u6211\u4EEC\u5199\u7684\u300D\uFF1A\u503C\u5FC5\u987B\u7B49\u4E8E\u5F53\u524D\u914D\u7F6E\u503C\u6216\u8BB0\u8D26\u503C\uFF0C\u5426\u5219\u89C6\u4E3A\u7528\u6237\u81EA\u5DF1\u5199\u7684\uFF0C\u4E0D\u78B0\u3002\n const stale: PathOp[] = []\n if (providers !== undefined) {\n const previousName = textOf(own[HEADER_APPLIED_NAME_FIELD])\n const previousValue = textOf(own[HEADER_APPLIED_VALUE_FIELD])\n const ours = new Set([textOf(own[HEADER_VALUE_FIELD]), previousValue])\n ours.delete('')\n // \u672C\u8F6E\u7684\u76EE\u6807\u952E\uFF08\u54EA\u6015\u503C\u5DF2\u7ECF\u5BF9\u3001\u4E0D\u9700\u8981\u5199\uFF09\u2014\u2014\u5B83\u4EEC\u7EDD\u4E0D\u80FD\u88AB\u5F53\u6210\u8FC7\u671F\u9879\u64A4\u9500\u3002\n const targets = new Set(applied.map(route => `${route}\\u0000${name}`))\n const candidates = new Set([previousName, nameOk ? name : ''])\n candidates.delete('')\n for (const candidate of candidates) {\n for (const [route, profile] of Object.entries(providers)) {\n if (targets.has(`${route}\\u0000${candidate}`)) continue\n const headers = objectOf(objectOf(profile)?.headers)\n const current = headers?.[candidate]\n if (typeof current !== 'string' || !ours.has(current)) continue\n stale.push({ op: 'unset', path: ['providers', route, 'headers', candidate] })\n }\n }\n }\n\n const providerOps = [...writes, ...stale]\n let failed = false\n if (providerOps.length > 0) {\n try {\n await settings.mutate(LLM_NAMESPACE, providerOps)\n } catch (error: unknown) {\n failed = true\n status = `\u5199\u5165\u5931\u8D25\uFF1A${errorText(error)}`\n }\n }\n\n // \u8BB0\u8D26 + \u72B6\u6001\u56DE\u5199\uFF1A\u53EA\u6709\u771F\u6B63\u5199\u6210\u529F\u624D\u8BB0\u8D26\uFF0C\u4E14\u503C\u4E0D\u53D8\u65F6\u4E0D\u5199\uFF08\u4FDD\u8BC1\u5E42\u7B49\u3001\u4E0D\u4EA7\u751F\u56DE\u73AF\uFF09\u3002\n const nextAppliedName = !failed && applied.length > 0 ? name : ''\n const nextAppliedValue = !failed && applied.length > 0 ? value : ''\n const ownOps: PathOp[] = []\n if (textOf(own[HEADER_APPLIED_NAME_FIELD]) !== nextAppliedName) {\n ownOps.push({ op: 'set', path: [HEADER_APPLIED_NAME_FIELD], value: nextAppliedName })\n }\n if (textOf(own[HEADER_APPLIED_VALUE_FIELD]) !== nextAppliedValue) {\n ownOps.push({ op: 'set', path: [HEADER_APPLIED_VALUE_FIELD], value: nextAppliedValue })\n }\n if (textOf(own[HEADER_STATUS_FIELD]) !== status) {\n ownOps.push({ op: 'set', path: [HEADER_STATUS_FIELD], value: status })\n }\n if (ownOps.length > 0) await settings.mutate(NAMESPACE, ownOps)\n}\n\n/** \u6CE8\u518C durable section\uFF1Bsettings \u670D\u52A1\u7F3A\u5E2D\uFF08\u65E0 provider\uFF09\u65F6\u9759\u9ED8\u8DF3\u8FC7\u3002 */\nexport function apply(ctx: Context): void {\n ctx.inject(['settings'], (settingsCtx) => {\n settingsCtx.settings.register(\n NAMESPACE,\n z.object({\n [ENABLED_FIELD]: z.boolean().default(DEFAULT_SETTINGS.enabled),\n // \u4E94\u680F\u5F00\u5173\u3002**\u6545\u610F\u4E0D\u7ED9\u9ED8\u8BA4\u503C\u3001\u58F0\u660E\u6210\u53EF\u9009**\uFF1A\u8FC1\u79FB\u8981\u7528\u7684\u4FE1\u606F\u5C31\u662F\"\u6587\u6863\u91CC\u6709\u6CA1\u6709\u8FD9\u4E2A\u952E\"\n // \u2014\u2014 \u6CA1\u6709 \u21D2 \u4ECE\u6CA1\u78B0\u8FC7\u8FD9\u4E00\u680F \u21D2 \u5173\u95ED\uFF1B\u6709 \u21D2 \u7528\u6237\u78B0\u8FC7 \u21D2 \u4FDD\u6301\u4ED6\u5199\u4E0B\u7684\u503C\u3002\n // \u7ED9\u4E86\u9759\u6001\u9ED8\u8BA4\u503C\u5C31\u518D\u4E5F\u5206\u4E0D\u51FA\u8FD9\u4E24\u79CD\u60C5\u51B5\u4E86\uFF08\u51C0\u5316\u7684 sectionEnabledOf \u9760\u5B83\uFF09\u3002\n [KEYS_ENABLED_FIELD]: z.boolean().required(false),\n [MENU_ENABLED_FIELD]: z.boolean().required(false),\n [QUICK_ENABLED_FIELD]: z.boolean().required(false),\n [PANEL_ENABLED_FIELD]: z.boolean().required(false),\n [TERMINAL_ENABLED_FIELD]: z.boolean().required(false),\n [SEND_KEY_FIELD]: z.string().default(DEFAULT_SETTINGS.sendKey),\n [NEWLINE_KEY_FIELD]: z.string().default(DEFAULT_SETTINGS.newlineKey),\n ...Object.fromEntries(MENU_FIELDS.map(field => [\n field,\n z.boolean().default(DEFAULT_SETTINGS[field]),\n ])),\n // \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF080.5.0 \u8D77\u4E09\u6863\uFF09\u3002**\u6545\u610F\u4E0D\u7ED9\u9ED8\u8BA4\u503C\u3001\u4E14\u58F0\u660E\u6210\u53EF\u9009**\uFF1A\n // \u300C\u6587\u6863\u91CC\u6CA1\u6709\u8FD9\u4E2A\u952E\u300D\u672C\u8EAB\u5C31\u662F\u8FC1\u79FB\u8981\u7528\u7684\u4FE1\u606F\u2014\u2014\u51C0\u5316\u636E\u6B64\u6309\u65E7\u5E03\u5C14 menuNative\n // \u63A8\u65AD\uFF08\u89C1 menuModeFrom\uFF09\u3002\u7ED9\u4E86\u9ED8\u8BA4\u503C\u5C31\u518D\u4E5F\u5206\u4E0D\u51FA\u300C\u4ECE\u6CA1\u8BBE\u7F6E\u8FC7\u300D\u4E0E\u300C\u660E\u786E\u8BBE\u6210\u4E86\u5B83\u300D\u3002\n [MENU_MODE_FIELD]: z.string().required(false),\n // \u65E7\u7684\u5E03\u5C14\u5B57\u6BB5\uFF1A\u53EA\u4F5C\u8FC1\u79FB\u7EBF\u7D22\uFF0C\u6545\u540C\u6837\u4E0D\u7ED9\u9ED8\u8BA4\u503C\u2014\u2014\u65E7\u6587\u6863\u91CC\u7684 true / false\n // \u90FD\u8981\u4FDD\u4F4F\u539F\u610F\uFF08true = \u6D4F\u89C8\u5668\u83DC\u5355\u3001false = \u660E\u786E\u9009\u8FC7\u81EA\u5B9A\u4E49\u83DC\u5355\uFF09\u3002\n [MENU_NATIVE_FIELD]: z.boolean().required(false),\n [PANEL_SCROLL_FIELD]: z.boolean().default(DEFAULT_SETTINGS.panelScroll),\n [PANEL_RESIZE_FIELD]: z.boolean().default(DEFAULT_SETTINGS.panelResize),\n // schemastery \u65E0 .optional()\uFF1A\u53EF\u9009\u952E\u7528 .required(false)\u3002\n [PANEL_WIDTH_FIELD]: z.number().min(PANEL_MIN).max(PANEL_MAX).required(false),\n [PANEL_HEIGHT_FIELD]: z.number().min(320).max(PANEL_MAX).required(false),\n // OpenCode \u8BF7\u6C42\u5934\u680F\u76EE\uFF08\u503C\u7531\u5BBF\u4E3B\u534A\u6309 llm-pi-ai \u7684 Fetch \u89C4\u5219\u81EA\u6821\u9A8C\u540E\u518D\u5199\u5165\uFF09\u3002\n [HEADER_ENABLED_FIELD]: z.boolean().default(DEFAULT_SETTINGS.headerEnabled),\n [HEADER_NAME_FIELD]: z.string().default(DEFAULT_HEADER_NAME),\n [HEADER_VALUE_FIELD]: z.string().default(DEFAULT_SETTINGS.headerValue),\n [HEADER_ROUTES_FIELD]: z.string().default(DEFAULT_SETTINGS.headerRoutes),\n [HEADER_APPLIED_NAME_FIELD]: z.string().default(DEFAULT_SETTINGS.headerAppliedName),\n [HEADER_APPLIED_VALUE_FIELD]: z.string().default(DEFAULT_SETTINGS.headerAppliedValue),\n [HEADER_STATUS_FIELD]: z.string().default(DEFAULT_SETTINGS.headerStatus),\n // \u5FEB\u6377\u6307\u4EE4\u5217\u8868\uFF1A\u7ED3\u6784\u56FA\u5B9A\u4E3A {id,label,prompt,always}\uFF0C\u9010\u6761\u81EA\u5E26\u9ED8\u8BA4\u503C\uFF0C\n // \u8BA9\u65E7\u8BBE\u7F6E\u6587\u6863\uFF08\u6CA1\u6709\u8FD9\u4E2A\u952E\uFF09\u5728\u8BFB\u53D6\u65F6\u76F4\u63A5\u5F97\u5230\u5185\u7F6E 9 \u6761\u3002\n [QUICK_PROMPTS_FIELD]: z.array(z.object({\n id: z.string().default(''),\n label: z.string().default(''),\n prompt: z.string().default(''),\n always: z.boolean().default(false),\n })).default(DEFAULT_QUICK_PROMPTS.map(item => ({ ...item }))),\n [OPTIMIZER_TIER_FIELD]: z.string().default(DEFAULT_SETTINGS.optimizerTier),\n // \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\uFF080.5.0 \u8D77\uFF09\uFF1A\u7528\u6237\u6863\u4F4D\u4E0E\u53EF\u9009\u8DEF\u5F84\u3002\n [TERMINAL_MODE_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalMode),\n [TERMINAL_BASH_PATH_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalBashPath),\n // \u5BBF\u4E3B\u534A\u81EA\u6301\u7684\u4E09\u9879\uFF1A\u63A2\u6D4B\u5019\u9009\u3001\u72B6\u6001\u884C\u3001\u5F53\u524D\u751F\u6548 shell\uFF08\u89C1 HOST_OWNED_FIELDS\uFF09\u3002\n [TERMINAL_CANDIDATES_FIELD]: z.array(z.object({\n path: z.string().default(''),\n label: z.string().default(''),\n kind: z.string().default('path'),\n explicit: z.boolean().default(false),\n })).default([]),\n [TERMINAL_STATUS_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalStatus),\n [TERMINAL_EFFECTIVE_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalEffective),\n }),\n )\n\n const settings = settingsCtx.settings as unknown as SettingsLike\n // \u4E32\u884C\u5316\uFF1A\u672C\u63D2\u4EF6\u81EA\u5DF1\u7684\u5199\u5165\u4E5F\u4F1A\u518D\u89E6\u53D1 settings/updated\uFF0C\u7528 busy/again \u4FDD\u8BC1\n // \u4E00\u6B21\u53EA\u8DD1\u4E00\u8F6E\u955C\u50CF\uFF0C\u4E14\u4E0D\u6F0F\u6389\u671F\u95F4\u5230\u8FBE\u7684\u53D8\u66F4\u3002\n let busy = false\n let again = false\n const sync = (): void => {\n if (busy) {\n again = true\n return\n }\n busy = true\n void mirrorHeader(settings)\n .catch((error: unknown) => {\n console.error('[composer-ux] \u8BF7\u6C42\u5934\u955C\u50CF\u5931\u8D25', error)\n })\n .finally(() => {\n busy = false\n if (again) {\n again = false\n sync()\n }\n })\n }\n\n const onSettingsUpdated = (ns: unknown): void => {\n if (ns === NAMESPACE || ns === LLM_NAMESPACE) sync()\n }\n ctx.on('settings/updated' as never, onSettingsUpdated as never)\n // \u542F\u52A8\u5373\u5BF9\u9F50\u4E00\u6B21\uFF1A\u542F\u7528\u72B6\u6001\u4E0B\u7684\u5934\u5373\u4F7F\u5728\u522B\u5904\u88AB\u62B9\u6389\uFF0C\u4E5F\u4F1A\u5728\u6B64\u8865\u56DE\u3002\n sync()\n })\n\n // \u2500\u2500 \u63D0\u793A\u8BCD\u4F18\u5316\u63A5\u53E3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u4E3A\u4EC0\u4E48\u5FC5\u987B\u5728\u5BBF\u4E3B\u534A\uFF1A\u51FA\u7F51\u8BF7\u6C42\u7531\u5BBF\u4E3B\u7684\u6A21\u578B\u9002\u914D\u5668\u53D1\u51FA\uFF0C\u6D4F\u89C8\u5668\u4FA7\u78B0\u4E0D\u5230\u6A21\u578B\u8DEF\u7531\u3002\n // \u6240\u4EE5\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u662F\u4E00\u6B21\u300C\u6D4F\u89C8\u5668 POST \u539F\u6587 -> \u5BBF\u4E3B\u72EC\u7ACB\u8DD1\u4E00\u6B21\u6A21\u578B\u8C03\u7528 ->\n // \u628A\u4F18\u5316\u540E\u7684\u6B63\u6587\u56DE\u7ED9\u6D4F\u89C8\u5668\u586B\u8FDB\u8F93\u5165\u6846\u300D\u7684\u5F80\u8FD4\u3002\u8FD9\u4E0E\n // WestFox-AwA/dsh-prompt-optimizer \u7684\u67B6\u6784\u4E00\u81F4\uFF08\u5B83\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\u4E5F\u5DF2\u63D0\u53D6\u5230\n // ./optimizer-prompt.ts\uFF09\u3002\n ctx.inject(['webServer', 'llm'], (optCtx) => {\n /** \u5355\u6B21\u4F18\u5316\u7684\u5899\u949F\u4E0A\u9650\uFF1A\u591F\u6162\u6A21\u578B\u8DD1\u5B8C\uFF0C\u4F46\u4E0D\u4F1A\u8BA9\u8BF7\u6C42\u6C38\u8FDC\u6302\u7740\u3002 */\n const LLM_TIMEOUT_MS = 180_000\n /** \u8BF7\u6C42\u4F53\u4E0A\u9650\uFF08\u8F93\u5165\u6846\u91CC\u7684\u539F\u6587\uFF0C\u6B63\u5E38\u90FD\u662F\u51E0 KB\uFF09\u3002 */\n const BODY_MAX_BYTES = 1_000_000\n /**\n * \u76F4\u63A5\u9001\u53BB\u4F18\u5316\u7684\u539F\u6587\u957F\u5EA6\u4E0A\u9650\u3002\n *\n * \u4E0E\u65E7\u5B9E\u73B0\u7B49\u503C\uFF08\u65E7 `QUICK_TEXT_MAX * 2` = 8000\uFF09\uFF1A\u5FEB\u6377\u6307\u4EE4\u7684\u5B58\u50A8\u4E0A\u9650\u5DF2\u7ECF\u63D0\u5230\n * 20 \u4E07\uFF0C\u4F46**\u4F18\u5316\u8BF7\u6C42**\u7684\u8F93\u5165\u4E0A\u9650\u5FC5\u987B\u7559\u5728\u539F\u5730\uFF0C\u5426\u5219\u8D85\u957F\u6587\u672C\u4F1A\u88AB\u4E22\u7ED9\u6A21\u578B\u3002\n */\n const TEXT_MAX = OPTIMIZE_TEXT_MAX\n\n const sendJson = (\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n code: number,\n payload: unknown,\n ): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })\n res.end(JSON.stringify(payload))\n }\n\n const readBody = async (req: AsyncIterable<unknown>): Promise<string> => {\n const chunks: Buffer[] = []\n let total = 0\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n total += buf.length\n if (total > BODY_MAX_BYTES) throw new Error('\u8BF7\u6C42\u4F53\u8FC7\u5927')\n chunks.push(buf)\n }\n return Buffer.concat(chunks).toString('utf8')\n }\n\n /** \u89E3\u6790\u672C\u6B21\u4F18\u5316\u7528\u54EA\u6761\u8DEF\u7531\uFF1A\u8BF7\u6C42\u4F53\u4F18\u5148\uFF0C\u5176\u6B21\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002 */\n const resolveRoute = (payload: Record<string, unknown>): { provider: string; model: string } => {\n const provider = textOf(payload.provider)\n const model = textOf(payload.model)\n if (provider !== '' && model !== '') return { provider, model }\n try {\n const selector = optCtx.get('agentDefaultModel') as\n { currentSelection?: () => { provider?: unknown; model?: unknown } } | undefined\n const current = selector?.currentSelection?.()\n return { provider: textOf(current?.provider), model: textOf(current?.model) }\n } catch {\n return { provider: '', model: '' }\n }\n }\n\n const handle = async (\n req: { method?: string; [key: string]: unknown },\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n ): Promise<void> => {\n if ((req.method ?? 'GET').toUpperCase() !== 'POST') {\n sendJson(res, 405, { ok: false, error: '\u53EA\u63A5\u53D7 POST' })\n return\n }\n let payload: Record<string, unknown>\n try {\n payload = objectOf(JSON.parse(await readBody(req as unknown as AsyncIterable<unknown>)))\n ?? {}\n } catch (error: unknown) {\n sendJson(res, 400, { ok: false, error: `\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${errorText(error)}` })\n return\n }\n\n const text = textOf(payload.text).trim()\n if (text === '') {\n sendJson(res, 400, { ok: false, error: '\u8F93\u5165\u6846\u662F\u7A7A\u7684\uFF0C\u6CA1\u6709\u53EF\u4F18\u5316\u7684\u5185\u5BB9' })\n return\n }\n if (text.length > TEXT_MAX) {\n sendJson(res, 400, { ok: false, error: `\u539F\u6587\u8FC7\u957F\uFF08\u4E0A\u9650 ${TEXT_MAX} \u5B57\u7B26\uFF09` })\n return\n }\n\n const tier = textOf(payload.tier) === '' ? DEFAULT_OPTIMIZER_TIER : textOf(payload.tier)\n const route = resolveRoute(payload)\n if (route.provider === '' || route.model === '') {\n sendJson(res, 200, { ok: false, error: '\u62FF\u4E0D\u5230\u5F53\u524D\u7684\u6A21\u578B\u8DEF\u7531\uFF0C\u65E0\u6CD5\u4F18\u5316\uFF08\u8BF7\u5148\u5728\u8F93\u5165\u6846\u65C1\u7684\u6A21\u578B\u9009\u62E9\u5668\u91CC\u9009\u4E00\u4E2A\u6A21\u578B\uFF09' })\n return\n }\n\n const controller = new AbortController()\n const timer = setTimeout(() => { controller.abort() }, LLM_TIMEOUT_MS)\n let out = ''\n let failure = ''\n try {\n const stream = optCtx.llm.stream({\n provider: route.provider,\n model: route.model,\n system: buildOptimizeSystem(tier),\n temperature: buildOptimizeTemperature(tier),\n signal: controller.signal,\n messages: [{\n id: `optimize-${Date.now().toString(36)}`,\n role: 'user',\n content: [{ type: 'text', text: buildOptimizeUser(text) }],\n source: { kind: 'user' },\n }],\n })\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n if (chunk.type === 'text-delta') {\n out += String(chunk.text ?? '')\n if (out.length > OPTIMIZE_OUTPUT_MAX) break\n } else if (chunk.type === 'finish') {\n const reason = objectOf(chunk.reason)\n if (reason?.kind === 'error' || reason?.kind === 'aborted') {\n const detail = objectOf(reason.failure)\n failure = textOf(detail?.message) || (reason.kind === 'aborted' ? '\u4F18\u5316\u88AB\u4E2D\u65AD' : '\u6A21\u578B\u8FD4\u56DE\u9519\u8BEF')\n }\n }\n }\n } catch (error: unknown) {\n failure = errorText(error)\n } finally {\n clearTimeout(timer)\n }\n\n const optimized = out.trim()\n if (optimized === '') {\n sendJson(res, 200, {\n ok: false,\n error: failure === '' ? '\u6A21\u578B\u6CA1\u6709\u4EA7\u51FA\u4EFB\u4F55\u5185\u5BB9' : `\u4F18\u5316\u5931\u8D25\uFF1A${failure}`,\n })\n return\n }\n sendJson(res, 200, {\n ok: true,\n text: optimized.slice(0, OPTIMIZE_OUTPUT_MAX),\n truncated: out.length > OPTIMIZE_OUTPUT_MAX,\n provider: route.provider,\n model: route.model,\n })\n }\n\n optCtx.effect(() => optCtx.webServer.register({\n kind: 'exact',\n path: OPTIMIZER_API_PATH,\n handler: handle as never,\n }), 'composer-ux: prompt optimizer route')\n })\n\n // \u2500\u2500 \u5FEB\u6377\u6307\u4EE4\u7684\u5168\u5C40\u5B58\u50A8 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // 0.3.0 \u8D77\u5FEB\u6377\u6307\u4EE4\u4E0D\u518D\u5199\u5165 settings \u6587\u6863\uFF0C\u6539\u5B58 `$DSH_HOME/quick-prompts.json`\uFF1A\n // \u8BBE\u7F6E\u6587\u6863\u5BF9\u6570\u7EC4\u662F\u6574\u4EFD\u66FF\u6362\u3001\u4E14\u53D7 schema \u957F\u5EA6\u4E0A\u9650\u622A\u65AD\uFF0C\u800C\u5FEB\u6377\u6307\u4EE4\u662F**\u7528\u6237\u5185\u5BB9**\n // \uFF08\u957F\u63D0\u793A\u8BCD\u662F\u5E38\u6001\uFF09\uFF0C\u5E76\u4E14\u9700\u8981\u4E00\u4EFD\u4E0E\u4F1A\u8BDD\u3001\u9879\u76EE\u65E0\u5173\u3001\u53EF\u4EE5\u5355\u72EC\u5907\u4EFD\u7684\u843D\u70B9\u3002\n //\n // \u672C\u5757\u53EA\u8D1F\u8D23\u300C\u8BFB\u3001\u8FC1\u79FB\u3001\u6574\u672C\u5199\u56DE\u300D\uFF1B\u539F\u5B50\u5199\u3001\u5199\u9501\u3001\u574F\u6587\u4EF6\u9694\u79BB\u90FD\u5728\n // ./quick-store.ts\uFF0C\u5BA2\u6237\u7AEF\u534A\u901A\u8FC7\u8FD9\u6761\u8DEF\u7531\u8BFB\u5199\uFF08\u89C1 client/prompt-book.ts\uFF09\u3002\n ctx.inject(['webServer'], (storeCtx) => {\n /** \u8BF7\u6C42\u4F53\u4E0A\u9650\uFF1A\u6574\u672C\u5FEB\u6377\u6307\u4EE4\u90FD\u5728\u91CC\u9762\uFF0C\u7ED9\u8DB3\u4F59\u91CF\uFF08\u6B63\u5E38\u53EA\u6709\u51E0\u5341 KB\uFF09\u3002 */\n const BODY_MAX_BYTES = 8_000_000\n\n const sendJson = (\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n code: number,\n payload: unknown,\n ): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })\n res.end(JSON.stringify(payload))\n }\n\n const readBody = async (req: AsyncIterable<unknown>): Promise<string> => {\n const chunks: Buffer[] = []\n let total = 0\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n total += buf.length\n if (total > BODY_MAX_BYTES) throw new Error('\u8BF7\u6C42\u4F53\u8FC7\u5927')\n chunks.push(buf)\n }\n return Buffer.concat(chunks).toString('utf8')\n }\n\n /**\n * \u8FC1\u79FB\u79CD\u5B50\uFF1A0.2.x \u5B58\u5728 settings \u91CC\u7684\u5E73\u94FA\u5217\u8868\u3002\n *\n * \u53D6\u4E0D\u5230\u5C31\u662F undefined \u2014\u2014 \u90A3\u65F6\u7528\u5185\u7F6E 9 \u6761\u521D\u59CB\u5316\uFF08\u89C1 quick-store \u7684 ensureQuickBook\uFF09\u3002\n * \u65E7\u503C**\u4FDD\u7559\u5728\u8BBE\u7F6E\u6587\u6863\u91CC\u3001\u4E0D\u6E05\u7A7A**\uFF1A\u4E07\u4E00\u56DE\u6EDA\u5230\u65E7\u7248\u672C\uFF0C\u7528\u6237\u8FD8\u80FD\u770B\u5230\u81EA\u5DF1\u90A3\u51E0\u6761\u3002\n */\n const legacyPrompts = (): readonly unknown[] | undefined => {\n try {\n const settings = storeCtx.get('settings') as SettingsLike | undefined\n const row = objectOf(settings?.get(NAMESPACE))\n const list = row?.[QUICK_PROMPTS_FIELD]\n return Array.isArray(list) ? list as readonly unknown[] : undefined\n } catch {\n return undefined\n }\n }\n\n const handle = async (\n req: { method?: string; [key: string]: unknown },\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n ): Promise<void> => {\n const method = (req.method ?? 'GET').toUpperCase()\n if (method !== 'GET' && method !== 'POST') {\n sendJson(res, 405, { ok: false, error: '\u53EA\u63A5\u53D7 GET / POST' })\n return\n }\n\n const file = quickStorePath()\n // \u6BCF\u6B21\u8BF7\u6C42\u90FD\u5C1D\u8BD5\u4E00\u6B21\u300C\u7F3A\u5931\u5373\u8FC1\u79FB\u300D\uFF1B\u6587\u4EF6\u5B58\u5728\u65F6\u5B83\u4EC0\u4E48\u4E5F\u4E0D\u505A\u3002\n const outcome = await ensureQuickBook(legacyPrompts(), file)\n if (outcome.kind === 'broken') {\n // \u574F\u6587\u4EF6\u5DF2\u88AB\u6539\u540D\u9694\u79BB\uFF0C\u8FD9\u91CC**\u4E0D\u505A\u4EFB\u4F55\u5199\u5165**\uFF0C\u5982\u5B9E\u628A\u539F\u56E0\u4EA4\u7ED9 UI \u663E\u793A\u3002\n sendJson(res, 200, {\n ok: false,\n file,\n error: `\u5FEB\u6377\u6307\u4EE4\u6587\u4EF6\u8BFB\u4E0D\u4E86\uFF1A${outcome.error}`,\n quarantined: outcome.quarantined ?? '',\n })\n return\n }\n if (method === 'GET') {\n sendJson(res, 200, { ok: true, file, book: outcome.book })\n return\n }\n\n let payload: Record<string, unknown>\n try {\n payload = objectOf(JSON.parse(await readBody(req as unknown as AsyncIterable<unknown>))) ?? {}\n } catch (error: unknown) {\n sendJson(res, 400, { ok: false, error: `\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${errorText(error)}` })\n return\n }\n\n const candidate = payload.book !== undefined ? payload.book : payload\n const next = sanitizeBook(candidate)\n if (next === undefined) {\n sendJson(res, 400, {\n ok: false,\n error: '\u63D0\u4EA4\u7684\u7ED3\u6784\u8BA4\u4E0D\u51FA\uFF08\u671F\u671B { book: { categories: [...] } } \u6216 { categories: [...] }\uFF09',\n })\n return\n }\n try {\n await writeQuickBook(next, file)\n } catch (error: unknown) {\n sendJson(res, 500, { ok: false, error: `\u5199\u5165\u5931\u8D25\uFF1A${errorText(error)}` })\n return\n }\n // \u5199\u5B8C\u91CD\u8BFB\u4E00\u904D\uFF1A\u56DE\u7ED9\u5BA2\u6237\u7AEF\u7684\u662F**\u78C1\u76D8\u4E0A\u7684\u771F\u5B9E\u5185\u5BB9**\uFF0C\u4E0D\u662F\u6211\u4EEC\u4EE5\u4E3A\u5199\u8FDB\u53BB\u7684\u4E1C\u897F\uFF0C\n // \u8FD9\u6837\u4EFB\u4F55\u88AB\u6536\u7A84/\u4E22\u5F03\u7684\u5B57\u6BB5\u90FD\u4F1A\u7ACB\u523B\u5728 UI \u4E0A\u66B4\u9732\u51FA\u6765\u3002\n const verified = await readQuickBook(file)\n sendJson(res, 200, { ok: true, file, book: verified.kind === 'ok' ? verified.book : next })\n }\n\n storeCtx.effect(() => storeCtx.webServer.register({\n kind: 'exact',\n path: QUICK_PROMPTS_API_PATH,\n handler: handle as never,\n }), 'composer-ux: quick prompt store route')\n })\n\n // \u2500\u2500 \u9ED8\u8BA4\u7EC8\u7AEF\uFF08Windows\uFF1A\u628A\u7EC8\u7AEF\u7684 pwsh \u6362\u6210 Git Bash\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u673A\u5236\uFF1A**\u6309 agent \u4F1A\u8BDD\u4E0B\u53D1**\u3002\u5B98\u65B9 `tools.restrict()` \u5728\u5168\u5C40\u4E0A\u4E0B\u6587\u4F1A\u629B\u9519\n // \uFF08\"a context-global restriction would mask every agent\"\uFF09\uFF0C\u6240\u4EE5\u538B\u5236 pwsh \u5FC5\u987B\u53D1\u751F\u5728\n // \u8BE5 agent \u81EA\u5DF1\u7684 scope \u91CC\uFF1B\u4E3A\u4E86\u8BA9\"\u6539\u5B8C\u8BBE\u7F6E\u7ACB\u523B\u751F\u6548\"\uFF0C\u8FD9\u91CC\u5728\u8BBE\u7F6E\u53D8\u5316\u65F6\u904D\u5386\n // `ctx.agents.list()` \u5BF9\u6BCF\u4E2A\u5728\u8DD1\u4F1A\u8BDD\u91CD\u65B0\u4E0B\u53D1\uFF08\u89C1 terminal/host.ts \u7684\u6CE8\u91CA\uFF09\u3002\n //\n // \u5E73\u53F0\uFF1A\u975E Windows \u76F4\u63A5\u4E0D\u63A5\u7BA1\uFF08\u5B98\u65B9 bash \u5DE5\u5177\u672C\u6765\u5C31\u5728\uFF09\uFF0C\u53EA\u628A\u72B6\u6001\u5982\u5B9E\u56DE\u62A5\u7ED9\u8BBE\u7F6E\u9875\u3002\n ctx.inject(['settings', 'webServer'], (termCtx) => {\n /** \u91C7\u96C6\u5DE5\u5177\u8FD0\u884C\u6240\u9700\u7684\u5BBF\u4E3B\u670D\u52A1\uFF1B\u7F3A subprocess \u5C31\u6CA1\u6CD5\u8DD1\u547D\u4EE4\uFF08\u53EA\u964D\u7EA7\u4E3A\u538B\u5236 pwsh\uFF09\u3002 */\n const readToolDeps = (): BashToolDeps | undefined => {\n const subprocess = termCtx.get('subprocess')\n if (subprocess === undefined) return undefined\n const sandbox = termCtx.get('sandbox')\n const sandboxPolicy = termCtx.get('sandboxPolicy')\n const approval = termCtx.get('approval')\n const jobs = termCtx.get('jobs')\n const shellEnv = termCtx.get('shellEnv')\n return {\n subprocess: subprocess as never,\n ...(sandbox === undefined ? {} : { sandbox: sandbox as never }),\n ...(sandboxPolicy === undefined ? {} : { sandboxPolicy: sandboxPolicy as never }),\n ...(approval === undefined ? {} : { approval: approval as never }),\n ...(jobs === undefined ? {} : { jobs: jobs as never }),\n ...(shellEnv === undefined ? {} : { shellEnv: shellEnv as never }),\n }\n }\n installTerminalPolicy(\n termCtx as never,\n NAMESPACE,\n termCtx.get('settings') as never,\n readToolDeps,\n )\n })\n\n // \u2500\u2500 \u8FC1\u79FB\uFF1A\u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u5BF9\u8001\u7528\u6237\u4FDD\u6301\u5F00\u7740\uFF08\u4E00\u6B21\u6027\u5199\u56DE\u6587\u6863\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u4E3A\u4EC0\u4E48\u8FD9\u4E00\u680F\u4E0D\u80FD\u53EA\u9760\u8BBE\u7F6E\u6587\u6863\u5224\u65AD\uFF1A0.3.0 \u8D77\u6761\u76EE\u642C\u5230\u4E86 `quick-prompts.json`\uFF0C\n // **\"\u7528\u8FC7\u5FEB\u6377\u6307\u4EE4\u7684\u4EBA\"\u548C\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u4EBA\"\u7684\u8BBE\u7F6E\u6587\u6863\u53EF\u4EE5\u4E00\u6A21\u4E00\u6837**\uFF08\u90FD\u662F\u5185\u7F6E 9 \u6761 + \u9ED8\u8BA4\u6863\u4F4D\uFF09\uFF0C\n // \u7EAF\u51C0\u51FD\u6570\u90A3\u5957\"\u503C\u4E0D\u7B49\u4E8E\u9ED8\u8BA4\u503C\"\u7684\u5224\u636E\u5728\u4ED6\u8EAB\u4E0A\u4F1A\u5F97\u51FA\"\u6CA1\u78B0\u8FC7 \u21D2 \u5173\"\uFF0C\u628A\u5165\u53E3\u6309\u94AE\u6536\u6389\u3002\n // \u6240\u4EE5\u8FD9\u91CC\u8BFB\u4E00\u6B21\u4E66\u672C\u6587\u4EF6\uFF1A\u6709\u975E\u5185\u7F6E\u5185\u5BB9 \u21D2 \u8BA4\u5B9A\u4ED6\u5728\u7528 \u21D2 \u5199\u56DE `quickEnabled: true`\u3002\n // \u5199\u56DE\u4E4B\u540E\u4E24\u7AEF\u90FD\u53EA\u9700\u8981\u770B\u90A3\u4E00\u4E2A\u5E03\u5C14\uFF0C\u4E0D\u5FC5\u5404\u81EA\u77E5\u9053\u6587\u4EF6\u7684\u5B58\u5728\u3002\n // **\u53EA\u5728\u6587\u6863\u91CC\u8FD8\u6CA1\u6709\u8FD9\u4E2A\u952E\u65F6\u5199**\uFF1A\u7528\u6237\u660E\u786E\u5173\u6389\u4E4B\u540E\u6587\u6863\u91CC\u5C31\u662F `false`\uFF0C\u4E0D\u4F1A\u88AB\u91CD\u65B0\u6253\u5F00\u3002\n ctx.inject(['settings'], (migrateCtx) => {\n void (async () => {\n const service = migrateCtx.get('settings') as SettingsLike | undefined\n if (service === undefined) return\n const row = objectOf(service.get(NAMESPACE))\n if (row === undefined || row[QUICK_ENABLED_FIELD] !== undefined) return\n try {\n const outcome = await readQuickBook(quickStorePath())\n if (outcome.kind !== 'ok' || !bookLooksCustom(outcome.book)) return\n await service.mutate(NAMESPACE, [\n { op: 'set', path: [QUICK_ENABLED_FIELD], value: true },\n ])\n } catch (error: unknown) {\n // \u8FC1\u79FB\u5931\u8D25\u4E0D\u662F\u81F4\u547D\u9519\u8BEF\uFF1A\u7528\u6237\u9876\u591A\u5728\u8BBE\u7F6E\u9875\u624B\u52A8\u6253\u5F00\u8FD9\u4E00\u680F\u3002\n console.error('[composer-ux] quick section migration skipped', error)\n }\n })()\n })\n\n // \u2500\u2500 \u91CD\u542F DSH \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u53EA\u6709\u5BBF\u4E3B\u8FDB\u7A0B\u80FD\u628A\u81EA\u5DF1\u91CD\u65B0\u62C9\u8D77\u6765\uFF08\u6D4F\u89C8\u5668\u78B0\u4E0D\u5230\u8FDB\u7A0B\uFF09\uFF0CDSH \u4E5F\u6CA1\u6709\u5B98\u65B9\u91CD\u542F\u673A\u5236\n // \uFF08\u63D2\u4EF6\u5E02\u573A\u90A3\u8FB9\u53EA\u8BF4\u300C\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u751F\u6548\u300D\uFF09\u3002\u673A\u5236\u7167\u642C\u63D2\u4EF6\u5E02\u573A\uFF1A\u5206\u79BB\u4E00\u4E2A node \u52A9\u624B\n // \u8FDB\u7A0B \u2192 \u81EA\u5DF1\u9000\u51FA \u2192 \u52A9\u624B\u7B49\u7AEF\u53E3\u771F\u7684\u7A7A\u51FA\u6765 \u2192 \u7528\u9690\u85CF\u63A7\u5236\u53F0\u7684 PowerShell \u8D77\u65B0\u5BBF\u4E3B \u2192\n // 20 \u79D2\u5185\u786E\u8BA4\u7AEF\u53E3\u6709\u4EBA\u76D1\u542C\uFF0C\u6CA1\u8D77\u6765\u628A\u8BCA\u65AD\u5199\u8FDB\u65E5\u5FD7\u3002\u7EC6\u8282\u4E0E\u7406\u7531\u5168\u5728 `src/restart.ts`\u3002\n //\n // \u8FD9\u4E00\u6574\u5757\u662F**\u5BBF\u4E3B\u534A**\uFF0C\u6240\u4EE5\u6539\u5B8C\u5FC5\u987B\u91CD\u542F DSH \u624D\u4F1A\u751F\u6548\uFF08\u8FD9\u4E5F\u6B63\u662F\u5B83\u8981\u89E3\u51B3\u7684\u95EE\u9898\uFF09\u3002\n ctx.inject(['webServer'], (restartCtx) => {\n /** \u8FD9\u6B21\u542F\u52A8\u7684\u6807\u8BC6\uFF1A\u754C\u9762\u9760\"\u53F7\u53D8\u4E86\"\u5224\u65AD\u65B0\u8FDB\u7A0B\u771F\u7684\u8D77\u6765\u4E86\u3002 */\n const BOOT_ID = bootId(process.pid, Date.now())\n /** \u5F53\u524D\u5BBF\u4E3B\u662F\u5426\u5904\u4E8E\"\u4E0D\u8BE5\u88AB\u4ECE\u754C\u9762\u91CC\u6740\u6389\"\u7684\u72B6\u6001\u3002 */\n const blockedBy = (): string | null => {\n const supervisor = detectedSupervisor({\n env: process.env,\n ppid: process.ppid,\n parentComm: (pid) => {\n try {\n return readFileSync(`/proc/${String(pid)}/comm`, 'utf8').trim()\n } catch {\n // /proc \u53EA\u5728 Linux \u4E0A\u6709\uFF1B\u8BFB\u4E0D\u5230\u5C31\u8BF4\u660E\"\u4E0D\u662F systemd \u7684\u4E3B\u8FDB\u7A0B\"\u3002\n return null\n }\n },\n })\n if (supervisor !== null) return `supervised:${supervisor}`\n if (detectedDebugger({\n inspectorUrl: inspector.url(),\n execArgv: process.execArgv,\n nodeOptions: process.env.NODE_OPTIONS,\n }) !== null) return 'debugger'\n return null\n }\n /** \u7EC4\u88C5\u6CE8\u5165\u9762\uFF08\u771F\u5B9E\u5B9E\u73B0\uFF1B\u6D4B\u8BD5\u91CC\u6362\u5047\u7684\uFF09\u3002 */\n const buildIo = (): RestartIo => ({\n platform: process.platform,\n pid: process.pid,\n argv0: process.argv0,\n execPath: process.execPath,\n argv1: process.argv[1],\n execArgv: process.execArgv,\n // argv[0] \u662F node \u81EA\u5DF1\u3001argv[1] \u662F\u5165\u53E3\uFF1B\u91CD\u653E\u7684\u662F\"\u5165\u53E3 + \u4E4B\u540E\u7684\u53C2\u6570\"\u3002\n rest: process.argv.slice(2),\n cwd: process.cwd(),\n env: process.env,\n tmpdir: tmpdir(),\n stamp: new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19),\n exists: (path) => existsSync(path),\n resolve: (path) => resolve(path),\n dirname: (path) => dirname(path),\n join: (...parts) => join(...parts),\n spawn: (command, args, options) => spawn(command, [...args], {\n detached: options.detached,\n stdio: options.stdio,\n windowsHide: options.windowsHide,\n env: options.env as NodeJS.ProcessEnv,\n }),\n stop: () => {\n gracefulStop({\n emitSignal: (signal) => { process.emit(signal as 'SIGTERM') },\n exit: (code) => { process.exit(code) },\n timer: (ms, run) => { setTimeout(run, ms) },\n })\n },\n wait: (ms) => new Promise<void>((done) => { setTimeout(done, ms) }),\n })\n /** \u5DF2\u7ECF\u6392\u8FC7\u4E00\u6B21\u91CD\u542F\uFF1A\u9632\u6B62\u754C\u9762\u91CD\u590D\u70B9 / \u4E24\u4E2A\u6807\u7B7E\u9875\u540C\u65F6\u70B9\u3002 */\n let restarting = false\n /** GET \u53EA\u8BFB\u5C55\u793A\uFF1A\u4F1A\u600E\u4E48\u91CD\u542F\u3001\u65E5\u5FD7\u843D\u5728\u54EA\u3002 */\n const planForDisplay = (): { command: string; execPath: string; logHint: string } => {\n const io = buildIo()\n const plan = planRestart(io, null)\n return {\n command: [plan.respawn.file, ...plan.respawn.args].join(' '),\n execPath: plan.node,\n logHint: join(io.tmpdir, `${RESTART_LOG_PREFIX}*.err.log`),\n }\n }\n\n restartCtx.effect(() => restartCtx.webServer.register({\n kind: 'exact',\n path: RESTART_API_PATH,\n handler: (req: {\n method?: string\n headers?: Readonly<Record<string, string | readonly string[] | undefined>>\n socket?: { remoteAddress?: string }\n }, res: {\n statusCode?: number\n writeHead: (code: number, headers: Record<string, string>) => void\n end: (body?: string) => void\n }): void => {\n const send = (code: number, payload: unknown): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' })\n res.end(JSON.stringify(payload))\n }\n // \u7B2C\u4E00\u9053\uFF1A\u5B98\u65B9\u90A3\u9053\u4FE1\u4EFB\u5173\u5361\uFF08\u672C\u673A webServer \u7ED1 0.0.0.0\uFF1AHost/Origin \u56F4\u680F + \u6D4F\u89C8\u5668\u4EE4\u724C\uFF09\u3002\n // \u4E0E\u53E6\u5916\u4E24\u6761\u8DEF\u7531\u4E00\u81F4\uFF0C\u5148\u95EE\u5B83\uFF0C\u88AB\u62D2\u5C31\u76F4\u63A5\u7ED3\u675F\u3002\n const connection = restartCtx.get('connection') as\n { requestRejection?: (request: unknown) => number | undefined } | undefined\n const rejection = connection?.requestRejection?.(req)\n if (rejection !== undefined) {\n res.statusCode = rejection\n res.end()\n return\n }\n\n const agents = restartCtx.get('agents') as { list?: () => readonly unknown[] } | undefined\n const running = agents?.list?.().length ?? 0\n const blocked = blockedBy()\n const method = (req.method ?? 'GET').toUpperCase()\n\n if (method !== 'GET' && method !== 'POST') {\n res.writeHead(405, { allow: 'GET, POST' })\n res.end()\n return\n }\n if (method === 'GET') {\n const plan = planForDisplay()\n send(200, { ok: true, ...plan, running, blocked, boot: BOOT_ID })\n return\n }\n\n // \u7B2C\u4E8C\u9053\uFF1A\u8FD9\u662F\"\u6740\u8FDB\u7A0B\"\u7684\u63A5\u53E3\uFF0C\u6240\u4EE5\u989D\u5916\u8981\u6C42\u8BF7\u6C42\u786E\u5B9E\u6765\u81EA\u672C\u673A\u540C\u6E90\u9875\u9762 \u2014\u2014\n // \u56DE\u73AF peer\u3001\u65E0\u8F6C\u53D1\u75D5\u8FF9\u3001Origin \u4E0E Host \u540C\u6E90\u3002\u8DE8\u7AD9\u9875\u9762\u4E00\u5B9A\u5E26\u81EA\u5DF1\u7684 Origin\uFF0C\u6321\u5728\u8FD9\u91CC\u3002\n if (!trustedRestartRequest({\n remoteAddress: req.socket?.remoteAddress,\n headers: req.headers ?? {},\n })) {\n send(403, { ok: false, error: 'restart is limited to same-origin loopback requests' })\n return\n }\n if (blocked !== null) {\n send(403, { ok: false, error: blocked === 'debugger'\n ? 'self-restart is disabled while the host is under a debugger'\n : `restart belongs to the ${blocked.slice('supervised:'.length)} supervisor on this host` })\n return\n }\n if (restarting) {\n send(409, { ok: false, error: 'restart already scheduled' })\n return\n }\n restarting = true\n try {\n const scheduled = scheduleRestart(buildIo(), servingPort(firstHeaderValue(req.headers?.host)))\n send(202, { ok: true, boot: BOOT_ID, running, ...scheduled })\n } catch (error: unknown) {\n restarting = false\n send(500, { ok: false, error: error instanceof Error ? error.message : String(error) })\n }\n },\n }), 'composer-ux: restart route')\n })\n}\n", "/**\n * bash \u63A2\u6D4B\uFF08\u7EAF\u51FD\u6570\uFF0C\u96F6 import\uFF0Chost \u4E0E\u6D4B\u8BD5\u5171\u7528\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u80FD\"\u626B PATH \u91CC\u7684 bash.exe \u5C31\u5B8C\u4E8B\"\uFF1A\n *\n * 1. **Windows \u4E0A `bash.exe` \u6709\u4E24\u4E2A\u6765\u6E90\uFF0C\u5176\u4E2D\u4E00\u4E2A\u5FC5\u987B\u6392\u9664\u3002**\n * `C:\\Windows\\System32\\bash.exe` \u4E0E `\u2026\\Microsoft\\WindowsApps\\bash.exe` \u662F WSL \u7684\n * \u542F\u52A8\u5668\u3002\u628A\u5B83\u4EA4\u7ED9\u6A21\u578B\uFF0C\u7B49\u4E8E\u628A Windows \u8DEF\u5F84\u4F53\u7CFB\u6362\u6389\uFF1A`D:\\a\\b` \u8981\u5199\u6210 `/mnt/d/a/b`\uFF0C\n * \u76D8\u7B26\u3001\u53CD\u659C\u6760\u3001`%TEMP%` \u5168\u90FD\u4E0D\u901A\uFF0C\u800C\u6A21\u578B\u624B\u91CC\u8FD8\u62FF\u7740 Windows \u98CE\u683C\u7684\u8DEF\u5F84\u4E0E\u5DE5\u4F5C\u76EE\u5F55\u3002\n * \u6240\u4EE5\u8FD9\u91CC\u662F**\u786C\u6392\u9664**\uFF08`isWslBash`\uFF09\uFF0C\u4E0D\u662F\"\u6392\u5E8F\u9760\u540E\"\u3002\n *\n * 2. **Git for Windows \u4E0D\u4E00\u5B9A\u88C5\u5728 Program Files\u3002** \u5B89\u88C5\u5668\u4EE5\u7BA1\u7406\u5458\u8FD0\u884C\u65F6\u9ED8\u8BA4\u843D\n * `C:\\Program Files\\Git`\uFF0C**\u4EE5\u666E\u901A\u7528\u6237\u8FD0\u884C\u65F6\u9ED8\u8BA4\u843D `%LOCALAPPDATA%\\Programs\\Git`**\uFF1B\n * \u8FD8\u6709 Scoop / Chocolatey / GitHub Desktop \u5185\u5D4C / \u81EA\u89E3\u538B PortableGit \u7B49\u6765\u6E90\u3002\n * \u672C\u673A\u5C31\u662F\u53CD\u4F8B\uFF1AGit \u88C5\u5728 `D:\\Git`\uFF08\u53EA\u6709\u56E0\u4E3A `D:\\Git\\cmd` \u5728 PATH \u4E0A\u624D\u88AB\u627E\u5230\uFF09\u3002\n * \u6240\u4EE5\u63A2\u6D4B\u662F**\u5148\u627E git\uFF0C\u518D\u7531\u540C\u4E00\u4E2A\u5B89\u88C5\u53CD\u63A8 bash**\uFF0C\u518D\u53E0\u52A0\u4E00\u4EFD\"\u5E38\u89C1\u6765\u6E90\"\u5019\u9009\u8868\u3002\n *\n * 3. **Niubash\uFF08\u725B bash\uFF0C`niu.exe`\uFF09\u662F\u5019\u9009\u800C\u4E0D\u662F\u9ED8\u8BA4\u3002** \u5B83\u7684\u547D\u4EE4\u96C6\uFF08winuxcmd\uFF09\u5BF9\n * \u975E ASCII \u53C2\u6570\u7684\u5904\u7406\u6709\u95EE\u9898\uFF08\u5B9E\u6D4B\uFF1A`grep <\u4E2D\u6587\u6587\u4EF6\u540D>` \u76F4\u63A5 `cannot open` \u5E76\u4EE5\n * `0xC0000409` \u9000\u51FA\uFF09\uFF0C\u6240\u4EE5\u6392\u5728\u771F Git Bash \u4E4B\u540E\uFF0C\u4F46\u4ECD\u7136\u5217\u51FA\u6765 \u2014\u2014 \u7528\u6237\u53EF\u80FD\u7279\u610F\u9009\u4E86\u5B83\u3002\n *\n * \u8986\u76D6\u7684\u6765\u6E90\uFF08\u987A\u5E8F\u5373\u4F18\u5148\u7EA7\uFF0C\u540C\u7C7B\u5185\u4FDD\u6301\u8FD9\u91CC\u7684\u5148\u540E\uFF09\uFF1A\n * \u663E\u5F0F\u8DEF\u5F84 \u2192 PATH \u4E0A\u7684 git \u53CD\u63A8 \u2192 Program Files / x86 / W6432 / `%LOCALAPPDATA%\\Programs`\n * \u2192 Scoop \u2192 Chocolatey \u4FBF\u643A\u5305 \u2192 GitHub Desktop \u5185\u5D4C \u2192 \u65E7 GitHub \u7684 PortableGit\n * \u2192 Visual Studio \u5185\u5D4C \u2192 MSYS2 \u2192 Cygwin \u2192 **\u5404\u76D8\u7B26\u6839\u4E0B\u7684 Git / PortableGit / msys64 / cygwin64**\n * \u2192 Niubash \u2192 PATH \u515C\u5E95\u3002\n *\n * \u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF08GitHub Desktop \u7684 `app-*`\u3001\u65E7 GitHub \u7684 `PortableGit_*`\u3001VS \u7684\n * `<\u5E74\u4EFD>\\<\u7248\u672C>`\uFF09\u9700\u8981\"\u5217\u4E00\u773C\u5B50\u76EE\u5F55\"\uFF0C\u6240\u4EE5\u8F93\u5165\u91CC\u591A\u4E86\u4E00\u4E2A\u53EF\u6CE8\u5165\u7684 `listDirs`\uFF1B\n * **\u4E0D\u6CE8\u5165\u5C31\u9000\u5316\u6210\u7EAF\u5B58\u5728\u6027\u68C0\u67E5**\uFF08\u4E0D\u8BFB\u76EE\u5F55\uFF09\u3002\u5168\u7A0B\u4E0D\u8FD0\u884C\u4EFB\u4F55\u8FDB\u7A0B\uFF1A\u7248\u672C\u63A2\u6D4B\u5C5E\u4E8E\u5BBF\u4E3B\u534A\u3002\n */\n\n/** \u5019\u9009\u7684\u79CD\u7C7B\uFF08\u51B3\u5B9A\u6392\u5E8F\u6743\u91CD\u4E0E\u9ED8\u8BA4\u6807\u7B7E\uFF09\u3002 */\nexport type BashKind = 'git' | 'msys2' | 'cygwin' | 'niubash' | 'path'\n\n/** \u4E00\u4E2A\u5019\u9009 shell\u3002 */\nexport interface BashCandidate {\n /** \u5F52\u4E00\u5316\u540E\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u6B63\u659C\u6760\uFF09\uFF0C\u53EF\u76F4\u63A5\u843D\u76D8\u4E0E\u56DE\u663E\u3002 */\n readonly path: string\n readonly kind: BashKind\n /** \u7ED9\u7528\u6237\u770B\u7684\u6765\u6E90\u6807\u7B7E\uFF08\u5177\u4F53\u6765\u6E90\u4F18\u5148\uFF0C\u4F8B\u5982 'Scoop \u7684 git'\uFF0C\u5426\u5219\u7528\u79CD\u7C7B\u6807\u7B7E\uFF09\u3002 */\n readonly label: string\n /** \u662F\u5426\u662F\u7528\u6237\u5728\u8BBE\u7F6E\u91CC\u663E\u5F0F\u6307\u5B9A\u7684\uFF08\u754C\u9762\u6807\u6CE8\u300C\u4F60\u6307\u5B9A\u7684\u300D\uFF0C\u4E14\u6392\u5E8F\u6C38\u8FDC\u5728\u6700\u524D\uFF09\u3002 */\n readonly explicit: boolean\n}\n\n/** \u88AB\u786C\u6392\u9664\u7684\u8DEF\u5F84\u53CA\u539F\u56E0\uFF08\u8BBE\u7F6E\u9875\u8981\u5982\u5B9E\u8BF4\u660E\"\u4E3A\u4EC0\u4E48\u4E0D\u9009\u5B83\"\uFF09\u3002 */\nexport interface ExcludedPath {\n readonly path: string\n readonly reason: string\n}\n\n/** \u663E\u5F0F\u8DEF\u5F84\uFF08\u8BBE\u7F6E\u91CC\u586B\u7684\uFF09\u7684\u72B6\u6001\u3002 */\nexport interface ExplicitState {\n readonly path: string\n readonly state: 'ok' | 'missing' | 'wsl'\n}\n\n/** \u63A2\u6D4B\u7684\u8F93\u5165\uFF08\u5168\u90E8\u53EF\u6CE8\u5165\uFF0C\u6D4B\u8BD5\u91CC\u7ED9\u5047\u5B9E\u73B0\u5373\u53EF\uFF09\u3002 */\nexport interface DiscoverInput {\n /** \u8DEF\u5F84\u662F\u5426\u5B58\u5728\u3002 */\n readonly exists: (path: string) => boolean\n /** \u6309\u987A\u5E8F\u7684 PATH \u6761\u76EE\uFF08\u672A\u6E05\u6D17\uFF09\u3002 */\n readonly pathEntries: readonly string[]\n /** \u73AF\u5883\u53D8\u91CF\u53D6\u503C\u3002 */\n readonly env: (name: string) => string | undefined\n /** \u8BBE\u7F6E\u91CC\u663E\u5F0F\u586B\u7684 bash \u8DEF\u5F84\uFF08\u53EF\u7A7A\uFF09\u3002 */\n readonly explicitPath?: string\n /**\n * \u5217\u51FA\u67D0\u4E2A\u76EE\u5F55\u4E0B\u7684**\u5B50\u76EE\u5F55\u540D**\uFF08\u53EA\u7528\u4E8E\u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF1AGitHub Desktop / \u65E7 GitHub / VS\uFF09\u3002\n * \u4E0D\u6CE8\u5165\u3001\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6CA1\u6709\u6743\u9650\u65F6\u90FD\u5F53\u4F5C\"\u7A7A\"\uFF0C\u63A2\u6D4B\u9000\u5316\u6210\u7EAF\u5B58\u5728\u6027\u68C0\u67E5\u3002\n */\n readonly listDirs?: (parent: string) => readonly string[]\n}\n\n/** \u63A2\u6D4B\u7ED3\u679C\u3002 */\nexport interface DiscoverResult {\n /** \u6309\u4F18\u5148\u7EA7\u6392\u597D\u5E8F\u3001\u5DF2\u53BB\u91CD\u3001\u5DF2\u5254\u9664 WSL \u7684\u5019\u9009\u3002 */\n readonly candidates: readonly BashCandidate[]\n /** \u88AB\u786C\u6392\u9664\u7684\u8DEF\u5F84\uFF08\u5F53\u524D\u53EA\u6709 WSL\uFF09\u3002 */\n readonly excluded: readonly ExcludedPath[]\n /** \u663E\u5F0F\u8DEF\u5F84\u7684\u72B6\u6001\uFF1B\u6CA1\u586B\u5C31\u662F undefined\u3002 */\n readonly explicit?: ExplicitState\n}\n\n/** WSL \u6392\u9664\u539F\u56E0\uFF08\u8BBE\u7F6E\u9875\u76F4\u63A5\u5C55\u793A\u8FD9\u53E5\u8BDD\uFF09\u3002 */\nexport const WSL_REASON = 'WSL \u7684 bash\uFF1A\u5B83\u6309 Linux \u89C4\u5219\u89E3\u91CA\u8DEF\u5F84\uFF08D:\\\\x \u8981\u5199\u6210 /mnt/d/x\uFF09\uFF0C'\n + '\u4E0E\u6A21\u578B\u624B\u91CC\u7684 Windows \u5DE5\u4F5C\u76EE\u5F55\u4E0D\u517C\u5BB9\uFF0C\u6545\u4E0D\u91C7\u7528'\n\n/** \u5F52\u4E00\u5316\uFF1A\u53CD\u659C\u6760\u8F6C\u6B63\u659C\u6760\u3001\u53BB\u6389\u5305\u88F9\u5F15\u53F7\u4E0E\u7ED3\u5C3E\u659C\u6760\u3001\u5408\u5E76\u91CD\u590D\u5206\u9694\u7B26\u3002 */\nexport function normalizePath(value: string): string {\n const trimmed = value.trim().replace(/^\"|\"$/g, '')\n const slashed = trimmed.replace(/\\\\/g, '/').replace(/\\/{2,}/g, '/')\n return slashed.length > 1 ? slashed.replace(/\\/+$/, '') : slashed\n}\n\n/** \u662F\u5426 WSL \u7684 bash\uFF08System32 \u7684\u542F\u52A8\u5668\u4E0E WindowsApps \u7684\u522B\u540D\uFF09\u3002 */\nexport function isWslBash(value: string): boolean {\n const path = normalizePath(value).toLowerCase()\n return /\\/windows\\/system32\\/bash\\.exe$/.test(path) || /\\/windowsapps\\/bash\\.exe$/.test(path)\n}\n\n/** \u6309\u8DEF\u5F84\u5F62\u6001\u5224\u65AD\u79CD\u7C7B\uFF08\u663E\u5F0F\u8DEF\u5F84\u4E5F\u80FD\u56E0\u6B64\u62FF\u5230\u6B63\u786E\u7684\u6807\u7B7E\u4E0E\u4F18\u5148\u7EA7\uFF09\u3002 */\nexport function candidateKindOf(value: string): BashKind {\n const path = normalizePath(value).toLowerCase()\n if (path.endsWith('/niu.exe') || path.includes('/niubash/')) return 'niubash'\n if (path.includes('/msys64/') || path.includes('/msys32/') || path.includes('/msys2/')) return 'msys2'\n if (path.includes('/cygwin')) return 'cygwin'\n // `PortableGit` \u4E5F\u7B97 git\uFF08\u6B63\u5219\u91CC\u628A\u53EF\u9009\u524D\u7F00\u5199\u4E0A\uFF09\uFF0C\u53EA\u662F\u6807\u7B7E\u4E0D\u540C\u3002\n if (/(^|\\/)(portable)?git(\\/|$)/.test(path)) return 'git'\n return 'path'\n}\n\n/** \u79CD\u7C7B \u2192 \u754C\u9762\u6807\u7B7E\uFF08\u5177\u4F53\u6765\u6E90\u6CA1\u7ED9\u65F6\u7528\u5B83\uFF09\u3002 */\nexport function kindLabel(kind: BashKind): string {\n switch (kind) {\n case 'git': return 'Git for Windows'\n case 'msys2': return 'MSYS2'\n case 'cygwin': return 'Cygwin'\n case 'niubash': return 'Niubash\uFF08\u725B bash\uFF09'\n default: return 'PATH'\n }\n}\n\n/** \u79CD\u7C7B\u6392\u5E8F\u6743\u91CD\uFF08\u6570\u5B57\u8D8A\u5C0F\u8D8A\u4F18\u5148\uFF09\uFF1Bniubash \u4F4E\u4E8E MSYS2/Cygwin\uFF0C\u9AD8\u4E8E\u6742\u9879 PATH\u3002 */\nconst KIND_RANK: Record<BashKind, number> = { git: 0, msys2: 1, cygwin: 2, niubash: 3, path: 4 }\n\n/** \u76D8\u7B26\u626B\u63CF\u7684\u5B57\u6BCD\uFF08\u8DF3\u8FC7 A:/B: \u8F6F\u9A71\u4F4D\uFF09\u3002 */\nconst DRIVE_LETTERS = 'CDEFGHIJKLMNOPQRSTUVWXYZ'\n\n/** \u4ECE PATH \u6761\u76EE\u91CC\u8BA4\u51FA git \u5B89\u88C5\u6839\uFF08`<root>\\cmd` / `<root>\\bin` / `<root>\\mingw64\\bin` \u90FD\u5F52\u5230 root\uFF09\u3002 */\nfunction gitRootOf(entry: string): string | undefined {\n const path = normalizePath(entry)\n if (path === '') return undefined\n const lower = path.toLowerCase()\n for (const suffix of ['/mingw64/bin', '/mingw32/bin', '/usr/bin', '/cmd', '/bin']) {\n if (lower.endsWith(suffix)) return path.slice(0, path.length - suffix.length)\n }\n return path\n}\n\n/** \u4E00\u4E2A\u5B89\u88C5\u6839\u4E0B\u6240\u6709\u53EF\u80FD\u7684 bash \u4F4D\u7F6E\uFF08\u987A\u5E8F\u5373\u4F18\u5148\u7EA7\uFF09\u3002 */\nfunction bashPathsUnder(root: string): readonly string[] {\n return [`${root}/bin/bash.exe`, `${root}/usr/bin/bash.exe`, `${root}/mingw64/bin/bash.exe`]\n}\n\n/**\n * `usr/bin` / `mingw64/bin` \u4E0B\u7684 bash \u662F**\u88F8\u672C\u4F53**\uFF1A\u76F4\u63A5\u8DD1\u5B83\u4E0D\u4F1A\u51C6\u5907 MSYS \u73AF\u5883\u3002\n *\n * \u672C\u673A\u5B9E\u6D4B\uFF08`D:\\Git` \u4E24\u4E2A\u90FD\u8DD1\u4E86\u4E00\u904D\uFF09\uFF1A`bin\\bash.exe` \u7ED9\u51FA `MSYSTEM=MINGW64`\u3001\n * `PATH` \u524D\u7F6E `/mingw64/bin:/usr/bin`\uFF0C`head` / `grep` / `uname` \u90FD\u5728\uFF08\u4E2D\u6587\u6587\u4EF6\u540D\u5F53\u53C2\u6570\u4E5F\u6B63\u5E38\uFF09\uFF1B\n * \u800C `usr\\bin\\bash.exe` \u7684 `MSYSTEM` \u4E3A\u7A7A\u3001`PATH` \u53EA\u6709\u7EE7\u627F\u6765\u7684 Windows PATH\uFF08\u91CC\u9762\u53EA\u6709 `D:\\Git\\cmd`\uFF09\uFF0C\n * \u4E8E\u662F `head` / `grep` / `uname` **\u5168\u90E8 command not found** \u2014\u2014 \u4EA4\u7ED9\u6A21\u578B\u5C31\u662F\u5927\u9762\u79EF\u5931\u8D25\u3002\n *\n * \u6240\u4EE5\uFF1A\u540C\u4E00\u4E2A\u6839\u4E0B\u53EA\u8981\u6709 `bin/bash.exe`\uFF0C\u5C31\u4E0D\u518D\u5217\u8FD9\u4E2A\u88F8\u672C\u4F53\uFF08\u7528\u6237\u4ECD\u53EF\u624B\u586B\uFF09\u3002\n * \u6CA1\u6709 `bin/bash.exe` \u5144\u5F1F\u7684\uFF08\u4F8B\u5982 MSYS2 \u53EA\u63D0\u4F9B `usr\\bin\\bash.exe`\uFF09\u7167\u5E38\u5217\u51FA\u3002\n * @param value \u5019\u9009\u8DEF\u5F84\u3002\n * @returns \u5B89\u88C5\u6839\uFF1B\u4E0D\u662F\u88F8\u672C\u4F53\u65F6 undefined\u3002\n */\nexport function unpreparedBashRoot(value: string): string | undefined {\n const match = /^(.*)\\/(usr|mingw32|mingw64)\\/bin\\/bash\\.exe$/i.exec(normalizePath(value))\n return match?.[1]\n}\n\n/** \u4E00\u4E2A\u5019\u9009\u6765\u6E90\uFF1A\u4E00\u7EC4\u5B89\u88C5\u6839 + \u53EF\u9009\u7684\u5177\u4F53\u6807\u7B7E\u3002 */\ninterface SourceGroup {\n readonly roots: readonly string[]\n readonly label?: string\n}\n\n/**\n * \u63A2\u6D4B\u5019\u9009 bash\u3002\n * @param input \u6CE8\u5165\u7684 exists/PATH/\u73AF\u5883\u53D8\u91CF\uFF0C\u4EE5\u53CA\u53EF\u9009\u7684 listDirs\uFF08\u5217\u5B50\u76EE\u5F55\uFF09\u3002\n * @returns \u5019\u9009\u3001\u88AB\u6392\u9664\u7684\u8DEF\u5F84\u3001\u663E\u5F0F\u8DEF\u5F84\u72B6\u6001\u3002\n */\nexport function discoverBashCandidates(input: DiscoverInput): DiscoverResult {\n const seen = new Set<string>()\n const excluded: ExcludedPath[] = []\n const ordered: BashCandidate[] = []\n\n /** \u5217\u5B50\u76EE\u5F55\uFF1B\u6CA1\u6709\u6CE8\u5165\u3001\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6CA1\u6743\u9650\u90FD\u5F53\u7A7A\u3002 */\n const dirsOf = (parent: string): readonly string[] => {\n if (input.listDirs === undefined) return []\n try {\n return input.listDirs(parent)\n } catch {\n return []\n }\n }\n\n /** \u8BB0\u4E00\u4E2A\u5019\u9009\uFF1BWSL \u4E00\u5F8B\u8F6C\u6210\u6392\u9664\u9879\uFF0C\u91CD\u590D\u8DEF\u5F84\u53EA\u7559\u7B2C\u4E00\u6B21\uFF08\u5373\u4F18\u5148\u7EA7\u6700\u9AD8\u7684\u90A3\u4E00\u6B21\uFF09\u3002 */\n const consider = (raw: string, label?: string, isExplicit = false): void => {\n const path = normalizePath(raw)\n if (path === '') return\n if (isWslBash(path)) {\n // \u53EA\u5728\u5B83**\u786E\u5B9E\u5B58\u5728**\u65F6\u62A5\"\u5DF2\u6392\u9664\"\uFF1A\u5426\u5219\u6BCF\u53F0\u673A\u5668\u90FD\u4F1A\u51ED\u7A7A\u591A\u51FA\u4E00\u6761 WSL \u8B66\u544A\u3002\n if (!input.exists(path)) return\n if (!excluded.some(item => item.path.toLowerCase() === path.toLowerCase())) {\n excluded.push({ path, reason: WSL_REASON })\n }\n return\n }\n // \u88F8\u672C\u4F53\uFF08usr/bin\u3001mingw64/bin\uFF09\uFF1A\u540C\u6839\u4E0B\u5DF2\u6709\u4F1A\u51C6\u5907\u73AF\u5883\u7684 `bin/bash.exe` \u65F6\u4E0D\u518D\u4F5C\u4E3A\u5019\u9009\uFF0C\n // \u514D\u5F97\u7528\u6237\u70B9\u5230\u4E00\u4E2A\"\u547D\u4EE4\u5168\u627E\u4E0D\u5230\"\u7684 shell\u3002**\u663E\u5F0F\u8DEF\u5F84\u4E0D\u53D7\u6B64\u9650**\uFF1A\u90A3\u662F\u7528\u6237\u81EA\u5DF1\u7684\u9009\u62E9\u3002\n if (!isExplicit) {\n const root = unpreparedBashRoot(path)\n if (root !== undefined && input.exists(`${root}/bin/bash.exe`)) return\n }\n const key = path.toLowerCase()\n if (seen.has(key)) return\n if (!input.exists(path)) return\n seen.add(key)\n const kind = candidateKindOf(path)\n ordered.push({ path, kind, label: label ?? kindLabel(kind), explicit: isExplicit })\n }\n\n /** \u4E00\u7EC4\u6765\u6E90\uFF1A\u53EA\u8BD5\u5B58\u5728\u7684\u5B89\u88C5\u6839\uFF0C\u518D\u628A\u8BE5\u6839\u4E0B\u6240\u6709\u53EF\u80FD\u7684 bash \u4F4D\u7F6E\u4E22\u7ED9 consider\u3002 */\n const addGroup = (group: SourceGroup): void => {\n for (const root of group.roots) {\n if (root === '' || !input.exists(root)) continue\n for (const path of bashPathsUnder(root)) consider(path, group.label)\n }\n }\n\n // 1) \u663E\u5F0F\u8DEF\u5F84\uFF1A\u7528\u6237\u81EA\u5DF1\u586B\u7684\uFF0C\u4F18\u5148\u7EA7\u6700\u9AD8\uFF08\u586B\u9519\u4E5F\u4F1A\u5982\u5B9E\u62A5\u544A\uFF09\u3002\n const explicitRaw = normalizePath(input.explicitPath ?? '')\n let explicit: ExplicitState | undefined\n if (explicitRaw !== '') {\n if (isWslBash(explicitRaw)) {\n explicit = { path: explicitRaw, state: 'wsl' }\n // \u7528\u6237\u660E\u786E\u586B\u4E86 WSL\uFF1A\u8981\u8BA9\u4ED6\u770B\u5230\"\u4E3A\u4EC0\u4E48\u4E0D\u91C7\u7528\"\uFF0C\u800C\u4E0D\u662F\u770B\u5230\u5019\u9009\u91CC\u6084\u6084\u5C11\u4E86\u4E00\u6761\u3002\n if (input.exists(explicitRaw)) excluded.push({ path: explicitRaw, reason: WSL_REASON })\n } else if (input.exists(explicitRaw)) explicit = { path: explicitRaw, state: 'ok' }\n else explicit = { path: explicitRaw, state: 'missing' }\n }\n\n const entries = input.pathEntries\n .map(entry => normalizePath(entry))\n .filter(entry => entry !== '')\n const env = (name: string): string | undefined => {\n const value = input.env(name)\n return value === undefined || value === '' ? undefined : normalizePath(value)\n }\n\n const programFiles = env('ProgramFiles') ?? 'C:/Program Files'\n const programFilesX86 = env('ProgramFiles(x86)') ?? 'C:/Program Files (x86)'\n const programW6432 = env('ProgramW6432')\n const localAppData = env('LOCALAPPDATA')\n const home = env('USERPROFILE') ?? env('HOME')\n const scoop = env('SCOOP') ?? (home === undefined ? undefined : `${home}/scoop`)\n const choco = env('ChocolateyInstall')\n ?? (env('ProgramData') === undefined ? 'C:/ProgramData/chocolatey' : `${env('ProgramData') as string}/chocolatey`)\n\n // \u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF1A\u5217\u4E00\u773C\u5B50\u76EE\u5F55\uFF0C\u6309\u540D\u5B57**\u5012\u5E8F**\uFF08`app-3.4.3` \u8FD9\u79CD\u540D\u5B57\uFF0C\u65B0\u7684\u6392\u5728\u524D\u9762\uFF09\u3002\n const versioned: string[] = []\n if (localAppData !== undefined) {\n const desktop = `${localAppData}/GitHubDesktop`\n for (const dir of [...dirsOf(desktop)].sort().reverse()) {\n if (dir.startsWith('app-')) versioned.push(`${desktop}/${dir}/resources/app/git`)\n }\n const github = `${localAppData}/GitHub`\n for (const dir of [...dirsOf(github)].sort().reverse()) {\n if (dir.startsWith('PortableGit')) versioned.push(`${github}/${dir}`)\n }\n }\n const vsRoot = `${programFiles}/Microsoft Visual Studio`\n for (const year of dirsOf(vsRoot)) {\n const yearRoot = `${vsRoot}/${year}`\n for (const edition of dirsOf(yearRoot)) {\n versioned.push(`${yearRoot}/${edition}/Common7/IDE/CommonExtensions/Microsoft/TeamFoundation/Team Explorer/Git`)\n }\n }\n\n // \u5404\u76D8\u7B26\u6839\u4E0B\u7684\u5E38\u89C1\u540D\u5B57\uFF1A\u8986\u76D6\"\u88C5\u5728 D:\\Git / D:\\PortableGit / \u81EA\u5DF1\u89E3\u538B\"\u7684\u60C5\u51B5\u3002\n const drives: string[] = []\n for (const letter of DRIVE_LETTERS) {\n const root = `${letter}:`\n if (input.exists(`${root}/`)) drives.push(root)\n }\n const driveRoots = (names: readonly string[]): readonly string[] =>\n drives.flatMap(root => names.map(name => `${root}/${name}`))\n\n const groups: readonly SourceGroup[] = [\n // 2) PATH \u4E0A\u8BA4\u51FA\u6765\u7684 git \u6839 \u2014\u2014 \u90A3\u624D\u662F\u7528\u6237\u5B9E\u9645\u5728\u7528\u7684\u90A3\u4EFD\u3002\n ...entries.map(entry => gitRootOf(entry))\n .filter((root): root is string => root !== undefined)\n .map(root => ({ roots: [root] })),\n // 3) \u5B98\u65B9\u5B89\u88C5\u5668\u7684\u4E24\u4E2A\u9ED8\u8BA4\u843D\u70B9 + 32 \u4F4D / \u91CD\u5B9A\u5411\u540E\u7684 Program Files\u3002\n { roots: [programFiles, programFilesX86, programW6432, localAppData === undefined ? undefined : `${localAppData}/Programs`]\n .filter((base): base is string => base !== undefined)\n .map(base => `${base}/Git`) },\n // 4) Scoop\uFF08`scoop install git` \u4F1A\u5E26\u4E00\u4EFD bash\uFF09\u3002\n ...(scoop === undefined ? [] : [{ roots: [`${scoop}/apps/git/current`, `${scoop}/apps/git`], label: 'Scoop \u7684 git' }]),\n // 5) Chocolatey \u7684\u4FBF\u643A\u5305\uFF08`git.install` \u88C5\u7684\u4ECD\u5728 Program Files\uFF0C\u4E0A\u9762\u90A3\u6761\u5DF2\u8986\u76D6\uFF09\u3002\n { roots: [`${choco}/lib/git.portable/tools`, `${choco}/lib/git.portable/tools/git`], label: 'Chocolatey \u4FBF\u643A\u5305' },\n // 6) GitHub Desktop / \u65E7 GitHub for Windows / Visual Studio \u81EA\u5E26\uFF08\u90FD\u5E26\u7248\u672C\u53F7\uFF0C\u9760 listDirs\uFF09\u3002\n { roots: versioned.filter(path => path.includes('GitHubDesktop')), label: 'GitHub Desktop \u5185\u5D4C' },\n { roots: versioned.filter(path => path.includes('/GitHub/PortableGit')), label: 'GitHub PortableGit' },\n { roots: versioned.filter(path => path.includes('/Microsoft Visual Studio/')), label: 'Visual Studio \u5185\u5D4C' },\n // 7) MSYS2 / Cygwin \u7684\u5E38\u89C1\u4F4D\u7F6E\uFF08\u542B\u5404\u76D8\u7B26\u6839\u4E0B\u7684\u540C\u540D\u76EE\u5F55\uFF09\u3002\n { roots: [`${programFiles}/msys64`, 'C:/msys64', ...driveRoots(['msys64'])], label: 'MSYS2' },\n { roots: [`${programFiles}/cygwin64`, 'C:/cygwin64', 'C:/cygwin', ...driveRoots(['cygwin64', 'cygwin'])], label: 'Cygwin' },\n // 8) \u5404\u76D8\u7B26\u6839\u4E0B\u7684 Git / PortableGit\uFF08\u88C5\u5728 D:\\Git\u3001D:\\PortableGit \u8FD9\u7C7B\uFF09\u3002\n { roots: driveRoots(['Git', 'Program Files/Git', 'Program Files (x86)/Git']), label: 'Git for Windows' },\n { roots: driveRoots(['PortableGit']), label: 'PortableGit\uFF08\u81EA\u89E3\u538B\uFF09' },\n ]\n for (const group of groups) addGroup(group)\n\n // 9) Niubash\uFF08\u7528\u6237\u53EF\u80FD\u7279\u610F\u88C5\u7684 bash \u517C\u5BB9\u73AF\u5883\uFF09\u3002\u5B83\u7684\u53EF\u6267\u884C\u6587\u4EF6\u53EB `niu.exe` \u4E14\u5C31\u5728\u6839\u76EE\u5F55\uFF0C\n // \u4E0D\u7B26\u5408\"\u5B89\u88C5\u6839 / bin|usr/bin|mingw64/bin\"\u7684\u5F62\u72B6\uFF0C\u6240\u4EE5\u5355\u72EC\u8003\u8651\uFF0C\u4E0D\u80FD\u585E\u8FDB\u5206\u7EC4\u3002\n if (localAppData !== undefined) consider(`${localAppData}/Programs/Niubash/niu.exe`, 'Niubash\uFF08\u725B bash\uFF09')\n\n // 10) PATH \u515C\u5E95\uFF1A\u6700\u5BB9\u6613\u547D\u4E2D\u7684\u662F WSL\uFF0C\u9760 consider() \u91CC\u7684 isWslBash \u62E6\u6389\u3002\n for (const entry of entries) consider(`${entry}/bash.exe`)\n\n // \u663E\u5F0F\u8DEF\u5F84\u4E5F\u4EA4\u7ED9 consider \u53C2\u4E0E\u53BB\u91CD\uFF1B\u5B83\u9760 `explicit` \u6807\u8BB0\u5728\u6392\u5E8F\u91CC\u62FF\u7B2C\u4E00\uFF0C\n // \u800C\u4E0D\u662F\u9760\u5728\u6570\u7EC4\u91CC\u63D2\u961F \u2014\u2014 \u5426\u5219\u540C\u4E00\u6761\u8DEF\u5F84\u53EF\u80FD\u51FA\u73B0\u4E24\u6B21\u3002\n if (explicit?.state === 'ok') consider(explicit.path, undefined, true)\n\n // \u6392\u5E8F\uFF1A\u663E\u5F0F\u4F18\u5148 \u2192 \u79CD\u7C7B\u6743\u91CD \u2192 \u540C\u4E00\u7EC4\u5185\u4FDD\u6301\u4E0A\u9762\u7684\u641C\u7D22\u5148\u540E\u3002\n const ranked = ordered\n .map((candidate, index) => ({ candidate, index }))\n .sort((a, b) => {\n if (a.candidate.explicit !== b.candidate.explicit) return a.candidate.explicit ? -1 : 1\n const rank = KIND_RANK[a.candidate.kind] - KIND_RANK[b.candidate.kind]\n return rank !== 0 ? rank : a.index - b.index\n })\n .map(item => item.candidate)\n\n return {\n candidates: ranked,\n excluded,\n ...(explicit === undefined ? {} : { explicit }),\n }\n}\n\n/**\n * \u9ED8\u8BA4\u9009\u8C01\uFF1A\u5019\u9009\u8868\u91CC\u7684\u7B2C\u4E00\u4E2A\uFF08\u63A2\u6D4B\u987A\u5E8F\u5DF2\u7ECF\u628A\"\u663E\u5F0F\u8DEF\u5F84 \u2192 \u771F Git Bash \u2192 \u5176\u5B83\"\u6392\u597D\u4E86\uFF09\u3002\n * @param result \u63A2\u6D4B\u7ED3\u679C\u3002\n * @returns \u8DEF\u5F84\uFF1B\u4E00\u4E2A\u5019\u9009\u90FD\u6CA1\u6709\u65F6\u8FD4\u56DE\u7A7A\u4E32\u3002\n */\nexport function defaultBashPath(result: DiscoverResult): string {\n return result.candidates[0]?.path ?? ''\n}\n", "/**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u516C\u5171\u5951\u7EA6\uFF1A\u8BBE\u7F6E\u5B57\u6BB5\u3001\u4E09\u6863\u5143\u6570\u636E\u3001\u5019\u9009\u5F62\u72B6\u3001\u51C0\u5316\u4E0E\"\u6700\u7EC8\u7528\u8C01\"\u7684\u5224\u5B9A\u3002\n *\n * \u96F6 import\uFF08host \u4E0E client \u4E24\u534A\u5171\u7528\uFF0C\u8DE8\u7AEF\u4E0D\u5171\u4EAB\u4EFB\u4F55\u8FD0\u884C\u65F6\u8EAB\u4EFD\uFF09\u3002\n *\n * \u8FD9\u91CC\u7684\u5B57\u6BB5\u5206\u4E24\u7C7B\uFF0C**\u4E0D\u8981\u6DF7**\uFF1A\n * - \u7528\u6237\u914D\u7F6E\uFF1A`terminalMode` / `terminalBashPath` \u2014\u2014 \u7531\u8BBE\u7F6E\u9875\u5199\uFF0C\u5BBF\u4E3B\u534A\u8BFB\uFF1B\n * - \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A`terminalCandidates` / `terminalStatus` / `terminalEffective` \u2014\u2014\n * \u53EA\u7531\u5BBF\u4E3B\u534A\u5199\uFF08\u63A2\u6D4B\u7ED3\u679C\u4E0E\u8FD0\u884C\u72B6\u6001\uFF09\uFF0C\u8BBE\u7F6E\u9875\u53EA\u8BFB\u5C55\u793A\uFF1B\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u4E0D\u5F97\u6E05\u7A7A\u5B83\u4EEC\n * \uFF08\u89C1 settings-contract \u7684 HOST_OWNED_FIELDS\uFF09\uFF0C\u5426\u5219\u754C\u9762\u4F1A\u5931\u53BB\u63A2\u6D4B\u7ED3\u679C\u4E0E\u72B6\u6001\u3002\n */\nimport type { BashCandidate, BashKind, DiscoverResult, ExplicitState } from './discover.ts'\nimport { defaultBashPath, discoverBashCandidates, normalizePath } from './discover.ts'\n\n/** \u7528\u6237\u914D\u7F6E\u5B57\u6BB5\uFF1A\u7EC8\u7AEF\u6863\u4F4D\u3002 */\nexport const TERMINAL_MODE_FIELD = 'terminalMode'\n\n/** \u7528\u6237\u914D\u7F6E\u5B57\u6BB5\uFF1AGit Bash \u8DEF\u5F84\uFF08\u7559\u7A7A = \u7528\u63A2\u6D4B\u5230\u7684\u7B2C\u4E00\u4E2A\u5019\u9009\uFF09\u3002 */\nexport const TERMINAL_BASH_PATH_FIELD = 'terminalBashPath'\n\n/** \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A\u63A2\u6D4B\u5230\u7684\u5019\u9009\u5217\u8868\u3002 */\nexport const TERMINAL_CANDIDATES_FIELD = 'terminalCandidates'\n\n/** \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A\u72B6\u6001\u884C\uFF08\u5F53\u524D\u751F\u6548 shell / \u4E3A\u4EC0\u4E48\u6CA1\u751F\u6548\uFF09\u3002 */\nexport const TERMINAL_STATUS_FIELD = 'terminalStatus'\n\n/** \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A\u5F53\u524D\u5B9E\u9645\u751F\u6548\u7684 shell\uFF08'bash' / 'pwsh'\uFF09\u3002 */\nexport const TERMINAL_EFFECTIVE_FIELD = 'terminalEffective'\n\n/** \u5BBF\u4E3B\u534A\u6CE8\u518C\u7684\u72B6\u6001/\u53D1\u73B0\u63A5\u53E3\u8DEF\u5F84\uFF08\u5BA2\u6237\u7AEF\u534A\u8BFB\u5199\uFF09\u3002 */\nexport const TERMINAL_API_PATH = '/composer-ux/terminal'\n\n/** \u6863\u4F4D\u3002 */\nexport type TerminalMode = 'auto' | 'gitbash' | 'pwsh'\n\n/** \u4E09\u6863\u5143\u6570\u636E\uFF08\u6570\u7EC4\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const TERMINAL_MODES: readonly {\n readonly id: TerminalMode\n readonly label: string\n readonly hint: string\n}[] = [\n {\n id: 'auto',\n label: '\u81EA\u52A8',\n hint: '\u63A2\u6D4B\u5230 Git Bash \u5C31\u7528\u5B83\uFF08\u627E\u4E0D\u5230\u5219\u4FDD\u6301 PowerShell\uFF09\uFF1B\u5F00\u7BB1\u5373\u7528\uFF0C\u4E0D\u7528\u624B\u586B\u8DEF\u5F84',\n },\n {\n id: 'gitbash',\n label: 'Git Bash',\n hint: '\u5F3A\u5236\u6362\u6210 Git Bash\uFF1B\u6CA1\u63A2\u6D4B\u5230\u5C31\u56DE\u843D PowerShell\uFF0C\u5E76\u5728\u72B6\u6001\u884C\u5199\u660E\u539F\u56E0',\n },\n {\n id: 'pwsh',\n label: 'PowerShell',\n hint: '\u4FDD\u6301 DSH \u9ED8\u8BA4\uFF08\u672C\u63D2\u4EF6\u5B8C\u5168\u4E0D\u78B0\u7EC8\u7AEF\u5DE5\u5177\u9762\uFF09',\n },\n]\n\n/** \u9ED8\u8BA4\u6863\u4F4D\uFF1A\u81EA\u52A8\uFF08\u96F6\u914D\u7F6E\u5373\u5F97\u6536\u76CA\uFF0C\u4E14\u627E\u4E0D\u5230 bash \u65F6\u4E0D\u4F1A\u628A\u73AF\u5883\u5F04\u574F\uFF09\u3002 */\nexport const DEFAULT_TERMINAL_MODE: TerminalMode = 'auto'\n\n/** \u843D\u76D8\u7684\u5019\u9009\u5F62\u72B6\uFF08\u6BD4\u63A2\u6D4B\u7ED3\u679C\u591A\u4E00\u70B9\uFF1Akind \u4E0E explicit \u4F9B\u754C\u9762\u6807\u6CE8\uFF09\u3002 */\nexport interface TerminalCandidate {\n readonly path: string\n readonly label: string\n readonly kind: BashKind\n readonly explicit: boolean\n}\n\n/** \u6536\u7A84\u6863\u4F4D\u3002 */\nexport function terminalModeFrom(value: unknown): TerminalMode {\n return value === 'auto' || value === 'gitbash' || value === 'pwsh' ? value : DEFAULT_TERMINAL_MODE\n}\n\n/** \u63A2\u6D4B\u7ED3\u679C \u2192 \u843D\u76D8\u5019\u9009\uFF08\u53BB\u6389\u8FD0\u884C\u671F\u624D\u77E5\u9053\u7684\u5B57\u6BB5\uFF09\u3002 */\nexport function candidatesToStored(candidates: readonly BashCandidate[]): readonly TerminalCandidate[] {\n return candidates.map(candidate => ({\n path: candidate.path,\n label: candidate.label,\n kind: candidate.kind,\n explicit: candidate.explicit,\n }))\n}\n\n/** \u6536\u7A84\u843D\u76D8\u5019\u9009\uFF08\u9632\u810F\u6570\u636E\uFF1B\u4E0A\u9650 20 \u6761\u591F\u7528\uFF09\u3002 */\nexport function sanitizeTerminalCandidates(value: unknown): readonly TerminalCandidate[] {\n if (!Array.isArray(value)) return []\n const out: TerminalCandidate[] = []\n const seen = new Set<string>()\n for (const item of value) {\n if (out.length >= 20) break\n if (typeof item !== 'object' || item === null) continue\n const row = item as Record<string, unknown>\n const path = typeof row.path === 'string' ? normalizePath(row.path).slice(0, 400) : ''\n if (path === '') continue\n const key = path.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n const label = typeof row.label === 'string' ? row.label.slice(0, 40) : ''\n const kind = row.kind === 'git' || row.kind === 'msys2' || row.kind === 'cygwin'\n || row.kind === 'niubash' || row.kind === 'path' ? row.kind : 'path'\n out.push({ path, label: label === '' ? 'PATH' : label, kind, explicit: row.explicit === true })\n }\n return out\n}\n\n/**\n * \u8FD9\u4E00\u8F6E\u5B9E\u9645\u8BE5\u7528\u54EA\u4E2A bash\u3002\n *\n * \u4E09\u6863\u7684\u5DEE\u522B\u53EA\u5728\u8FD9\u91CC\uFF0C\u522B\u5728\u8C03\u7528\u5904\u518D\u5224\u4E00\u6B21\uFF1A\n * - `pwsh`\uFF1A\u4E0D\u7528 bash\uFF08\u8FD4\u56DE\u7A7A\u4E32\uFF09\uFF1B\n * - `gitbash` / `auto`\uFF1A\u4F18\u5148\u7528\u6237\u586B\u7684\u8DEF\u5F84\uFF0C\u5176\u6B21\u5019\u9009\u8868\u7B2C\u4E00\u4E2A\uFF08\u63A2\u6D4B\u987A\u5E8F\u5DF2\u6392\u597D\uFF1A\n * \u663E\u5F0F \u2192 Git Bash \u2192 MSYS2/Cygwin \u2192 Niubash \u2192 PATH\uFF09\uFF1B\n * - \u4E24\u8005\u90FD\u4E0D\u8981\u6C42\"\u5FC5\u987B\u627E\u5230\"\uFF1A\u627E\u4E0D\u5230\u65F6\u8FD4\u56DE\u7A7A\u4E32\uFF0C\u7531\u8C03\u7528\u65B9\u56DE\u843D PowerShell\n * \uFF08`auto` \u9759\u9ED8\u56DE\u843D\uFF0C`gitbash` \u4F1A\u5728\u72B6\u6001\u884C\u91CC\u8BF4\u660E\u2014\u2014\u5DEE\u522B\u53EA\u662F\"\u8981\u4E0D\u8981\u89E3\u91CA\"\uFF09\u3002\n * @param mode \u5F53\u524D\u6863\u4F4D\u3002\n * @param bashPath \u7528\u6237\u586B\u7684\u8DEF\u5F84\uFF08\u53EF\u7A7A\uFF09\u3002\n * @param candidates \u5BBF\u4E3B\u534A\u4E0A\u6B21\u63A2\u6D4B\u5230\u7684\u5019\u9009\u3002\n * @returns \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF1B\u7A7A\u4E32\u8868\u793A\u8FD9\u4E00\u8F6E\u4E0D\u7528 bash\u3002\n */\nexport function activeBashPath(\n mode: TerminalMode,\n bashPath: string,\n candidates: readonly TerminalCandidate[],\n explicitState?: ExplicitState,\n): string {\n if (mode === 'pwsh') return ''\n const explicit = normalizePath(bashPath)\n // \u663E\u5F0F\u8DEF\u5F84\u53EA\u6709\u5728\"\u786E\u5B9E\u5B58\u5728\"\uFF08\u6216\u8C03\u7528\u65B9\u5DF2\u7ECF\u9A8C\u8BC1\u8FC7\u3001\u6CA1\u7ED9\u72B6\u6001\uFF09\u65F6\u624D\u538B\u8FC7\u63A2\u6D4B\u7ED3\u679C\u3002\n if (explicit !== '' && (explicitState === undefined || explicitState.state === 'ok')) return explicit\n return defaultBashPath({ candidates, excluded: [] })\n}\n\n/** \u63A2\u6D4B\uFF08\u628A\u5199\u6B7B\u7684\u73AF\u5883\u8BFB\u53D6\u96C6\u4E2D\u5728\u8FD9\u91CC\uFF0C\u5176\u4F59\u903B\u8F91\u90FD\u5728\u7EAF\u51FD\u6570\u91CC\uFF09\u3002 */\nexport function probeBash(\n explicitPath: string,\n pathValue: string,\n env: (name: string) => string | undefined,\n exists: (path: string) => boolean,\n listDirs?: (parent: string) => readonly string[],\n): DiscoverResult {\n return discoverBashCandidates({\n exists,\n pathEntries: pathValue.split(';'),\n env,\n explicitPath,\n ...(listDirs === undefined ? {} : { listDirs }),\n })\n}\n\n/** \u72B6\u6001\u884C\u7684\u8F93\u5165\uFF08\u5BBF\u4E3B\u534A\u7B97\u597D\u8FD9\u4E9B\u4E8B\u5B9E\uFF0C\u6587\u6848\u672C\u8EAB\u662F\u7EAF\u51FD\u6570\uFF0C\u4FBF\u4E8E\u5355\u6D4B\uFF09\u3002 */\nexport interface StatusInput {\n /** `process.platform`\u3002 */\n readonly platform: string\n readonly mode: TerminalMode\n /** \u63A2\u6D4B\u5230\u7684\u5019\u9009\uFF08\u5DF2\u6392\u5E8F\uFF09\u3002 */\n readonly candidates: readonly TerminalCandidate[]\n /** \u88AB\u786C\u6392\u9664\u7684 WSL \u8DEF\u5F84\u6761\u6570\u3002 */\n readonly excludedCount: number\n /** \u7528\u6237\u663E\u5F0F\u586B\u7684\u8DEF\u5F84\u72B6\u6001\uFF08\u6CA1\u586B\u5219 undefined\uFF09\u3002 */\n readonly explicit?: ExplicitState\n /** \u8FD9\u4E00\u8F6E\u5B9E\u9645\u751F\u6548\u7684 shell\u3002 */\n readonly effective: 'bash' | 'pwsh' | 'unsupported'\n /** \u751F\u6548\u65F6\u7528\u7684\u5177\u4F53\u8DEF\u5F84\uFF08effective \u4E3A bash \u65F6\u7ED9\u51FA\uFF09\u3002 */\n readonly effectivePath?: string\n /** \u4E0B\u53D1\u5230 agent \u65F6\u9047\u5230\u7684\u5931\u8D25\u539F\u56E0\uFF08restrict/register \u5931\u8D25\uFF09\u3002 */\n readonly failure?: string\n}\n\n/**\n * \u751F\u6210\u72B6\u6001\u884C\uFF08\u8BBE\u7F6E\u9875\u76F4\u63A5\u5C55\u793A\u8FD9\u53E5\u8BDD\uFF09\u3002\n *\n * \u539F\u5219\uFF1A**\u53EA\u8BF4\u4E8B\u5B9E\uFF0C\u4E0D\u7ED9\u5EFA\u8BAE**\u3002\u751F\u6548\u65F6\u7ED9\u51FA\u8DEF\u5F84\u4E0E\u6765\u6E90\uFF1B\u4E0D\u751F\u6548\u65F6\u89E3\u91CA\u4E3A\u4EC0\u4E48\n * \uFF08\u6CA1\u627E\u5230 / \u8DEF\u5F84\u4E0D\u5B58\u5728 / \u5E73\u53F0\u4E0D\u5BF9\uFF09\uFF0C\u5E76\u4E14\u660E\u786E\u8BF4\u51FA\"\u5DF2\u6392\u9664 WSL\"\u8FD9\u79CD\u6211\u4EEC\u4E3B\u52A8\u505A\u7684\u51B3\u5B9A\u3002\n * @param input \u4E8B\u5B9E\u3002\n * @returns \u4E00\u884C\u4E2D\u6587\u72B6\u6001\uFF08\u6700\u957F 400 \u5B57\u7B26\uFF0C\u4E0E schema \u4E0A\u9650\u4E00\u81F4\uFF09\u3002\n */\nexport function terminalStatusText(input: StatusInput): string {\n const text = (() => {\n if (input.platform !== 'win32') {\n return `\u672C\u63D2\u4EF6\u53EA\u5728 Windows \u4E0A\u63A5\u7BA1\u7EC8\u7AEF\uFF08\u5F53\u524D\u5E73\u53F0 ${input.platform}\uFF09\uFF0C\u6B64\u5904\u4E0D\u751F\u6548`\n }\n if (input.mode === 'pwsh') {\n return '\u4FDD\u6301 DSH \u9ED8\u8BA4\uFF08PowerShell\uFF09\u2014\u2014\u672C\u63D2\u4EF6\u4E0D\u4ECB\u5165\u7EC8\u7AEF\u5DE5\u5177\u9762'\n }\n if (input.effective === 'bash') {\n const path = input.effectivePath ?? ''\n const candidate = input.candidates.find(item => item.path === path)\n const suffix = input.explicit?.state === 'missing'\n ? `\uFF08\u4F60\u586B\u7684\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${input.explicit.path}\uFF09`\n : input.explicit?.state === 'wsl'\n ? `\uFF08\u4F60\u586B\u7684\u662F WSL \u7684 bash\uFF1A${input.explicit.path}\uFF09`\n : ''\n return `\u5DF2\u751F\u6548\uFF1A${path}${candidate === undefined ? '' : `\uFF08${candidate.label}\uFF09`}${suffix}`\n }\n if (input.candidates.length === 0) {\n const excluded = input.excludedCount > 0 ? `\uFF08\u5DF2\u6392\u9664 ${input.excludedCount} \u4E2A WSL \u7684 bash.exe\uFF09` : ''\n return `\u6CA1\u627E\u5230\u53EF\u7528\u7684 bash${excluded}\uFF0C\u6682\u65F6\u4FDD\u6301 PowerShell`\n }\n return `\u5019\u9009\u4E0D\u53EF\u7528\uFF0C\u6682\u65F6\u4FDD\u6301 PowerShell`\n })()\n const failure = input.failure === undefined || input.failure === '' ? '' : `\uFF1B\u4E0B\u53D1\u5931\u8D25\uFF1A${input.failure}`\n return `${text}${failure}`.slice(0, 400)\n}\n", "/**\n * dsh-composer-ux \u516C\u5171\u5951\u7EA6\uFF1A\u8BBE\u7F6E\u5B57\u6BB5\u3001\u9ED8\u8BA4\u503C\u3001\u5C55\u793A\u5143\u6570\u636E\u3002\n * \u672C\u6A21\u5757\u5FC5\u987B\u96F6 import\uFF08host \u4E0E client \u4E24\u534A\u5171\u7528\uFF0C\u8DE8\u7AEF\u4E0D\u5171\u4EAB\u4EFB\u4F55\u8FD0\u884C\u65F6\u8EAB\u4EFD\uFF09\u3002\n *\n * \u552F\u4E00\u7684\u4F8B\u5916\u662F `./terminal/` \u4E0B\u90A3\u51E0\u4E2A**\u7EAF\u51FD\u6570**\u6A21\u5757\uFF08\u96F6\u5916\u90E8\u4F9D\u8D56\u3001\u65E0 DOM\u3001\u65E0 node API\uFF09\uFF0C\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u5B57\u6BB5\u4E0E\u5224\u5B9A\u653E\u5728\u90A3\u91CC\uFF0C\u8FD9\u91CC\u53EA\u628A\u5B83\u4EEC\u5E76\u8FDB\u8BBE\u7F6E\u5951\u7EA6\u3002\n */\nimport {\n DEFAULT_TERMINAL_MODE, TERMINAL_BASH_PATH_FIELD, TERMINAL_CANDIDATES_FIELD,\n TERMINAL_EFFECTIVE_FIELD, TERMINAL_MODE_FIELD, TERMINAL_STATUS_FIELD,\n sanitizeTerminalCandidates, terminalModeFrom,\n type TerminalCandidate, type TerminalMode,\n} from './terminal/contracts.ts'\n\n/** Host settings namespace\uFF08\u5C0F\u5199\u5B57\u6BCD/\u6570\u5B57/\u8FDE\u5B57\u7B26\uFF09\u3002 */\nexport const NAMESPACE = 'composer-ux'\n\n/**\n * \u4ED3\u5E93\u5730\u5740\uFF1A\u8BBE\u7F6E\u9875\u62AC\u5934\u90A3\u4E2A\u300CGitHub \u2197\u300D\u94FE\u63A5\u7528\u5B83\u3002\n *\n * \u5FC5\u987B\u4E0E `package.json` \u7684 `repository.url` \u4E00\u81F4 \u2014\u2014 `test/client-registration.mjs`\n * \u6709\u4E00\u6761\u62A4\u680F\u76EF\u7740\u4E24\u5904\uFF0C\u514D\u5F97\u5404\u5199\u4E00\u4EFD\u7136\u540E\u6162\u6162\u5206\u53C9\uFF08\u5BA2\u6237\u7AEF\u4E5F\u4E0D\u8BB8\u786C\u7F16\u7801\u7B2C\u4E8C\u4EFD\u5730\u5740\uFF09\u3002\n */\nexport const REPO_URL = 'https://github.com/fangwen9527/dsh-composer-ux'\n\n// \u2500\u2500 \u300C\u91CD\u542F DSH\u300D\u6309\u94AE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// \u4E3A\u4EC0\u4E48\u8FD9\u4EF6\u4E8B\u5FC5\u987B\u843D\u5728\u5BBF\u4E3B\u534A\uFF1A\u53EA\u6709\u5BBF\u4E3B\u8FDB\u7A0B\u80FD\u628A\u81EA\u5DF1\u91CD\u65B0\u62C9\u8D77\u6765\uFF08\u6D4F\u89C8\u5668\u78B0\u4E0D\u5230\u8FDB\u7A0B\uFF09\u3002\n// \u673A\u5236\u7167\u642C\u63D2\u4EF6\u5E02\u573A\uFF08\u5206\u79BB\u4E00\u4E2A node \u52A9\u624B\u8FDB\u7A0B\u3001\u7B49\u7AEF\u53E3\u7A7A\u95F2\u3001\u7528\u9690\u85CF\u63A7\u5236\u53F0\u7684 PowerShell \u8D77\u65B0\u5BBF\u4E3B\uFF09\uFF0C\n// \u5168\u90E8\u7EC6\u8282\u5728 `src/restart.ts`\u3002\u8FD9\u91CC\u53EA\u6709\u4E24\u7AEF\u5171\u7528\u7684\u90A3\u4E00\u4E2A\u5E38\u91CF\u3002\n// 0.5.0 \u91CC\u90A3\u4E2A\u300C\u53EF\u9009\u91CD\u542F\u547D\u4EE4\u300D\u5B57\u6BB5\u5DF2\u53BB\u6389\uFF1A\u673A\u5236\u8DB3\u591F\u53EF\u9760\u4E4B\u540E\u5B83\u53EA\u5269\"\u591A\u4E00\u4E2A\u4F1A\u586B\u9519\u7684\u5730\u65B9\"\u3002\n\n/** \u91CD\u542F\u63A5\u53E3\u8DEF\u5F84\uFF08\u5BBF\u4E3B\u534A\u6CE8\u518C\uFF0C\u5BA2\u6237\u7AEF\u534A\u8C03\u7528\uFF09\u3002 */\nexport const RESTART_API_PATH = '/composer-ux/restart'\n\n/** \u5168\u5C40\u603B\u5F00\u5173\u5B57\u6BB5\u540D\u3002 */\nexport const ENABLED_FIELD = 'enabled'\n\n// \u2500\u2500 \u300C\u6BCF\u4E00\u680F\u4E00\u4E2A\u5F00\u5173\u300D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// \u516D\u5F20\u6298\u53E0\u5361\u5404\u6709\u4E00\u4E2A\"\u8FD9\u4E00\u680F\u8981\u4E0D\u8981\u751F\u6548\"\u7684\u5F00\u5173\uFF0C**\u9ED8\u8BA4\u5173**\uFF1B\u603B\u5F00\u5173\uFF08`enabled`\uFF09\u9ED8\u8BA4\u5F00\uFF0C\n// \u5B83\u662F\u4E00\u9053\u603B\u95F8\uFF1A`enabled && \u8BE5\u680F\u5F00\u5173` \u624D\u751F\u6548\u3002\n//\n// \u4E3A\u4EC0\u4E48\u8981\u6709\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u680F\u624D\u9ED8\u8BA4\u5173\"\u8FD9\u6761\u8FC1\u79FB\u89C4\u5219\uFF08\u7528\u6237\u62CD\u677F A \u65B9\u6848\uFF09\uFF1A\u672C\u63D2\u4EF6\u5DF2\u7ECF\u53D1\u5E03\u8FC7\uFF0C\n// \u8001\u7528\u6237\u8BBE\u7F6E\u6587\u6863\u91CC\u5168\u662F\"\u6211\u6B63\u5728\u7528\"\u7684\u75D5\u8FF9\u3002\u82E5\u4E00\u5F8B\u9ED8\u8BA4\u5173\uFF0C\u5347\u7EA7\u90A3\u4E00\u523B\u4ED6\u7684\u952E\u4F4D\u5C31\u56DE\u5230 DSH \u539F\u751F\u3001\n// OpenCode \u8DEF\u7531\u76F4\u63A5 400\uFF08\u8BF7\u6C42\u5934\u4E0D\u518D\u6CE8\u5165\uFF09\u3001Git Bash \u6362\u56DE PowerShell \u2014\u2014 \u5168\u662F\u8981\u7528\u5230\u624D\u53D1\u73B0\u7684\u7834\u574F\u3002\n// \u6240\u4EE5\uFF1A**\u8FD9\u4E00\u680F\u7684\u503C\u4E0D\u7B49\u4E8E\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u6837\u5B50\" \u21D2 \u8BA4\u5B9A\u78B0\u8FC7 \u21D2 \u5F00**\uFF08\u5224\u636E\u89C1 `sectionEnabledOf`\uFF09\u3002\n// \u5168\u65B0\u5B89\u88C5\uFF08\u4EC0\u4E48\u75D5\u8FF9\u90FD\u6CA1\u6709\uFF09\u56E0\u6B64\u662F\u516D\u680F\u5168\u5173\u3002\u89C4\u5219\u7684\u5B9E\u73B0\u5728\u4E0B\u9762 `sectionEnabledOf`\u3002\n//\n// \u300COpenCode \u8BF7\u6C42\u5934\u300D\u90A3\u4E00\u680F**\u6CA1\u6709\u65B0\u952E**\uFF1A\u5B83\u539F\u6765\u7684 `headerEnabled`\uFF08\u9ED8\u8BA4 false\uFF09\u672C\u6765\u5C31\u662F\n// \"\u8FD9\u4E00\u680F\u8981\u4E0D\u8981\u751F\u6548\"\uFF0C\u76F4\u63A5\u642C\u5230\u6807\u9898\u884C\u5F53\u5361\u7EA7\u5F00\u5173\uFF0C\u4E0D\u518D\u9020\u4E00\u4E2A\u540C\u4E49\u7684\u952E\u3002\n\n/** \u300C\u952E\u4F4D\u300D\u680F\u5F00\u5173\u3002 */\nexport const KEYS_ENABLED_FIELD = 'keysEnabled'\n/** \u300C\u53F3\u952E\u83DC\u5355\u300D\u680F\u5F00\u5173\u3002 */\nexport const MENU_ENABLED_FIELD = 'menuEnabled'\n/** \u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u5F00\u5173\u3002 */\nexport const QUICK_ENABLED_FIELD = 'quickEnabled'\n/** \u300C\u8BBE\u7F6E\u9762\u677F\u300D\u680F\u5F00\u5173\u3002 */\nexport const PANEL_ENABLED_FIELD = 'panelEnabled'\n/** \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u680F\u5F00\u5173\u3002 */\nexport const TERMINAL_ENABLED_FIELD = 'terminalEnabled'\n\n/** \u952E\u4F4D\u5B57\u6BB5\u540D\u3002 */\nexport const SEND_KEY_FIELD = 'sendKey'\nexport const NEWLINE_KEY_FIELD = 'newlineKey'\n\n/** \u8BBE\u7F6E\u9762\u677F\u5B57\u6BB5\u540D\u3002 */\nexport const PANEL_SCROLL_FIELD = 'panelScroll'\nexport const PANEL_RESIZE_FIELD = 'panelResize'\nexport const PANEL_WIDTH_FIELD = 'panelWidth'\nexport const PANEL_HEIGHT_FIELD = 'panelHeight'\n\n/** \u53F3\u952E\u83DC\u5355\u5F00\u5173\u5B57\u6BB5\u540D\u3002 */\nexport const MENU_FIELDS = [\n 'menuUndo',\n 'menuRedo',\n 'menuCut',\n 'menuCopy',\n 'menuPaste',\n 'menuDelete',\n 'menuSelectAll',\n] as const\n\nexport type MenuField = (typeof MENU_FIELDS)[number]\n\n/**\n * \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\u5B57\u6BB5\u540D\uFF080.5.0 \u8D77\u4E09\u6863\uFF09\u3002\n *\n * 0.2.x\uFF5E0.4.0 \u7528\u7684\u662F\u5E03\u5C14 `menuNative`\uFF1Atrue = \u6D4F\u89C8\u5668\u539F\u751F\u83DC\u5355\u3001false = \u81EA\u5B9A\u4E49\u83DC\u5355\u3002\n * \u5E03\u5C14\u53EA\u6709\u4E24\u4F4D\uFF0C\u8868\u8FBE\u4E0D\u4E86\u300C\u63D2\u4EF6\u5B8C\u5168\u4E0D\u4ECB\u5165\u300D\uFF08\u4E0D\u6321\u522B\u7684\u63D2\u4EF6\u7684\u83DC\u5355\uFF09\u8FD9\u4E00\u6863\uFF0C\u6240\u4EE5\u6362\u6210\n * \u5B57\u7B26\u4E32\u4E09\u6863\u3002\u65E7\u5B57\u6BB5**\u53EA\u4F5C\u4E3A\u8FC1\u79FB\u7EBF\u7D22\u4FDD\u7559**\uFF1A\u672C\u5B57\u6BB5\u4E3A\u7A7A\u65F6\u6309\u65E7\u5B57\u6BB5\u63A8\u65AD\uFF08\u89C1 `menuModeFrom`\uFF09\u3002\n */\nexport const MENU_MODE_FIELD = 'menuMode'\n\n/** 0.2.x\uFF5E0.4.0 \u7684\u65E7\u5B57\u6BB5\u540D\uFF1A\u8FC1\u79FB\u7EBF\u7D22\uFF0C0.5.0 \u8D77\u4E0D\u518D\u5199\u5B83\u3002 */\nexport const MENU_NATIVE_FIELD = 'menuNative'\n\n/** \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF1A\u5B98\u65B9\u4E0D\u4ECB\u5165 / \u6D4F\u89C8\u5668\u83DC\u5355 / \u81EA\u5B9A\u4E49\u83DC\u5355\u3002 */\nexport type MenuMode = 'official' | 'browser' | 'custom'\n\n/** \u4E09\u6863\u7684\u5143\u6570\u636E\uFF08\u6570\u7EC4\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const MENU_MODES: readonly {\n readonly id: MenuMode\n readonly label: string\n readonly hint: string\n}[] = [\n {\n id: 'official',\n label: '\u5B98\u65B9',\n hint: '\u672C\u63D2\u4EF6\u5B8C\u5168\u4E0D\u4ECB\u5165\uFF1ADSH \u4E0E\u5176\u5B83\u63D2\u4EF6\u81EA\u5DF1\u7684\u53F3\u952E\u5904\u7406\u539F\u6837\u751F\u6548\uFF08DSH \u5B98\u65B9\u8F93\u5165\u6846\u672C\u8EAB\u6CA1\u6709\u53F3\u952E\u83DC\u5355\uFF0C\u901A\u5E38\u770B\u5230\u7684\u5C31\u662F\u6D4F\u89C8\u5668\u7684\u83DC\u5355\uFF09',\n },\n {\n id: 'browser',\n label: '\u6D4F\u89C8\u5668',\n hint: '\u56FA\u5B9A\u4F7F\u7528\u6D4F\u89C8\u5668\u81EA\u5E26\u7684\u83DC\u5355\uFF0C\u5E76\u5728\u672C\u63D2\u4EF6\u8FD9\u4E00\u5C42\u6321\u4F4F\u5176\u5B83\u63D2\u4EF6\u7684\u83DC\u5355\uFF1B\u7C98\u8D34\u514D\u6388\u6743\u3001\u96F6\u914D\u7F6E',\n },\n {\n id: 'custom',\n label: '\u81EA\u5B9A\u4E49',\n hint: '\u4F7F\u7528\u672C\u63D2\u4EF6\u7684\u56FA\u5B9A\u6837\u5F0F\u83DC\u5355\uFF1B\u672A\u9009\u4E2D\u6587\u672C\u65F6\u300C\u526A\u5207 / \u590D\u5236 / \u5220\u9664\u300D\u7F6E\u7070\uFF0C\u7C98\u8D34\u9700\u8981\u6D4F\u89C8\u5668\u526A\u8D34\u677F\u6388\u6743',\n },\n]\n\n/**\n * \u5B9A\u51FA\u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF1A\u65B0\u5B57\u6BB5\u4F18\u5148\uFF0C\u5176\u6B21\u6309\u65E7\u5E03\u5C14\u63A8\u65AD\uFF0C\u90FD\u6CA1\u6709\u5C31\u7528\u9ED8\u8BA4\u6863\u3002\n *\n * \u4E09\u79CD\u60C5\u51B5\u5224\u65AD\u5F97\u51FA\u6765\uFF0C\u662F\u56E0\u4E3A\u5BBF\u4E3B\u534A\u628A\u65E7\u5B57\u6BB5\u58F0\u660E\u6210**\u53EF\u9009**\uFF08\u6CA1\u6709 `.default(false)`\uFF09\uFF1A\n * \u300C\u4ECE\u6CA1\u78B0\u8FC7\u90A3\u4E2A\u5F00\u5173\u300D\u4E0E\u300C\u660E\u786E\u5173\u4E86\u5B83\u300D\u5728\u6587\u6863\u91CC\u957F\u5F97\u4E0D\u4E00\u6837\uFF08\u952E\u4E0D\u5B58\u5728 / \u952E\u4E3A false\uFF09\uFF0C\n * \u524D\u8005\u843D\u5230\u65B0\u9ED8\u8BA4\u6863\uFF08\u5B98\u65B9\u4E0D\u4ECB\u5165\uFF09\uFF0C\u540E\u8005\u4FDD\u6301\u539F\u6765\u7684\u81EA\u5B9A\u4E49\u83DC\u5355\u3002\n * @param storedMode - \u6587\u6863\u91CC\u7684\u65B0\u5B57\u6BB5\u503C\uFF08\u53EF\u80FD\u662F\u810F\u6570\u636E\uFF09\u3002\n * @param legacyNative - \u6587\u6863\u91CC\u7684\u65E7\u5E03\u5C14\u503C\uFF08\u53EF\u80FD\u4E0D\u5B58\u5728\uFF09\u3002\n * @returns \u4E09\u6863\u4E4B\u4E00\u3002\n */\nexport function menuModeFrom(storedMode: unknown, legacyNative: unknown): MenuMode {\n if (storedMode === 'official' || storedMode === 'browser' || storedMode === 'custom') return storedMode\n if (legacyNative === true) return 'browser'\n if (legacyNative === false) return 'custom'\n return DEFAULT_SETTINGS.menuMode\n}\n\n// \u2500\u2500 \u5FEB\u6377\u6307\u4EE4\u4E0E\u63D0\u793A\u8BCD\u4F18\u5316 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5FEB\u6377\u6307\u4EE4\u5217\u8868\u5B57\u6BB5\u540D\u3002 */\nexport const QUICK_PROMPTS_FIELD = 'quickPrompts'\n\n/** \u4F18\u5316\u5F3A\u5EA6\u6863\u4F4D\u5B57\u6BB5\u540D\u3002 */\nexport const OPTIMIZER_TIER_FIELD = 'optimizerTier'\n\n/** \u5355\u4E2A\u5206\u7C7B\u5185\u7684\u6761\u6570\u4E0A\u9650\u3002 */\nexport const QUICK_PROMPT_MAX = 60\n\n/** \u5206\u7C7B\u6570\u4E0A\u9650\u3002 */\nexport const QUICK_CATEGORY_MAX = 20\n\n/** \u5206\u7C7B\u540D\u7684\u5B57\u7B26\u4E0A\u9650\u3002 */\nexport const QUICK_CATEGORY_NAME_MAX = 40\n\n/** \u5355\u6761\u300C\u540D\u79F0\u300D\u7684\u5B57\u7B26\u4E0A\u9650\u3002 */\nexport const QUICK_LABEL_MAX = 40\n\n/**\n * \u5355\u6761\u300C\u63D0\u793A\u8BCD\u300D\u7684\u5B57\u7B26\u4E0A\u9650\u3002\n *\n * 0.3.0 \u8D77\u5FEB\u6377\u6307\u4EE4\u6539\u5B58 `$DSH_HOME/quick-prompts.json`\uFF0C\u4E0D\u518D\u53D7\u8BBE\u7F6E\u6587\u6863\u7684\u4F53\u79EF\u7EA6\u675F\uFF0C\n * \u6240\u4EE5\u8FD9\u91CC\u4ECE 4000 \u63D0\u5230 20 \u4E07\u2014\u2014\u53EA\u505A\u300C\u522B\u628A\u51E0\u767E MB \u585E\u8FDB\u6765\u300D\u7684\u9632\u5446\uFF0C\u6B63\u5E38\u63D0\u793A\u8BCD\u4E0D\u518D\u88AB\u622A\u65AD\u3002\n */\nexport const QUICK_TEXT_MAX = 200_000\n\n/**\n * \u9001\u53BB\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u7684\u539F\u6587\u4E0A\u9650\u3002\n *\n * \u4E0E\u539F `QUICK_TEXT_MAX * 2`\uFF08= 8000\uFF09\u7B49\u503C\uFF1A\u62AC\u9AD8\u7B49\u5FEB\u6377\u6307\u4EE4\u7684\u5B58\u50A8\u4E0A\u9650\u65F6**\u4E0D\u80FD**\n * \u987A\u5E26\u628A\u4F18\u5316\u8BF7\u6C42\u7684\u8F93\u5165\u4E0A\u9650\u4E5F\u62AC\u4E0A\u53BB\uFF0C\u5426\u5219\u8D85\u957F\u6587\u672C\u4F1A\u88AB\u4E22\u7ED9\u6A21\u578B\u3002\n */\nexport const OPTIMIZE_TEXT_MAX = 8_000\n\n/**\n * \u5FEB\u6377\u6307\u4EE4\u5B58\u50A8\u7684 HTTP \u8DEF\u5F84\uFF08\u5BBF\u4E3B\u534A\u6CE8\u518C\uFF0C\u5BA2\u6237\u7AEF\u534A\u8BFB\u5199\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5B58\u50A8\u4E5F\u5FC5\u987B\u8D70 HTTP\uFF1A\u6D4F\u89C8\u5668\u4FA7\u6CA1\u6709\u6587\u4EF6\u7CFB\u7EDF\uFF0C\u800C\u300C\u7528\u6237\u5185\u5BB9\u300D\u9700\u8981\u4E00\u4EFD\n * \u5168\u5C40\u3001\u4E0E\u4F1A\u8BDD/\u9879\u76EE\u65E0\u5173\u7684\u843D\u70B9\uFF0C\u53EA\u6709\u5BBF\u4E3B\u534A\u80FD\u63D0\u4F9B\u3002\n */\nexport const QUICK_PROMPTS_API_PATH = '/composer-ux/prompts'\n\n/** \u6587\u4EF6\u683C\u5F0F\u7248\u672C\uFF1B\u4E0E lnyuqian/dsh-quick-prompts \u7684 v2 \u5BF9\u9F50\uFF08\u89C1 bookToFile \u6CE8\u91CA\uFF09\u3002 */\nexport const QUICK_BOOK_VERSION = 2\n\n/** \u8FC1\u79FB/\u515C\u5E95\u5206\u7C7B\u540D\u3002 */\nexport const DEFAULT_CATEGORY_NAME = '\u9ED8\u8BA4'\n\n/** \u4F18\u5316\u7ED3\u679C\u957F\u5EA6\u4E0A\u9650\uFF08\u8D85\u8FC7\u89C6\u4E3A\u5F02\u5E38\u4EA7\u51FA\uFF0C\u622A\u65AD\u5E76\u63D0\u793A\uFF09\u3002 */\nexport const OPTIMIZE_OUTPUT_MAX = 12000\n\n/**\n * \u5BBF\u4E3B\u534A\u4E3A\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u6CE8\u518C\u7684 HTTP \u63A5\u53E3\u8DEF\u5F84\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u8D70 HTTP\uFF1A\u51FA\u7F51\u8BF7\u6C42\u7531\u5BBF\u4E3B\u7684\u6A21\u578B\u9002\u914D\u5668\u53D1\u51FA\uFF08\u6D4F\u89C8\u5668\u4FA7\u78B0\u4E0D\u5230\u6A21\u578B\u8DEF\u7531\uFF09\uFF0C\n * \u800C\u5BBF\u4E3B\u534A <-> \u5BA2\u6237\u7AEF\u534A\u4E4B\u95F4\u6CA1\u6709\u522B\u7684\u53D7\u652F\u6301\u901A\u9053 \u2014\u2014 \u4E0E\n * WestFox-AwA/dsh-prompt-optimizer \u7684\u505A\u6CD5\u4E00\u81F4\u3002\n */\nexport const OPTIMIZER_API_PATH = '/composer-ux/optimize'\n\n/**\n * \u4E00\u6761\u5FEB\u6377\u6307\u4EE4\u3002\n *\n * `always` \u5C31\u662F\u754C\u9762\u4E0A\u7684\u300C\u9ED8\u8BA4\u63D2\u5165\u300D\uFF1A\u52FE\u4E0A\u4E4B\u540E\uFF0C\u70B9\u53D1\u9001\u65F6\u8FD9\u6761\u63D0\u793A\u8BCD\u4F1A\u88AB\n * \u81EA\u52A8\u62FC\u5230\u6D88\u606F**\u672B\u5C3E**\u4E00\u8D77\u53D1\u51FA\u53BB\uFF08\u8F93\u5165\u6846\u91CC\u4E0D\u63D0\u524D\u663E\u793A\uFF09\uFF0C\u89C1\n * `client/quick-commands.ts` \u7684 `appendAlwaysPrompts()`\u3002\n */\nexport interface QuickPrompt {\n /** \u7A33\u5B9A id\uFF1A\u7F16\u8F91\u540D\u79F0/\u5185\u5BB9\u65F6\u4E0D\u53D8\uFF0C\u7528\u4E8E\u52FE\u9009\u72B6\u6001\u4E0E\u5217\u8868 diff\u3002 */\n readonly id: string\n /** \u6309\u94AE\u4E0A\u663E\u793A\u7684\u540D\u79F0\u3002 */\n readonly label: string\n /** \u70B9\u51FB\u540E\u63D2\u5165\u8F93\u5165\u6846\u7684\u63D0\u793A\u8BCD\u6B63\u6587\u3002 */\n readonly prompt: string\n /** \u300C\u6BCF\u6B21\u300D\uFF1A\u6BCF\u6B21\u53D1\u9001\u90FD\u81EA\u52A8\u9644\u52A0\u5230\u6D88\u606F\u672B\u5C3E\u3002\u4E0E `firstOnly` \u4E92\u65A5\u3002 */\n readonly always: boolean\n /**\n * \u300C\u4EC5\u9996\u6B21\u300D\uFF1A\u53EA\u5728**\u8FD9\u4E2A\u4F1A\u8BDD\u7684\u7B2C\u4E00\u6761\u6D88\u606F**\u4E0A\u9644\u52A0\u3002\n *\n * \u5224\u636E\u662F\u4F1A\u8BDD\u5FEB\u7167\u7684 `blank`\uFF08\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u4EFB\u4F55\u6D88\u606F\uFF09\u2014\u2014\u53D1\u5B8C\u7B2C\u4E00\u6761\u5B83\u81EA\u5DF1\u5C31\u53D8\u6210 false\uFF0C\n * \u6240\u4EE5\u4E0D\u9700\u8981\u6211\u4EEC\u81EA\u5DF1\u8BB0\u300C\u8FD9\u6B21\u4F1A\u8BDD\u9644\u52A0\u8FC7\u6CA1\u6709\u300D\uFF0C\u5237\u65B0\u9875\u9762\u4E5F\u4E0D\u4F1A\u91CD\u590D\u9644\u52A0\u3002\n * \u4E0E `always` \u4E92\u65A5\uFF08\u754C\u9762\u4E0A\u662F\u4E09\u9009\u4E00\uFF09\u3002\n */\n readonly firstOnly: boolean\n}\n\n/** \u63D2\u5165\u6A21\u5F0F\uFF1A\u754C\u9762\u4E0A\u90A3\u6761\u4E09\u9009\u4E00\u3002 */\nexport type InsertMode = 'never' | 'always' | 'first'\n\n/** \u4E09\u9009\u4E00\u7684\u5143\u6570\u636E\uFF08\u6570\u7EC4\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const INSERT_MODES: readonly {\n readonly id: InsertMode\n readonly label: string\n readonly hint: string\n}[] = [\n { id: 'never', label: '\u5173', hint: '\u70B9\u6761\u76EE\u53EA\u63D2\u5165\u8F93\u5165\u6846\uFF0C\u53D1\u9001\u65F6\u4E0D\u9644\u52A0' },\n { id: 'always', label: '\u6BCF\u6B21', hint: '\u6BCF\u6B21\u53D1\u9001\u90FD\u628A\u8FD9\u6761\u9644\u52A0\u5230\u6D88\u606F\u672B\u5C3E' },\n { id: 'first', label: '\u4EC5\u9996\u6B21', hint: '\u53EA\u5728\u5F53\u524D\u4F1A\u8BDD\u7684\u7B2C\u4E00\u6761\u6D88\u606F\u4E0A\u9644\u52A0' },\n]\n\n/**\n * \u8BFB\u4E00\u6761\u7684\u63D2\u5165\u6A21\u5F0F\u3002\n *\n * \u4E24\u4E2A\u6807\u5FD7\u90FD\u662F true \u65F6\u6309\u300C\u6BCF\u6B21\u300D\u5904\u7406\uFF08\u624B\u5DE5\u7F16\u8F91\u7684\u6587\u4EF6\u53EF\u80FD\u5199\u6210\u8FD9\u6837\uFF1B\u300C\u6BCF\u6B21\u300D\u672C\u6765\u5C31\n * \u5305\u542B\u7B2C\u4E00\u6B21\uFF09\uFF0C\u5E76\u4E14\u4E0B\u4E00\u6B21\u5199\u76D8\u4F1A\u628A\u4E92\u65A5\u6027\u4FEE\u6B63\u56DE\u6765\u3002\n */\nexport function insertModeOf(prompt: Pick<QuickPrompt, 'always' | 'firstOnly'>): InsertMode {\n if (prompt.always) return 'always'\n if (prompt.firstOnly) return 'first'\n return 'never'\n}\n\n/**\n * \u4F18\u5316\u5F3A\u5EA6\u6863\u4F4D\u3002\n *\n * \u4E09\u6863\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\u63D0\u53D6\u81EA WestFox-AwA/dsh-prompt-optimizer\uFF08BSD-3-Clause\uFF0C\n * \u4F5C\u8005\u300C\u5543\u8F6E\u80CE\u7684\u897F\u72D0\u300D\uFF09\u7684 `lib/index.js`\uFF0C\u89C1 `optimizer-prompt.ts`\u3002\n */\nexport type OptimizerTier = 'basic' | 'advanced' | 'extreme'\n\n/** \u6863\u4F4D\u5143\u6570\u636E\uFF08\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const OPTIMIZER_TIERS: readonly {\n readonly id: OptimizerTier\n readonly label: string\n readonly hint: string\n}[] = [\n { id: 'basic', label: '\u666E\u901A', hint: '\u53EA\u505A\u8BED\u8A00\u5C42\u4FEE\u590D\uFF1A\u75C5\u53E5\u3001\u9519\u522B\u5B57\u3001\u6307\u4EE3\u4E0E\u542B\u7CCA\u8BCD\uFF0C\u4E0D\u65B0\u589E\u4EFB\u4F55\u9700\u6C42\uFF0C\u7BC7\u5E45\u4E0E\u539F\u6587\u76F8\u5F53\u3002' },\n { id: 'advanced', label: '\u9AD8\u7EA7', hint: '\u5728\u4E0D\u52A8\u76EE\u6807\u7684\u524D\u63D0\u4E0B\uFF0C\u628A\u300C\u4F60\u663E\u7136\u60F3\u8981\u3001\u4F46\u6CA1\u8BF4\u51FA\u53E3\u300D\u7684\u5FC5\u8981\u8981\u6C42\u8865\u6210\u5BF9 AI \u7684\u8981\u6C42\uFF0C\u8BA9\u5B83\u4E00\u6B21\u505A\u5BF9\u3002' },\n { id: 'extreme', label: '\u6781\u7AEF', hint: '\u6309\u590D\u6742\u4EFB\u52A1\u5904\u7406\uFF1A\u56FA\u5316\u547D\u4EE4\u7ED3\u6784 + \u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212 + 2~4 \u79CD\u60C5\u51B5\u7684\u9884\u6848\u3002' },\n]\n\n/** \u9ED8\u8BA4\u6863\u4F4D\u3002 */\nexport const DEFAULT_OPTIMIZER_TIER: OptimizerTier = 'advanced'\n\n/**\n * \u5185\u7F6E\u7684 9 \u6761\u5FEB\u6377\u6307\u4EE4 = \u7528\u6237\u53E3\u8FF0\u7684 4 \u6761 + \u63D0\u53D6\u81EA congyaqwq/dsh-quick-prompts \u7684 5 \u6761\u3002\n *\n * \u8BF4\u660E\uFF08\u5982\u5B9E\u8BB0\u5F55\u8C03\u7814\u7ED3\u679C\uFF09\uFF1A\u53E6\u5916\u4E24\u4E2A\u540C\u540D\u63D2\u4EF6 lcsdg / lnyuqian \u7684\n * dsh-quick-prompts **\u4E0D\u5E26\u5185\u7F6E\u6307\u4EE4**\uFF08\u5217\u8868\u9ED8\u8BA4\u662F\u7A7A\u7684\uFF0C\u9760\u7528\u6237\u81EA\u5EFA\uFF09\uFF0C\n * \u6240\u4EE5\u4ECE\u5B83\u4EEC\u90A3\u91CC\u6CA1\u6709\u53EF\u63D0\u53D6\u7684\u6761\u76EE\u3002\n */\nexport const DEFAULT_QUICK_PROMPTS: readonly QuickPrompt[] = [\n { id: 'builtin-1', label: '\u4E00\u95EE\u4E00\u7B54', prompt: '\u4F60\u4E0D\u61C2\u7684\u5C31\u95EE\u6211\uFF0C\u4E00\u95EE\u4E00\u7B54\uFF1B\u540C\u65F6\u8BF4\u6E05\u695A\u4F60\u4E3A\u4EC0\u4E48\u8981\u95EE\u8BE5\u95EE\u9898\uFF1B\u76F4\u5230\u4F60\u5BF9\u6211\u7684\u76EE\u6807\u6709\u660E\u786E\u8BA4\u77E5\u540E\u518D\u5F00\u59CB\u5E72\u6D3B\u3002', always: false, firstOnly: false },\n { id: 'builtin-2', label: '\u4EA4\u63A5\u6587\u6863', prompt: '\u628A\u8FD9\u6B21\u4EFB\u52A1\u3001\u5DF2\u5B8C\u6210\u5185\u5BB9\u3001\u5F53\u524D\u5361\u70B9\u3001\u4E0B\u4E00\u6B65\u8BA1\u5212\u3001\u8E29\u8FC7\u7684\u5751\uFF0C\u6574\u7406\u6210\u4E00\u4EFD\u4EA4\u63A5\u6587\u6863\uFF0C\u5199\u7ED9\u65B0\u4F1A\u8BDD\u770B\u3002', always: false, firstOnly: false },\n { id: 'builtin-3', label: '\u4EC5\u8BF4\u660E\u539F\u56E0', prompt: '\u4EC5\u8BF4\u660E\u539F\u56E0\uFF0C\u4E0D\u8981\u505A\u5176\u4ED6\u52A8\u4F5C\u3002', always: false, firstOnly: false },\n { id: 'builtin-4', label: '\u5206\u6790\u540E\u76F4\u63A5\u5E72', prompt: '\u5206\u6790\u539F\u56E0\uFF0C\u7136\u540E\u76F4\u63A5\u5F00\u59CB\u5E72\u6D3B\uFF0C\u4E0D\u9700\u8981\u8FC7\u95EE\u6211\u3002', always: false, firstOnly: false },\n { id: 'builtin-5', label: '\u63D0\u4EA4\u4EE3\u7801', prompt: '\u8BF7\u5E2E\u6211\u63D0\u4EA4\u4EE3\u7801\uFF1A\u68C0\u67E5\u5F53\u524D git \u53D8\u66F4\uFF0C\u751F\u6210\u89C4\u8303\u7684 commit message \u5E76\u6267\u884C\u63D0\u4EA4\u3002', always: false, firstOnly: false },\n { id: 'builtin-6', label: '\u7ED9\u65B9\u6848', prompt: '\u8BF7\u9488\u5BF9\u4E0A\u9762\u7684\u95EE\u9898\u7ED9\u51FA\u4E00\u4E2A\u5B8C\u6574\u65B9\u6848\uFF0C\u5305\u62EC\u601D\u8DEF\u3001\u6B65\u9AA4\u3001\u6CE8\u610F\u4E8B\u9879\u548C\u98CE\u9669\u3002', always: false, firstOnly: false },\n { id: 'builtin-7', label: '\u89E3\u91CA\u4EE3\u7801', prompt: '\u8BF7\u89E3\u91CA\u8FD9\u6BB5\u4EE3\u7801\u7684\u4F5C\u7528\u548C\u5B9E\u73B0\u601D\u8DEF\u3002', always: false, firstOnly: false },\n { id: 'builtin-8', label: '\u5199\u6D4B\u8BD5', prompt: '\u8BF7\u4E3A\u4E0B\u9762\u7684\u4EE3\u7801\u7F16\u5199\u5355\u5143\u6D4B\u8BD5\u3002', always: false, firstOnly: false },\n { id: 'builtin-9', label: '\u4EE3\u7801\u5BA1\u67E5', prompt: '\u8BF7\u5BF9\u4E0B\u9762\u7684\u4EE3\u7801\u8FDB\u884C\u4EE3\u7801\u5BA1\u67E5\uFF0C\u6307\u51FA\u95EE\u9898\u5E76\u7ED9\u51FA\u6539\u8FDB\u5EFA\u8BAE\u3002', always: false, firstOnly: false },\n]\n\n/** \u751F\u6210\u4E00\u6761\u65B0\u5FEB\u6377\u6307\u4EE4\u7684 id\uFF08\u65F6\u95F4\u6233 + \u968F\u673A\u540E\u7F00\uFF0C\u907F\u514D\u4E0E\u65E2\u6709 id \u78B0\u649E\uFF09\u3002 */\nexport function newQuickPromptId(): string {\n return `qp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n// \u2500\u2500 \u5FEB\u6377\u6307\u4EE4\uFF1A\u5206\u7C7B\u7ED3\u6784\u4E0E\u6587\u4EF6\u6620\u5C04 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// 0.3.0 \u8D77\u5FEB\u6377\u6307\u4EE4\u4E0D\u518D\u5B58\u5728\u8BBE\u7F6E\u6587\u6863\u91CC\uFF0C\u800C\u662F\u5B58\u5728 `$DSH_HOME/quick-prompts.json`\u3002\n// \u539F\u56E0\u662F\u8BBE\u7F6E\u6587\u6863\u5BF9**\u6570\u7EC4**\u662F\u300C\u6574\u4EFD\u66FF\u6362\u300D\u3001\u4E14\u53D7 schema \u957F\u5EA6\u4E0A\u9650\u7EA6\u675F\uFF08\u65E7 4000 \u5B57\u4F1A\u9759\u9ED8\n// \u622A\u65AD\uFF09\uFF0C\u800C\u5FEB\u6377\u6307\u4EE4\u662F\u7528\u6237\u5185\u5BB9\u3001\u4F1A\u5199\u5F88\u957F\u7684\u63D0\u793A\u8BCD\u3002\u4E13\u7528\u6587\u4EF6\u8FD8\u4FBF\u4E8E\u5355\u72EC\u5907\u4EFD\u4E0E\u8FC1\u79FB\u3002\n//\n// \u6587\u4EF6\u5B57\u6BB5\u540D\u4E0E lnyuqian/dsh-quick-prompts \u5BF9\u9F50\uFF08categories / name / title / text /\n// autoSend / order\uFF09\uFF0C\u8FD9\u6837\u540C\u4E00\u4E2A\u6587\u4EF6\u4E24\u8FB9\u90FD\u8BFB\u5F97\u61C2\uFF1A\u5185\u90E8\u7528 label/prompt/always\uFF0C\n// \u53EA\u5728\u6587\u4EF6\u8FB9\u754C\u6620\u5C04\uFF08\u89C1 bookToFile / asPromptRow\uFF09\u3002\n// \u26A0\uFE0F \u4F46**\u4E0D\u8981\u540C\u65F6\u88C5\u4E24\u4E2A\u63D2\u4EF6**\u2014\u2014\u540C\u4E00\u4E2A\u6587\u4EF6\u4E24\u4E2A\u5199\u8005\u4F1A\u4E92\u76F8\u8986\u76D6\uFF0C\u800C\u5B83\u90A3\u8FB9\u662F\u975E\u539F\u5B50\u5199\u3002\n\n/** \u751F\u6210\u4E00\u4E2A\u65B0\u5206\u7C7B id\u3002 */\nexport function newQuickCategoryId(): string {\n return `qc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/** \u4E00\u4E2A\u5206\u7C7B\uFF1A\u540D\u5B57 + \u5B83\u81EA\u5DF1\u7684\u6761\u76EE\u5217\u8868\uFF08\u987A\u5E8F\u5373\u663E\u793A\u987A\u5E8F\uFF09\u3002 */\nexport interface QuickPromptCategory {\n readonly id: string\n readonly name: string\n readonly prompts: readonly QuickPrompt[]\n}\n\n/** \u5168\u5C40\u5FEB\u6377\u6307\u4EE4\u672C\uFF1A\u5206\u7C7B\u4E24\u7EA7\u7ED3\u6784\uFF0C\u843D\u76D8\u6210\u4E00\u4EFD JSON \u6587\u4EF6\u3002 */\nexport interface QuickPromptBook {\n readonly version: number\n readonly categories: readonly QuickPromptCategory[]\n}\n\n/** \u5185\u7F6E\u9ED8\u8BA4\u672C\uFF1A\u4E00\u4E2A\u300C\u9ED8\u8BA4\u300D\u5206\u7C7B\u88C5\u90A3 9 \u6761\u3002 */\nexport function defaultQuickBook(): QuickPromptBook {\n return {\n version: QUICK_BOOK_VERSION,\n categories: [{ id: 'cat-default', name: DEFAULT_CATEGORY_NAME, prompts: DEFAULT_QUICK_PROMPTS }],\n }\n}\n\n/** \u6587\u4EF6\u91CC\u7684\u5206\u7C7B\u5F62\u72B6\uFF08\u5199\u76D8\u7528\uFF1B\u4E0E\u53C2\u8003\u5B9E\u73B0\u540C\u540D\u5B57\u6BB5\uFF09\u3002 */\nexport interface QuickCategoryFileRow {\n readonly id: string\n readonly name: string\n readonly prompts: readonly {\n readonly id: string\n readonly title: string\n readonly text: string\n readonly autoSend: boolean\n /** \u300C\u4EC5\u9996\u6B21\u300D\u6807\u5FD7\uFF08\u6211\u4EEC\u7684\u6269\u5C55\u952E\uFF1B\u53C2\u8003\u5B9E\u73B0\u4F1A\u5FFD\u7565\u5B83\uFF0C\u5199\u56DE\u65F6\u53EF\u80FD\u4E22\u6389\uFF09\u3002 */\n readonly autoSendFirst?: boolean\n readonly order: number\n }[]\n}\n\n/** \u6536\u7A84\u4E00\u6761\uFF1A\u5185\u90E8\u5B57\u6BB5\u540D\uFF08label/prompt/always\uFF09\u4E0E\u6587\u4EF6\u5B57\u6BB5\u540D\uFF08title/text/autoSend\uFF09\u90FD\u8BA4\u3002 */\nfunction asPromptRow(value: unknown): { readonly prompt: QuickPrompt; readonly order?: number } | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const row = value as Record<string, unknown>\n const either = (first: unknown, second: unknown): string => {\n const picked = typeof first === 'string' && first !== '' ? first : second\n return typeof picked === 'string' ? picked : ''\n }\n const prompt = either(row.prompt, row.text).slice(0, QUICK_TEXT_MAX).trim()\n if (prompt === '') return undefined\n const label = either(row.label, row.title).slice(0, QUICK_LABEL_MAX).trim()\n const id = typeof row.id === 'string' && row.id !== '' ? row.id.slice(0, 64) : newQuickPromptId()\n const order = typeof row.order === 'number' && Number.isFinite(row.order)\n ? Math.max(1, Math.round(row.order))\n : undefined\n return {\n prompt: {\n id,\n label: label === '' ? prompt.slice(0, 12) : label,\n prompt,\n always: row.always === true || row.autoSend === true,\n firstOnly: row.firstOnly === true || row.autoSendFirst === true,\n },\n order,\n }\n}\n\n/** \u6536\u7A84\u4E00\u4E2A\u5217\u8868\uFF1A\u6309 id \u53BB\u91CD\u4FDD\u5E8F\u3001\u6309 order \u5347\u5E8F\uFF08\u6CA1\u6709 order \u7684\u4FDD\u6301\u539F\u76F8\u5BF9\u4F4D\u7F6E\uFF09\u3001\u9650\u91CF\u3002 */\nfunction toPromptList(values: readonly unknown[]): readonly QuickPrompt[] {\n const rows: { prompt: QuickPrompt; order?: number; index: number }[] = []\n for (const value of values) {\n const row = asPromptRow(value)\n if (row !== undefined) rows.push({ ...row, index: rows.length })\n }\n rows.sort((a, b) => {\n const left = a.order ?? Number.MAX_SAFE_INTEGER\n const right = b.order ?? Number.MAX_SAFE_INTEGER\n return left === right ? a.index - b.index : left - right\n })\n const seen = new Set<string>()\n const out: QuickPrompt[] = []\n for (const row of rows) {\n if (out.length >= QUICK_PROMPT_MAX) break\n if (seen.has(row.prompt.id)) continue\n seen.add(row.prompt.id)\n out.push(row.prompt)\n }\n return out\n}\n\n/**\n * \u628A\u4EFB\u610F\u6765\u6E90\u6536\u7A84\u6210\u4E00\u672C\uFF08\u6587\u4EF6\u5185\u5BB9\u3001HTTP \u8BF7\u6C42\u4F53\u90FD\u8D70\u8FD9\u91CC\uFF09\u3002\n * @param value \u4EFB\u610F\u503C\u3002\n * @returns \u6536\u7A84\u540E\u7684\u672C\uFF1B**\u8BA4\u4E0D\u51FA\u7684\u5F62\u72B6\u8FD4\u56DE undefined** \u2014\u2014 \u8C03\u7528\u65B9\u5FC5\u987B\u628A\u5B83\u5F53\u6210\u635F\u574F\uFF0C\n * \u7EDD\u4E0D\u80FD\u56DE\u9000\u6210\u7A7A\u672C\u518D\u5199\u56DE\u53BB\uFF08\u90A3\u4F1A\u628A\u7528\u6237\u6570\u636E\u62B9\u6389\uFF09\u3002\n */\nexport function sanitizeBook(value: unknown): QuickPromptBook | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const source = value as Record<string, unknown>\n\n // v1 \u5E73\u94FA\uFF08\u88F8\u6570\u7EC4\uFF0C\u6216 { prompts: [...] }\uFF09\uFF1A\u5347\u7EA7\u6210\u4E00\u4E2A\u300C\u9ED8\u8BA4\u300D\u5206\u7C7B\u3002\n const flat = Array.isArray(value) ? value : (Array.isArray(source.prompts) ? source.prompts : undefined)\n if (flat !== undefined) {\n const prompts = toPromptList(flat)\n return {\n version: QUICK_BOOK_VERSION,\n categories: prompts.length === 0\n ? []\n : [{ id: 'cat-default', name: DEFAULT_CATEGORY_NAME, prompts }],\n }\n }\n\n if (!Array.isArray(source.categories)) return undefined\n const seen = new Set<string>()\n const categories: QuickPromptCategory[] = []\n for (const raw of source.categories) {\n if (categories.length >= QUICK_CATEGORY_MAX) break\n if (typeof raw !== 'object' || raw === null) continue\n const row = raw as Record<string, unknown>\n const prompts = toPromptList(Array.isArray(row.prompts) ? row.prompts : [])\n // \u7A7A\u5206\u7C7B**\u4FDD\u7559**\uFF08\u8FD9\u70B9\u4E0E\u53C2\u8003\u5B9E\u73B0\u4E0D\u540C\uFF09\uFF1A\u9762\u677F\u7684\u300C\uFF0B\u300D\u53EA\u662F\u65B0\u5EFA\u4E00\u4E2A\u5206\u7C7B\uFF0C\u7528\u6237\u63A5\u4E0B\u6765\n // \u624D\u4F1A\u5F80\u91CC\u653E\u6761\u76EE\uFF1B\u82E5\u5728\u8FD9\u91CC\u4E22\u6389\uFF0C\u70B9\u300C\uFF0B\u300D\u5C31\u4F1A\u770B\u8D77\u6765\u6BEB\u65E0\u53CD\u5E94\uFF080.3.0 \u771F\u673A\u4E0A\u8E29\u5230\uFF09\u3002\n // \u7A7A\u5206\u7C7B\u5728\u6587\u4EF6\u91CC\u4E5F\u662F\u5408\u6CD5\u72B6\u6001\uFF0C\u6570\u91CF\u4E0A\u9650\u7531 QUICK_CATEGORY_MAX \u515C\u4F4F\u3002\n const wanted = typeof row.id === 'string' && row.id !== '' ? row.id.slice(0, 64) : newQuickCategoryId()\n const id = seen.has(wanted) ? newQuickCategoryId() : wanted\n seen.add(id)\n const name = (typeof row.name === 'string' ? row.name : '').slice(0, QUICK_CATEGORY_NAME_MAX).trim()\n categories.push({ id, name: name === '' ? DEFAULT_CATEGORY_NAME : name, prompts })\n }\n return { version: QUICK_BOOK_VERSION, categories }\n}\n\n/** \u5185\u90E8\u7ED3\u6784 \u2192 \u6587\u4EF6\u7ED3\u6784\uFF08\u5199\u76D8\u65F6\u7528\uFF1B\u987A\u5E8F\u5373 order\uFF09\u3002 */\nexport function bookToFile(book: QuickPromptBook): { version: number; categories: readonly QuickCategoryFileRow[] } {\n return {\n version: QUICK_BOOK_VERSION,\n categories: book.categories.map(category => ({\n id: category.id,\n name: category.name,\n prompts: category.prompts.map((prompt, index) => ({\n id: prompt.id,\n title: prompt.label,\n text: prompt.prompt,\n autoSend: prompt.always,\n // \u300C\u4EC5\u9996\u6B21\u300D\u662F\u6211\u4EEC\u52A0\u7684\u952E\uFF0C\u53EA\u5728\u4E3A\u771F\u65F6\u5199\u51FA\u6765\uFF1A\u6587\u4EF6\u5F62\u72B6\u5C3D\u91CF\u8D34\u8FD1\u53C2\u8003\u5B9E\u73B0\u3002\n ...(prompt.firstOnly ? { autoSendFirst: true } : {}),\n order: index + 1,\n })),\n })),\n }\n}\n\n/** \u8DE8\u5206\u7C7B\u62CD\u5E73\uFF08\u9762\u677F\u5217\u8868\u3001\u603B\u6761\u6570\u7EDF\u8BA1\u7528\uFF09\u3002 */\nexport function flattenQuickPrompts(book: QuickPromptBook): readonly QuickPrompt[] {\n return book.categories.flatMap(category => category.prompts)\n}\n\n/** \u53EA\u53D6\u300C\u6BCF\u6B21\u300D\u7684\u90A3\u4E9B\uFF08\u6BCF\u6B21\u53D1\u9001\u90FD\u9644\u52A0\uFF1B\u8DE8\u6240\u6709\u5206\u7C7B\uFF09\u3002 */\nexport function alwaysQuickPrompts(book: QuickPromptBook): readonly QuickPrompt[] {\n return flattenQuickPrompts(book).filter(prompt => insertModeOf(prompt) === 'always')\n}\n\n/** \u53EA\u53D6\u300C\u4EC5\u9996\u6B21\u300D\u7684\u90A3\u4E9B\uFF08\u8DE8\u6240\u6709\u5206\u7C7B\uFF09\u3002 */\nexport function firstOnlyQuickPrompts(book: QuickPromptBook): readonly QuickPrompt[] {\n return flattenQuickPrompts(book).filter(prompt => insertModeOf(prompt) === 'first')\n}\n\n/**\n * \u8FD9\u4E00\u6B21\u53D1\u9001\u8981\u9644\u52A0\u7684\u6279\u6B21\u3002\n *\n * @param book \u5F53\u524D\u8FD9\u672C\u3002\n * @param blank \u4F1A\u8BDD\u5FEB\u7167\u7684 `blank`\uFF1Atrue = \u8FD9\u4E2A\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u4EFB\u4F55\u6D88\u606F\uFF08\u4E5F\u5C31\u662F\u7B2C\u4E00\u6761\uFF09\u3002\n * @returns \u987A\u5E8F = \u300C\u6BCF\u6B21\u300D\u7684\u90A3\u4E9B\uFF0C\u518D\u8DDF\u4E0A\u300C\u4EC5\u9996\u6B21\u300D\u7684\u90A3\u4E9B\uFF08\u4EC5\u9996\u6B21\u53EA\u5728\u7B2C\u4E00\u6761\u4E0A\u51FA\u73B0\uFF09\u3002\n */\nexport function appendBatchForSend(book: QuickPromptBook, blank: boolean): readonly QuickPrompt[] {\n const every = alwaysQuickPrompts(book)\n if (!blank) return every\n return [...every, ...firstOnlyQuickPrompts(book)]\n}\n\n// \u2500\u2500 OpenCode \u8BF7\u6C42\u5934 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// OpenCode \u7684\u63A5\u53E3\u8981\u6C42\u5BA2\u6237\u7AEF\u6BCF\u6B21\u8BF7\u6C42\u90FD\u5E26\u4E00\u4E2A\u7A33\u5B9A\u7684\u4F1A\u8BDD ID \u8BF7\u6C42\u5934\n// \uFF08\u5B98\u65B9 Go \u6587\u6863\u300C\u53EF\u4EE5\u5728\u54EA\u91CC\u4F7F\u7528\uFF1F\u300D\u7B2C 3 \u6761\uFF09\u3002DSH \u7684 Models \u8BBE\u7F6E\u9875\u660E\u786E\u4E0D\u63D0\u4F9B\n// \u8BF7\u6C42\u5934\u7F16\u8F91\u5668\uFF0C\u6240\u4EE5\u672C\u63D2\u4EF6\u628A\u8FD9\u4E00\u9879\u5199\u8FDB llm-pi-ai \u7684 provider profile.headers \u2014\u2014\n// \u90A3\u662F DSH \u91CC\u552F\u4E00\u53D7\u652F\u6301\u7684\u51FA\u7F51\u8BF7\u6C42\u5934\u5165\u53E3\uFF08\u4F1A\u5728 pi-ai \u4FA7\u6700\u540E\u5408\u5E76\uFF0C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u751F\u6548\uFF09\u3002\n\n/** \u8BF7\u6C42\u5934\u680F\u76EE\u5B57\u6BB5\u540D\u3002 */\nexport const HEADER_ENABLED_FIELD = 'headerEnabled'\nexport const HEADER_NAME_FIELD = 'headerName'\nexport const HEADER_VALUE_FIELD = 'headerValue'\n/** \u4F5C\u7528\u8DEF\u7531\u540D\u5355\uFF08\u9017\u53F7/\u7A7A\u683C\u5206\u9694\uFF09\uFF1B\u7559\u7A7A = \u81EA\u52A8\u5339\u914D OpenCode \u8DEF\u7531\uFF08\u89C1 OPENCODE_ROUTE_PREFIX / OPENCODE_HOSTS\uFF09\u3002 */\nexport const HEADER_ROUTES_FIELD = 'headerRoutes'\n\n/** \u5BBF\u4E3B\u534A\u8BB0\u8D26\uFF1A\u4E0A\u6B21\u5B9E\u9645\u5199\u5165\u7684\u5934\u540D\u4E0E\u503C\uFF08\u51B3\u5B9A\u505C\u7528/\u6539\u540D\u65F6\u64A4\u9500\u54EA\u4E9B\u952E\uFF09\u3002 */\nexport const HEADER_APPLIED_NAME_FIELD = 'headerAppliedName'\nexport const HEADER_APPLIED_VALUE_FIELD = 'headerAppliedValue'\n\n/** \u5BBF\u4E3B\u534A\u5199\u5165\u7684\u6267\u884C\u7ED3\u679C\uFF1B\u8BBE\u7F6E\u9875\u53EA\u8BFB\u5C55\u793A\u3002 */\nexport const HEADER_STATUS_FIELD = 'headerStatus'\n\n/**\n * \u53EA\u5728\u5BBF\u4E3B\u534A\u7EF4\u62A4\u7684\u5B57\u6BB5\uFF1A\u8BBE\u7F6E\u9875\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u4E0D\u5F97\u6E05\u7A7A\u5B83\u4EEC\uFF0C\n * \u5426\u5219\u5DF2\u5199\u5165\u7684\u5934\u4F1A\u5931\u53BB\u8BB0\u8D26\u3001\u6C38\u8FDC\u64A4\u9500\u4E0D\u6389\u3002\n *\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u4E09\u4E2A\u81EA\u6301\u5B57\u6BB5\u540C\u7406\uFF1A\u5019\u9009\u8868\u4E0E\u72B6\u6001\u662F**\u5BBF\u4E3B\u534A\u7684\u63A2\u6D4B\u7ED3\u679C**\uFF0C\n * \u6E05\u6389\u4E4B\u540E\u754C\u9762\u4F1A\u53D8\u6210\"\u6CA1\u63A2\u6D4B\u8FC7\"\u7684\u6837\u5B50\uFF08\u800C\u5B9E\u9645\u8FD8\u5728\u7528\u67D0\u4E2A bash\uFF09\uFF0C\n * \u7528\u6237\u70B9\u4E00\u6B21\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u5C31\u4F1A\u770B\u5230\u81EA\u76F8\u77DB\u76FE\u7684\u72B6\u6001\u3002\n */\nexport const HOST_OWNED_FIELDS = [\n HEADER_APPLIED_NAME_FIELD,\n HEADER_APPLIED_VALUE_FIELD,\n HEADER_STATUS_FIELD,\n TERMINAL_CANDIDATES_FIELD,\n TERMINAL_STATUS_FIELD,\n TERMINAL_EFFECTIVE_FIELD,\n] as const\n\n/** \u8BF7\u6C42\u5934\u6700\u7EC8\u843D\u5730\u7684\u8BBE\u7F6E\u547D\u540D\u7A7A\u95F4\uFF08\u7531 llm-pi-ai \u6CE8\u518C\uFF09\u3002 */\nexport const LLM_NAMESPACE = 'llm-pi-ai'\n\n/**\n * \u81EA\u52A8\u5339\u914D\u7684\u4E24\u6761\u5224\u636E\uFF08\u6EE1\u8DB3\u5176\u4E00\u5373\u7B97 OpenCode \u8DEF\u7531\uFF09\uFF1A\n * 1. \u8DEF\u7531\u540D\u4EE5 `opencode` \u5F00\u5934\u2014\u2014DSH \u5185\u7F6E\u7684 `opencode-go` \u5C31\u5C5E\u4E8E\u8FD9\u79CD\uFF0C\n * \u5B83\u7684 baseURL \u7531 pi-ai \u76EE\u5F55\u5185\u7F6E\uFF0C\u914D\u7F6E\u91CC\u8BFB\u4E0D\u5230\uFF0C\u53EA\u80FD\u9760\u540D\u5B57\u3002\n * 2. \u8BE5\u8DEF\u7531\u7684 `baseURL` \u4E3B\u673A\u662F opencode.ai\uFF08\u542B\u5B50\u57DF\uFF09\u2014\u2014\u7528\u6237\u81EA\u5EFA\u8DEF\u7531\u5E38\u8D77\u4EFB\u610F\u540D\u5B57\n * \uFF08\u4F8B\u5982 `go`\uFF09\uFF0C\u4F46\u7AEF\u70B9\u7167\u6837\u662F OpenCode\uFF0C\u6309 URL \u8BA4\u6BD4\u6309\u540D\u5B57\u8BA4\u53EF\u9760\u3002\n */\nexport const OPENCODE_ROUTE_PREFIX = 'opencode'\n\n/** \u5224\u636E 2 \u7528\u7684\u4E3B\u673A\u540D\uFF08\u542B\u5B50\u57DF\uFF09\u3002 */\nexport const OPENCODE_HOSTS = ['opencode.ai'] as const\n\n/** \u5934\u540D\u9ED8\u8BA4\u503C = OpenCode \u5B98\u65B9\u8981\u6C42\u7684\u90A3\u4E00\u4E2A\u3002 */\nexport const DEFAULT_HEADER_NAME = 'x-opencode-session'\n\n/** \u5934\u503C\u957F\u5EA6\u4E0A\u9650\uFF08HTTP \u5934\u4E0E\u8BBE\u7F6E\u6587\u6863\u90FD\u4E0D\u5B9C\u8FC7\u957F\uFF09\u3002 */\nexport const HEADER_VALUE_MAX = 200\n\n/** \u5934\u540D\u957F\u5EA6\u4E0A\u9650\u3002 */\nexport const HEADER_NAME_MAX = 64\n\n/** \u5168\u90E8\u53EF\u6301\u4E45\u5316\u5B57\u6BB5\u3002 */\nexport type SettingsField =\n | typeof ENABLED_FIELD\n | typeof KEYS_ENABLED_FIELD\n | typeof MENU_ENABLED_FIELD\n | typeof QUICK_ENABLED_FIELD\n | typeof PANEL_ENABLED_FIELD\n | typeof TERMINAL_ENABLED_FIELD\n | typeof SEND_KEY_FIELD\n | typeof NEWLINE_KEY_FIELD\n | typeof PANEL_SCROLL_FIELD\n | typeof PANEL_RESIZE_FIELD\n | typeof PANEL_WIDTH_FIELD\n | typeof PANEL_HEIGHT_FIELD\n | typeof MENU_NATIVE_FIELD\n | typeof MENU_MODE_FIELD\n | typeof HEADER_ENABLED_FIELD\n | typeof HEADER_NAME_FIELD\n | typeof HEADER_VALUE_FIELD\n | typeof HEADER_ROUTES_FIELD\n | typeof QUICK_PROMPTS_FIELD\n | typeof OPTIMIZER_TIER_FIELD\n | typeof TERMINAL_MODE_FIELD\n | typeof TERMINAL_BASH_PATH_FIELD\n | MenuField\n\n/** \u9F20\u6807\u53F3\u952E\u83DC\u5355\u6253\u5F00\u65F6\u7684\u4E00\u6B21\u5FEB\u7167\uFF08\u542B\u4F4D\u7F6E\u4E0E\u9009\u62E9\u72B6\u6001\uFF09\u3002 */\nexport interface MenuState {\n /** \u89C6\u53E3\u5750\u6807\u3002 */\n readonly x: number\n readonly y: number\n /** \u53F3\u952E\u65F6\u8F93\u5165\u6846\u5185\u662F\u5426\u6709\u975E\u6298\u53E0\u9009\u533A\uFF08\u51B3\u5B9A\u526A\u5207/\u590D\u5236/\u5220\u9664\u662F\u5426\u53EF\u7528\uFF09\u3002 */\n readonly hasSelection: boolean\n /** \u7C98\u8D34\u5931\u8D25\u65F6\u7684\u77ED\u6682\u63D0\u793A\u3002 */\n readonly note?: string\n}\n\n/** \u89E3\u6790\u540E\u7684\u8BBE\u7F6E\u3002 */\nexport interface ComposerUxSettings {\n /** \u5168\u5C40\u603B\u5F00\u5173\uFF1Afalse \u65F6\u672C\u63D2\u4EF6\u6240\u6709\u529F\u80FD\u505C\u7528\u3002\u9ED8\u8BA4**\u5F00**\u3002 */\n enabled: boolean\n /**\n * \u516D\u680F\u5404\u81EA\u7684\u5F00\u5173\uFF1A`enabled && \u8BE5\u680F\u5F00\u5173` \u624D\u751F\u6548\u3002\u9ED8\u8BA4**\u5173**\uFF08\u8001\u7528\u6237\u6309\"\u78B0\u8FC7\u6CA1\"\u8FC1\u79FB\uFF0C\u89C1\n * `sectionEnabledOf`\uFF09\u3002\u300COpenCode \u8BF7\u6C42\u5934\u300D\u90A3\u4E00\u680F\u76F4\u63A5\u7528 `headerEnabled`\uFF0C\u6CA1\u6709\u5355\u72EC\u7684\u952E\u3002\n */\n keysEnabled: boolean\n menuEnabled: boolean\n quickEnabled: boolean\n panelEnabled: boolean\n terminalEnabled: boolean\n /** \u53D1\u9001\u952E\u4F4D\u89C4\u8303\u4E32\uFF08\u5982 'Enter'\u3001'Ctrl+Enter'\u3001''=\u65E0\uFF09\u3002 */\n sendKey: string\n /** \u6362\u884C\u952E\u4F4D\u89C4\u8303\u4E32\u3002 */\n newlineKey: string\n menuUndo: boolean\n menuRedo: boolean\n menuCut: boolean\n menuCopy: boolean\n menuPaste: boolean\n menuDelete: boolean\n menuSelectAll: boolean\n /**\n * \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF08\u5B98\u65B9\u4E0D\u4ECB\u5165 / \u6D4F\u89C8\u5668\u83DC\u5355 / \u81EA\u5B9A\u4E49\u83DC\u5355\uFF09\u3002\n * \u6587\u6863\u91CC\u6CA1\u6709\u8FD9\u4E2A\u5B57\u6BB5\u65F6\u6309\u65E7\u5E03\u5C14 `menuNative` \u63A8\u65AD\uFF0C\u89C1 `menuModeFrom`\u3002\n */\n menuMode: MenuMode\n /** \u8BBE\u7F6E\u9762\u677F\uFF1A\u6761\u76EE\u8FC7\u591A\u65F6\u5BFC\u822A\u5217\u53EF\u6EDA\u52A8\u3002 */\n panelScroll: boolean\n /** \u8BBE\u7F6E\u9762\u677F\uFF1A\u5141\u8BB8\u62D6\u62FD\u8FB9\u7F18\u8C03\u6574\u5927\u5C0F\u3002 */\n panelResize: boolean\n /** \u8BBE\u7F6E\u9762\u677F\u5BBD\uFF08px\uFF09\uFF1B\u7F3A\u7701\u4F7F\u7528\u5B98\u65B9\u9ED8\u8BA4 800\u3002 */\n panelWidth?: number\n /** \u8BBE\u7F6E\u9762\u677F\u9AD8\uFF08px\uFF09\uFF1B\u7F3A\u7701\u4F7F\u7528\u5B98\u65B9\u9ED8\u8BA4 min(800, \u89C6\u53E3-48)\u3002 */\n panelHeight?: number\n /** OpenCode \u8BF7\u6C42\u5934\uFF1A\u542F\u7528\u540E\u5199\u8FDB llm-pi-ai \u7684 opencode \u7CFB\u8DEF\u7531\u3002 */\n headerEnabled: boolean\n /** \u5934\u540D\uFF08\u9ED8\u8BA4 x-opencode-session\uFF09\u3002 */\n headerName: string\n /** \u5934\u503C\uFF1B\u7559\u7A7A\u65F6\u9996\u6B21\u542F\u7528\u7531\u5BBF\u4E3B\u534A\u751F\u6210\u4E00\u4E2A\u7A33\u5B9A ID \u5E76\u843D\u76D8\u6CBF\u7528\u3002 */\n headerValue: string\n /** \u4F5C\u7528\u8DEF\u7531\u540D\u5355\uFF1B\u7559\u7A7A = \u81EA\u52A8\u5339\u914D opencode \u7CFB\u8DEF\u7531\uFF08\u53EA\u52A8\u5DF2\u5B58\u5728\u7684\u8DEF\u7531\uFF09\u3002 */\n headerRoutes: string\n /** \u5BBF\u4E3B\u534A\u8BB0\u8D26\u5B57\u6BB5\uFF08\u8BBE\u7F6E\u9875\u53EA\u8BFB\uFF09\u3002 */\n headerAppliedName: string\n headerAppliedValue: string\n /** \u5BBF\u4E3B\u534A\u5199\u5165\u7ED3\u679C\uFF08\u8BBE\u7F6E\u9875\u53EA\u8BFB\uFF09\u3002 */\n headerStatus: string\n /** \u5FEB\u6377\u6307\u4EE4\u5217\u8868\uFF08\u987A\u5E8F\u5373\u9762\u677F\u4E0E\u8BBE\u7F6E\u9875\u91CC\u7684\u663E\u793A\u987A\u5E8F\uFF09\u3002 */\n quickPrompts: readonly QuickPrompt[]\n /** \u63D0\u793A\u8BCD\u4F18\u5316\u5F3A\u5EA6\u6863\u4F4D\u3002 */\n optimizerTier: OptimizerTier\n /**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u6863\u4F4D\uFF1A\u81EA\u52A8 / Git Bash / PowerShell\u3002\u53EA\u5BF9 Windows \u751F\u6548\n * \uFF08\u975E Windows \u4E0A\u5BBF\u4E3B\u534A\u76F4\u63A5\u8DF3\u8FC7\uFF0C\u5361\u7247\u663E\u793A\"\u4E0D\u9700\u8981\"\uFF09\u3002\n */\n terminalMode: TerminalMode\n /** \u7528\u6237\u6307\u5B9A\u7684 Git Bash \u8DEF\u5F84\uFF1B\u7559\u7A7A = \u7528\u63A2\u6D4B\u5230\u7684\u7B2C\u4E00\u4E2A\u5019\u9009\u3002 */\n terminalBashPath: string\n /** \u5BBF\u4E3B\u534A\u63A2\u6D4B\u5230\u7684\u5019\u9009\uFF08\u53EA\u8BFB\u5C55\u793A\uFF0C\u89C1 HOST_OWNED_FIELDS\uFF09\u3002 */\n terminalCandidates: readonly TerminalCandidate[]\n /** \u5BBF\u4E3B\u534A\u5199\u7684\u72B6\u6001\u884C\uFF1A\u5F53\u524D\u751F\u6548 shell / \u4E3A\u4EC0\u4E48\u6CA1\u751F\u6548\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n terminalStatus: string\n /** \u5BBF\u4E3B\u534A\u5199\u7684\u5F53\u524D\u751F\u6548 shell\uFF1A'bash' / 'pwsh'\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n terminalEffective: string\n}\n\n/** \u9ED8\u8BA4\u503C = DSH Web \u73B0\u72B6\uFF08Enter \u53D1\u9001\u3001Shift+Enter \u6362\u884C\u3001\u53F3\u952E\u83DC\u5355\u5168\u5F00\uFF09\u3002 */\nexport const DEFAULT_SETTINGS: ComposerUxSettings = {\n // \u603B\u5F00\u5173\u9ED8\u8BA4\u5F00\uFF1A\u5B83\u53EA\u662F\u603B\u95F8\uFF0C\u771F\u6B63\"\u8981\u4E0D\u8981\u7528\u8FD9\u4E00\u680F\"\u7531\u4E0B\u9762\u4E94\u4E2A\u5F00\u5173\u51B3\u5B9A\uFF08\u9ED8\u8BA4\u5173\uFF09\u3002\n enabled: true,\n // \u4E94\u680F\u9ED8\u8BA4\u5173\uFF08\u8001\u6587\u6863\u7531 sectionEnabledOf \u8FC1\u79FB\u6210\"\u78B0\u8FC7\u5C31\u5F00\"\uFF09\u3002\n keysEnabled: false,\n menuEnabled: false,\n quickEnabled: false,\n panelEnabled: false,\n terminalEnabled: false,\n sendKey: 'Enter',\n newlineKey: 'Shift+Enter',\n menuUndo: true,\n menuRedo: true,\n menuCut: true,\n menuCopy: true,\n menuPaste: true,\n menuDelete: true,\n menuSelectAll: true,\n menuMode: 'official',\n panelScroll: true,\n panelResize: true,\n headerEnabled: false,\n headerName: DEFAULT_HEADER_NAME,\n headerValue: '',\n headerRoutes: '',\n headerAppliedName: '',\n headerAppliedValue: '',\n headerStatus: '',\n quickPrompts: DEFAULT_QUICK_PROMPTS,\n optimizerTier: DEFAULT_OPTIMIZER_TIER,\n terminalMode: DEFAULT_TERMINAL_MODE,\n terminalBashPath: '',\n terminalCandidates: [],\n terminalStatus: '',\n terminalEffective: '',\n}\n\n/**\n * \u516D\u680F\u91CC\u54EA\u51E0\u680F\u751F\u6548\uFF1A**\u603B\u5F00\u5173 +\uFF08OpenCode \u90A3\u680F\u7528\u81EA\u5DF1\u7684 `headerEnabled`\uFF09+ \u8BE5\u680F\u5F00\u5173**\u3002\n *\n * \u5BBF\u4E3B\u534A\u4E0E\u5BA2\u6237\u7AEF\u534A\u90FD\u8D70\u8FD9\u4E00\u4E2A\u51FD\u6570\uFF0C\u514D\u5F97\u6709\u4EBA\u53EA\u770B\u4E86\u680F\u5F00\u5173\u3001\u5FD8\u4E86\u603B\u95F8\uFF08\u6216\u8005\u53CD\u8FC7\u6765\uFF09\u3002\n */\nexport function activeSections(settings: ComposerUxSettings): {\n readonly keys: boolean\n readonly menu: boolean\n readonly quick: boolean\n readonly panel: boolean\n readonly header: boolean\n readonly terminal: boolean\n} {\n const on = settings.enabled\n return {\n keys: on && settings.keysEnabled,\n menu: on && settings.menuEnabled,\n quick: on && settings.quickEnabled,\n panel: on && settings.panelEnabled,\n header: on && settings.headerEnabled,\n terminal: on && settings.terminalEnabled,\n }\n}\n\n/** \u8BBE\u7F6E\u9875\u300C\u952E\u4F4D\u300D\u4E00\u8282\u7684\u9884\u8BBE\u3002 */\nexport const SEND_PRESETS: readonly string[] = ['Enter', 'Ctrl+Enter', 'Alt+Enter', 'Shift+Enter']\nexport const NEWLINE_PRESETS: readonly string[] = ['Shift+Enter', 'Enter', 'Ctrl+Enter', 'Alt+Enter']\n\n/** \u53F3\u952E\u83DC\u5355\u6761\u76EE\uFF08\u987A\u5E8F\u5373\u663E\u793A\u987A\u5E8F\uFF1Bshortcut \u4E0E\u56FE\u7247\u4E00\u81F4\uFF09\u3002 */\nexport const MENU_ITEMS: readonly {\n readonly field: MenuField\n readonly label: string\n readonly shortcut: string\n}[] = [\n { field: 'menuUndo', label: '\u64A4\u9500', shortcut: 'Ctrl+Z' },\n { field: 'menuRedo', label: '\u91CD\u505A', shortcut: 'Ctrl+Y' },\n { field: 'menuCut', label: '\u526A\u5207', shortcut: 'Ctrl+X' },\n { field: 'menuCopy', label: '\u590D\u5236', shortcut: 'Ctrl+C' },\n { field: 'menuPaste', label: '\u7C98\u8D34', shortcut: 'Ctrl+V' },\n { field: 'menuDelete', label: '\u5220\u9664', shortcut: '' },\n { field: 'menuSelectAll', label: '\u5168\u9009', shortcut: 'Ctrl+A' },\n]\n\n/**\n * \u751F\u6210\u4E00\u4E2A\u7A33\u5B9A\u7684\u4F1A\u8BDD ID\uFF08UUID v4\uFF1B\u65E0 crypto \u65F6\u9000\u56DE\u7B49\u4EF7\u7684\u968F\u673A\u5341\u516D\u8FDB\u5236\uFF09\u3002\n * \u503C\u672C\u8EAB\u4E0D\u53C2\u4E0E\u9274\u6743\uFF0C\u53EA\u7528\u4E8E\u8BA9\u7F51\u5173\u628A\u540C\u4E00\u6BB5\u5BF9\u8BDD\u56FA\u5B9A\u5230\u540C\u4E00\u4E2A\u4E0A\u6E38\uFF0C\u6545 Math.random \u515C\u5E95\u53EF\u63A5\u53D7\u3002\n * @returns 36 \u5B57\u7B26\u7684 UUID \u5B57\u7B26\u4E32\u3002\n */\nexport function newSessionId(): string {\n const bag = globalThis as unknown as { crypto?: { randomUUID?: () => string } }\n if (typeof bag.crypto?.randomUUID === 'function') return bag.crypto.randomUUID()\n const hex = (count: number): string => Array.from(\n { length: count },\n () => Math.floor(Math.random() * 16).toString(16),\n ).join('')\n return `${hex(8)}-${hex(4)}-4${hex(3)}-a${hex(3)}-${hex(12)}`\n}\n\n/** \u89E3\u6790\u300C\u4F5C\u7528\u8DEF\u7531\u300D\u6587\u672C\uFF1A\u9017\u53F7 / \u7A7A\u683C / \u6362\u884C\u5206\u9694\uFF0C\u53BB\u91CD\u4FDD\u5E8F\u3002 */\nexport function parseRouteList(text: string): readonly string[] {\n const parts = text.split(/[\\s,\uFF0C\u3001]+/).map(item => item.trim()).filter(item => item !== '')\n return [...new Set(parts)]\n}\n\n/**\n * \u6BCF\u680F\u7684\"\u7528\u6237\u78B0\u8FC7\u6CA1\"\u5224\u636E\uFF08\u8FC1\u79FB\u89C4\u5219\u7528\uFF0C\u89C1\u6587\u4EF6\u4E0A\u65B9\u90A3\u6BB5\u8BF4\u660E\uFF09\u3002\n *\n * \u26A0\uFE0F \u5224\u636E\u5FC5\u987B\u662F\u300C**\u503C\u4E0D\u7B49\u4E8E\"\u4ECE\u6CA1\u78B0\u8FC7\"\u7684\u6837\u5B50**\u300D\uFF0C\u4E0D\u80FD\u662F\u300C\u952E\u5B58\u5728\u300D\uFF1A\n * `settings.get()` \u7ED9\u7684\u662F**\u5DF2\u89E3\u6790**\u7684\u503C\uFF08schema \u9ED8\u8BA4\u503C + \u7EC4\u5408 base + \u7528\u6237\u5C42\uFF09\uFF0C\n * \u6240\u4EE5\u4ECE\u6CA1\u78B0\u8FC7\u7684\u4EBA\u7684\u6587\u6863\u91CC\u4E5F\u7167\u6837\u6709 `sendKey: 'Enter'`\u3001`panelScroll: true` \u8FD9\u4E9B\u9ED8\u8BA4\u503C \u2014\u2014\n * \u6309\"\u952E\u5B58\u5728\"\u5224\u65AD\u4F1A\u8BA9\u5168\u65B0\u5B89\u88C5\u516D\u680F\u5168\u5F00\uFF0C\u4E0E\"\u9ED8\u8BA4\u5173\"\u6B63\u597D\u76F8\u53CD\u3002\n * \uFF08\u7B2C\u4E00\u7248\u5C31\u5199\u6210\u4E86\"\u952E\u5B58\u5728\"\uFF0C\u662F\u63A8\u7406 + \u6D4B\u8BD5\u5F53\u573A\u902E\u4F4F\u7684\uFF0C\u6CE8\u91CA\u7559\u5728\u8FD9\u91CC\u9632\u590D\u53D1\u3002\uFF09\n *\n * \u53E6\u5916\uFF1A\u5BBF\u4E3B\u534A\u81EA\u6301\u5B57\u6BB5\uFF08`terminalStatus` / `terminalCandidates` / `terminalEffective` /\n * `headerApplied*`\uFF09**\u4E0D\u8BB8**\u5F53\u5224\u636E \u2014\u2014 \u5B83\u4EEC\u662F\u63D2\u4EF6\u81EA\u5DF1\u5199\u7684\uFF0C\u5168\u65B0\u5B89\u88C5\u4E5F\u4F1A\u51FA\u73B0\u3002\n *\n * \u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u8FD8\u6709\u4E00\u4E2A\u6587\u6863\u91CC\u770B\u4E0D\u51FA\u6765\u7684\u4FE1\u53F7\uFF1A0.3.0 \u8D77\u6761\u76EE\u642C\u5230\u4E86 `quick-prompts.json`\uFF0C\n * \u7528\u8FC7\u7684\u4EBA\u548C\u6CA1\u7528\u8FC7\u7684\u4EBA\u7684\u8BBE\u7F6E\u6587\u6863\u53EF\u4EE5\u4E00\u6A21\u4E00\u6837\u3002\u90A3\u4E00\u6761\u7531\u5BBF\u4E3B\u534A\u8BFB\u6587\u4EF6\u540E**\u4E00\u6B21\u6027\u5199\u56DE\u6587\u6863**\n * \uFF08\u89C1 `src/host.ts` \u7684 `migrateQuickSection`\uFF09\uFF0C\u6240\u4EE5\u8FD9\u91CC\u53EA\u5269\"\u6587\u6863\u91CC\u7684\u5217\u8868\u88AB\u6539\u8FC7\"\u8FD9\u4E00\u6B21\u7EA7\u4FE1\u53F7\u3002\n */\nconst SECTION_SIGNALS: Readonly<Record<string, (source: Record<string, unknown>) => boolean>> = {\n [KEYS_ENABLED_FIELD]: source =>\n touched(source, SEND_KEY_FIELD, DEFAULT_SETTINGS.sendKey)\n || touched(source, NEWLINE_KEY_FIELD, DEFAULT_SETTINGS.newlineKey),\n // \u300C\u5B98\u65B9\u300D\uFF1D\u672C\u63D2\u4EF6\u4E0D\u4ECB\u5165\uFF0C\u7B49\u4EF7\u4E8E\u5173\uFF1B\u6240\u4EE5\u53EA\u6709\u9009\u8FC7\u53E6\u5916\u4E24\u6863\u624D\u7B97\"\u78B0\u8FC7\"\u3002\n // \uFF08`menuModeFrom` \u5BF9\"\u4E24\u4E2A\u952E\u90FD\u6CA1\u6709\"\u7ED9\u7684\u5C31\u662F 'official'\uFF0C\u5929\u7136\u6EE1\u8DB3\"\u7F3A\u7701 = \u9ED8\u8BA4\"\u3002\uFF09\n [MENU_ENABLED_FIELD]: source =>\n menuModeFrom(source[MENU_MODE_FIELD], source[MENU_NATIVE_FIELD]) !== 'official',\n [QUICK_ENABLED_FIELD]: source =>\n (Array.isArray(source[QUICK_PROMPTS_FIELD])\n && source[QUICK_PROMPTS_FIELD].length !== DEFAULT_QUICK_PROMPTS.length)\n || touched(source, OPTIMIZER_TIER_FIELD, DEFAULT_OPTIMIZER_TIER),\n [PANEL_ENABLED_FIELD]: source =>\n touched(source, PANEL_SCROLL_FIELD, true)\n || touched(source, PANEL_RESIZE_FIELD, true)\n || source[PANEL_WIDTH_FIELD] !== undefined\n || source[PANEL_HEIGHT_FIELD] !== undefined,\n [TERMINAL_ENABLED_FIELD]: source =>\n touched(source, TERMINAL_MODE_FIELD, DEFAULT_TERMINAL_MODE)\n || touched(source, TERMINAL_BASH_PATH_FIELD, ''),\n}\n\n/**\n * \u8FD9\u4E2A\u952E\u5728\u6587\u6863\u91CC**\u51FA\u73B0\u8FC7**\uFF0C\u4E14\u503C\u4E0D\u7B49\u4E8E\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u6837\u5B50\"\u3002\n *\n * \u4E24\u4E2A\u6761\u4EF6\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u800C\u4E14\u7B2C\u4E8C\u534A\u6781\u6613\u6F0F\uFF1A\u6587\u6863\u91CC\u6CA1\u6709\u8FD9\u4E2A\u952E\u65F6\u503C\u662F `undefined`\uFF0C\n * \u62FF\u5B83\u53BB\u6BD4\u9ED8\u8BA4\u503C\u4F1A\u5F97\u51FA\"\u4E0D\u76F8\u7B49 \u21D2 \u78B0\u8FC7\"\uFF08`'' !== 'Enter'`\u3001`undefined !== true` \u90FD\u662F\u771F\uFF09\uFF0C\n * \u4E8E\u662F\u5168\u65B0\u5B89\u88C5\u516D\u680F\u5168\u5F00 \u2014\u2014 \u4E0E\"\u9ED8\u8BA4\u5173\"\u6B63\u597D\u76F8\u53CD\u3002\u7B2C\u4E00\u7248\u5C31\u662F\u8FD9\u4E48\u5199\u7684\uFF0C\u88AB\u6D4B\u8BD5\u5F53\u573A\u902E\u4F4F\u3002\n */\nfunction touched(source: Record<string, unknown>, field: string, untouched: unknown): boolean {\n const value = source[field]\n return value !== undefined && value !== untouched\n}\n\n/**\n * \u7B97\u51FA\u4E00\u680F\u5F00\u5173\u7684\u503C\uFF1A\u663E\u5F0F\u5199\u8FC7\u5C31\u542C\u5B83\u7684\uFF0C\u5426\u5219\u6309\"\u7528\u6237\u78B0\u8FC7\u6CA1\"\u63A8\u65AD\u3002\n * @param field \u680F\u5F00\u5173\u5B57\u6BB5\u540D\u3002\n * @param source \u8BBE\u7F6E\u6587\u6863\uFF08\u89E3\u6790\u540E\u7684\u503C\uFF1B\u7F3A\u7701\u7684\u952E\u4F1A\u88AB schemastery \u7701\u6389\uFF0C\u6240\u4EE5 undefined \u5C31\u662F\"\u6CA1\u5199\u8FC7\"\uFF09\u3002\n * @returns \u8BE5\u680F\u662F\u5426\u751F\u6548\u3002\n */\nexport function sectionEnabledOf(field: string, source: Record<string, unknown>): boolean {\n const explicit = source[field]\n if (typeof explicit === 'boolean') return explicit\n const signal = SECTION_SIGNALS[field]\n return signal === undefined ? false : signal(source)\n}\n\n/** \u8BBE\u7F6E\u6570\u636E\u51C0\u5316\uFF1A\u628A\u7EBF\u4E0A\u503C\u6536\u7A84\u4E3A\u5B89\u5168\u5F62\u72B6\uFF08\u9632\u810F\u6570\u636E\uFF09\u3002 */\nexport function sanitizeSettings(value: unknown): ComposerUxSettings {\n const source = (typeof value === 'object' && value !== null ? value : {}) as Record<string, unknown>\n const asString = (field: string): string => {\n const v = source[field]\n return typeof v === 'string' && v.length > 0 && v.length <= 64 ? v : ''\n }\n const asText = (field: string, max: number): string => {\n const v = source[field]\n return typeof v === 'string' && v.length <= max ? v : ''\n }\n const asBool = (field: string): boolean => {\n const v = source[field]\n return typeof v === 'boolean' ? v : (DEFAULT_SETTINGS as unknown as Record<string, unknown>)[field] as boolean\n }\n const asSize = (field: string): number | undefined => {\n const v = source[field]\n return typeof v === 'number' && Number.isFinite(v) && v >= 320 && v <= 4000 ? Math.round(v) : undefined\n }\n /**\n * \u51C0\u5316\u5FEB\u6377\u6307\u4EE4\u5217\u8868\uFF1A\u9010\u6761\u6536\u7A84\u5F62\u72B6\uFF0C\u4E22\u6389\u6B8B\u7F3A\u9879\uFF0C\u5E76\u6309 id \u53BB\u91CD\u4FDD\u5E8F\u3002\n * \u5B57\u6BB5\u7F3A\u5931 / \u4E0D\u662F\u6570\u7EC4\uFF08\u9996\u6B21\u542F\u7528\uFF09\u2192 \u56DE\u843D\u5230\u5185\u7F6E 9 \u6761\uFF1B\u5B57\u6BB5\u662F\u6570\u7EC4\u5C31\u7167\u5B83\u6765\uFF0C\n * \u7A7A\u6570\u7EC4\u4E5F\u662F\u5408\u6CD5\u72B6\u6001\uFF08\u7528\u6237\u628A\u6761\u76EE\u5168\u5220\u5149\uFF0C\u5C31\u5E94\u5F53\u4FDD\u6301\u5168\u7A7A\uFF0C\u4E0D\u518D\u81EA\u52A8\u5192\u51FA\u6765\uFF09\u3002\n */\n const asQuickPrompts = (): readonly QuickPrompt[] => {\n const raw = source[QUICK_PROMPTS_FIELD]\n if (!Array.isArray(raw)) return DEFAULT_QUICK_PROMPTS\n const seen = new Set<string>()\n const out: QuickPrompt[] = []\n for (const item of raw) {\n if (out.length >= QUICK_PROMPT_MAX) break\n if (typeof item !== 'object' || item === null) continue\n const row = item as Record<string, unknown>\n const prompt = typeof row.prompt === 'string' ? row.prompt.slice(0, QUICK_TEXT_MAX).trim() : ''\n if (prompt === '') continue\n const label = typeof row.label === 'string' ? row.label.slice(0, QUICK_LABEL_MAX).trim() : ''\n const id = typeof row.id === 'string' && row.id !== '' ? row.id.slice(0, 64) : newQuickPromptId()\n if (seen.has(id)) continue\n seen.add(id)\n out.push({\n id,\n label: label === '' ? prompt.slice(0, 12) : label,\n prompt,\n always: row.always === true,\n firstOnly: row.firstOnly === true,\n })\n }\n return out\n }\n const asTier = (): OptimizerTier => {\n const v = source[OPTIMIZER_TIER_FIELD]\n return v === 'basic' || v === 'advanced' || v === 'extreme' ? v : DEFAULT_OPTIMIZER_TIER\n }\n return {\n enabled: asBool(ENABLED_FIELD),\n // \u4E94\u680F\u5F00\u5173\uFF1A\u663E\u5F0F\u5199\u8FC7\u542C\u5B83\u7684\uFF0C\u5426\u5219\u6309\"\u7528\u6237\u78B0\u8FC7\u6CA1\"\u8FC1\u79FB\uFF08\u89C1 sectionEnabledOf\uFF09\u3002\n keysEnabled: sectionEnabledOf(KEYS_ENABLED_FIELD, source),\n menuEnabled: sectionEnabledOf(MENU_ENABLED_FIELD, source),\n quickEnabled: sectionEnabledOf(QUICK_ENABLED_FIELD, source),\n panelEnabled: sectionEnabledOf(PANEL_ENABLED_FIELD, source),\n terminalEnabled: sectionEnabledOf(TERMINAL_ENABLED_FIELD, source),\n sendKey: asString(SEND_KEY_FIELD),\n newlineKey: asString(NEWLINE_KEY_FIELD),\n menuUndo: asBool('menuUndo'),\n menuRedo: asBool('menuRedo'),\n menuCut: asBool('menuCut'),\n menuCopy: asBool('menuCopy'),\n menuPaste: asBool('menuPaste'),\n menuDelete: asBool('menuDelete'),\n menuSelectAll: asBool('menuSelectAll'),\n menuMode: menuModeFrom(source[MENU_MODE_FIELD], source[MENU_NATIVE_FIELD]),\n panelScroll: asBool(PANEL_SCROLL_FIELD),\n panelResize: asBool(PANEL_RESIZE_FIELD),\n panelWidth: asSize(PANEL_WIDTH_FIELD),\n panelHeight: asSize(PANEL_HEIGHT_FIELD),\n headerEnabled: asBool(HEADER_ENABLED_FIELD),\n // \u5934\u540D\u7559\u7A7A\u662F\u4E0D\u5408\u6CD5\u72B6\u6001\uFF08\u5BBF\u4E3B\u534A\u4F1A\u62D2\u7EDD\u5199\u5165\u5E76\u628A\u539F\u56E0\u5199\u8FDB headerStatus\uFF09\uFF0C\n // \u6545\u51C0\u5316\u53EA\u505A\u957F\u5EA6\u6536\u7A84\u3001\u4FDD\u7559\u539F\u6837\uFF0C\u8BA9\u7528\u6237\u770B\u5F97\u89C1\u81EA\u5DF1\u8F93\u9519\u4E86\u4EC0\u4E48\u3002\n headerName: asText(HEADER_NAME_FIELD, HEADER_NAME_MAX),\n headerValue: asText(HEADER_VALUE_FIELD, HEADER_VALUE_MAX),\n headerRoutes: asText(HEADER_ROUTES_FIELD, HEADER_VALUE_MAX),\n headerAppliedName: asText(HEADER_APPLIED_NAME_FIELD, HEADER_NAME_MAX),\n headerAppliedValue: asText(HEADER_APPLIED_VALUE_FIELD, HEADER_VALUE_MAX),\n headerStatus: asText(HEADER_STATUS_FIELD, HEADER_VALUE_MAX),\n quickPrompts: asQuickPrompts(),\n optimizerTier: asTier(),\n terminalMode: terminalModeFrom(source[TERMINAL_MODE_FIELD]),\n // \u8DEF\u5F84\u53EA\u505A\u957F\u5EA6\u4E0E\u5F52\u4E00\u5316\u6536\u7A84\uFF0C\u4E0D\u5728\u8FD9\u91CC\u5224\"\u5B58\u4E0D\u5B58\u5728\"\u2014\u2014\u90A3\u662F\u5BBF\u4E3B\u534A\u7684\u63A2\u6D4B\u7ED3\u8BBA\uFF0C\n // \u7531\u72B6\u6001\u884C\u544A\u8BC9\u7528\u6237\uFF08\u7528\u6237\u770B\u5F97\u89C1\u81EA\u5DF1\u586B\u4E86\u4EC0\u4E48\uFF0C\u6BD4\u6084\u6084\u6E05\u7A7A\u597D\uFF09\u3002\n terminalBashPath: asText(TERMINAL_BASH_PATH_FIELD, 400),\n terminalCandidates: sanitizeTerminalCandidates(source[TERMINAL_CANDIDATES_FIELD]),\n terminalStatus: asText(TERMINAL_STATUS_FIELD, 400),\n terminalEffective: asText(TERMINAL_EFFECTIVE_FIELD, 16),\n }\n}\n", "/**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u5BBF\u4E3B\u534A\uFF1A\u63A2\u6D4B \u2192 \u51B3\u7B56 \u2192 **\u6309\u4F1A\u8BDD\u4E0B\u53D1** \u2192 \u72B6\u6001\u56DE\u5199 \u2192 \u7ED9\u8BBE\u7F6E\u9875\u4E00\u4E2A\u67E5\u8BE2\u63A5\u53E3\u3002\n *\n * \u4E3A\u4EC0\u4E48\u662F\"\u6309\u4F1A\u8BDD\u4E0B\u53D1\"\u800C\u4E0D\u662F\"\u5168\u5C40\u9690\u85CF pwsh\"\uFF1A\u5B98\u65B9 `tools.restrict()` \u5728**\u5168\u5C40\u4E0A\u4E0B\u6587\u4F1A\u76F4\u63A5\u629B\u9519**\n * \uFF08`packages/core/tools/src/index.ts:1077`\uFF0C\u539F\u6587\uFF1Aa context-global restriction would mask every agent\n * \u2014 deny the tool for the intended agent instead\uFF09\u3002\u6240\u4EE5\u6B63\u786E\u505A\u6CD5\u53EA\u6709\u4E00\u6761\uFF1A\u5728\u8BE5 agent \u81EA\u5DF1\u7684 scope \u91CC\n * restrict\u3002\u4E3A\u4E86\u8BA9\"\u6539\u5B8C\u8BBE\u7F6E\u7ACB\u523B\u751F\u6548\"\uFF0C\u8FD9\u91CC\u5728\u8BBE\u7F6E\u53D8\u5316\u65F6**\u904D\u5386\u6240\u6709\u5728\u8DD1 agent** \u91CD\u65B0\u4E0B\u53D1 \u2014\u2014 \u8FD9\u6B63\u662F\n * \u5B98\u65B9 fixture \u7684\u5199\u6CD5\uFF08`packages/subagent/.../scoped-tool-subagent.ts`\uFF1A`ctx.on('agent/created')`\n * + `for (const agent of ctx.agents.list()) install(agent)`\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u5FC5\u518D\u5199 `system-prompt/assemble` \u8FC7\u6EE4\u5668\uFF1A\u5DE5\u5177\u6CE8\u518C\u8868**\u81EA\u5DF1**\u628A schema \u5582\u7ED9\u63D0\u793A\u8BCD\n * \uFF08`packages/core/tools/src/index.ts:834` \u2192 `systemPrompt.tools(context => this.wireSchemas(context.scope))`\uFF09\uFF0C\n * \u800C `wireSchemas(scope)` \u53D6\u7684\u662F\"\u53EF\u89C1\uFF08\u5DF2\u8FC7\u6EE4\uFF09\"\u7684 schema \u2014\u2014 \u6240\u4EE5 deny \u4F1A\u540C\u65F6\u4ECE**\u53EF\u8C03\u7528\u6CE8\u518C\u8868**\n * \u4E0E**\u63D0\u793A\u8BCD\u5DE5\u5177\u5217\u8868**\u91CC\u6D88\u5931\u3002\n *\n * \u5931\u8D25\u4E00\u5F8B\"\u53EA\u964D\u7EA7\u3001\u4E0D\u4F24\u4F1A\u8BDD\"\uFF08A \u7684\u505A\u6CD5\uFF09\uFF1Arestrict \u5931\u8D25\uFF08\u4F8B\u5982\u8BE5 agent \u672C\u6765\u5C31\u770B\u4E0D\u5230 pwsh\uFF09\n * \u53EA\u8BB0\u4E00\u884C\u539F\u56E0\uFF1Bregister \u5931\u8D25\u53EA\u8BB0\u539F\u56E0\uFF1B\u4E24\u79CD\u60C5\u51B5\u90FD\u4E0D\u629B\u3001\u4E0D veto \u522B\u7684\u63D2\u4EF6\u3002\n */\nimport { existsSync, readdirSync } from 'node:fs'\nimport { isAbsolute, sep } from 'node:path'\nimport type { DiscoverResult } from './discover.ts'\nimport {\n TERMINAL_BASH_PATH_FIELD, TERMINAL_CANDIDATES_FIELD, TERMINAL_EFFECTIVE_FIELD,\n TERMINAL_MODE_FIELD, TERMINAL_STATUS_FIELD, activeBashPath, candidatesToStored, probeBash,\n sanitizeTerminalCandidates, terminalModeFrom, terminalStatusText,\n type TerminalCandidate, type TerminalMode,\n} from './contracts.ts'\nimport { BASH_SECTION_TEXT, TOOL_BASH_SECTION_ORDER, TOOL_PWSH_SECTION_ORDER, createBashTool } from './tool.ts'\nimport type { BashToolDeps, ToolDefinitionLike } from './tool.ts'\nimport { TERMINAL_ENABLED_FIELD, sectionEnabledOf } from '../settings-contract.ts'\n\n/**\n * \u8FD9\u4E00\u680F\u6CA1\u542F\u7528\uFF08\u6216\u603B\u5F00\u5173\u5173\u7740\uFF09\u65F6\u5199\u8FDB\u72B6\u6001\u884C\u7684\u90A3\u53E5\u8BDD\u3002\n *\n * \u5199\u72B6\u6001\u884C\u800C\u4E0D\u662F\u4EC0\u4E48\u90FD\u4E0D\u5199\uFF1A\u8BBE\u7F6E\u9875\u90A3\u884C\u53EA\u8BFB\u6587\u5B57\u662F\u7528\u6237\u5224\u65AD\"\u5230\u5E95\u751F\u6548\u4E86\u6CA1\"\u7684\u552F\u4E00\u4F9D\u636E\uFF0C\n * \u7559\u7A7A\u4F1A\u88AB\u8BFB\u6210\"\u8FD8\u6CA1\u63A2\u6D4B\"\u3002\n */\nexport const TERMINAL_OFF_TEXT = '\u672A\u542F\u7528\uFF1A\u6253\u5F00\u8FD9\u4E00\u680F\u7684\u5F00\u5173\u540E\u624D\u4F1A\u63A5\u7BA1\uFF08\u73B0\u5728\u4FDD\u6301 PowerShell\uFF09'\n\n/** \u5BBF\u4E3B\u534A\u7528\u5230\u7684 settings \u80FD\u529B\uFF08\u4E0E src/host.ts \u540C\u4E00\u5957\u7ED3\u6784\u7A84\u5316\uFF09\u3002 */\nexport interface SettingsLike {\n get(ns: string): unknown\n mutate(ns: string, ops: readonly (\n | { op: 'set'; path: readonly string[]; value: unknown }\n | { op: 'unset'; path: readonly string[] }\n )[]): Promise<void>\n}\n\n/** \u5DE5\u5177\u9762\uFF08\u53EA\u53D6\u672C\u63D2\u4EF6\u7528\u5F97\u5230\u7684\u4E24\u4EF6\u4E8B\uFF09\u3002 */\ninterface ToolServiceLike {\n register(definition: unknown): (() => void) | undefined\n restrict(filter: { deny?: readonly string[]; allow?: readonly string[] }): (() => void) | undefined\n}\n\n/** \u63D0\u793A\u8BCD\u9762\u3002 */\ninterface PromptServiceLike {\n section(section: { name: string; order: number; text: string }): (() => void) | undefined\n}\n\n/** agent \u81EA\u5DF1 scope \u4E0A\u7684\u4E0A\u4E0B\u6587\uFF08\u5B98\u65B9\u6A21\u677F `const scoped = agent.ctx` \u76F4\u63A5\u53D6\uFF09\u3002 */\ninterface ScopedLike {\n readonly tools?: ToolServiceLike\n readonly systemPrompt?: PromptServiceLike\n /** \u4F5C\u7528\u57DF\u4E8B\u4EF6\uFF1A\u6CE8\u518C\u5728 agent.ctx \u4E0A\u7684 `system-prompt/assemble` \u53EA\u6536\u5230\u8BE5 agent \u7684\u88C5\u914D\u3002 */\n on?(event: string, listener: (...args: never[]) => unknown): (() => void) | undefined\n}\n\n/** \u4E00\u4E2A\u6D3B\u7740\u7684 agent\uFF08\u53EA\u53D6\u672C\u63D2\u4EF6\u7528\u5F97\u5230\u7684\u90E8\u5206\uFF09\u3002 */\ninterface AgentLike {\n readonly ctx: ScopedLike\n}\n\ninterface AgentsLike {\n list(): readonly AgentLike[]\n}\n\n/** \u5BBF\u4E3B\u534A\u9700\u8981\u7684\u670D\u52A1\u96C6\u5408\u3002 */\ninterface CtxLike {\n get(name: string): unknown\n /** \u4E8B\u4EF6\u63A5\u7EBF\uFF1B\u771F\u5B9E cordis \u4E0A\u4E0B\u6587\u4E00\u5B9A\u6709\uFF0C\u6D4B\u8BD5\u66FF\u8EAB\u53EF\u80FD\u6CA1\u6709\uFF08\u6CA1\u6709\u65F6\u964D\u7EA7\u5E76\u5728\u72B6\u6001\u884C\u8BF4\u660E\uFF09\u3002 */\n on?(event: string, listener: (...args: never[]) => void): unknown\n inject?(deps: string[], callback: (ctx: CtxLike) => void): unknown\n effect?(callback: () => unknown, label?: string): unknown\n webServer: {\n register(route: { kind: 'exact' | 'prefix'; path: string; handler: unknown }): () => void\n }\n}\n\n/** \u6BCF\u4E2A agent \u7684\u4E0B\u53D1\u8BB0\u8D26\u3002 */\ninterface Installed {\n readonly path: string\n readonly dispose: () => void\n /** \u4E0B\u53D1\u65F6\u9047\u5230\u7684\u95EE\u9898\uFF08\u7B2C\u4E00\u6761\uFF09\uFF0C\u7528\u4E8E\u72B6\u6001\u884C\u5982\u5B9E\u8BF4\u660E\u3002 */\n readonly failure?: string\n}\n\n/** \u53D6\u666E\u901A\u5BF9\u8C61\u3002 */\nfunction objectOf(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n}\n\n/** \u53D6\u5B57\u7B26\u4E32\u3002 */\nfunction textOf(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\n/** \u9519\u8BEF \u2192 \u4E00\u884C\u3002 */\nfunction errorText(error: unknown): string {\n return error instanceof Error && error.message !== '' ? error.message : String(error)\n}\n\n/**\n * \u88C5\u4E0A\u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u5B50\u7CFB\u7EDF\u3002\n *\n * @param ctx \u5BBF\u4E3B\u534A\u4E0A\u4E0B\u6587\uFF08\u7EC4\u5408\u5C42\uFF09\u3002\n * @param namespace \u672C\u63D2\u4EF6\u7684 settings \u547D\u540D\u7A7A\u95F4\u3002\n * @param settings settings \u670D\u52A1\uFF08\u7F3A\u5E2D\u65F6\u53EA\u6302\u72B6\u6001\u8DEF\u7531\uFF0C\u4E0D\u63A5\u7BA1\u7EC8\u7AEF\uFF09\u3002\n * @param readToolDeps \u91C7\u96C6\u5DE5\u5177\u8FD0\u884C\u6240\u9700\u7684\u5BBF\u4E3B\u670D\u52A1\uFF1B`subprocess` \u7F3A\u5E2D\u65F6\u8FD4\u56DE undefined\uFF08\u964D\u7EA7\u4E3A\u53EA\u538B\u5236 pwsh\uFF09\u3002\n */\nexport function installTerminalPolicy(\n ctx: CtxLike,\n namespace: string,\n settings: SettingsLike | undefined,\n readToolDeps: () => BashToolDeps | undefined,\n options: {\n /** \u5E73\u53F0\uFF08\u9ED8\u8BA4 process.platform\uFF1B\u6D4B\u8BD5\u7528\u6765\u8D70\u975E Windows \u5206\u652F\uFF09\u3002 */\n readonly platform?: string\n /** \u63A2\u6D4B\uFF08\u9ED8\u8BA4\u8BFB\u771F\u5B9E PATH \u4E0E\u6587\u4EF6\u7CFB\u7EDF\uFF1B\u6D4B\u8BD5\u6CE8\u5165\u5047\u7ED3\u679C\uFF09\u3002 */\n readonly discover?: (explicitPath: string) => DiscoverResult\n /** \u5B58\u5728\u6027\u5224\u5B9A\uFF08\u9ED8\u8BA4 existsSync\uFF09\u3002 */\n readonly exists?: (path: string) => boolean\n } = {},\n): void {\n const platform = options.platform ?? process.platform\n const isWindows = platform === 'win32'\n const existsFn = options.exists ?? existsSync\n const installed = new Map<AgentLike, Installed>()\n let lastStatus = ''\n let lastEffective = ''\n let lastCandidates = ''\n let failure = ''\n let busy = false\n let again = false\n\n /** \u8D70\u4E00\u904D\u63A2\u6D4B\uFF08\u552F\u4E00\u78B0 node API \u7684\u5730\u65B9\u90FD\u5728\u8FD9\u91CC\uFF09\u3002 */\n const discover = options.discover ?? ((explicitPath: string): DiscoverResult => probeBash(\n explicitPath,\n process.env.PATH ?? '',\n name => process.env[name],\n path => existsFn(path),\n // \u53EA\u8BFB\u5B50\u76EE\u5F55\u540D\uFF08\u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF1AGitHub Desktop \u7684 app-*\u3001\u65E7 GitHub \u7684 PortableGit_*\u3001VS \u7684\u5E74\u4EFD/\u7248\u672C\uFF09\uFF1B\n // \u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6CA1\u6743\u9650\u4E00\u5F8B\u5F53\u7A7A\uFF0C\u63A2\u6D4B\u5C31\u9000\u5316\u6210\u7EAF\u5B58\u5728\u6027\u68C0\u67E5\u3002\n parent => {\n try {\n return readdirSync(parent, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n } catch {\n return []\n }\n },\n ))\n\n /**\n * \u5728\u4E00\u4E2A agent \u81EA\u5DF1\u7684 scope \u91CC\u4E0B\u53D1\uFF1A\u538B\u5236 pwsh + \u6CE8\u518C bash + \u6362\u63D0\u793A\u8BCD\u6BB5\u3002\n * @param agent \u76EE\u6807 agent\u3002\n * @param bashPath \u8FD9\u4E00\u8F6E\u751F\u6548\u7684 bash \u8DEF\u5F84\uFF08\u6362\u8DEF\u5F84\u65F6\u4F1A\u91CD\u65B0\u4E0B\u53D1\uFF09\u3002\n * @returns \u8BB0\u8D26\uFF1B\u62FF\u4E0D\u5230 scoped \u670D\u52A1\u65F6\u8FD4\u56DE undefined\u3002\n */\n const install = (agent: AgentLike, bashPath: string): Installed | undefined => {\n const scoped: ScopedLike = agent.ctx\n const cleanups: (() => void)[] = []\n const notes: string[] = []\n\n // 1) \u538B\u6389\u9884\u8BBE\u7684 pwsh\u3002\u540D\u5B57\u5FC5\u987B\u5DF2\u5728\u5168\u5C40\u6CE8\u518C\u8868\u91CC\uFF0C\u5426\u5219\u5B98\u65B9\u4F1A\u629B\n // `names unknown global tool \"pwsh\"` \u2014\u2014 \u90A3\u79CD\u60C5\u51B5\u8BF4\u660E\u8BE5 agent \u672C\u6765\u5C31\u770B\u4E0D\u5230 pwsh\uFF0C\n // \u8BB0\u4E00\u884C\u539F\u56E0\u8DF3\u8FC7\u5373\u53EF\uFF08A \u7684\u65E5\u5FD7\u91CC\u4E5F\u662F\u8FD9\u4E48\u5904\u7406\u7684\uFF09\u3002\n try {\n const lift = scoped.tools?.restrict({ deny: ['pwsh'] })\n if (typeof lift === 'function') cleanups.push(lift)\n } catch (error: unknown) {\n notes.push(`restrict(pwsh) \u8DF3\u8FC7\uFF1A${errorText(error)}`)\n }\n\n // 2) \u6CE8\u518C bash \u5DE5\u5177\u3002\u6CE8\u518C\u5728**\u8BE5 agent \u81EA\u5DF1\u7684 scope**\uFF1Arestrict \u53EA\u4F5C\u7528\u4E8E\u5168\u5C40\u5DE5\u5177\uFF0C\n // \u4E0D\u4F1A\u9690\u85CF\u81EA\u8EAB\u6CE8\u518C\uFF08\u5B98\u65B9 view() \u7684\u8BED\u4E49\uFF09\u3002\n try {\n const deps = readToolDeps()\n if (deps === undefined) {\n notes.push('\u5BBF\u4E3B\u6CA1\u6709 subprocess \u670D\u52A1\uFF0C\u65E0\u6CD5\u6CE8\u518C bash')\n } else {\n const definition = createBashTool(deps, { bashPath, sep, isAbsolute })\n const unregister = scoped.tools?.register(definition as ToolDefinitionLike)\n if (typeof unregister === 'function') cleanups.push(unregister)\n }\n } catch (error: unknown) {\n notes.push(`\u6CE8\u518C bash \u5931\u8D25\uFF1A${errorText(error)}`)\n }\n\n // 3) \u63D0\u793A\u8BCD\uFF1A\u52A0 bash \u7684\u90A3\u53E5\uFF08\u5B98\u65B9 `tool:bash` \u6BB5\uFF09\uFF0C\u5E76\u5728**\u672C scope \u7684\u88C5\u914D**\u91CC\n // \u6458\u6389\u9884\u8BBE\u7684 `tool:pwsh` \u6BB5\u3002\u7528\u7011\u5E03\u800C\u4E0D\u662F\"\u6CE8\u518C\u7A7A\u540C\u540D\u6BB5\"\uFF1A\u5B98\u65B9\u660E\u786E\n // \u300C\u6BB5\u540D\u552F\u4E00\u3001\u91CD\u590D\u6CE8\u518C\u4F1A\u629B\u300D\uFF0C\u800C\u6309\u540D\u5B57\u8FC7\u6EE4 sections \u662F\u5B98\u65B9\u73B0\u6210\u505A\u6CD5\n // \uFF08`browser-use-runtime` \u7684 mcp.ts \u5C31\u662F\u8FD9\u4E48\u6458\u6389\u81EA\u5DF1\u90A3\u6BB5\uFF09\u3002\n try {\n const bashSection = scoped.systemPrompt?.section({\n name: 'tool:bash', order: TOOL_BASH_SECTION_ORDER, text: BASH_SECTION_TEXT,\n })\n if (typeof bashSection === 'function') cleanups.push(bashSection)\n const dropPwsh = scoped.on?.('system-prompt/assemble', (async (\n _assembly: unknown, _context: unknown, next: () => Promise<{ sections: { name: string }[] }>,\n ) => {\n const assembly = await next()\n return { ...assembly, sections: assembly.sections.filter(section => section.name !== 'tool:pwsh') }\n }) as never)\n if (typeof dropPwsh === 'function') cleanups.push(dropPwsh)\n } catch (error: unknown) {\n notes.push(`\u63D0\u793A\u8BCD\u6BB5\u5931\u8D25\uFF1A${errorText(error)}`)\n }\n\n return {\n path: bashPath,\n dispose: () => {\n for (const cleanup of [...cleanups].reverse()) {\n try { cleanup() } catch { /* \u5DF2\u968F agent \u91CA\u653E */ }\n }\n },\n ...(notes.length === 0 ? {} : { failure: notes.join('\uFF1B') }),\n }\n }\n\n /** \u6309\u5F53\u524D\u8BBE\u7F6E\u91CD\u65B0\u4E0B\u53D1\uFF08\u5E42\u7B49\uFF1B\u53EA\u6709\u771F\u7684\u53D8\u5316\u624D\u52A8\uFF09\u3002 */\n const reconcile = (): void => {\n if (busy) {\n again = true\n return\n }\n busy = true\n void (async () => {\n const row = settings === undefined ? undefined : objectOf(settings.get(namespace))\n const mode = terminalModeFrom(row?.[TERMINAL_MODE_FIELD])\n const explicit = textOf(row?.[TERMINAL_BASH_PATH_FIELD])\n const agents = (ctx.get('agents') as AgentsLike | undefined)\n const ops: { op: 'set'; path: readonly string[]; value: unknown }[] = []\n // \u603B\u95F8 + \u8FD9\u4E00\u680F\u7684\u5F00\u5173\uFF1A`enabled`\uFF08\u7F3A\u7701\u89C6\u4E3A\u5F00\uFF09\u4E0E\u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u680F\u5F00\u5173\u90FD\u4E3A\u771F\u624D\u63A5\u7BA1\u3002\n const sectionOn = row?.['enabled'] !== false && sectionEnabledOf(TERMINAL_ENABLED_FIELD, row ?? {})\n\n if (!isWindows) {\n // \u975E Windows\uFF1A\u4E0D\u63A5\u7BA1\uFF08\u5B98\u65B9 bash \u5DE5\u5177\u672C\u6765\u5C31\u5728\uFF09\uFF0C\u53EA\u5982\u5B9E\u56DE\u62A5\u3002\n for (const entry of installed.values()) entry.dispose()\n installed.clear()\n failure = ''\n writeState(ops, {\n status: terminalStatusText({ platform, mode, candidates: [], excludedCount: 0, effective: 'unsupported' }),\n effective: 'unsupported',\n candidates: [],\n })\n await flush(ops)\n return\n }\n\n if (!sectionOn) {\n // \u8FD9\u4E00\u680F\uFF08\u6216\u603B\u5F00\u5173\uFF09\u5173\u7740\uFF1A\u4E00\u5F8B\u4E0D\u63A5\u7BA1\uFF0C\u5E76\u628A\u539F\u56E0\u5199\u8FDB\u72B6\u6001\u884C\u3002\n // \u5019\u9009\u4E5F\u6E05\u7A7A\uFF1A\u6CA1\u63A5\u7BA1\u65F6\u5217\u4E00\u5806\u8DEF\u5F84\u53EA\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u5DF2\u7ECF\u751F\u6548\u4E86\u3002\n for (const entry of installed.values()) entry.dispose()\n installed.clear()\n failure = ''\n writeState(ops, { status: TERMINAL_OFF_TEXT, effective: 'pwsh', candidates: [] })\n await flush(ops)\n return\n }\n\n const found = discover(explicit)\n const candidates = candidatesToStored(found.candidates)\n const bashPath = activeBashPath(mode, explicit, candidates, found.explicit)\n const usable = bashPath !== '' && existsFn(bashPath)\n\n if (usable) {\n for (const agent of agents?.list() ?? []) {\n const current = installed.get(agent)\n if (current !== undefined && current.path === bashPath) continue\n if (current !== undefined) {\n current.dispose()\n installed.delete(agent)\n }\n const record = install(agent, bashPath)\n if (record !== undefined) installed.set(agent, record)\n }\n } else {\n for (const entry of installed.values()) entry.dispose()\n installed.clear()\n failure = ''\n }\n\n const firstFailure = [...installed.values()].find(entry => entry.failure !== undefined)?.failure\n writeState(ops, {\n status: terminalStatusText({\n platform,\n mode,\n candidates,\n excludedCount: found.excluded.length,\n ...(found.explicit === undefined ? {} : { explicit: found.explicit }),\n effective: usable ? 'bash' : 'pwsh',\n ...(usable ? { effectivePath: bashPath } : {}),\n ...(firstFailure === undefined && failure === '' ? {} : { failure: firstFailure ?? failure }),\n }),\n effective: usable ? 'bash' : 'pwsh',\n candidates,\n })\n await flush(ops)\n })()\n .catch((error: unknown) => {\n console.error('[composer-ux] \u7EC8\u7AEF\u7B56\u7565\u4E0B\u53D1\u5931\u8D25', error)\n })\n .finally(() => {\n busy = false\n if (again) {\n again = false\n reconcile()\n }\n })\n }\n\n /** \u53EA\u5728\u771F\u7684\u53D8\u5316\u65F6\u5199\u72B6\u6001\u5B57\u6BB5\uFF08\u907F\u514D\u81EA\u89E6\u53D1\u56DE\u73AF\uFF09\u3002 */\n const writeState = (\n ops: { op: 'set'; path: readonly string[]; value: unknown }[],\n next: { status: string; effective: string; candidates: readonly TerminalCandidate[] },\n ): void => {\n const candidatesJson = JSON.stringify(next.candidates)\n if (next.status !== lastStatus) {\n lastStatus = next.status\n ops.push({ op: 'set', path: [TERMINAL_STATUS_FIELD], value: next.status })\n }\n if (next.effective !== lastEffective) {\n lastEffective = next.effective\n ops.push({ op: 'set', path: [TERMINAL_EFFECTIVE_FIELD], value: next.effective })\n }\n if (candidatesJson !== lastCandidates) {\n lastCandidates = candidatesJson\n ops.push({ op: 'set', path: [TERMINAL_CANDIDATES_FIELD], value: next.candidates })\n }\n }\n\n /** \u843D\u76D8\uFF08values \u4E3A\u7A7A\u65F6\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\n const flush = async (ops: readonly { op: 'set'; path: readonly string[]; value: unknown }[]): Promise<void> => {\n if (ops.length === 0 || settings === undefined) return\n try {\n await settings.mutate(namespace, ops)\n } catch (error: unknown) {\n console.error('[composer-ux] \u7EC8\u7AEF\u72B6\u6001\u5199\u5165\u5931\u8D25', error)\n }\n }\n\n // \u2500\u2500 \u4E8B\u4EF6\u63A5\u7EBF \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // \u65B0\u4F1A\u8BDD\uFF08agent \u521B\u5EFA\uFF09\u7ACB\u523B\u4E0B\u53D1\uFF1Bagent \u91CA\u653E\u65F6\u6E05\u8BB0\u8D26\uFF08\u5B83 scope \u91CC\u7684\u4E1C\u897F\u968F\u4E4B\u91CA\u653E\uFF09\u3002\n // \u6CA1\u6709\u4E8B\u4EF6\u80FD\u529B\u7684\u4E0A\u4E0B\u6587\uFF08\u6D4B\u8BD5\u66FF\u8EAB\uFF09\u4E0D\u7B97\u81F4\u547D\uFF0C\u4F46**\u5FC5\u987B\u8BA9\u7528\u6237\u770B\u89C1**\uFF1A\u72B6\u6001\u884C\u4F1A\u5199\u660E\u3002\n if (typeof ctx.on !== 'function') {\n failure = '\u4E0A\u4E0B\u6587\u4E0D\u652F\u6301\u4E8B\u4EF6\uFF0C\u65E0\u6CD5\u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u4E0B\u53D1'\n }\n ctx.on?.('agent/created', (() => { reconcile() }) as never)\n ctx.on?.('agent/disposed', ((payload: { agent?: AgentLike }) => {\n if (payload?.agent !== undefined) installed.delete(payload.agent)\n }) as never)\n if (settings !== undefined) ctx.on?.('settings/updated', (() => { reconcile() }) as never)\n\n // \u2500\u2500 \u8BBE\u7F6E\u9875\u7684\u67E5\u8BE2/\u53D1\u73B0\u63A5\u53E3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: '/composer-ux/terminal',\n handler: async (req: { method?: string }, res: {\n statusCode?: number\n writeHead: (code: number, headers: Record<string, string>) => void\n end: (body?: string) => void\n }): Promise<void> => {\n const send = (code: number, payload: unknown): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })\n res.end(JSON.stringify(payload))\n }\n // \u5B98\u65B9\u6BCF\u6761\u8DEF\u7531\u90FD\u5148\u8FC7\u8FD9\u4E00\u9053\uFF1A\u672C\u673A\u7684 webServer \u7ED1\u5728 0.0.0.0\uFF08\u7528\u6237\u8FD8\u4F1A\u4ECE\u4E2D\u7EE7\u8FDC\u7A0B\u8BBF\u95EE\uFF09\uFF0C\n // \u800C\u8FD9\u6761\u63A5\u53E3\u4F1A\u56DE\u4F20\u672C\u5730 bash \u8DEF\u5F84\uFF0C\u4E0D\u8BBE\u9632\u7B49\u4E8E\u628A\u672C\u673A\u76EE\u5F55\u7ED3\u6784\u900F\u51FA\u53BB\u3002\n const connection = ctx.get('connection') as\n { requestRejection?: (request: unknown) => number | undefined } | undefined\n const rejection = connection?.requestRejection?.(req)\n if (rejection !== undefined) {\n res.statusCode = rejection\n res.end()\n return\n }\n const method = (req.method ?? 'GET').toUpperCase()\n const row = settings === undefined ? undefined : objectOf(settings.get(namespace))\n const mode = terminalModeFrom(row?.[TERMINAL_MODE_FIELD])\n const explicit = textOf(row?.[TERMINAL_BASH_PATH_FIELD])\n if (method === 'POST') {\n // \u300C\u81EA\u52A8\u53D1\u73B0\u300D\uFF1A\u91CD\u65B0\u63A2\u6D4B\u4E00\u6B21\u5E76\u5373\u65F6\u56DE\u4F20\uFF08\u5199\u76D8\u7531 reconcile \u5B8C\u6210\uFF09\u3002\n reconcile()\n const found = discover(explicit)\n send(200, {\n ok: true,\n candidates: candidatesToStored(found.candidates),\n excluded: found.excluded,\n ...(found.explicit === undefined ? {} : { explicit: found.explicit }),\n })\n return\n }\n const found = discover(explicit)\n send(200, {\n ok: true,\n platform,\n supported: isWindows,\n mode,\n bashPath: explicit,\n effective: lastEffective === '' ? 'pwsh' : lastEffective,\n status: lastStatus,\n candidates: isWindows ? candidatesToStored(found.candidates) : [],\n excluded: found.excluded,\n })\n },\n }), 'composer-ux: terminal status route')\n\n // \u542F\u52A8\u5373\u5BF9\u9F50\u4E00\u6B21\uFF08\u4E0E settings \u6587\u6863\u91CC\u7684\u73B0\u72B6\u4E00\u81F4\u4E3A\u6B62\uFF09\u3002\n reconcile()\n // \u4F9B\u5916\u90E8\uFF08settings \u53D8\u5316\u7684\u515C\u5E95\u8DEF\u5F84\uFF09\u4E3B\u52A8\u89E6\u53D1\u4E00\u6B21\u3002\n return\n}\n\n/** \u8BFB\u4E00\u4EFD\u5BBF\u4E3B\u534A\u81EA\u6301\u7684\u5019\u9009\uFF08\u6D4B\u8BD5\u4E0E\u754C\u9762\u5171\u7528\u540C\u4E00\u5957\u51C0\u5316\uFF09\u3002 */\nexport function storedCandidates(row: unknown): readonly TerminalCandidate[] {\n return sanitizeTerminalCandidates(objectOf(row)?.[TERMINAL_CANDIDATES_FIELD])\n}\n\n/** \u8BFB\u6863\u4F4D\uFF08\u6D4B\u8BD5\u7528\uFF09\u3002 */\nexport function storedMode(row: unknown): TerminalMode {\n return terminalModeFrom(objectOf(row)?.[TERMINAL_MODE_FIELD])\n}\n", "/**\n * \u6C99\u7BB1\u7B56\u7565\u4E0E\u5347\u7EA7\u5BA1\u6279\uFF1A\u4E0E\u5B98\u65B9 `@deepseek-ai/dsh-sandbox`\uFF08`src/escalation.ts`\uFF09**\u540C\u8BED\u4E49**\u7684\n * \u672C\u5730\u5B9E\u73B0\u3002\n *\n * \u4E3A\u4EC0\u4E48\u672C\u5730\u5B9E\u73B0\u800C\u4E0D\u662F import\uFF1A\u672C\u63D2\u4EF6\u5BBF\u4E3B\u534A\u662F\u81EA\u5305\u542B\u4EA7\u7269\uFF08build.mjs \u53EA\u5185\u8054\n * schemastery/cosmokit\uFF09\uFF0C\u5F15\u5B98\u65B9\u8FD0\u884C\u65F6\u4F1A\u628A\u5B83\u7ED1\u6B7B\u5728\u67D0\u4E2A DSH \u7248\u672C\uFF0C\u5E76\u4E14\u5E02\u573A\u4F53\u68C0\u4F1A\u56E0\u4E3A\n * \u300C\u4F9D\u8D56\u4E86\u5171\u4EAB\u5BBF\u4E3B\u5305\u300D\u7ED9\u51FA\u8B66\u544A\u3002\u800C\u8FD9\u4E9B\u8BED\u4E49\u672C\u8EAB\u662F**\u7A33\u5B9A\u7684\u5951\u7EA6**\uFF08\u6A21\u5F0F\u8BCD\u6C47\u3001\u66F4\u5BBD\u987A\u5E8F\u3001\n * \u5BA1\u6279\u6587\u6848\u3001fail-closed \u89C4\u5219\uFF09\uFF0C\u9010\u5B57\u7167\u6284\u6BD4\"\u7528\u4E0D\u4E86\u5C31\u5D29\"\u66F4\u53EF\u9760\u3002\n *\n * \u4E09\u5904\u5FC5\u987B\u9010\u5B57\u4E00\u81F4\uFF0C\u5426\u5219\u7528\u6237\u770B\u5230\u7684\u6587\u6848\u4F1A\u4E0E\u5B98\u65B9\u5DE5\u5177\u4E0D\u540C\uFF1A\n * - `sandboxDenialMarker` / `escalationHintMarker` \u7684\u6587\u672C\uFF1B\n * - `WIDER_MODES` \u7684\u4E25\u683C\u66F4\u5BBD\u987A\u5E8F\uFF08\u300C\u4E0D\u66F4\u5BBD\u300D\u662F\u9519\u8BEF\uFF0C\u4E0D\u662F\u7A7A\u64CD\u4F5C\uFF09\uFF1B\n * - \u5BA1\u6279\u5931\u8D25\u6587\u6848\u4E0E fail-closed\uFF08\u6CA1\u6709\u5BA1\u6279\u670D\u52A1 / \u6CA1\u6709 agent \u90FD\u5FC5\u987B\u62D2\u7EDD\uFF0C\u4E0D\u80FD\u653E\u884C\uFF09\u3002\n */\n\n/** \u6587\u4EF6\u6548\u679C\u6A21\u5F0F\u3002 */\nexport type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access'\n\n/** \u53EF\u88AB confining \u7684\u6A21\u5F0F\uFF08`danger-full-access` \u4E0D\u53D7\u9650\uFF0C\u6545\u4E0D\u5728\u5176\u4E2D\uFF09\u3002 */\nexport type ConfinedSandboxMode = Exclude<SandboxMode, 'danger-full-access'>\n\n/** \u6BCF\u6761\u6A21\u5F0F\u80FD\u5347\u7EA7\u5230\u7684\u66F4\u5BBD\u6A21\u5F0F\uFF08\u987A\u5E8F\u5373\u4F18\u5148\u7EA7\uFF09\u3002 */\nexport const WIDER_MODES: Record<string, readonly SandboxMode[]> = {\n 'read-only': ['workspace-write', 'danger-full-access'],\n 'workspace-write': ['danger-full-access'],\n}\n\n/** \u5347\u7EA7\u76EE\u6807\u7684\u5C01\u95ED\u8BCD\u6C47\uFF08\u6CA1\u6709\u4EFB\u4F55\u4E1C\u897F\u4F1A\u5347\u7EA7\u5230 read-only\uFF09\u3002 */\nexport const ESCALATION_TARGETS: readonly SandboxMode[] = ['workspace-write', 'danger-full-access']\n\n/** \u4E00\u6B21\u8C03\u7528\u7684\u5B8C\u6574\u7B56\u7565\uFF08\u5B98\u65B9 `SandboxExecutionPolicy`\uFF09\u3002 */\nexport interface SandboxExecutionPolicy {\n readonly mode: SandboxMode\n /** `workspace-write` \u7684\u7EDD\u5BF9\u6839\u76EE\u5F55\u3002 */\n readonly workspaceRoot: string\n readonly sessionId?: string\n}\n\n/** `sandbox.confine` \u7684\u8FD4\u56DE\u503C\uFF08\u5B98\u65B9 `ConfinedArgv`\uFF09\u3002 */\nexport interface ConfinedArgv {\n /** \u5305\u597D\u540E\u5E94\u5F53 spawn \u7684 argv\u3002 */\n readonly argv: readonly string[]\n readonly enforcement: 'full' | 'partial'\n /** \u8BE5\u540E\u7AEF\u62D2\u7EDD\u6587\u4EF6\u6548\u679C\u65F6 stderr \u91CC\u4F1A\u51FA\u73B0\u7684\u7279\u5F81\u4E32\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\u3002 */\n readonly denialSignatures: readonly string[]\n /** runner \u81EA\u8EAB\u5931\u8D25\u7684\u5224\u5B9A\u89C4\u5219\uFF1B\u547D\u4E2D\u8BF4\u660E\"\u547D\u4EE4\u6CA1\u8DD1\"\uFF0C\u4E0E\"\u88AB\u62D2\u7EDD\"\u4E0D\u540C\u3002 */\n readonly runnerFailureRules: readonly {\n readonly allowedExitCodes?: readonly number[]\n readonly fatalSignatures: readonly string[]\n readonly informationalLines?: readonly string[]\n }[]\n}\n\n/** \u53EA\u53D6\u672C\u63D2\u4EF6\u7528\u5F97\u5230\u7684\u90A3\u4E00\u9762\uFF08\u7ED3\u6784\u6027\u7A84\u5316\uFF0C\u4E0D import \u5B98\u65B9\u7C7B\u578B\uFF09\u3002 */\nexport interface SandboxLike {\n confine(argv: readonly string[], policy: SandboxExecutionPolicy, signal?: AbortSignal): Promise<ConfinedArgv>\n}\n\n/** \u7B56\u7565\u89E3\u6790\u670D\u52A1\uFF08\u5B98\u65B9 `SandboxPolicyService.resolve`\uFF09\u3002 */\nexport interface SandboxPolicyLike {\n resolve(request?: { readonly session?: unknown; readonly mode?: SandboxMode }): SandboxExecutionPolicy\n}\n\n/** \u5BA1\u6279\u7ED3\u679C\uFF08\u5B98\u65B9 `ApprovalOutcome`\uFF09\u3002 */\nexport type EscalationOutcome = 'allowed-once' | 'rejected' | 'cancelled' | 'unavailable'\n\n/** \u5BA1\u6279\u670D\u52A1\u7684\u7ED3\u6784\u9762\uFF08\u5B98\u65B9 `EscalationApprover`\uFF09\u3002 */\nexport interface EscalationApproverLike<A = unknown, C = string> {\n request(req: {\n agent: A\n toolName: string\n callId: C\n reason: string\n signal?: AbortSignal\n }): Promise<EscalationOutcome>\n}\n\n/** \u8BF7\u6C42\u5347\u7EA7\u6240\u9700\u7684\u4E0A\u4E0B\u6587\u3002 */\nexport interface EscalationApproval<A = unknown, C = string> {\n readonly approver: EscalationApproverLike<A, C> | undefined\n readonly agent: A | undefined\n readonly callId: C\n readonly toolName: string\n readonly signal?: AbortSignal\n}\n\n/** \u5347\u7EA7\u8BF7\u6C42\u3002 */\nexport interface EscalationRequest {\n readonly requestedMode: string\n readonly justification: string\n /** \u672C\u6B21\u8C03\u7528\u7684\u5F53\u524D\u6A21\u5F0F\uFF1B\u4E0E\u5B83\u76F8\u540C\u65F6\u65E0\u9700\u5BA1\u6279\u3002 */\n readonly effectiveMode: SandboxMode\n /** \u9762\u5411\u7528\u6237\u7684\u52A8\u4F5C\u540D\u8BCD\uFF08bash \u662F `command`\uFF0C\u6587\u4EF6\u64CD\u4F5C\u662F `operation`\uFF09\u3002 */\n readonly subject: string\n}\n\n/** \u6C99\u7BB1\u62D2\u7EDD\u6807\u8BB0\uFF08\u4E0E\u5B98\u65B9\u9010\u5B57\u4E00\u81F4\uFF09\u3002 */\nexport function sandboxDenialMarker(mode: SandboxMode | string): string {\n return `[sandbox: file access denied under ${mode} mode]`\n}\n\n/** \u5347\u7EA7\u63D0\u793A\u6807\u8BB0\uFF08\u4E0E\u5B98\u65B9\u9010\u5B57\u4E00\u81F4\uFF09\u3002 */\nexport function escalationHintMarker(subject: string): string {\n return `[sandbox: escalation available \u2014 retry this exact ${subject} once with sandbox_permissions `\n + '(the narrowest wider mode that suffices) + justification; the approval prompt asks the user]'\n}\n\n/** \u5347\u7EA7\u53C2\u6570\u6821\u9A8C\uFF08\u4E0E\u5B98\u65B9\u9010\u5B57\u4E00\u81F4\u7684\u4E09\u6761\u9519\u8BEF\uFF09\u3002 */\nexport function validateEscalationArgs(\n sandboxPermissions: string | undefined,\n justification: string | undefined,\n): void {\n if (sandboxPermissions !== undefined && justification === undefined) {\n throw new Error('invalid escalation: sandbox_permissions requires a justification')\n }\n if (justification !== undefined && sandboxPermissions === undefined) {\n throw new Error('invalid escalation: justification is only valid together with sandbox_permissions')\n }\n if (justification !== undefined && justification.trim().length === 0) {\n throw new Error('invalid justification: expected a non-empty sentence')\n }\n}\n\n/**\n * \u5BA1\u6279\u4E00\u6B21\u5347\u7EA7\uFF08\u4E0E\u5B98\u65B9 `approveEscalation` \u540C\u8BED\u4E49\uFF09\u3002\n *\n * \u51E0\u4E2A\u523B\u610F\u7684\u884C\u4E3A\uFF0C\u522B\"\u987A\u624B\u4F18\u5316\"\uFF1A\n * - \u8BF7\u6C42\u7684\u6A21\u5F0F\u4E0E\u5F53\u524D\u6A21\u5F0F**\u76F8\u540C**\u65F6\u76F4\u63A5\u8FD4\u56DE\uFF0C\u4E0D\u6253\u6270\u7528\u6237\uFF1B\n * - \u4E0D\u662F**\u4E25\u683C\u66F4\u5BBD**\u5C31\u62A5\u9519\uFF08`read-only \u2192 read-only` \u4E0D\u662F\u7A7A\u64CD\u4F5C\uFF0C\u662F\u914D\u7F6E\u9519\u8BEF\uFF09\uFF1B\n * - \u6CA1\u6709\u5BA1\u6279\u670D\u52A1\u3001\u6216\u6CA1\u6709 agent \u53EF\u8DEF\u7531\u65F6**\u4E00\u5F8B\u62D2\u7EDD**\uFF08fail-closed\uFF0C\u7EDD\u4E0D\u9ED8\u8BA4\u653E\u884C\uFF09\u3002\n * @param request \u5347\u7EA7\u8BF7\u6C42\u3002\n * @param approval \u5BA1\u6279\u4E0A\u4E0B\u6587\u3002\n * @returns \u83B7\u6279\u7684\u6A21\u5F0F\u3002\n */\nexport async function approveEscalation<A, C>(\n request: EscalationRequest,\n approval: EscalationApproval<A, C>,\n): Promise<SandboxMode> {\n const { requestedMode: mode, effectiveMode, justification, subject } = request\n if (mode === effectiveMode) return effectiveMode\n if (!(WIDER_MODES[effectiveMode] ?? []).includes(mode as SandboxMode)) {\n throw new Error(`sandbox escalation to \"${mode}\" is not strictly wider than this call's current \"${effectiveMode}\" mode`)\n }\n if (approval.approver === undefined) {\n throw new Error(`sandbox escalation to \"${mode}\" requires approval, but no approval service is composed`)\n }\n if (approval.agent === undefined) {\n throw new Error(`sandbox escalation to \"${mode}\" requires approval, but the call has no agent to route it through`)\n }\n const outcome = await approval.approver.request({\n agent: approval.agent,\n toolName: approval.toolName,\n callId: approval.callId,\n reason: `escalate sandbox to ${mode}: ${justification}`,\n ...approval.signal === undefined ? {} : { signal: approval.signal },\n })\n switch (outcome) {\n case 'allowed-once': return mode as SandboxMode\n case 'rejected': throw new Error(`the user rejected escalating this ${subject} to \"${mode}\"`)\n case 'cancelled': throw new Error(`approval for escalating to \"${mode}\" was cancelled`)\n case 'unavailable': throw new Error(`sandbox escalation to \"${mode}\" requires approval, but no approval channel is available`)\n default: throw new Error(`unexpected escalation outcome ${JSON.stringify(outcome)}`)\n }\n}\n", "/**\n * bash \u5DE5\u5177\u7684\u7ED3\u679C\u6E32\u67D3\u4E0E\u9000\u51FA\u72B6\u6001\u89E3\u6790\u3002\n *\n * \u8FD9\u91CC\u7684\u6BCF\u4E00\u6839\u5B57\u7B26\u4E32\u90FD**\u9010\u5B57\u5BF9\u9F50**\u5B98\u65B9 `@deepseek-ai/dsh-tool-bash`\uFF08+ `dsh-shell` \u7684\n * render / `dsh-sandbox` \u7684\u4E24\u4E2A\u6807\u8BB0\uFF09\uFF0C\u56E0\u4E3A\u5B83\u4EEC\u662F**\u6A21\u578B\u770B\u5230\u7684\u884C\u4E3A**\uFF1A\u6807\u8BB0\u987A\u5E8F\u3001`[stderr]`\n * \u5934\u3001`(no output)` \u515C\u5E95\u3001\u4EE5\u53CA\"\u9000\u51FA\u72B6\u6001\u5FC5\u987B\u6302\u5728\u6700\u672B\u5C3E\"\uFF08\u7EC8\u7AEF\u5361\u7247\u9760\u8FD9\u4E2A\u951A\u70B9\u628A\u5B83\u62C6\u6210 pill\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u76F4\u63A5 import \u5B98\u65B9\u5305\uFF1A\u672C\u63D2\u4EF6\u7684\u5BBF\u4E3B\u534A\u662F\u81EA\u5305\u542B\u4EA7\u7269\uFF08\u89C1 build.mjs\uFF0C\u53EA\u5185\u8054\n * schemastery/cosmokit\uFF09\uFF0C\u5F15\u5165\u5B98\u65B9\u8FD0\u884C\u65F6\u4F1A\u628A\u5B83\u7ED1\u6B7B\u5728\u67D0\u4E2A DSH \u7248\u672C\u4E0A\uFF0C\u8FD8\u4F1A\u8BA9\u5E02\u573A\u4F53\u68C0\n * \u62A5\u300C\u4F9D\u8D56\u4E86\u5171\u4EAB\u5BBF\u4E3B\u5305\u300D\u3002\u5B98\u65B9\u90A3 5 \u4E2A\u8FD0\u884C\u65F6\u7B26\u53F7\uFF08\u5E38\u91CF\u4E0E\u4E24\u4E2A\u7EAF\u51FD\u6570\u5F0F\u7684\u6807\u8BB0\u6784\u9020\u5668\uFF09\n * \u5728\u8FD9\u91CC\u672C\u5730\u7B49\u4EF7\u5B9E\u73B0\uFF0C\u884C\u4E3A\u4E00\u81F4\u3002\n */\n\nimport {\n ESCALATION_TARGETS, escalationHintMarker, sandboxDenialMarker, type SandboxMode,\n} from './sandbox.ts'\n\nexport { ESCALATION_TARGETS, escalationHintMarker, sandboxDenialMarker, type SandboxMode }\n\n/** \u53D7\u7BA1\u73AF\u5883\u53D8\u91CF\u7684\u524D\u7F00\uFF08\u5B98\u65B9 `DSH_ENV_PREFIX`\uFF09\u3002 */\nexport const DSH_ENV_PREFIX = 'DSH_'\n\n/** \u4E00\u6BB5\u6D41\u5F0F\u8F93\u51FA\uFF08\u5B98\u65B9 `CollectedOutput` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface StreamOutput {\n readonly text: string\n readonly truncated: boolean\n readonly spillPath?: string\n}\n\n/** \u6C99\u7BB1\u4E8B\u5B9E\u3002 */\nexport interface SandboxFacts {\n readonly mode: SandboxMode | string\n readonly denied: boolean\n readonly enforcement?: string\n readonly runnerFailed?: boolean\n}\n\n/** \u4E00\u6B21\u524D\u53F0\u6267\u884C\u7684\u7ED3\u679C\uFF08\u5B98\u65B9 `ShellRunResult` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface BashRunResult {\n readonly exitCode: number | null\n readonly signal: string | null\n readonly timedOut: boolean\n readonly aborted: boolean\n readonly timeoutMs: number\n readonly stdout: StreamOutput\n readonly stderr: StreamOutput\n readonly sandbox?: SandboxFacts\n}\n\n/** \u540E\u53F0\u4EFB\u52A1\u589E\u91CF\u8BFB\u53D6\u7684\u4E00\u5E27\uFF08\u5B98\u65B9 `ShellProcessRead` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface ProcessRead {\n readonly delta: string\n readonly lossy: boolean\n readonly stdoutSpillPath?: string\n readonly stderrSpillPath?: string\n}\n\n/** \u9000\u51FA\u72B6\u6001\u62C6\u89E3\u7ED3\u679C\uFF1A\u6B63\u6587 + \u8981\u4E48 exitCode\u3001\u8981\u4E48 signal\u3002 */\nexport type ParsedExitStatus = { readonly body: string } & (\n | { readonly exitCode: number }\n | { readonly signal: string }\n)\n\n/**\n * \u62C6\u51FA\u672B\u5C3E\u7684\u9000\u51FA\u72B6\u6001\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u951A\u5728**\u672B\u5C3E**\uFF1A\u7EC8\u7AEF\u5361\u7247\u628A exit \u72B6\u6001\u663E\u793A\u6210\u72EC\u7ACB\u7684 pill\uFF0C\u6807\u8BB0\u5F97\u4ECE\u6B63\u6587\u91CC\u6458\u6389\uFF1B\n * \u5B98\u65B9\u56E0\u6B64\u628A\u6807\u8BB0\u653E\u5728\u6700\u540E\uFF0C\u5E76\u7528 `$` \u951A\u5B9A\u3002\u6CE8\u610F `[exit code: null]`\uFF08\u8FDB\u7A0B\u88AB\u4FE1\u53F7\u6740\u6389\u3001\n * \u9000\u51FA\u7801\u672A\u77E5\uFF09**\u4E0D\u5339\u914D** `\\d+`\uFF0C\u6240\u4EE5\u5B83\u4F1A\u7559\u5728\u6B63\u6587\u91CC\u2014\u2014\u8FD9\u662F\u5B98\u65B9\u884C\u4E3A\uFF0C\u4E0D\u8981\"\u987A\u624B\u4FEE\u597D\"\u3002\n */\nexport function parseExitStatus(text: string): ParsedExitStatus {\n const signal = /\\n\\[killed by signal: ([^\\]\\n]+)\\]$/.exec(text)\n if (signal?.[1] !== undefined) return { body: text.slice(0, signal.index), signal: signal[1] }\n const exit = /\\n\\[exit code: (\\d+)\\]$/.exec(text)\n if (exit?.[1] !== undefined) return { body: text.slice(0, exit.index), exitCode: Number(exit[1]) }\n return { body: text, exitCode: 0 }\n}\n\n/** \u8F93\u51FA\u4F53\uFF1A\u622A\u65AD\u65F6\u8865\u4E00\u884C\"\u5B8C\u6574\u8F93\u51FA\u5728\u54EA\"\u3002 */\nfunction streamText(output: StreamOutput): string {\n if (!output.truncated) return output.text\n return `${output.text}\\n[output truncated; full output: ${output.spillPath ?? '(unavailable)'}]`\n}\n\n/**\n * \u524D\u53F0\u7ED3\u679C \u2192 \u7ED9\u6A21\u578B\u770B\u7684\u6B63\u6587\uFF08\u5B98\u65B9 `renderResult`\uFF09\u3002\n *\n * \u6807\u8BB0\u987A\u5E8F\u662F\u5951\u7EA6\uFF1A\u6C99\u7BB1\u62D2\u7EDD \u2192 \u5347\u7EA7\u63D0\u793A \u2192 \u8D85\u65F6 \u2192 \u6700\u540E\u624D\u662F signal **\u6216** exit code\u3002\n * \u9000\u51FA\u7801\u4E3A 0 \u4E14\u65E0\u4FE1\u53F7\u65F6\u4E0D\u4EA7\u751F\u4EFB\u4F55\u6807\u8BB0\u3002\n */\nexport function renderBashResult(result: BashRunResult, escalationModes: readonly SandboxMode[] = []): string {\n const out = streamText(result.stdout)\n const err = streamText(result.stderr)\n let body = out\n if (err.length > 0) {\n if (body.length > 0 && !body.endsWith('\\n')) body += '\\n'\n body += `[stderr]\\n${err}`\n }\n if (body.length === 0) body = '(no output)'\n const markers: string[] = []\n if (result.sandbox?.denied === true) {\n markers.push(sandboxDenialMarker(result.sandbox.mode))\n if (escalationModes.length > 0) markers.push(escalationHintMarker('command'))\n }\n if (result.timedOut) markers.push(`[timed out after ${result.timeoutMs}ms]`)\n if (result.signal !== null) markers.push(`[killed by signal: ${result.signal}]`)\n else if (result.exitCode !== 0) markers.push(`[exit code: ${result.exitCode}]`)\n if (markers.length === 0) return body\n if (!body.endsWith('\\n')) body += '\\n'\n return body + markers.join('\\n')\n}\n\n/**\n * \u540E\u53F0\u4EFB\u52A1\u7684\u4E00\u5E27 \u2192 \u7ED9\u6A21\u578B\u770B\u7684\u589E\u91CF\uFF08\u5B98\u65B9 `renderProcessRead`\uFF09\u3002\n * \u4E22\u4E86\u5185\u5B58\u91CC\u7684\u8F93\u51FA\u3001\u4EE5\u53CA\u6C99\u7BB1\u81EA\u8EAB\u5931\u8D25\uFF0C\u90FD\u8981\u5728\u8FD9\u91CC\u5982\u5B9E\u8BF4\u51FA\u6765\uFF08\u5B83\u4EEC\u4E0E\"\u547D\u4EE4\u5931\u8D25\"\u4E0D\u540C\uFF09\u3002\n */\nexport function renderProcessRead(\n read: ProcessRead,\n sandbox: SandboxFacts | undefined,\n escalationModes: readonly SandboxMode[] = [],\n): string {\n const notices: string[] = []\n if (read.lossy) {\n const paths = [read.stdoutSpillPath, read.stderrSpillPath]\n .filter((path): path is string => path !== undefined)\n notices.push('[some output was dropped from memory; full output: '\n + `${paths.length > 0 ? paths.join(', ') : '(unavailable)'}]`)\n }\n if (sandbox?.runnerFailed === true) {\n notices.push(`[sandbox: the sandbox runner itself failed under ${sandbox.mode} mode \u2014 `\n + 'the command did not run; this is a sandbox problem, not a command failure]')\n } else if (sandbox?.denied === true) {\n notices.push(sandboxDenialMarker(sandbox.mode))\n if (escalationModes.length > 0) notices.push(escalationHintMarker('command'))\n }\n if (notices.length === 0) return read.delta\n const separator = read.delta.length > 0 && !read.delta.endsWith('\\n') ? '\\n' : ''\n return `${read.delta}${separator}${notices.join('\\n')}`\n}\n", "/**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684 bash \u5DE5\u5177\uFF1A\u4E0E\u5B98\u65B9 `@deepseek-ai/dsh-tool-bash` **\u540C\u5951\u7EA6**\u7684\u81EA\u5305\u542B\u5B9E\u73B0\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u76F4\u63A5\u7528\u5B98\u65B9\u90A3\u4E2A\uFF1Awin32 \u4E0A\u5B83\u7684\u884C\u662F `disabled`\uFF08`packages/bundle/base/cordis.patch.yml`\uFF09\uFF0C\n * \u800C\u4E14\u5B83\u53EA\u6D88\u8D39 `ctx.shell` \u2014\u2014 \u800C win32 \u7684 `ctx.shell` \u6808\u662F `pwsh-sandbox`\uFF08PowerShell\uFF09\u3002\n * \u4E5F\u5C31\u662F\u8BF4\"\u542F\u7528\u5B98\u65B9 bash \u5DE5\u5177\"\u5F97\u4E0D\u5230 Git Bash\uFF0C\u5FC5\u987B\u81EA\u5DF1\u5E26\u5DE5\u5177\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u50CF\u5B98\u65B9\u90A3\u6837 `import { defineTool }`\uFF1A\u672C\u63D2\u4EF6\u5BBF\u4E3B\u534A\u662F\u81EA\u5305\u542B\u4EA7\u7269\uFF08build.mjs \u53EA\u5185\u8054\n * schemastery/cosmokit\uFF09\u3002\u6240\u4EE5\u8FD9\u91CC\u7684 `parameters` / `output.schema` \u76F4\u63A5\u5199\u6210**\u7F16\u8BD1\u540E\u7684\n * canonical JSON Schema**\uFF08\u5373 defineTool \u7F16\u8BD1\u540E\u7684\u5F62\u72B6\uFF09\uFF0C\u5B57\u6BB5\u4E0E\u5B98\u65B9**\u9010\u5B57\u4E00\u81F4**\uFF1A\n * \u6A21\u578B\u770B\u5230\u7684\u5DE5\u5177\u63CF\u8FF0\u3001\u53C2\u6570\u3001\u8F93\u51FA\u3001\u6807\u8BB0\u3001\u7EC8\u7AEF\u5361\u7247\u90FD\u5E94\u5F53\u4E0E\u5B98\u65B9\u4E0D\u53EF\u533A\u5206\u3002\n *\n * \u4E09\u5904\"\u770B\u8D77\u6765\u53EF\u4EE5\u66F4\u806A\u660E\u4F46\u6545\u610F\u7167\u6284\"\u7684\u5730\u65B9\uFF1A\n * 1. \u975E\u96F6\u9000\u51FA**\u4E0D\u662F\u9519\u8BEF**\uFF0C\u53EA\u662F\u6E32\u67D3\u6210\u672B\u5C3E\u7684 `[exit code: N]` \u6807\u8BB0\uFF1B\n * 2. `sandbox.confine` \u662F **async**\uFF08\u88C5\u5728\u4F60\u673A\u5668\u4E0A\u7684 dsh-windows-shell-policy \u5F53\u540C\u6B65\u7528\uFF0C\n * \u6240\u4EE5\u5B83\u5728\u5E26\u6C99\u7BB1\u7684\u7EC4\u5408\u91CC\u6839\u672C\u53D1\u4E0D\u8D77\u6765 \u2014\u2014 \u8FD9\u91CC\u5FC5\u987B await\uFF09\uFF1B\n * 3. \u4E2D\u6B62\u65F6\u629B\u7684\u9519\u5E26 `name='AbortError'` + `code='ABORTED'`\u3002\u5B98\u65B9\u7528 `HarnessError`\n * \uFF08`instanceof` \u624D\u80FD\u88AB registry \u8BA4\u6210 `info`\uFF09\uFF1B\u672C\u5305\u7ED3\u6784\u4E0A\u65E0\u6CD5\u63D0\u4F9B\u540C\u4E00\u4E2A\u7C7B\u8EAB\u4EFD\uFF0C\n * \u800C registry \u5BF9\"\u8C03\u7528\u65B9\u4E2D\u6B62\"\u672C\u8EAB\u5C31\u4F1A\u628A\u7ED3\u5C40\u89C4\u8303\u5316\u4E3A ABORTED\uFF0C\u6545\u8FD9\u91CC\u629B\u7ED3\u6784\u7B49\u4EF7\u7684\n * \u666E\u901A\u9519\u8BEF\uFF0C\u4EE3\u4EF7\u662F `info` \u5C11\u4E00\u6761\u6CE8\u89E3\uFF08\u5DF2\u5728\u4EA4\u63A5\u6587\u6863\u4E2D\u5982\u5B9E\u8BB0\u5F55\uFF09\u3002\n */\nimport {\n parseExitStatus, renderBashResult, renderProcessRead,\n type BashRunResult, type ProcessRead, type SandboxFacts,\n} from './render.ts'\nimport {\n ESCALATION_TARGETS, approveEscalation, validateEscalationArgs,\n type ConfinedArgv, type EscalationApproverLike, type SandboxExecutionPolicy, type SandboxLike,\n type SandboxMode, type SandboxPolicyLike,\n} from './sandbox.ts'\n\n/** \u5DE5\u5177\u540D\uFF08\u4E0E\u5B98\u65B9\u4E00\u81F4\uFF1A\u6A21\u578B\u770B\u5230\u7684\u5C31\u662F `bash`\uFF09\u3002 */\nexport const BASH_TOOL_NAME = 'bash'\n\n/** \u5DE5\u5177\u63D0\u793A\u8BCD\u6BB5\u7684\u987A\u5E8F\uFF08\u5B98\u65B9 `TOOL_BASH: 1000`\uFF09\u3002 */\nexport const TOOL_BASH_SECTION_ORDER = 1000\n\n/** pwsh \u63D0\u793A\u8BCD\u6BB5\u7684\u987A\u5E8F\uFF08\u5B98\u65B9 `TOOL_PWSH: 1010`\uFF09\u2014\u2014\u6362\u58F3\u65F6\u7528\u5B83\u538B\u6389\u9884\u8BBE\u90A3\u6BB5\u3002 */\nexport const TOOL_PWSH_SECTION_ORDER = 1010\n\n/** \u6362\u6210 bash \u540E\u5199\u8FDB\u63D0\u793A\u8BCD\u7684\u90A3\u53E5\uFF08\u5B98\u65B9\u9010\u5B57\uFF09\u3002 */\nexport const BASH_SECTION_TEXT = 'Check the [exit code: N] marker on every bash result; '\n + 'investigate failures before moving on.'\n\n/** \u8D85\u65F6\u4E0E\u8F93\u51FA\u7684\u9ED8\u8BA4\u503C\uFF08\u5B98\u65B9 bash-local \u7684\u9ED8\u8BA4\u503C\uFF09\u3002 */\nexport const DEFAULT_TIMEOUT_MS = 120_000\nexport const MAX_TIMEOUT_MS = 600_000\nexport const MAX_OUTPUT_BYTES = 64_000\nexport const MAX_SPILL_BYTES = 64 * 1024 * 1024\nexport const GRACE_MS = 3_000\n\n/** \u4E2D\u6B62\u9519\u8BEF\u7684\u7801\uFF08\u5B98\u65B9 `TOOL_ABORTED`\uFF09\u3002 */\nexport const TOOL_ABORTED = 'ABORTED'\n\n/** \u6267\u884C\u73AF\u5883\u7684\u4E09\u6761\u538B\u5236\u9879\uFF08\u5B98\u65B9 ENV_OVERRIDES\uFF1A\u8BA9\u8F93\u51FA\u7A33\u5B9A\u3001\u5C11\u5206\u9875\uFF09\u3002 */\nexport const ENV_OVERRIDES: Readonly<Record<string, string>> = {\n NO_COLOR: '1',\n TERM: 'dumb',\n PAGER: 'cat',\n GIT_PAGER: 'cat',\n}\n\n/** \u5DE5\u5177\u53C2\u6570\u3002 */\nexport interface BashToolArgs {\n readonly command: string\n readonly description: string\n readonly timeoutMs?: number\n readonly workdir?: string\n readonly run_in_background?: boolean\n readonly sandbox_permissions?: string\n readonly justification?: string\n}\n\n/** \u7ED3\u6784\u5316\u7A84\u5316\u51FA\u6765\u7684\u6267\u884C\u4E0A\u4E0B\u6587\uFF08\u53EA\u53D6\u672C\u5DE5\u5177\u7528\u5F97\u5230\u7684\u5B57\u6BB5\uFF09\u3002 */\nexport interface ToolRunContextLike {\n readonly callId: string\n readonly signal: AbortSignal\n readonly agent?: {\n readonly session: {\n readonly header: { readonly cwd?: string; readonly id?: string }\n }\n }\n}\n\n/** \u5B50\u8FDB\u7A0B\u670D\u52A1\uFF08\u5B98\u65B9 `SubprocessHandle` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface SubprocessHandleLike {\n readonly collected: {\n readonly stdout?: { readFrom(fromByte: number): { text: string; nextOffset: number; lossy: boolean; spillPath?: string } }\n readonly stderr?: { readFrom(fromByte: number): { text: string; nextOffset: number; lossy: boolean; spillPath?: string } }\n }\n readonly done: Promise<{ exitCode: number | null; signal: string | null }>\n terminate(): void\n}\n\nexport interface SubprocessLike {\n spawn(spec: {\n argv: readonly string[]\n cwd: string\n stdio: {\n stdin: 'ignore'\n stdout: { maxBytes: number; spill: { maxBytes: number } }\n stderr: { maxBytes: number; spill: { maxBytes: number } }\n }\n graceMs: number\n signal?: AbortSignal\n env: Record<string, string>\n }): SubprocessHandleLike\n}\n\n/** \u540E\u53F0 job \u7684\u94A9\u5B50\uFF08\u5B98\u65B9 `JobHooks`\uFF09\u3002 */\nexport interface JobHooksLike {\n cancel(reason?: string): void\n done: Promise<{ status: 'completed' | 'killed' | 'failed'; detail?: string }>\n readOutput?(): string\n}\n\nexport interface JobsLike {\n start(spec: {\n kind: 'bash'\n label: string\n owner?: unknown\n run(): JobHooksLike\n }): string\n}\n\n/** \u53D7\u7BA1\u73AF\u5883\u53D8\u91CF\u6536\u96C6\uFF08\u5B98\u65B9 `ctx.shellEnv.collect`\uFF09\u3002 */\nexport interface ShellEnvLike {\n collect(exec: ToolRunContextLike): Record<string, string>\n}\n\n/** \u5185\u5BB9\u5757\u4E0E\u89C6\u56FE\uFF08\u53EA\u58F0\u660E\u672C\u6587\u4EF6\u8FD4\u56DE\u7684\u90A3\u51E0\u79CD\uFF09\u3002 */\nexport type ContentBlockLike = { readonly type: 'text'; readonly text: string }\n\nexport interface ToolDefinitionLike {\n readonly name: string\n readonly description: string\n readonly parameters: Record<string, unknown>\n readonly output: {\n readonly schema: Record<string, unknown>\n render(args: unknown, value: unknown): ContentBlockLike[]\n }\n execute(args: unknown, exec: ToolRunContextLike): Promise<unknown>\n presentCall?(args: unknown): unknown\n presentResult?(args: unknown, result: { content: ContentBlockLike[]; isError: boolean }): unknown\n}\n\n/** \u5DE5\u5177\u4F9D\u8D56\uFF08\u5168\u90E8\u7ED3\u6784\u6027\u6CE8\u5165\uFF0C\u4FBF\u4E8E\u5355\u6D4B\uFF09\u3002 */\nexport interface BashToolDeps {\n readonly subprocess: SubprocessLike\n readonly sandbox?: SandboxLike\n readonly sandboxPolicy?: SandboxPolicyLike\n readonly approval?: EscalationApproverLike\n readonly jobs?: JobsLike\n readonly shellEnv?: ShellEnvLike\n}\n\n/** \u53EF\u5347\u7EA7\u7684\u6A21\u5F0F\u8868\uFF1A\u53EA\u6709\u7EC4\u5408\u91CC\u771F\u7684\u80FD confine \u65F6\u624D\u63D0\u4F9B\u5347\u7EA7\u53C2\u6570\uFF08\u5B98\u65B9\u540C\u5224\u636E\uFF09\u3002 */\nexport function escalationModesOf(deps: BashToolDeps): readonly SandboxMode[] {\n return deps.sandbox !== undefined && deps.sandboxPolicy !== undefined ? ESCALATION_TARGETS : []\n}\n\n/**\n * \u5DE5\u5177\u63CF\u8FF0\uFF08\u5B98\u65B9\u9010\u5B57\uFF09\u3002\n * @param backgroundEnabled \u662F\u5426\u66B4\u9732 `run_in_background`\u3002\n * @param escalationModes \u53EF\u5347\u7EA7\u6A21\u5F0F\uFF08\u7A7A = \u4E0D\u66B4\u9732 `sandbox_permissions`\uFF09\u3002\n * @returns \u5B8C\u6574\u63CF\u8FF0\u4E32\u3002\n */\nexport function bashDescription(backgroundEnabled: boolean, escalationModes: readonly SandboxMode[]): string {\n const background = backgroundEnabled\n ? 'Set `run_in_background: true` for long-running commands: the call returns a job id immediately; '\n + 'read its output with `job_output` and stop it with `job_kill`.'\n : 'Background execution is not available; long-running commands must finish within the timeout.'\n const base = 'Execute a bash command (`bash -c`) and return its stdout/stderr. '\n + 'Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls \u2014 '\n + 'pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. '\n + 'Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. '\n + 'Commands may run under a file sandbox; a blocked file operation is reported as '\n + '`[sandbox: file access denied under <mode> mode]` \u2014 a policy denial, not a bug in the command; '\n + 'do not retry another way. '\n + 'Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. '\n + background\n if (escalationModes.length === 0) return base\n return base + ' Attempting a command the sandbox may deny is safe and expected: run it and read the '\n + 'marker rather than assuming the denial. When a command is denied and a wider mode would let it '\n + 'succeed, escalate immediately in the same turn \u2014 the one sanctioned exception to a denial: retry '\n + 'the exact same command once with `sandbox_permissions` (the narrowest wider mode that suffices) '\n + 'plus a one-sentence `justification`. Do not detour through chat to ask permission first \u2014 the '\n + 'approval prompt raised by that retry is how the user consents. If the session states approval '\n + 'prompts are disabled, there is no exception: a denial is final \u2014 do not set `sandbox_permissions`. '\n + 'Never escalate speculatively: ground the request in a real denial \u2014 normally the one this command '\n + 'just hit; escalating up front is fine only when this session already denied the same access. '\n + 'A rejected escalation is final for that command \u2014 stop and explain, never work around '\n + 'it \u2014 but it does not forbid attempting or escalating other commands later.'\n}\n\n/** \u53C2\u6570 JSON Schema\uFF08canonical\uFF1B\u4E0E\u5B98\u65B9\u7F16\u8BD1\u540E\u7684\u5F62\u72B6\u4E00\u81F4\uFF09\u3002 */\nexport function bashParameters(escalationModes: readonly SandboxMode[]): Record<string, unknown> {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n command: { type: 'string', description: 'The bash command to execute.' },\n description: {\n type: 'string',\n description: 'Clear, concise description of what this command does in active voice, '\n + '5-10 words (shown in the UI). Examples: \"ls\" \u2192 \"List files in current directory\"; '\n + '\"git status\" \u2192 \"Show working tree status\"; \"npm install\" \u2192 \"Install package dependencies\".',\n },\n timeoutMs: {\n type: 'number',\n description: 'Timeout in milliseconds. The executor applies its configured default and cap, '\n + 'and kills the command on expiry.',\n },\n workdir: {\n type: 'string',\n description: 'Working directory for this command. Defaults to the session workspace; '\n + 'a relative path is resolved against it.',\n },\n ...(escalationModes.length === 0 ? {} : {\n sandbox_permissions: {\n type: 'string',\n enum: [...escalationModes],\n description: 'The wider sandbox mode this command needs. Only valid as a one-shot retry of a '\n + 'command the sandbox just denied; requires justification and user approval.',\n },\n justification: {\n type: 'string',\n description: 'Required with sandbox_permissions: one sentence for the user explaining why '\n + 'this exact command needs the wider access.',\n },\n }),\n },\n required: ['command', 'description'],\n }\n}\n\n/** \u8F93\u51FA JSON Schema\uFF08canonical\uFF1A\u524D\u53F0 / \u540E\u53F0\u4E24\u652F\uFF09\u3002 */\nexport function bashOutputSchema(): Record<string, unknown> {\n const stream = {\n type: 'object',\n additionalProperties: false,\n required: ['text', 'truncated'],\n properties: {\n text: { type: 'string' },\n truncated: { type: 'boolean' },\n spillPath: { type: 'string' },\n },\n }\n return {\n oneOf: [\n {\n type: 'object',\n additionalProperties: false,\n required: ['kind', 'jobId'],\n properties: {\n kind: { type: 'string', const: 'background' },\n jobId: { type: 'string' },\n },\n },\n {\n type: 'object',\n additionalProperties: false,\n required: ['kind', 'exitCode', 'signal', 'timedOut', 'aborted', 'timeoutMs', 'stdout', 'stderr'],\n properties: {\n kind: { type: 'string', const: 'foreground' },\n exitCode: { oneOf: [{ type: 'integer' }, { type: 'null' }] },\n signal: { oneOf: [{ type: 'string' }, { type: 'null' }] },\n timedOut: { type: 'boolean' },\n aborted: { type: 'boolean' },\n timeoutMs: { type: 'number' },\n stdout: stream,\n stderr: stream,\n sandbox: {\n type: 'object',\n additionalProperties: false,\n required: ['mode', 'denied'],\n properties: {\n mode: { type: 'string' },\n denied: { type: 'boolean' },\n enforcement: { type: 'string' },\n runnerFailed: { type: 'boolean' },\n },\n },\n },\n },\n ],\n }\n}\n\n/**\n * \u8D85\u65F6\u6536\u655B\u5230 [\u4E0B\u9650, \u4E0A\u9650]\uFF08\u5B98\u65B9 executor \u7684 clamp \u8BED\u4E49\uFF1A\u8BF7\u6C42\u503C\u8FC7\u5C0F\u88AB\u62AC\u5230\u9ED8\u8BA4\u3001\u8FC7\u5927\u88AB\u538B\u5230\u4E0A\u9650\uFF09\u3002\n * @param requested \u6A21\u578B\u7ED9\u7684 timeoutMs\u3002\n * @param min \u4E0B\u9650\uFF08\u5B98\u65B9 `timeoutMs`\uFF0C\u9ED8\u8BA4 120s\uFF09\u3002\n * @param max \u4E0A\u9650\uFF08\u5B98\u65B9 `maxTimeoutMs`\uFF0C\u9ED8\u8BA4 600s\uFF09\u3002\n * @returns \u5B9E\u9645\u8D85\u65F6\u6BEB\u79D2\u6570\u3002\n */\nexport function clampTimeout(requested: number | undefined, min: number, max: number): number {\n if (requested === undefined || !Number.isFinite(requested) || requested <= 0) return min\n return Math.min(Math.max(requested, min), max)\n}\n\n/**\n * \u89E3\u6790\u5DE5\u4F5C\u76EE\u5F55\uFF08\u5B98\u65B9 `resolveWorkdir`\uFF09\u3002\n *\n * \u523B\u610F\u4E0E\u5B98\u65B9\u4E00\u81F4\uFF1A**\u7B56\u7565\u91CC\u7684 workspaceRoot \u4F18\u5148\u4E8E\u4F1A\u8BDD cwd**\uFF08\u6C99\u7BB1\u628A\u53EF\u5199\u8FB9\u754C\u5F53\u4F5C\u5DE5\u4F5C\u76EE\u5F55\uFF09\uFF0C\n * \u76F8\u5BF9\u8DEF\u5F84\u7528 `sep` \u62FC\u63A5\u800C**\u4E0D\u662F** `resolve()`\uFF08\u907F\u514D\u628A\u4E00\u4E2A\u4E0D\u5B58\u5728\u7684\u8DEF\u5F84\u89C4\u8303\u5316\u6210\u522B\u7684\u4E1C\u897F\uFF09\u3002\n * @param modelWorkdir \u6A21\u578B\u7ED9\u7684 workdir\u3002\n * @param exec \u6267\u884C\u4E0A\u4E0B\u6587\u3002\n * @param policyWorkspaceRoot \u7B56\u7565\u91CC\u7684 workspaceRoot\u3002\n * @param sep \u5E73\u53F0\u5206\u9694\u7B26\u3002\n * @param isAbsolute \u5224\u5B9A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u6CE8\u5165\u4EE5\u4FBF\u5355\u6D4B\uFF09\u3002\n * @returns \u5DE5\u4F5C\u76EE\u5F55\uFF1B\u90FD\u6CA1\u6709\u65F6 undefined\uFF08\u7531\u8C03\u7528\u65B9\u515C\u5E95\uFF09\u3002\n */\nexport function resolveWorkdir(\n modelWorkdir: string | undefined,\n exec: ToolRunContextLike,\n policyWorkspaceRoot: string | undefined,\n sep: string,\n isAbsolute: (path: string) => boolean,\n): string | undefined {\n const headerCwd = exec.agent?.session.header.cwd\n const sessionCwd = policyWorkspaceRoot ?? headerCwd\n if (modelWorkdir === undefined) return sessionCwd\n if (sessionCwd !== undefined && !isAbsolute(modelWorkdir)) return `${sessionCwd}${sep}${modelWorkdir}`\n return modelWorkdir\n}\n\n/** \u9020\u4E00\u4E2A\"\u4E2D\u6B62\"\u9519\u8BEF\uFF08\u7ED3\u6784\u7B49\u4EF7\u4E8E\u5B98\u65B9\u7684 HarnessError + name \u8986\u5199\uFF09\u3002 */\nfunction abortedError(): Error {\n const error = new Error('tool call aborted') as Error & { code?: string }\n error.name = 'AbortError'\n error.code = TOOL_ABORTED\n return error\n}\n\n/**\n * \u521B\u5EFA bash \u5DE5\u5177\u5B9A\u4E49\u3002\n *\n * @param deps \u7ED3\u6784\u6027\u6CE8\u5165\u7684\u670D\u52A1\uFF08subprocess \u5FC5\u9700\uFF0C\u5176\u4F59\u7F3A\u7701\u5373\u964D\u7EA7\uFF09\u3002\n * @param options `bashPath` \u662F Git Bash \u53EF\u6267\u884C\u6587\u4EF6\uFF1B`sep`/`isAbsolute` \u6CE8\u5165\u4EE5\u4FBF\u8DE8\u5E73\u53F0\u5355\u6D4B\u3002\n * @returns \u53EF\u76F4\u63A5\u4EA4\u7ED9 `tools.register()` \u7684\u5DE5\u5177\u5B9A\u4E49\u3002\n */\nexport function createBashTool(\n deps: BashToolDeps,\n options: {\n readonly bashPath: string\n readonly sep?: string\n readonly isAbsolute?: (path: string) => boolean\n /** \u8D85\u65F6\u4E0B\u9650\uFF08\u9ED8\u8BA4 120s\uFF09\u3002\u53EF\u6CE8\u5165\uFF1A\u5C0F\u503C\u8BA9\u8D85\u65F6\u8DEF\u5F84\u80FD\u88AB\u6D4B\u5230\u3002 */\n readonly timeoutMs?: number\n /** \u8D85\u65F6\u4E0A\u9650\uFF08\u9ED8\u8BA4 600s\uFF09\u3002 */\n readonly maxTimeoutMs?: number\n },\n): ToolDefinitionLike {\n const escalationModes = escalationModesOf(deps)\n const sep = options.sep ?? '\\\\'\n const isAbsolute = options.isAbsolute ?? ((path: string) => /^([a-zA-Z]:[\\\\/]|[\\\\/])/.test(path))\n const minTimeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const maxTimeout = options.maxTimeoutMs ?? MAX_TIMEOUT_MS\n\n /** \u9020\u4E00\u4EFD spawn \u89C4\u683C\uFF08\u5B98\u65B9 bash-local \u7684 spawnSpec \u7B49\u4EF7\u7269\uFF09\u3002 */\n const spawnSpec = (argv: readonly string[], cwd: string, dshEnv: Record<string, string>, signal: AbortSignal | undefined) => ({\n argv,\n cwd,\n stdio: {\n stdin: 'ignore' as const,\n stdout: { maxBytes: MAX_OUTPUT_BYTES, spill: { maxBytes: MAX_SPILL_BYTES } },\n stderr: { maxBytes: MAX_OUTPUT_BYTES, spill: { maxBytes: MAX_SPILL_BYTES } },\n },\n graceMs: GRACE_MS,\n ...(signal === undefined ? {} : { signal }),\n // dshEnv \u5FC5\u987B\u663E\u5F0F\u5E26\u4E0A\uFF1Asubprocess \u4F1A\u5148\u6309\u51ED\u636E\u5F62\u72B6\u6E05\u6D17\u7236\u73AF\u5883\uFF08\u542B\u6E05\u6389\u6240\u6709 DSH_*\uFF09\u3002\n env: { ...ENV_OVERRIDES, ...dshEnv },\n })\n\n /** \u8BFB\u4E00\u5E27\u589E\u91CF\uFF08\u5B98\u65B9 executor \u7684\u6E38\u6807\u8BB0\u8D26\uFF09\u3002 */\n const readFrame = (\n handle: SubprocessHandleLike,\n offsets: { stdout: number; stderr: number },\n ): ProcessRead => {\n const outRead = handle.collected.stdout?.readFrom(offsets.stdout)\n const errRead = handle.collected.stderr?.readFrom(offsets.stderr)\n offsets.stdout = outRead?.nextOffset ?? offsets.stdout\n offsets.stderr = errRead?.nextOffset ?? offsets.stderr\n const outText = outRead?.text ?? ''\n const errText = errRead?.text ?? ''\n const separator = outText.length > 0 && !outText.endsWith('\\n') ? '\\n' : ''\n return {\n delta: outText + (errText.length > 0 ? `${separator}[stderr]\\n${errText}` : ''),\n lossy: (outRead?.lossy ?? false) || (errRead?.lossy ?? false),\n ...(outRead?.spillPath === undefined ? {} : { stdoutSpillPath: outRead.spillPath }),\n ...(errRead?.spillPath === undefined ? {} : { stderrSpillPath: errRead.spillPath }),\n }\n }\n\n /** \u4E00\u6761\u547D\u4EE4\u7684\u5B8C\u6574\u6267\u884C\u4F53\u3002 */\n const execute = async (rawArgs: unknown, exec: ToolRunContextLike): Promise<unknown> => {\n const args = rawArgs as BashToolArgs\n if (args.command.trim().length === 0) throw new Error('invalid command: expected a non-empty string')\n if (args.description.trim().length === 0) throw new Error('invalid description: expected a non-empty string')\n if (args.timeoutMs !== undefined && (!Number.isFinite(args.timeoutMs) || args.timeoutMs <= 0)) {\n throw new Error(`invalid timeoutMs: expected a positive number, got ${JSON.stringify(args.timeoutMs)}`)\n }\n validateEscalationArgs(args.sandbox_permissions, args.justification)\n\n const standingPolicy: SandboxExecutionPolicy | undefined = deps.sandboxPolicy?.resolve(\n exec.agent === undefined ? {} : { session: exec.agent.session },\n )\n const approvedMode = args.sandbox_permissions !== undefined && args.justification !== undefined\n ? await approveEscalation(\n {\n requestedMode: args.sandbox_permissions,\n justification: args.justification,\n effectiveMode: (standingPolicy as SandboxExecutionPolicy).mode,\n subject: 'command',\n },\n {\n approver: deps.approval,\n agent: exec.agent,\n callId: exec.callId,\n toolName: BASH_TOOL_NAME,\n signal: exec.signal,\n },\n )\n : undefined\n const policy: SandboxExecutionPolicy | undefined = approvedMode === undefined\n ? standingPolicy\n : { ...(standingPolicy as SandboxExecutionPolicy), mode: approvedMode }\n\n const workdir = resolveWorkdir(args.workdir, exec, standingPolicy?.workspaceRoot, sep, isAbsolute)\n const dshEnv = deps.shellEnv?.collect(exec) ?? {}\n\n // \u7EA6\u675F\uFF1A\u53EA\u6709\"\u53D7\u9650\u6A21\u5F0F + \u6709 sandbox \u670D\u52A1\"\u624D\u5305\uFF1B`danger-full-access` \u76F4\u63A5\u8DD1\uFF08\u5B98\u65B9\u540C\u5224\u636E\uFF09\u3002\n let argv: readonly string[] = [options.bashPath, '-c', args.command]\n let confined: ConfinedArgv | undefined\n if (policy !== undefined && policy.mode !== 'danger-full-access' && deps.sandbox !== undefined) {\n // \u5B98\u65B9 `bash-sandbox` \u7684\u505A\u6CD5\uFF1A\u628A shell \u5F62\u72B6\u7684\u547D\u4EE4\u4EA4\u7ED9 confine\uFF08argv \u800C\u4E0D\u662F\u547D\u4EE4\u884C\u5B57\u7B26\u4E32\uFF09\u3002\n confined = await deps.sandbox.confine(argv, { ...policy, mode: policy.mode })\n argv = confined.argv\n }\n\n const timeoutMs = clampTimeout(args.timeoutMs, minTimeout, maxTimeout)\n\n // \u2500\u2500 \u540E\u53F0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (args.run_in_background === true) {\n const jobs = deps.jobs\n if (jobs === undefined) {\n throw new Error('background jobs unavailable: load @deepseek-ai/dsh-jobs and @deepseek-ai/dsh-tool-jobs')\n }\n if (exec.signal.aborted) throw abortedError()\n const id = jobs.start({\n kind: 'bash',\n label: args.command,\n ...(exec.agent === undefined ? {} : { owner: exec.agent }),\n run: () => {\n const controller = new AbortController()\n let handle: SubprocessHandleLike | undefined\n const offsets = { stdout: 0, stderr: 0 }\n const done = (async () => {\n try {\n handle = deps.subprocess.spawn(spawnSpec(argv, workdir ?? process.cwd(), dshEnv, controller.signal))\n if (controller.signal.aborted) handle.terminate()\n const outcome = await handle.done\n if (controller.signal.aborted) {\n return {\n status: 'killed' as const,\n detail: outcome.signal !== null ? `signal: ${outcome.signal}` : 'killed before exit',\n }\n }\n return { status: 'completed' as const, detail: `exit code: ${outcome.exitCode ?? 0}` }\n } catch (error: unknown) {\n return {\n status: (controller.signal.aborted && handle === undefined ? 'killed' : 'failed') as 'killed' | 'failed',\n detail: error instanceof Error ? error.message : String(error),\n }\n }\n })()\n return {\n cancel: (): void => {\n if (controller.signal.aborted) return\n controller.abort()\n handle?.terminate()\n },\n done,\n readOutput: (): string => (handle === undefined\n ? ''\n : renderProcessRead(readFrame(handle, offsets), undefined, escalationModes)),\n }\n },\n })\n return { kind: 'background', jobId: id }\n }\n\n // \u2500\u2500 \u524D\u53F0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const controller = new AbortController()\n let timedOut = false\n const timer = setTimeout(() => {\n timedOut = true\n controller.abort()\n }, timeoutMs)\n const onAbort = (): void => { controller.abort() }\n exec.signal.addEventListener('abort', onAbort)\n let handle: SubprocessHandleLike | undefined\n try {\n handle = deps.subprocess.spawn(spawnSpec(argv, workdir ?? process.cwd(), dshEnv, controller.signal))\n } catch (error: unknown) {\n clearTimeout(timer)\n exec.signal.removeEventListener('abort', onAbort)\n throw error\n }\n const onControllerAbort = (): void => {\n try { handle?.terminate() } catch { /* \u5DF2\u7ECF\u7ED3\u675F */ }\n }\n controller.signal.addEventListener('abort', onControllerAbort)\n try {\n const outcome = await handle.done\n const read = readFrame(handle, { stdout: 0, stderr: 0 })\n const aborted = exec.signal.aborted && !timedOut\n const denied = confined !== undefined\n && outcome.exitCode !== 0\n && confined.denialSignatures.some(signature => read.delta.toLowerCase().includes(signature.toLowerCase()))\n const result: BashRunResult = {\n exitCode: outcome.exitCode,\n signal: outcome.signal,\n timedOut,\n aborted,\n timeoutMs,\n stdout: { text: read.delta, truncated: read.lossy, ...(read.stdoutSpillPath === undefined ? {} : { spillPath: read.stdoutSpillPath }) },\n stderr: { text: '', truncated: false },\n ...(denied ? { sandbox: { mode: policy?.mode ?? 'read-only', denied: true } as SandboxFacts } : {}),\n }\n if (aborted) throw abortedError()\n return { kind: 'foreground', ...result }\n } finally {\n clearTimeout(timer)\n exec.signal.removeEventListener('abort', onAbort)\n controller.signal.removeEventListener('abort', onControllerAbort)\n }\n }\n\n return {\n name: BASH_TOOL_NAME,\n description: bashDescription(true, escalationModes),\n parameters: bashParameters(escalationModes),\n output: {\n schema: bashOutputSchema(),\n render: (_args: unknown, value: unknown): ContentBlockLike[] => {\n const v = value as { kind?: string; jobId?: string } & BashRunResult\n const text = v.kind === 'background'\n ? `started background job ${v.jobId}`\n : renderBashResult(v, escalationModes)\n return [{ type: 'text', text }]\n },\n },\n execute,\n presentCall: (args: unknown): unknown => {\n const a = args as BashToolArgs\n if (a.run_in_background === true) {\n return {\n card: 'generic', title: a.command, kind: 'execute', rawInput: a.command,\n content: [{ type: 'text', text: a.description }],\n }\n }\n return {\n card: 'terminal', title: a.command, description: a.description,\n ...(a.workdir === undefined ? {} : { cwd: a.workdir }),\n }\n },\n presentResult: (args: unknown, result: { content: ContentBlockLike[]; isError: boolean }): unknown => {\n const block = result.content.length === 1 ? result.content[0] : undefined\n if (block === undefined || block.type !== 'text') return undefined\n const raw = block.text\n const isBackground = typeof args === 'object' && args !== null\n && (args as { run_in_background?: unknown }).run_in_background === true\n if (isBackground || result.isError) {\n return { card: 'generic', content: [{ type: 'text', text: `\\`\\`\\`console\\n${raw.replace(/\\n+$/, '')}\\n\\`\\`\\`` }] }\n }\n const { body, ...exit } = parseExitStatus(raw)\n return { card: 'terminal', output: body, ...exit }\n },\n }\n}\n", "/**\n * \u300C\u91CD\u542F DSH\u300D\u7684\u5BBF\u4E3B\u534A\uFF1A**\u628A\u81EA\u5DF1\u91CD\u65B0\u62C9\u8D77\u6765**\u3002\n *\n * \u673A\u5236\u7167\u642C\u63D2\u4EF6\u5E02\u573A\uFF08GitHub `dsh-market/dsh-market` \u7684 `src/restart.ts` \u4E0E `src/dsh-cli.ts`\uFF0C\n * \u672C\u673A profile \u91CC\u6709\u5B83\u7684\u6E90\u7801\uFF09\u3002\u4E3A\u4EC0\u4E48\u6284\u5B83\u800C\u4E0D\u662F\u81EA\u5DF1\u53D1\u660E\uFF1A\u5B83\u662F\u5728\u771F\u5B9E\u7528\u6237\u91CC\u88AB\u6253\u78E8\u51FA\u6765\u7684 \u2014\u2014\n * \u6587\u4EF6\u9876\u90E8\u7684\u6CE8\u91CA\u91CC\u6302\u7740\u4E00\u6761\u6761 issue \u53F7\uFF0C\u6BCF\u4E00\u6761\u90FD\u662F\"\u91CD\u542F\u6309\u94AE\u6309\u4E0B\u53BB\u6CA1\u7528\"\u7684\u5177\u4F53\u6B7B\u6CD5\u3002\n *\n * \u5B83\u505A\u7684\u4E8B\uFF08\u4E5F\u662F\u8FD9\u91CC\u505A\u7684\u4E8B\uFF09\uFF1A\n * 1. \u5206\u79BB\u4E00\u4E2A **node \u52A9\u624B\u8FDB\u7A0B**\uFF08`node -e <\u6E90\u7801>`\uFF0Cdetached + unref + stdio ignore\uFF09\u2014\u2014\n * \u5BBF\u4E3B\u81EA\u5DF1\u9A6C\u4E0A\u5C31\u8981\u9000\u51FA\uFF0C\u6240\u4EE5\"\u7B49\u7AEF\u53E3\u3001\u8D77\u65B0\u8FDB\u7A0B\u3001\u9A8C\u8BC1\"\u5FC5\u987B\u7531\u4E00\u4E2A\u6D3B\u5F97\u6BD4\u5B83\u4E45\u7684\u8FDB\u7A0B\u6765\u505A\uFF1B\n * 2. \u52A9\u624B**\u7B49\u7AEF\u53E3\u771F\u7684\u7A7A\u51FA\u6765**\uFF08\u6BCF 250ms connect \u63A2\u4E00\u6B21\uFF0C\u6700\u591A 30 \u79D2\uFF09\uFF0C\u800C\u4E0D\u662F\u7761\u56FA\u5B9A\u65F6\u957F\uFF1A\n * \u65E7\u8FDB\u7A0B\u9000\u51FA \u2260 \u7AEF\u53E3\u7ACB\u523B\u91CA\u653E\uFF08Windows \u4E0A\u8FD8\u6709 TIME_WAIT\uFF09\uFF0C\u56FA\u5B9A\u7761 1500ms \u66FE\u8BA9\u65B0\u5BBF\u4E3B\n * `EADDRINUSE` \u5F53\u573A\u6B7B\u6389\u3001\u800C\u5931\u8D25\u8FD8\u88AB `catch {}` \u541E\u4E86\uFF08issue #177\uFF09\uFF1B\n * 3. \u52A9\u624B\u7528 **\u9690\u85CF\u63A7\u5236\u53F0\u7684 PowerShell** \u8D77\u65B0\u5BBF\u4E3B\uFF08Windows \u4E0A `detached` = `DETACHED_PROCESS`\n * = \u6CA1\u6709\u63A7\u5236\u53F0\uFF0C\u65B0\u5BBF\u4E3B\u4E4B\u540E\u8D77\u7684\u6BCF\u4E2A\u63A7\u5236\u53F0\u5B50\u8FDB\u7A0B\u90FD\u4F1A\u5F39\u4E00\u4E2A\u9ED1\u7A97\u53E3\uFF0Cissue #40\uFF1B\u800C\n * `-WindowStyle Hidden` \u53C8\u7BA1\u4E0D\u5230 spawn \u4EA4\u7ED9 PowerShell \u7684\u90A3\u4E2A\u63A7\u5236\u53F0\uFF0C\u6240\u4EE5\u52A9\u624B\u8FD9\u4E00\u5C42\n * \u8FD8\u5F97\u81EA\u5DF1\u5E26 `windowsHide`\uFF0Cissue #624\uFF09\uFF1B\n * 4. \u52A9\u624B\u8D77\u5B8C\u8FDB\u7A0B\u518D\u7B49\u6700\u591A 20 \u79D2\u786E\u8BA4\u7AEF\u53E3\u6709\u4EBA\u76D1\u542C\uFF0C\u6CA1\u8D77\u6765\u5C31\u628A\u8BCA\u65AD**\u5199\u8FDB\u65E5\u5FD7\u6587\u4EF6** \u2014\u2014\n * \u672C\u6765\u8BE5\u8BB0\u65E5\u5FD7\u7684\u90A3\u4E2A\u8FDB\u7A0B\uFF08\u5BBF\u4E3B\uFF09\u5DF2\u7ECF\u9000\u51FA\u4E86\uFF0C\u91CD\u542F\u5931\u8D25\u5FC5\u987B\u7559\u8BC1\u636E\uFF1B\n * 5. \u5BBF\u4E3B\u81EA\u5DF1\u9000\u51FA\uFF0C**\u5EF6\u8FDF 500ms**\uFF0C\u597D\u8BA9 HTTP \u54CD\u5E94\u5148\u53D1\u51FA\u53BB\uFF08\u5E02\u573A\u7528\n * `process.kill(pid,'SIGTERM')`\uFF1B\u672C\u63D2\u4EF6\u6539\u7528 `process.emit('SIGTERM')`\uFF0C\u7406\u7531\u89C1\n * {@link gracefulStop}\uFF09\u3002\n *\n * \u4E0E\u5E02\u573A\u7684\u4E24\u5904\u523B\u610F\u5206\u6B67\uFF08\u90FD\u5728\u4E0B\u9762\u6CE8\u91CA\u91CC\u5199\u660E\u7406\u7531\uFF09\uFF1A\u9000\u51FA\u65B9\u5F0F\uFF0C\u4EE5\u53CA\u6CA1\u6709\"\u5199\u4E00\u4E2A\u811A\u672C\u5230\u78C1\u76D8\"\u3002\n * \u5168\u90E8\u5916\u90E8\u52A8\u4F5C\uFF08spawn / \u5B9A\u65F6 / \u9000\u51FA / \u53D6\u8DEF\u5F84 / \u5224\u5B58\u5728\uFF09\u90FD\u6CE8\u5165\uFF0C\u4FBF\u4E8E\u5355\u6D4B\u3002\n */\n\n/** \u52A9\u624B\u63A2\u6D4B\u7AEF\u53E3\u662F\u5426\u88AB\u5360\u7528\u7684\u95F4\u9694\u3002 */\nexport const RESTART_POLL_MS = 250\n/** \u52A9\u624B\u7B49\u65E7\u8FDB\u7A0B\u91CA\u653E\u7AEF\u53E3\u7684\u4E0A\u9650\u3002 */\nexport const RESTART_PORT_WAIT_MS = 30_000\n/** \u7AEF\u53E3\u521A\u7A7A\u51FA\u6765\u540E\u7684\u989D\u5916\u7B49\u5F85\uFF08Windows \u7684 TIME_WAIT \u5C3E\u5DF4\uFF09\u3002 */\nexport const RESTART_PORT_SETTLE_MS = 300\n/** \u5BBF\u4E3B\u6536\u5230\u91CD\u542F\u8BF7\u6C42\u540E\u3001\u771F\u6B63\u9000\u51FA\u524D\u7684\u5EF6\u8FDF\uFF08\u8BA9 HTTP \u54CD\u5E94\u5148\u53D1\u51FA\u53BB\uFF09\u3002 */\nexport const RESTART_EXIT_DELAY_MS = 500\n/** \u52A9\u624B\u5728\u65B0\u5BBF\u4E3B\u8D77\u6765\u540E\u786E\u8BA4\u7AEF\u53E3\u7684\u4E0A\u9650\u3002 */\nexport const RESTART_REPLACEMENT_WAIT_MS = 20_000\n/** \u52A9\u624B\u5355\u6B21 connect \u63A2\u6D4B\u7684\u8D85\u65F6\u3002 */\nexport const RESTART_PROBE_TIMEOUT_MS = 500\n/** \u7AEF\u53E3\u672A\u77E5\u65F6\u52A9\u624B\u8D77\u65B0\u8FDB\u7A0B\u524D\u7761\u7684\u65F6\u957F\uFF08\u5E02\u573A\u539F\u503C\uFF09\u3002 */\nexport const RESTART_NO_PORT_DELAY_MS = 1_500\n/** \u7AEF\u53E3\u672A\u77E5\u65F6\u52A9\u624B\u8D77\u5B8C\u8FDB\u7A0B\u540E\u591A\u6D3B\u4E00\u4F1A\u513F\uFF0C\u514D\u5F97\u628A\u8FD8\u6CA1 detach \u5B8C\u7684\u66FF\u6362\u8FDB\u7A0B\u5E26\u8D70\u3002 */\nexport const RESTART_HELPER_LINGER_MS = 3_000\n/**\n * \u4F18\u96C5\u9000\u51FA\u540E\u3001\u5F3A\u5236\u9000\u51FA\u7684\u515C\u5E95\u65F6\u957F\u3002\n *\n * \u6BD4 DSH \u81EA\u5DF1\u7684\u4E0A\u9650\u957F\uFF1A`createProcessShutdown` \u5185\u90E8\u662F 5 \u79D2\uFF08`PROCESS_SHUTDOWN_TIMEOUT_MS`\uFF09\uFF0C\n * \u6211\u4EEC\u53EA\u8D1F\u8D23\"\u8FDE\u90A3\u4E2A\u90FD\u6CA1\u751F\u6548\"\u7684\u60C5\u51B5\uFF08\u6BD4\u5982\u6CA1\u6709\u6CE8\u518C SIGTERM handler \u7684\u5D4C\u5165\u5F62\u6001\uFF09\u3002\n */\nexport const RESTART_STOP_FALLBACK_MS = 10_000\n/** \u52A9\u624B\u65E5\u5FD7\u6587\u4EF6\u540D\u524D\u7F00\uFF08\u843D\u5728\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF09\u3002 */\nexport const RESTART_LOG_PREFIX = 'composer-ux-restart-'\n\n/** \u4E00\u6B21\u91CD\u542F\u8981\u91CD\u653E\u7684\u542F\u52A8\u547D\u4EE4\u3002 */\nexport interface Launch {\n readonly file: string\n readonly args: readonly string[]\n readonly cwd: string\n /** \u88F8\u547D\u4EE4\uFF08Windows \u4E0A `dsh` \u662F .cmd shim\uFF09\u5FC5\u987B\u8FC7\u4E00\u5C42 shell \u624D\u80FD\u8D77\u3002 */\n readonly viaShell: boolean\n}\n\n/** \u91CD\u5EFA\u542F\u52A8\u547D\u4EE4\u6240\u9700\u7684\u8FDB\u7A0B\u4E8B\u5B9E\u3002 */\nexport interface LaunchFacts {\n /** \u8DD1\u5F97\u8D77\u6765\u7684 node \u53EF\u6267\u884C\u6587\u4EF6\uFF08\u89C1 {@link nodeExecutableOf}\uFF09\u3002 */\n readonly node: string\n /** `process.argv[1]`\uFF1A\u5165\u53E3\u811A\u672C\u3002 */\n readonly argv1: string | undefined\n /** `process.execArgv`\uFF1A\u542F\u52A8\u53C2\u6570\u91CC\u7684 loader/import \u4E4B\u7C7B\u3002 */\n readonly execArgv: readonly string[]\n /** `process.argv.slice(2)`\uFF1A\u547D\u4EE4\u4E0E\u547D\u4EE4\u81EA\u5DF1\u7684\u53C2\u6570\uFF08\u5982 `web`\uFF09\u3002 */\n readonly rest: readonly string[]\n readonly cwd: string\n readonly platform: string\n readonly resolve: (path: string) => string\n readonly dirname: (path: string) => string\n}\n\n/**\n * \u8BE5\u7528\u54EA\u4E2A node \u6765 spawn \u5B50\u8FDB\u7A0B\u3002\n *\n * Android \u4E0A\u5185\u6838\u901A\u8FC7\u52A8\u6001\u94FE\u63A5\u5668\u8DD1 node\uFF0C`process.execPath` \u662F `/apex/.../linker64`\uFF0C\n * \u62FF\u5B83\u53BB spawn \u4F1A\u8BA9\u94FE\u63A5\u5668\u628A flag \u5F53\u6210\u7A0B\u5E8F\u8DEF\u5F84\u3002`process.argv0` \u624D\u662F\u771F\u6B63\u7684 node\u3002\n * @param input `process.argv0` / `process.execPath` / \u5224\u5B58\u5728\u7684\u6CE8\u5165\u9762\u3002\n * @returns \u4E00\u4E2A\u7EDD\u5BF9\u8DEF\u5F84\u7684 node\uFF1B\u4E24\u8005\u90FD\u4E0D\u50CF\u65F6\u9000\u56DE execPath\u3002\n */\nexport function nodeExecutableOf(input: {\n readonly argv0: string | undefined\n readonly execPath: string\n readonly exists: (path: string) => boolean\n}): string {\n const { argv0, execPath, exists } = input\n if (argv0 !== undefined && argv0 !== '' && isAbsolutePath(argv0) && exists(argv0)) return argv0\n return execPath\n}\n\n/** \u7EDD\u5BF9\u8DEF\u5F84\u5224\u5B9A\uFF08\u4E0D\u5F15 node:path\uFF0C\u4FDD\u6301\u672C\u6A21\u5757\u96F6 import\uFF09\u3002 */\nfunction isAbsolutePath(value: string): boolean {\n return value.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(value) || value.startsWith('\\\\\\\\')\n}\n\n/**\n * \u91CD\u653E\"\u5F53\u521D\u662F\u600E\u4E48\u628A DSH \u8D77\u6765\u7684\"\u3002\n *\n * `argv[1]` \u957F\u5F97\u50CF dsh \u5165\u53E3\uFF08`bin.js` / `bin.ts` / `dsh`\uFF09\u65F6\uFF0C\u76F4\u63A5 `node <\u7EDD\u5BF9\u5165\u53E3> \u2026`\uFF1A\n * \u5FC5\u987B\u6709\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u56E0\u4E3A\u6E90\u7801\u542F\u52A8\uFF08`pnpm dsh`\uFF09\u7ED9\u7684\u662F\u76F8\u5BF9\u5165\u53E3\uFF0C\u5B50\u8FDB\u7A0B\u4F1A\u62FF**\u81EA\u5DF1\u7684** cwd \u53BB\n * \u89E3\u6790\u7136\u540E `MODULE_NOT_FOUND`\uFF1Bcwd \u53D6\u5165\u53E3\u6240\u5728\u76EE\u5F55\uFF0C`--import tsx/esm` \u8FD9\u7C7B execArgv \u624D\u89E3\u6790\u5F97\u5230\u3002\n * \u5426\u5219\u9000\u56DE\u88F8 `dsh`\uFF08Windows \u4E0A\u662F .cmd\uFF0C\u53EA\u80FD\u8FC7 shell\uFF09\u3002\n */\nexport function launchCommand(facts: LaunchFacts): Launch {\n const { argv1, execArgv, rest, cwd, platform, resolve, dirname } = facts\n if (argv1 !== undefined && /[\\\\/](?:bin\\.(?:js|ts)|dsh)$/.test(argv1)) {\n const absolute = resolve(argv1)\n return { file: facts.node, args: [...execArgv, absolute, ...rest], cwd: dirname(absolute), viaShell: false }\n }\n return { file: 'dsh', args: [...rest], cwd, viaShell: platform === 'win32' }\n}\n\n/** \u52A9\u624B\u6700\u7EC8\u8981 spawn \u4EC0\u4E48\u3002 */\nexport interface Respawn {\n readonly file: string\n readonly args: readonly string[]\n readonly viaShell: boolean\n readonly detached: boolean\n}\n\n/** PowerShell \u5355\u5F15\u53F7\uFF1A\u5185\u90E8\u7684\u5355\u5F15\u53F7\u5199\u4E24\u904D\u3002 */\nexport function quotePowerShell(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`\n}\n\n/**\n * \u628A\u542F\u52A8\u547D\u4EE4\u5305\u6210\"\u5E73\u53F0\u6B63\u786E\"\u7684 spawn \u53C2\u6570\u3002\n *\n * POSIX \u5C31\u662F\u539F\u6765\u7684\u547D\u4EE4 + `detached: true`\u3002\n *\n * Windows \u4E0A\u5FC5\u987B\u6362\u6210 `powershell.exe -NoProfile -WindowStyle Hidden -Command \"& '\u2026'\"`\uFF1A\n * - \u9690\u85CF\u63A7\u5236\u53F0\uFF1A\u65B0\u5BBF\u4E3B\u5982\u679C\u76F4\u63A5 detached \u542F\u52A8\u5C31\u6CA1\u6709\u63A7\u5236\u53F0\uFF0C\u5B83\u4E4B\u540E\u8D77\u7684\u6BCF\u4E2A\u63A7\u5236\u53F0\u5B50\u8FDB\u7A0B\n * \u90FD\u4F1A**\u65B0\u5EFA\u4E00\u4E2A\u53EF\u89C1\u7A97\u53E3**\uFF1BPowerShell \u8FD9\u5C42\u7ED9\u5B83\u4E00\u4E2A\u9690\u85CF\u7684\u63A7\u5236\u53F0\uFF0C\u5B50\u8FDB\u7A0B\u7EE7\u627F\u5B83\uFF1B\n * - \u663E\u5F0F\u70B9\u540D `.cmd`\uFF1A\u88F8 `dsh` \u4F1A\u8BA9 PowerShell \u4F18\u5148\u9009 `dsh.ps1`\uFF0C\u9ED8\u8BA4 Restricted \u7B56\u7565\u4E0B\n * \u76F4\u63A5\u62D2\u7EDD\u6267\u884C\uFF08issue #397\uFF09\uFF0C\u800C `dsh.cmd` \u4E0D\u53D7\u811A\u672C\u7B56\u7565\u7BA1\u8F96\u3002\n *\n * \u6CE8\u610F `detached: false`\uFF1A\u771F\u6B63\u7684\u9690\u85CF\u9760\u52A9\u624B\u90A3\u4E00\u5C42\u7684 `windowsHide`\uFF08CREATE_NO_WINDOW\uFF09\u3002\n */\nexport function respawnCommand(launch: Launch, platform: string): Respawn {\n if (platform !== 'win32') {\n return { file: launch.file, args: launch.args, viaShell: launch.viaShell, detached: true }\n }\n const file = launch.viaShell && !/\\.(?:cmd|bat)$/iu.test(launch.file) ? `${launch.file}.cmd` : launch.file\n return {\n file: 'powershell.exe',\n args: [\n '-NoProfile', '-WindowStyle', 'Hidden', '-Command',\n [`& ${quotePowerShell(file)}`, ...launch.args.map(quotePowerShell)].join(' '),\n ],\n viaShell: false,\n detached: false,\n }\n}\n\n/**\n * \u6D4F\u89C8\u5668\u5B9E\u9645\u8BBF\u95EE\u7684\u90A3\u4E2A\u7AEF\u53E3\uFF0C\u4ECE\u8BF7\u6C42\u7684 `Host` \u5934\u91CC\u8BFB\u3002\n *\n * \u6BD4\u89E3\u6790\u542F\u52A8\u53C2\u6570\u53EF\u9760\uFF1A\u7ED1\u54EA\u4E2A\u7AEF\u53E3\u53EF\u80FD\u6765\u81EA\u914D\u7F6E\u6216\u73AF\u5883\u53D8\u91CF\uFF0C\u800C `Host` \u5C31\u662F\u6D4F\u89C8\u5668\u771F\u6B63\u5230\u8FBE\u7684\u5730\u5740\uFF0C\n * \u4E5F\u5C31\u662F\u66FF\u6362\u8FDB\u7A0B\u5FC5\u987B\u63A5\u7BA1\u7684\u90A3\u4E00\u4E2A\uFF08\u800C\u4E14\u5B83\u5DF2\u7ECF\u88AB\u4FE1\u4EFB\u5173\u5361\u6821\u9A8C\u8FC7\u4E86\uFF09\u3002\n * @returns \u7AEF\u53E3\u53F7\uFF1B\u9ED8\u8BA4\u7AEF\u53E3\uFF08\u5934\u91CC\u6CA1\u5199\uFF09\u65F6\u8FD4\u56DE null\u3002\n */\nexport function servingPort(hostHeader: string | undefined): number | null {\n if (hostHeader === undefined) return null\n const match = /:(\\d{1,5})$/u.exec(hostHeader)\n if (match === null) return null\n const port = Number(match[1])\n return Number.isInteger(port) && port > 0 && port < 65536 ? port : null\n}\n\n/** \u56DE\u73AF\u5730\u5740\u5224\u5B9A\uFF08\u542B IPv4 \u6620\u5C04\u5F62\u6001\uFF09\u3002 */\nexport function isLoopbackAddress(address: string | undefined): boolean {\n return address === '127.0.0.1' || address === '::1' || address === '::ffff:127.0.0.1'\n}\n\n/** \u8FDB\u7A0B\u63A7\u5236\u8BF7\u6C42\u7684\u4FE1\u4EFB\u4E8B\u5B9E\u3002 */\nexport interface TrustRequest {\n readonly remoteAddress: string | undefined\n readonly headers: Readonly<Record<string, string | readonly string[] | undefined>>\n}\n\n/**\n * \u8FD9\u4E2A\"\u6740\u8FDB\u7A0B\"\u7684\u8BF7\u6C42\u662F\u4E0D\u662F\u6765\u81EA\u672C\u673A\u7684\u540C\u6E90\u9875\u9762\u3002\n *\n * \u56DB\u9053\u540C\u65F6\u6210\u7ACB\uFF1A\u56DE\u73AF peer\u3001\u6CA1\u6709\u4EFB\u4F55\u8F6C\u53D1\u75D5\u8FF9\uFF08\u6709\u8F6C\u53D1\u8BF4\u660E\u4E2D\u95F4\u7AD9\u7740\u4EE3\u7406\u800C\u4E0D\u662F\u7528\u6237\uFF09\u3001\n * `Origin` \u4E0E `Host` \u540C\u6E90\u3001\u4E24\u8005\u90FD\u5728\u3002\u8DE8\u7AD9\u9875\u9762\u53D1\u8D77\u7684 POST \u4E00\u5B9A\u5E26\u81EA\u5DF1\u7684 `Origin`\uFF0C\n * \u6240\u4EE5 DNS rebinding / \u8DE8\u7AD9\u8C03\u7528\u5728\u8FD9\u91CC\u88AB\u6321\u4F4F \u2014\u2014 \u8FD9\u662F\u5B98\u65B9 `connection.requestRejection`\n * \u4E4B\u5916\u7684\u7B2C\u4E8C\u9053\uFF0C\u800C\u4E0D\u662F\u66FF\u4EE3\u5B83\u3002\n */\nexport function trustedRestartRequest(request: TrustRequest): boolean {\n if (!isLoopbackAddress(request.remoteAddress)) return false\n const headers = request.headers\n if (headers.forwarded !== undefined\n || headers['x-forwarded-for'] !== undefined\n || headers['x-real-ip'] !== undefined) return false\n const origin = firstHeader(headers.origin)\n const host = firstHeader(headers.host)\n if (origin === undefined || host === undefined) return false\n try {\n const parsed = new URL(origin)\n return (parsed.protocol === 'http:' || parsed.protocol === 'https:') && parsed.host === host\n } catch {\n return false\n }\n}\n\n/** \u5934\u503C\u53EF\u80FD\u662F\u6570\u7EC4\uFF08Node \u5BF9\u91CD\u590D\u5934\u7684\u884C\u4E3A\uFF09\uFF0C\u53EA\u53D6\u7B2C\u4E00\u4E2A\u3002 */\nfunction firstHeader(value: string | readonly string[] | undefined): string | undefined {\n if (value === undefined) return undefined\n return typeof value === 'string' ? value : value[0]\n}\n\nconst INSPECT_ARG_PREFIXES = ['--inspect', '--inspect-brk', '--inspect-port', '--inspect-wait'] as const\n\n/** \u8FD9\u4E2A argv \u91CC\u6709\u6CA1\u6709 inspector \u5BB6\u65CF\u7684 flag\uFF08\u6309\u524D\u7F00\u5339\u914D\uFF0C\u4E0D\u770B\u5B50\u4E32\uFF09\u3002 */\nfunction tokenHasInspectFlag(token: string): boolean {\n for (const prefix of INSPECT_ARG_PREFIXES) {\n if (token === prefix || token.startsWith(`${prefix}=`)) return true\n }\n if (token === '--debug-brk' || token.startsWith('--debug-brk=')) return true\n if (token === '--debug' || token.startsWith('--debug=')) return true\n return false\n}\n\n/**\n * \u5BBF\u4E3B\u662F\u4E0D\u662F\u6B63\u88AB\u8C03\u8BD5\u5668\u9644\u7740\uFF08\u80FD\u88AB\u8BC6\u522B\u51FA\u6765\u65F6\u8FD4\u56DE `'inspector'`\uFF0C\u5426\u5219 null\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8FD9\u79CD\u65F6\u5019\u4E0D\u7ED9\u91CD\u542F\uFF1A\u628A\u6B63\u5728\u88AB\u8C03\u8BD5\u7684\u5BBF\u4E3B\u4ECE\u754C\u9762\u91CC\u6740\u6389\uFF0C\u4F60\u4E0D\u4F1A\u5F97\u5230\u4EFB\u4F55\u4E1C\u897F\uFF0C\n * \u53EA\u4F1A\u4E22\u6389\u90A3\u4E2A\u8C03\u8BD5\u4F1A\u8BDD\u3002\u4E09\u4E2A\u4FE1\u53F7\uFF1A`inspector.url()`\uFF08\u8986\u76D6 `--inspect` \u542F\u52A8\u3001\n * `inspector.open()`\u3001SIGUSR1 \u9644\u7740\uFF09\u3001`process.execArgv`\u3001`NODE_OPTIONS`\u3002\n *\n * \u6309 token \u524D\u7F00\u5339\u914D\u800C\u4E0D\u662F `/inspect/` \u5B50\u4E32\uFF1A\u5426\u5219\u8DEF\u5F84\u91CC\u5E26 `inspect-tool.js` \u7684\u5BBF\u4E3B\u4F1A\u88AB\u8BEF\u5224\u3002\n */\nexport function detectedDebugger(input: {\n readonly inspectorUrl: string | undefined\n readonly execArgv: readonly string[]\n readonly nodeOptions: string | undefined\n}): 'inspector' | null {\n const { inspectorUrl, execArgv, nodeOptions } = input\n if (inspectorUrl !== undefined && inspectorUrl !== '') return 'inspector'\n if (execArgv.some(tokenHasInspectFlag)) return 'inspector'\n const options = (nodeOptions ?? '').trim()\n if (options !== '' && options.split(/\\s+/u).some(tokenHasInspectFlag)) return 'inspector'\n return null\n}\n\n/**\n * \u5BBF\u4E3B\u662F\u4E0D\u662F\u88AB\u67D0\u4E2A\u8FDB\u7A0B\u7BA1\u7406\u5668\uFF08systemd\uFF09\u5F53\u670D\u52A1\u5728\u8DD1 \u2014\u2014 \u662F\u7684\u8BDD\u91CD\u542F\u6743\u5F52\u5B83\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8FD9\u503C\u5F97\u4E00\u6BB5\u4EE3\u7801\uFF1Asystemd \u9ED8\u8BA4 `KillMode=control-group`\uFF0C\u6574\u4E2A cgroup \u4F1A\u8DDF\u7740\u4E3B\u8FDB\u7A0B\u4E00\u8D77\u6B7B\uFF0C\n * \u5305\u62EC\u90A3\u4E2A\u672C\u8BE5\u628A\u66FF\u6362\u8FDB\u7A0B\u62C9\u8D77\u6765\u7684\u5206\u79BB\u52A9\u624B\u3002\u4E8E\u662F\"\u91CD\u542F\"\u6740\u6389\u4E86\u4E00\u4E2A\u751F\u4EA7\u670D\u52A1\uFF0C\u4EC0\u4E48\u90FD\u6CA1\u56DE\u6765\n * \uFF08\u5E02\u573A issue #229\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8981**\u4E24\u4E2A**\u4FE1\u53F7\uFF1A`INVOCATION_ID` \u662F**\u7EE7\u627F**\u7684\uFF0CLinux \u4E0A\u4E00\u4E2A\u666E\u901A\u684C\u9762\u7EC8\u7AEF\u548C CI runner\n * \u90FD\u5E26\u7740\u5B83\uFF1B\u53EA\u770B\u5B83\u4F1A\u628A\u4E00\u5927\u7247\u672C\u6765\u80FD\u6B63\u5E38\u91CD\u542F\u7684\u5BBF\u4E3B\u8BEF\u5224\u6210\"\u6709 supervisor\"\uFF08\u6BD4\u539F bug \u66F4\u7CDF\uFF09\u3002\n * \u7236\u8FDB\u7A0B\u624D\u662F\u533A\u5206\"\u6211\u5C31\u662F\u8FD9\u4E2A unit \u7684\u4E3B\u8FDB\u7A0B\"\u548C\"\u6211\u53EA\u662F\u5B83\u7684\u540E\u4EE3\"\u7684\u5730\u65B9\uFF1A\u7236\u8FDB\u7A0B\u662F PID 1\n * \u6216\u8005 comm \u662F `systemd`\uFF08\u4E24\u79CD manager \u5B9E\u4F8B\u552F\u4E00\u7684\u5171\u540C\u70B9\uFF09\u624D\u7B97\u3002\n *\n * \u53EA\u8BA4 systemd\uFF1Apm2 \u7684 `pm_id` \u540C\u6837\u4F1A\u88AB\u7EE7\u627F\uFF0C\u800C launchd \u6839\u672C\u6CA1\u6709\u6807\u8BB0 \u2014\u2014 \u90A3\u4E24\u79CD\u8BF7\u7528\u6237\n * \u663E\u5F0F\u914D\u7F6E\uFF0C\u731C\u6D4B\u53EA\u4F1A\u91CD\u65B0\u5F15\u5165\u8FD9\u91CC\u8981\u907F\u514D\u7684\u8BEF\u5224\u3002\n * @returns \u8BC6\u522B\u5230\u7684 supervisor \u540D\uFF08\u76EE\u524D\u53EA\u6709 `'systemd'`\uFF09\uFF0C\u6CA1\u6709\u5219 null\u3002\n */\nexport function detectedSupervisor(input: {\n readonly env: Readonly<Record<string, string | undefined>>\n readonly ppid: number\n readonly parentComm: (pid: number) => string | null\n}): string | null {\n const set = (name: string): boolean => (input.env[name] ?? '') !== ''\n if (!set('INVOCATION_ID') && !set('JOURNAL_STREAM')) return null\n if (input.ppid === 1 || input.parentComm(input.ppid) === 'systemd') return 'systemd'\n return null\n}\n\n/** \u52A9\u624B\u6E90\u7801\u7684\u6CE8\u5165\u9762\u3002 */\nexport interface HelperInput {\n readonly spawned: Respawn\n readonly cwd: string\n readonly logs: { readonly out: string; readonly err: string }\n readonly port: number | null\n}\n\n/**\n * \u5206\u79BB\u51FA\u53BB\u7684\u52A9\u624B\u8FDB\u7A0B\u6E90\u7801\uFF08`node -e <\u5B83>`\uFF09\u3002\n *\n * \u5355\u72EC\u62BD\u51FA\u6765\u662F\u4E3A\u4E86**\u80FD\u771F\u7684\u8DD1\u5B83\u6765\u6D4B**\uFF1A\u8FD9\u7C7B bug \u53EA\u4F1A\u5728\u8FD0\u884C\u65F6\u9732\u51FA\u6765\uFF08\"\u7B49\u5F85\"\u8FD9\u79CD\u4EE3\u7801\uFF0C\n * \u6BCF\u4E00\u90E8\u5206\u5355\u770B\u90FD\u662F\u5BF9\u7684\uFF0C\u5408\u8D77\u6765\u624D\u9519\uFF09\u3002\u5B83\u7684\u804C\u8D23\u53EA\u6709\u4E09\u4EF6\uFF1A\u7B49\u7AEF\u53E3 \u2192 \u8D77\u65B0\u5BBF\u4E3B \u2192 \u9A8C\u8BC1\u5E76\u7559\u8BC1\u636E\u3002\n */\nexport function restartHelperSource(input: HelperInput): string {\n const { spawned, cwd, logs, port } = input\n return [\n \"const { spawn } = require('node:child_process')\",\n \"const fs = require('node:fs')\",\n \"const net = require('node:net')\",\n `const file = ${JSON.stringify(spawned.file)}`,\n `const args = ${JSON.stringify(spawned.args)}`,\n `const cwd = ${JSON.stringify(cwd)}`,\n `const viaShell = ${JSON.stringify(spawned.viaShell)}`,\n `const detached = ${JSON.stringify(spawned.detached)}`,\n `const logOut = ${JSON.stringify(logs.out)}`,\n `const logErr = ${JSON.stringify(logs.err)}`,\n `const port = ${JSON.stringify(port)}`,\n `const pollMs = ${String(RESTART_POLL_MS)}`,\n `const portWaitMs = ${String(RESTART_PORT_WAIT_MS)}`,\n `const settleMs = ${String(RESTART_PORT_SETTLE_MS)}`,\n `const probeMs = ${String(RESTART_PROBE_TIMEOUT_MS)}`,\n `const noPortDelayMs = ${String(RESTART_NO_PORT_DELAY_MS)}`,\n `const lingerMs = ${String(RESTART_HELPER_LINGER_MS)}`,\n `const replacementWaitMs = ${String(RESTART_REPLACEMENT_WAIT_MS)}`,\n 'const sleep = (ms) => new Promise(r => setTimeout(r, ms))',\n // \u5931\u8D25\u5FC5\u987B\u7559\u8BC1\u636E\uFF0C\u800C\u4E14\u8FD9\u4E9B\u884C\u53EA\u80FD\u5728\"\u5BBF\u4E3B\u5DF2\u7ECF\u9000\u51FA\"\u4E4B\u540E\u5199 \u2014\u2014 \u6240\u4EE5\u7531\u52A9\u624B\u5199\u3002\n \"const note = (line) => { try { fs.appendFileSync(logErr, '[dsh-composer-ux] ' + line + '\\\\n') } catch {} }\",\n // \"\u7A7A\u95F2\" = \u6CA1\u4EBA\u63A5\u53D7\u8FDE\u63A5\u3002\u7528 connect \u63A2\u800C\u4E0D\u662F bind\uFF1Abind \u4E00\u4E0B\u81EA\u5DF1\u5C31\u628A\u7AEF\u53E3\u5360\u4F4F\u4E86\uFF0C\n // \u800C\u90A3\u6B63\u662F\u66FF\u6362\u8FDB\u7A0B\u9A6C\u4E0A\u8981\u7528\u7684\u4E1C\u897F\u3002\n 'const listening = () => new Promise((resolve) => {',\n ' const probe = net.connect({ host: \"127.0.0.1\", port })',\n ' const done = (value) => { probe.destroy(); resolve(value) }',\n ' probe.on(\"connect\", () => done(true))',\n ' probe.on(\"error\", () => done(false))',\n ' setTimeout(() => done(false), probeMs)',\n '})',\n 'const main = async () => {',\n ' if (port) {',\n ' const until = Date.now() + portWaitMs',\n ' while (Date.now() < until && await listening()) await sleep(pollMs)',\n ' if (await listening()) note(\"port \" + port + \" was still in use after \" + portWaitMs + \"ms; starting anyway\")',\n ' await sleep(settleMs)',\n ' } else {',\n ' await sleep(noPortDelayMs)',\n ' }',\n ' let child',\n ' try {',\n ' const out = fs.openSync(logOut, \"a\")',\n ' const err = fs.openSync(logErr, \"a\")',\n // windowsHide\uFF1A\u52A9\u624B\u81EA\u5DF1\u662F detached \u7684\uFF0CWindows \u4E0A\u5B83\u6CA1\u6709\u63A7\u5236\u53F0\uFF0C\u800C\u4E00\u4E2A\u6CA1\u6709\u63A7\u5236\u53F0\u7684\n // \u7236\u8FDB\u7A0B spawn \u63A7\u5236\u53F0\u7A0B\u5E8F\u4F1A**\u65B0\u5EFA\u4E00\u4E2A\u53EF\u89C1\u63A7\u5236\u53F0** \u2014\u2014 \u5C31\u662F\u90A3\u4E2A\u5173\u6389\u5C31\u628A\u5BBF\u4E3B\u5E26\u8D70\u7684\u9ED1\u7A97\u53E3\u3002\n ' child = spawn(file, args, { cwd, detached, stdio: [\"ignore\", out, err], env: process.env, shell: viaShell, windowsHide: true })',\n // spawn \u62A5\"\u6587\u4EF6\u4E0D\u5B58\u5728/\u4E0D\u53EF\u6267\u884C\"\u662F**\u5F02\u6B65**\u7684\uFF0C\u4E0B\u9762\u7684 try/catch \u53EA\u63A5\u540C\u6B65\u629B\u51FA\uFF0C\n // \u6240\u4EE5\u5C11\u4E86\u8FD9\u4E2A\u76D1\u542C\uFF0C\u5931\u8D25\u4F1A\u548C\u88AB\u4FEE\u7684\u90A3\u4E2A bug \u4E00\u6837\u5B89\u9759\u3002\n ' child.on(\"error\", (error) => note(\"could not start the replacement: \" + (error && error.message ? error.message : String(error))))',\n ' child.unref()',\n ' } catch (error) {',\n ' note(\"could not start the replacement: \" + (error && error.message ? error.message : String(error)))',\n ' return',\n ' }',\n // \u591A\u6D3B\u4E00\u4F1A\u513F\u5728 Windows \u4E0A\u662F\u6709\u610F\u4E49\u7684\uFF1Aspawn \u5B8C\u7ACB\u523B\u9000\u51FA\u7684\u52A9\u624B\u53EF\u80FD\u628A\u8FD8\u6CA1 detach \u5B8C\u7684\n // \u66FF\u6362\u8FDB\u7A0B\u4E00\u8D77\u5E26\u8D70\u3002\u6709\u7AEF\u53E3\u53EF\u63A2\u7684\u90A3\u6761\u8DEF\u672C\u6765\u5C31\u8981\u591A\u5F85\uFF0C\u8FD9\u6761\u662F\u7ED9\u6CA1\u6709\u7AEF\u53E3\u7684\u60C5\u51B5\u8865\u4E0A\u540C\u6837\u7684\u4FDD\u8BC1\u3002\n ' if (!port) { await sleep(lingerMs); return }',\n ' const upBy = Date.now() + replacementWaitMs',\n ' while (Date.now() < upBy && !(await listening())) await sleep(500)',\n ' if (!(await listening())) note(\"the replacement did not bind port \" + port + \" within \" + replacementWaitMs + \"ms \u2014 see the output log beside this one\")',\n '}',\n 'main()',\n ].join('\\n')\n}\n\n/** \u88AB spawn \u51FA\u6765\u7684\u8FDB\u7A0B\uFF08\u53EA\u53D6\u672C\u6A21\u5757\u8981\u7528\u7684\u90E8\u5206\uFF09\u3002 */\nexport interface SpawnedLike {\n readonly pid?: number | undefined\n unref?: () => void\n once(event: string, listener: (arg?: unknown) => void): unknown\n}\n\n/** spawn \u9009\u9879\uFF08\u53EA\u53D6\u672C\u6A21\u5757\u7528\u5230\u7684\uFF09\u3002 */\nexport interface SpawnOptionsLike {\n readonly detached: boolean\n readonly stdio: 'ignore'\n readonly windowsHide: boolean\n readonly env: Readonly<Record<string, string | undefined>>\n}\n\n/** \u6CE8\u5165\u7684\u5916\u90E8\u52A8\u4F5C\u3002 */\nexport interface RestartIo {\n readonly platform: string\n readonly pid: number\n readonly argv0: string | undefined\n readonly execPath: string\n readonly argv1: string | undefined\n readonly execArgv: readonly string[]\n readonly rest: readonly string[]\n readonly cwd: string\n readonly env: Readonly<Record<string, string | undefined>>\n readonly tmpdir: string\n /** \u65E5\u5FD7\u6587\u4EF6\u540D\u91CC\u7684\u65F6\u95F4\u6233\uFF08\u6D4B\u8BD5\u91CC\u56FA\u5B9A\uFF09\u3002 */\n readonly stamp: string\n readonly exists: (path: string) => boolean\n readonly resolve: (path: string) => string\n readonly dirname: (path: string) => string\n readonly join: (...parts: readonly string[]) => string\n readonly spawn: (command: string, args: readonly string[], options: SpawnOptionsLike) => SpawnedLike\n /** \u8BA9\u5BBF\u4E3B\u81EA\u5DF1\u9000\u51FA\uFF08\u771F\u5B9E\u5B9E\u73B0\u89C1 {@link gracefulStop}\uFF09\u3002 */\n readonly stop: () => void\n readonly wait: (ms: number) => Promise<void>\n}\n\n/** \u8BA1\u5212\u597D\u7684\u91CD\u542F\uFF08\u7EAF\u8BA1\u7B97\u7ED3\u679C\uFF0C\u4E0D\u505A\u4EFB\u4F55\u52A8\u4F5C\uFF09\u3002 */\nexport interface RestartPlan {\n readonly node: string\n readonly launch: Launch\n readonly respawn: Respawn\n readonly helper: string\n readonly logOut: string\n readonly logErr: string\n readonly port: number | null\n}\n\n/** \u7B97\u51FA\u8FD9\u6B21\u91CD\u542F\u8981\u600E\u4E48\u505A\u3002 */\nexport function planRestart(io: RestartIo, port: number | null): RestartPlan {\n const node = nodeExecutableOf({ argv0: io.argv0, execPath: io.execPath, exists: io.exists })\n const launch = launchCommand({\n node,\n argv1: io.argv1,\n execArgv: io.execArgv,\n rest: io.rest,\n cwd: io.cwd,\n platform: io.platform,\n resolve: io.resolve,\n dirname: io.dirname,\n })\n const respawn = respawnCommand(launch, io.platform)\n const logOut = io.join(io.tmpdir, `${RESTART_LOG_PREFIX}${io.stamp}.out.log`)\n const logErr = io.join(io.tmpdir, `${RESTART_LOG_PREFIX}${io.stamp}.err.log`)\n return {\n node,\n launch,\n respawn,\n helper: restartHelperSource({ spawned: respawn, cwd: launch.cwd, logs: { out: logOut, err: logErr }, port }),\n logOut,\n logErr,\n port,\n }\n}\n\n/** \u6392\u597D\u4E00\u6B21\u91CD\u542F\u4E4B\u540E\u56DE\u7ED9\u754C\u9762\u7684\u4FE1\u606F\u3002 */\nexport interface RestartScheduled {\n readonly ok: true\n readonly pid: number\n readonly helperPid: number | undefined\n readonly logOut: string\n readonly logErr: string\n readonly port: number | null\n /** \u91CD\u653E\u7528\u7684\u542F\u52A8\u547D\u4EE4\uFF0C\u7ED9\u754C\u9762\u5C55\u793A\"\u4F1A\u600E\u4E48\u91CD\u542F\"\u3002 */\n readonly command: string\n}\n\n/**\n * \u6392\u4E00\u6B21\u91CD\u542F\uFF1A\u5206\u79BB\u8D77\u52A9\u624B \u2192 \u5EF6\u8FDF 500ms \u8BA9\u81EA\u5DF1\u9000\u51FA\u3002\n *\n * \u8FD4\u56DE\u65F6**\u5BBF\u4E3B\u8FD8\u6CA1\u9000\u51FA**\uFF1A\u9000\u51FA\u662F\u5EF6\u8FDF\u4E4B\u540E\u7684\u5F02\u6B65\u52A8\u4F5C\uFF0C\u597D\u8BA9\u8C03\u7528\u65B9\u628A HTTP \u54CD\u5E94\u53D1\u51FA\u53BB\u3002\n * @param io \u6CE8\u5165\u7684\u5916\u90E8\u52A8\u4F5C\u3002\n * @param port \u6D4F\u89C8\u5668\u5B9E\u9645\u8BBF\u95EE\u7684\u7AEF\u53E3\uFF08\u52A9\u624B\u9760\u5B83\u5224\u65AD\u65E7\u8FDB\u7A0B\u4EC0\u4E48\u65F6\u5019\u771F\u7684\u8BA9\u51FA\u4E86\u7AEF\u53E3\uFF09\u3002\n * @throws \u52A9\u624B\u8FDB\u7A0B\u8D77\u4E0D\u6765\u65F6\u629B\u51FA\uFF08\u8FDE\u52A9\u624B\u90FD\u6CA1\u8D77\u6765\u5C31\u9000\u51FA\u81EA\u5DF1 = \u670D\u52A1\u5F7B\u5E95\u6CA1\u4E86\uFF0C\u5FC5\u987B\u8BA9\u754C\u9762\u77E5\u9053\uFF09\u3002\n */\nexport function scheduleRestart(io: RestartIo, port: number | null): RestartScheduled {\n const plan = planRestart(io, port)\n const helper = io.spawn(plan.node, ['-e', plan.helper], {\n detached: true,\n stdio: 'ignore',\n windowsHide: true,\n env: io.env,\n })\n helper.unref?.()\n void io.wait(RESTART_EXIT_DELAY_MS).then(() => { io.stop() })\n return {\n ok: true,\n pid: io.pid,\n helperPid: helper.pid,\n logOut: plan.logOut,\n logErr: plan.logErr,\n port: plan.port,\n command: [plan.respawn.file, ...plan.respawn.args].join(' '),\n }\n}\n\n/** \u9000\u51FA\u52A8\u4F5C\u7684\u6CE8\u5165\u9762\u3002 */\nexport interface StopIo {\n readonly emitSignal: (signal: string) => void\n readonly exit: (code: number) => void\n readonly timer: (ms: number, run: () => void) => void\n}\n\n/**\n * \u8BA9\u5BBF\u4E3B\u4F18\u96C5\u9000\u51FA\uFF1A\u628A `SIGTERM` **\u5F53\u4E8B\u4EF6\u53D1\u7ED9\u81EA\u5DF1**\uFF0C\u800C\u4E0D\u662F\u771F\u7684\u53D1\u4FE1\u53F7\u3002\n *\n * \u8FD9\u4E00\u6761\u662F\u672C\u63D2\u4EF6\u4E0E\u5E02\u573A\u552F\u4E00\u7684\u5B9E\u8D28\u5206\u6B67\uFF0C\u503C\u5F97\u5199\u6E05\u7406\u7531\uFF1A\n * `dsh web` \u5728 `apps/cli/src/profile-boot.ts` \u91CC\u6CE8\u518C\u4E86 `process.on('SIGTERM', () => interrupt(0))`\n * \u2014\u2014 \u8FD9\u662F\"supervisor \u7684\u666E\u901A\u505C\u6B62\u8BF7\u6C42\"\uFF0C\u4F1A\u5148 `fiber.dispose()` \u628A\u6574\u68F5\u63D2\u4EF6\u6811\u62C6\u5E72\u51C0\u518D\u9000\u51FA\uFF0C\n * \u800C\u4E14\u81EA\u5E26 5 \u79D2\u4E0A\u9650\uFF08`createProcessShutdown`\uFF09\u3002\n *\n * \u4F46\u5E02\u573A\u7528\u7684 `process.kill(pid,'SIGTERM')` \u5728 **Windows** \u4E0A\u7B49\u4EF7\u4E8E `TerminateProcess`\uFF1A\n * \u672C\u673A\u5B9E\u6D4B\uFF08node \u8D77\u5B50\u8FDB\u7A0B\u3001\u6CE8\u518C handler\u3001\u81EA\u5DF1\u6740\u81EA\u5DF1\uFF09handler \u4E00\u6B21\u90FD\u6CA1\u8DD1\u5230\uFF0C\u8FDB\u7A0B\u76F4\u63A5\u6CA1\u4E86\u3002\n * \u5BF9\"\u521A\u88C5\u5B8C\u63D2\u4EF6\u968F\u624B\u91CD\u542F\u4E00\u4E0B\"\u6CA1\u5DEE\u522B\uFF0C\u5BF9**\u6B63\u5728\u8DD1\u957F\u4F1A\u8BDD**\u7684\u7528\u6237\u5C31\u662F\u786C\u5207\u3002\u6240\u4EE5\u8FD9\u91CC\u8D70 emit\uFF1A\n * \u590D\u523B supervisor \u7684\u8BED\u4E49\uFF0C\u4EFB\u4F55\u5E73\u53F0\u90FD\u771F\u7684\u6267\u884C DSH \u81EA\u5DF1\u7684\u5173\u505C\u8DEF\u5F84\u3002\n *\n * \u515C\u5E95\uFF1A10 \u79D2\u540E\u8FDB\u7A0B\u8FD8\u5728\uFF08\u6BD4\u5982\u5BBF\u4E3B\u5F62\u6001\u91CC\u6CA1\u4EBA\u6CE8\u518C handler\uFF09\u5C31 `exit(0)` \u2014\u2014 \u4E0D\u80FD\u8BA9\u7528\u6237\u9762\u5BF9\n * \u4E00\u4E2A\"\u70B9\u4E86\u91CD\u542F\u4F46\u4EC0\u4E48\u90FD\u6CA1\u53D1\u751F\"\u7684\u754C\u9762\u3002\n */\nexport function gracefulStop(io: StopIo, signal = 'SIGTERM'): void {\n try {\n io.emitSignal(signal)\n } catch {\n // \u6CA1\u6709 handler / emit \u672C\u8EAB\u51FA\u9519\u90FD\u4E0D\u5F71\u54CD\u4E0B\u9762\u7684\u515C\u5E95\u3002\n }\n io.timer(RESTART_STOP_FALLBACK_MS, () => { io.exit(0) })\n}\n\n/** \u8FD9\u6B21\u542F\u52A8\u7684\u6807\u8BC6\uFF08\u754C\u9762\u9760\"\u53F7\u53D8\u4E86\"\u5224\u65AD\u65B0\u8FDB\u7A0B\u771F\u7684\u8D77\u6765\u4E86\uFF09\u3002 */\nexport function bootId(pid: number, now: number): string {\n return `${String(pid)}-${String(now)}`\n}\n", "/**\n * \u63D0\u793A\u8BCD\u4F18\u5316\u5668\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF08\u4E09\u6863\uFF09\u3002\n *\n * \u6765\u6E90\u4E0E\u6388\u6743\uFF1A\u4EE5\u4E0B RELAY_ROLE / NO_META_RULES / TIER_SPECS / relayMessage \u7684\n * \u6587\u672C**\u9010\u5B57\u63D0\u53D6**\u81EA WestFox-AwA/dsh-prompt-optimizer \u7684 `lib/index.js`\n * \uFF08BSD-3-Clause\uFF0C\u4F5C\u8005\u300C\u5543\u8F6E\u80CE\u7684\u897F\u72D0\u300D\uFF09\u3002BSD-3-Clause \u5141\u8BB8\u5728\u4FDD\u7559\u7248\u6743\u58F0\u660E\u7684\u524D\u63D0\u4E0B\n * \u4F7F\u7528\u4E0E\u4FEE\u6539\uFF0C\u6545\u6B64\u5904\u4FDD\u7559\u539F\u4F5C\u8005\u7684\u7F72\u540D\u4E0E\u6765\u6E90\u8BF4\u660E\uFF1B\u672C\u63D2\u4EF6\u81EA\u8EAB\u4ECD\u6309 MIT \u53D1\u5E03\u3002\n *\n * \u6838\u5FC3\u8BED\u4E49\uFF08\u539F\u4F5C\u8005\u7684\u8BBE\u8BA1\uFF0C\u7167\u642C\u4E0D\u8D70\u6837\uFF09\uFF1A\u4F18\u5316\u8005\u662F\u4E00\u4E2A**\u4F20\u8BDD\u5668**\uFF0C\u4E0D\u662F\u5BF9\u8BDD\u4F19\u4F34\u3002\n *\n * \u7528\u6237 \u2192\uFF08\u4F18\u5316\u8005\uFF1A\u628A\u7528\u6237\u7684\u610F\u601D\u6574\u7406\u6210\u4E00\u6761\u547D\u4EE4\uFF09\u2192 \u5DE5\u4F5C AI\n *\n * \u5B83\u7684\u4EA7\u51FA\u5C31\u662F\u300C\u7528\u6237\u8981\u53D1\u7ED9\u5DE5\u4F5C AI \u7684\u90A3\u6761\u6D88\u606F\u672C\u4F53\u300D\uFF0C\u4F1A\u88AB\u539F\u6837\u653E\u56DE\u8F93\u5165\u6846\uFF1B\n * \u5B83\u65E2\u4E0D\u4E0E\u7528\u6237\u5BF9\u8BDD\uFF0C\u4E5F\u4E0D\u66FF\u5DE5\u4F5C AI \u5E72\u6D3B\uFF0C\u66F4\u4E0D\u56DE\u7B54\u7528\u6237\u7684\u95EE\u9898\u3002\n *\n * \u672C\u6A21\u5757\u96F6 import\uFF0Chost \u534A\u4E0E\u6D4B\u8BD5\u5171\u7528\u3002\n */\n\n/** \u4F20\u8BDD\u8005\u4EBA\u8BBE\uFF1A\u4E3A\u4EC0\u4E48\u5FC5\u987B\u5355\u72EC\u6210\u6BB5\u2014\u2014\u88F8\u6587\u672C\u4F1A\u88AB\u6A21\u578B\u5F53\u6210\u300C\u5BF9\u5B83\u8BF4\u7684\u8BDD\u300D\u800C\u5F00\u59CB\u5BF9\u8BDD\u3002 */\nconst RELAY_ROLE = [\n '\u3010\u4F60\u662F\u8C01\u3011\u4F60\u662F\u4E00\u4E2A**\u4F20\u8BDD\u5668/\u6539\u5199\u5668**\uFF0C\u7AD9\u5728\u7528\u6237\u4E0E\"\u5DE5\u4F5C AI\"\u4E4B\u95F4\uFF1A',\n ' \u7528\u6237 \u2192\uFF08\u4F60\uFF1A\u628A\u7528\u6237\u7684\u610F\u601D\u6574\u7406\u6210\u4E00\u6761\u547D\u4EE4\uFF09\u2192 \u5DE5\u4F5C AI\uFF08\u7F16\u7801/\u6267\u884C agent\uFF09\u3002',\n '\u4F60\u7684\u8F93\u51FA**\u4F1A\u88AB\u539F\u6837\u53D1\u7ED9\u5DE5\u4F5C AI**\uFF0C\u7528\u6237\u4E0D\u4F1A\u518D\u770B\u4E00\u904D\u3001\u4E0D\u4F1A\u518D\u8865\u5145\u3002',\n '\u3010\u4F60\u4E0D\u662F\u8C01\u3011\u4F60\u4E0D\u662F\u5728\u548C\u7528\u6237\u804A\u5929\uFF0C\u4E5F\u4E0D\u662F\u5728\u56DE\u7B54\u7528\u6237\uFF1A',\n '- \u4E0D\u8981\u56DE\u5E94\u3001\u4E0D\u8981\u56DE\u7B54\u7528\u6237\u7684\u8981\u6C42\uFF0C\u4E5F\u4E0D\u8981\u66FF\u7528\u6237\u5B8C\u6210\u4EFB\u52A1\uFF08\u4E0D\u8981\u76F4\u63A5\u7ED9\u51FA\u4EE3\u7801/\u7B54\u6848/\u7ED3\u679C\uFF09\u3002',\n '- \u4E0D\u8981\u4EE5\u52A9\u624B\u53E3\u543B\u5BF9\u7528\u6237\u8BF4\u8BDD\uFF08\"\u597D\u7684\"\"\u6536\u5230\"\"\u6211\u53EF\u4EE5\u5E2E\u4F60\"\"\u5EFA\u8BAE\u4F60\u2026\"\"\u9700\u8981\u6211\u2026\u5417\"\uFF09\u3002',\n '- \u4E0D\u8981\u628A\u7528\u6237\u53D1\u6765\u7684\u6587\u5B57\u5F53\u6210\"\u5BF9\u4F60\u8BF4\u7684\u8BDD\"\u6765\u56DE\u5E94\uFF1B\u5B83\u53EA\u662F\u4F60\u8981\u8F6C\u8FBE\u7684\u5185\u5BB9\u3002',\n '- \u4E0D\u8981\u5411\u7528\u6237\u63D0\u95EE\uFF0C\u4E5F\u4E0D\u8981\u5728\u7ED3\u5C3E\u95EE\"\u662F\u5426\u7EE7\u7EED/\u8FD8\u9700\u8981\u4EC0\u4E48\"\u3002\u9700\u8981\u6F84\u6E05\u65F6\uFF0C\u5199\u6210**\u7ED9\u5DE5\u4F5C AI \u7684\u6307\u4EE4**\uFF1A',\n ' \"\u82E5 X \u4E0D\u660E\u786E\uFF0C\u5148\u8BFB Y \u6216\u5148\u5411\u6211\u786E\u8BA4\uFF0C\u4E0D\u8981\u81EA\u884C\u5047\u8BBE\"\u3002',\n '\u3010\u4F60\u7684\u4EA7\u54C1\u3011\u4E00\u6761\"\u50CF\u7528\u6237\u672C\u4EBA\u5728\u4E0B\u547D\u4EE4\"\u7684\u6D88\u606F\uFF1A\u8BFB\u8005\u53EA\u6709\u5DE5\u4F5C AI \u4E00\u4E2A\u3002',\n].join('\\n')\n\n/** \u7981\u5143\u8BDD\u8BED\u89C4\u5219\uFF1A\u4EA7\u51FA\u5FC5\u987B\u80FD\u539F\u6837\u53D1\u9001\uFF0C\u4E0D\u80FD\u5E26\u4EFB\u4F55\u300C\u6211\u505A\u4E86\u4EC0\u4E48\u300D\u7684\u75D5\u8FF9\u3002 */\nconst NO_META_RULES = [\n '\u3010\u4EA7\u51FA\u7684\u672C\u8D28\u3011\u4F60\u7684\u8F93\u51FA\u4F1A\u88AB\u7528\u6237**\u539F\u6837\u53D1\u9001**\u7ED9\u4E0B\u6E38\u7684\u5DE5\u4F5C AI\uFF08\u7F16\u7801/\u6267\u884C agent\uFF09\u3002',\n '\u6240\u4EE5\u4F60\u53EA\u80FD\u8F93\u51FA\"\u8FD9\u6761\u6D88\u606F\u672C\u8EAB\"\uFF0C\u5C31\u50CF\u7528\u6237\u5728\u4EB2\u81EA\u6253\u8FD9\u6761\u6D88\u606F\u4E00\u6837\u3002',\n '\u3010\u7EDD\u5BF9\u7981\u6B62\u3011\u4EE5\u4E0B\u5185\u5BB9\u4E00\u5F8B\u4E0D\u5F97\u51FA\u73B0\u5728\u8F93\u51FA\u91CC\uFF1A',\n '- \u4EFB\u4F55\u5143\u8BDD\u8BED\u6216\u5143\u6807\u9898\uFF1A\u5982\"\u4F18\u5316\u540E\u7684\u63D0\u793A\u8BCD\"\"\u6539\u5199\u540E\"\"\u6539\u52A8\u8BF4\u660E\"\"\u63A8\u7406\u8865\u5145\"\"\u5173\u952E\u5224\u65AD\"\"\u8FB9\u754C\"\"\u8BF4\u660E\"\"\u4EE5\u4E0B\u662F\u2026\"\u3002',\n '- \u4EFB\u4F55\u5BF9\u4F60\u6240\u505A\u5DE5\u4F5C\u7684\u89E3\u91CA\u3001\u7406\u7531\u3001\u4F9D\u636E\u3001\u514D\u8D23\u58F0\u660E\u3001\u7ED9\u7528\u6237\u7684\u5EFA\u8BAE\u3002',\n '- \u4EFB\u4F55\u5BF9\"\u7528\u6237\"\u8BF4\u8BDD\u6216\u63D0\u5230\"\u7528\u6237/\u539F\u6587\"\u7684\u8868\u8FF0\uFF08\u4F60\u8981\u5047\u88C5\u81EA\u5DF1\u5C31\u662F\u7528\u6237\uFF09\u3002',\n '- \u4EFB\u4F55\u95EE\u53E5\u629B\u7ED9\u7528\u6237\uFF08\u8981\u5BF9\u5DE5\u4F5C AI \u8BF4\u8BDD\uFF1B\u9700\u8981\u6F84\u6E05\u65F6\u5199\u6210\u6307\u4EE4\uFF1A\"\u82E5 X \u4E0D\u660E\u786E\uFF0C\u5148\u8BFB Y \u6216\u5148\u95EE\u6211\u786E\u8BA4\"\uFF09\u3002',\n '- \u4EFB\u4F55\u5BF9\u8BDD\u8BDD\u672F\uFF1A\u5F00\u573A\u767D\uFF08\"\u597D\u7684/\u660E\u767D\u4E86/\u6CA1\u95EE\u9898\"\uFF09\u3001\u6536\u5C3E\u8BED\uFF08\"\u5E0C\u671B\u5BF9\u4F60\u6709\u5E2E\u52A9/\u8FD8\u9700\u8981\u6211\u505A\u4EC0\u4E48\"\uFF09\u3001',\n ' \u4EE5\u53CA\u628A\u4EFB\u52A1\u5F53\u6210\u8BF7\u6C42\u6765\u56DE\u590D\u7684\u53E5\u5B50\uFF08\"\u6211\u6765\u5E2E\u4F60\u2026\"\"\u8FD9\u4E2A\u53EF\u4EE5\u505A\u2026\"\uFF09\u3002',\n '- Markdown \u4E00\u7EA7\u6807\u9898\uFF08#\uFF09\u4E0E\u4EFB\u4F55\u5305\u88F9\u6574\u7BC7\u7684\u6807\u9898\u3002',\n '\u3010\u5141\u8BB8\u7684\u7ED3\u6784\u3011\u53EA\u5141\u8BB8\"\u4F5C\u4E3A\u6307\u4EE4\u6B63\u6587\u7684\u4E00\u90E8\u5206\"\u5B58\u5728\u7684\u7ED3\u6784\uFF1A\u7F16\u53F7\u6B65\u9AA4\u3001\u5C0F\u6807\u9898\uFF08\u5982\"\u9A8C\u6536\u6807\u51C6\"\"\u4E0D\u8981\u505A\"\uFF09\u3001\u6E05\u5355\u3001\u4EE3\u7801\u5757\u3002',\n '\u3010\u98CE\u683C\u3011\u7948\u4F7F\u53E5\u3001\u76F4\u7ED9\u8981\u6C42\u3001\u53EF\u6267\u884C\uFF1B\u4E2D\u6587\u8FDB\u4E2D\u6587\u51FA\uFF1B\u4E0D\u786E\u5B9A\u7684\u9879\u76EE\u4E8B\u5B9E\u5199\u6210\"\u5148\u8BFB\u53D6/\u5148\u786E\u8BA4\"\u7684\u52A8\u4F5C\uFF0C\u7EDD\u4E0D\u7F16\u9020\u3002',\n '\u3010\u81EA\u68C0\u3011\u843D\u7B14\u524D\u95EE\u81EA\u5DF1\u4E24\u53E5\uFF1A\u2460 \u8FD9\u6BB5\u8BDD\u662F\u4E0D\u662F\"\u7528\u6237\u5728\u547D\u4EE4\u5DE5\u4F5C AI\"\uFF1F\u2461 \u5DE5\u4F5C AI \u62FF\u5230\u5B83\u80FD\u4E0D\u80FD\u76F4\u63A5\u5F00\u59CB\u5E72\uFF1F',\n '\u4E24\u4E2A\u7B54\u6848\u90FD\u4E3A\"\u662F\"\u624D\u8F93\u51FA\u3002\u73B0\u5728\u76F4\u63A5\u8F93\u51FA\u8FD9\u6761\u6D88\u606F\uFF0C\u4E0D\u8981\u4EFB\u4F55\u5F00\u573A\u767D\u4E0E\u6536\u5C3E\u8BED\u3002',\n].join('\\n')\n\n/** \u6863\u4F4D id \u4E0E\u7CFB\u7EDF\u63D0\u793A / \u6E29\u5EA6\u7684\u5BF9\u5E94\u8868\u3002\u6B64\u5904\u53EA\u653E\u672C\u9879\u76EE\u5B9E\u9645\u9700\u8981\u7684\u4E09\u79CD\u3002 */\nexport const OPTIMIZER_SPECS = {\n basic: {\n temperature: 0.2,\n system: [\n RELAY_ROLE,\n '\u4E0B\u9762\u8FD9\u6BB5\u662F\u7528\u6237\u8981\u53D1\u7ED9\u5DE5\u4F5C AI \u7684\u6307\u4EE4\uFF0C\u53EF\u80FD\u6709\u75C5\u53E5\u3001\u6307\u4EE3\u4E0D\u660E\u3001\u7528\u8BCD\u542B\u7CCA\u3002',\n '\u4F60\u7684\u552F\u4E00\u4EFB\u52A1\uFF1A\u628A\u5B83\u6539\u5199\u6210\u901A\u987A\u3001\u7CBE\u786E\u3001\u65E0\u6B67\u4E49\u7684**\u540C\u4E00\u6761\u6307\u4EE4**\uFF0C\u6539\u5B8C\u5C31\u80FD\u76F4\u63A5\u53D1\u51FA\u53BB\u3002',\n '\u94C1\u5F8B\uFF1A',\n '- \u53EA\u505A\u8BED\u8A00\u5C42\u4FEE\u590D\uFF1A\u75C5\u53E5\u3001\u9519\u522B\u5B57\u3001\u6807\u70B9\u3001\u6307\u4EE3\u6D88\u89E3\uFF08\"\u90A3\u4E2A\u9875\u9762\"\u2192\u4FDD\u7559\u4F46\u660E\u786E\u6307\u5411\u540C\u4E00\u5BF9\u8C61\uFF09\u3001\u542B\u7CCA\u8BCD\u6536\u655B\u5230\"\u53EF\u6267\u884C\u4F46\u4E0D\u65B0\u589E\u9700\u6C42\"\u3002',\n '- \u4E25\u7981\u65B0\u589E\u539F\u6587\u6CA1\u6709\u7684\u9700\u6C42\u3001\u529F\u80FD\u3001\u7EA6\u675F\u3001\u6280\u672F\u9009\u578B\u3001\u4EA4\u4ED8\u7269\uFF1B\u4E25\u7981\u6269\u5927\u6216\u7F29\u5C0F\u8303\u56F4\u3002',\n '- \u539F\u6587\u6CA1\u8BF4\u7684\u5C31\u4E0D\u8981\u66FF\u7528\u6237\u51B3\u5B9A\uFF1A\u65E0\u6CD5\u786E\u5B9A\u5904\u5199\u6210\u7ED9\u5DE5\u4F5C AI \u7684\u67E5\u8BC1\u6307\u4EE4\uFF08\u4F8B\u5982\"\u5148\u786E\u8BA4\u6307\u7684\u662F\u54EA\u4E2A\u9875\u9762\uFF0C\u518D\u52A8\u624B\"\uFF09\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u62CD\u677F\u3002',\n '- \u7BC7\u5E45\u4E0E\u539F\u6587\u76F8\u5F53\uFF0C\u4E0D\u8981\u81A8\u80C0\u3002',\n NO_META_RULES,\n ].join('\\n'),\n },\n advanced: {\n temperature: 0.3,\n system: [\n RELAY_ROLE,\n '\u7528\u6237\u7684\u539F\u8BDD\u542B\u7CCA\u3001\u7F3A\u5173\u952E\u7EA6\u675F\uFF1B\u4F60\u8981**\u4EE5\u7528\u6237\u7684\u540D\u4E49**\u628A\u8FD9\u6761\u547D\u4EE4\u8BF4\u6E05\u695A\uFF0C\u8F6C\u8FBE\u7ED9\u5DE5\u4F5C AI\u3002',\n '\u4F60\u7684\u4EFB\u52A1\uFF1A\u5728\u5B8C\u5168\u4E0D\u6539\u53D8\u7528\u6237\u76EE\u6807\u7684\u524D\u63D0\u4E0B\uFF0C\u7528\u4F60\u81EA\u5DF1\u7684\u63A8\u7406\uFF0C\u628A\"\u7528\u6237\u663E\u7136\u60F3\u8981\u3001\u4F46\u6CA1\u8BF4\u51FA\u53E3\"\u7684\u5FC5\u8981\u4FE1\u606F**\u5199\u6210\u5BF9\u5DE5\u4F5C AI \u7684\u8981\u6C42**\uFF0C\u8BA9\u5B83\u4E00\u6B21\u505A\u5BF9\u3002',\n '\u5141\u8BB8\u4F60\u505A\uFF08\u4E14\u4EC5\u9650\u8FD9\u4E9B\uFF09\uFF1A',\n '- \u8865\u5168\u4ECE\u76EE\u6807\u53EF\u76F4\u63A5\u63A8\u51FA\u7684\u6700\u4F4E\u4EA4\u4ED8\u8981\u6C42\u4E0E\u9A8C\u6536\u6807\u51C6\uFF08\u4F8B\u5982\"\u80FD\u8DD1\u8D77\u6765\"\"\u754C\u9762\u80FD\u7528\"\uFF09\uFF0C\u5F62\u5F0F\u662F\u8981\u6C42\u800C\u975E\u8BC4\u8BBA\u3002',\n '- \u628A\u542B\u7CCA\u8BCD\u6536\u655B\u4E3A\u53EF\u89C2\u5BDF\u3001\u53EF\u6267\u884C\u7684\u8981\u6C42\u3002',\n '- \u5B58\u5728\u4E24\u79CD\u5408\u7406\u89E3\u8BFB\u65F6\uFF1A\u6309\u66F4\u5E38\u89C1\u7684\u4E00\u79CD\u5199\u6210\u4E3B\u8981\u6C42\uFF0C\u53E6\u4E00\u79CD\u5199\u6210\"\u5982\u679C\u5B9E\u9645\u662F X\uFF0C\u5219\u2026\"\u7684\u6307\u4EE4\u3002',\n '\u94C1\u5F8B\uFF1A\u4E0D\u5F97\u589E\u52A0\u65B0\u529F\u80FD/\u65B0\u76EE\u6807/\u65B0\u4F9D\u8D56\uFF1B\u4E0D\u5F97\u865A\u6784\u7528\u6237\u6CA1\u63D0\u7684\u73AF\u5883\u3001\u6570\u636E\u3001\u6280\u672F\u6808\uFF1B\u6BCF\u6761\u8865\u5145\u90FD\u5FC5\u987B\u80FD\u56DE\u6EAF\u5230\u539F\u8BDD\u91CC\u7684\u67D0\u53E5\u3002',\n NO_META_RULES,\n ].join('\\n'),\n },\n extreme: {\n temperature: 0.3,\n system: [\n RELAY_ROLE,\n '\u8FD9\u6B21\u662F\u4E00\u4E2A\u9700\u8981\u591A\u6B65\u6267\u884C\u7684\u590D\u6742\u4EFB\u52A1\u3002\u4F60\u8981\u8F6C\u8FBE\u7684\u662F**\u4E00\u6761\u53EF\u76F4\u63A5\u53D1\u9001\u7684\u547D\u4EE4**\uFF1A\u7528\u6237\u4E0D\u4F1A\u518D\u7F16\u8F91\u6216\u8F6C\u8FF0\uFF0C\u5DE5\u4F5C AI \u4F1A\u7167\u5B83\u6267\u884C\u3002',\n '\u8981\u6C42\uFF08\u5168\u90E8\u4EE5\"\u7528\u6237\u5728\u7ED9\u5DE5\u4F5C AI \u4E0B\u547D\u4EE4\"\u7684\u53E3\u543B\u5199\uFF09\uFF1A',\n '- \u5148\u628A\u8BC9\u6C42\u56FA\u5316\u4E3A\u547D\u4EE4\u7ED3\u6784\uFF1A\u8981\u505A\u4EC0\u4E48 / \u505A\u5B8C\u7684\u6807\u5FD7\uFF08\u53EF\u89C2\u6D4B\u9A8C\u6536\u6807\u51C6\uFF09/ \u786C\u7EA6\u675F / \u4E0D\u8BB8\u505A\u4EC0\u4E48\u3002',\n '- \u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\uFF1A\u6BCF\u9636\u6BB5\u5199\u6E05\u52A8\u4F5C\u4E0E\u4EA7\u51FA\uFF0C\u5E76\u5199\u660E\u7EAA\u5F8B\u8981\u6C42\uFF08\u5148\u9A8C\u8BC1\u518D\u6539\u3001\u5931\u8D25\u5373\u56DE\u9000\u3001\u4E0D\u64C5\u81EA\u6269\u5927\u8303\u56F4\u3001\u6539\u5B8C\u7ED9\u51FA\u8BC1\u636E\uFF09\u3002',\n '- \u591A\u60C5\u51B5\u9884\u6848\uFF1A\u7ED9\u51FA\u6700\u53EF\u80FD\u51FA\u5C94\u5B50\u7684 2\u20134 \u79CD\u60C5\u51B5\uFF0C\u6BCF\u79CD\u5199\u6210\"\u5982\u679C\u51FA\u73B0 <\u89E6\u53D1\u4FE1\u53F7>\uFF0C\u5C31\u5148 <\u5E94\u5BF9\u52A8\u4F5C>\uFF0C\u4E0D\u8981 <\u7981\u6B62\u52A8\u4F5C>\"\u3002',\n '- \u662F\u5426\u9700\u8981\u529F\u80FD\u6027\u6307\u4EE4\uFF1A\u5224\u65AD\u8FD9\u6B21\u4EFB\u52A1\u662F\u5426\u503C\u5F97\u8BA9\u5DE5\u4F5C AI \u7528 goal / todo / \u8BA1\u5212\u6A21\u5F0F \u8DDF\u8E2A\uFF0C\u5E76\u628A\u7ED3\u8BBA**\u5199\u6210\u547D\u4EE4\u672C\u8EAB\u7684\u4E00\u90E8\u5206**\uFF08\u4F8B\u5982\"\u8BF7\u5148\u5EFA\u7ACB goal\uFF1A\u2026\uFF0C\u518D\u6309\u4E0B\u5217\u9636\u6BB5\u63A8\u8FDB\"\uFF09\uFF1B\u4E0D\u9700\u8981\u5C31\u5B8C\u5168\u4E0D\u63D0\u3002',\n '\u94C1\u5F8B\uFF1A\u4E0D\u5F97\u865A\u6784\u9879\u76EE\u4E8B\u5B9E\uFF1B\u9700\u8981\u9879\u76EE\u4E8B\u5B9E\u65F6\u5199\u6210\"\u5148\u8BFB\u53D6/\u786E\u8BA4 X\"\u7684\u67E5\u8BC1\u52A8\u4F5C\uFF0C\u800C\u4E0D\u662F\u7F16\u9020\u7ED3\u8BBA\u3002',\n NO_META_RULES,\n ].join('\\n'),\n },\n} as const\n\n/** \u6863\u4F4D id \u8054\u5408\uFF08\u4E0E settings-contract \u7684 OptimizerTier \u4E00\u81F4\uFF0C\u6B64\u5904\u4E0D import \u4EE5\u514D\u5FAA\u73AF\uFF09\u3002 */\nexport type OptimizerSpecTier = keyof typeof OPTIMIZER_SPECS\n\n/**\n * \u7EC4\u88C5\u4E00\u6B21\u4F18\u5316\u7684 system \u63D0\u793A\u8BCD\u3002\n * @param tier - \u5F3A\u5EA6\u6863\u4F4D\uFF1B\u672A\u77E5\u503C\u8D70 advanced\uFF08\u9ED8\u8BA4\u6863\uFF09\u3002\n * @returns \u8BE5\u6863\u4F4D\u7684\u5B8C\u6574\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002\n */\nexport function buildOptimizeSystem(tier: string): string {\n const spec = OPTIMIZER_SPECS[tier as OptimizerSpecTier] ?? OPTIMIZER_SPECS.advanced\n return spec.system\n}\n\n/**\n * \u7EC4\u88C5\u4E00\u6B21\u4F18\u5316\u7684 temperature\u3002\n * @param tier - \u5F3A\u5EA6\u6863\u4F4D\uFF1B\u672A\u77E5\u503C\u8D70 advanced\u3002\n * @returns \u8BE5\u6863\u4F4D\u7684\u91C7\u6837\u6E29\u5EA6\u3002\n */\nexport function buildOptimizeTemperature(tier: string): number {\n const spec = OPTIMIZER_SPECS[tier as OptimizerSpecTier] ?? OPTIMIZER_SPECS.advanced\n return spec.temperature\n}\n\n/**\n * \u4F20\u8BDD\u6846\u67B6\uFF1A\u628A\u7528\u6237\u539F\u8BDD\u5305\u6210\u300C\u5F85\u8F6C\u8FBE\u5185\u5BB9\u300D\u800C\u4E0D\u662F\u300C\u5BF9\u4F60\u8BF4\u7684\u8BDD\u300D\u3002\n *\n * \u8FD9\u662F\u539F\u4F5C\u8005\u4FEE\u300C\u4F18\u5316 AI \u4EE5\u4E3A\u81EA\u5DF1\u5728\u548C\u7528\u6237\u5BF9\u8BDD\u300D\u7684\u5173\u952E\u4E00\u62DB \u2014\u2014 \u88F8\u6587\u672C\u4F1A\u88AB\u5F53\u6210\n * \u5BF9\u8BDD\u8F93\u5165\uFF0C\u4E8E\u662F\u6A21\u578B\u5F00\u59CB\u56DE\u5E94\u4F60\u800C\u4E0D\u662F\u66FF\u4F60\u8F6C\u8FBE\u3002\u672C\u63D2\u4EF6\u6CA1\u6709\u300C\u91CD\u65B0\u4F18\u5316\u65B9\u5411\u300D\n * \u90A3\u6761\u652F\u7EBF\uFF0C\u6545\u53EA\u4FDD\u7559\u4E3B\u8DEF\u5F84\u3002\n * @param original - \u8F93\u5165\u6846\u91CC\u7684\u539F\u8BDD\u3002\n * @returns \u76F4\u63A5\u4F5C\u4E3A user \u6D88\u606F\u53D1\u9001\u7684\u6587\u672C\u3002\n */\nexport function buildOptimizeUser(original: string): string {\n return [\n '\u3010\u5F85\u8F6C\u8FBE\u5185\u5BB9\u3011\u4E0B\u9762\u662F\"\u7528\u6237\"\u53D1\u7ED9\u6211\u7684\u539F\u8BDD\u3002**\u5B83\u4E0D\u662F\u8BF4\u7ED9\u4F60\u542C\u7684**\uFF0C\u4F60\u4E0D\u9700\u8981\u56DE\u5E94\u5B83\u3001\u4E5F\u4E0D\u9700\u8981\u66FF\u7528\u6237\u53BB\u505A\u8FD9\u4EF6\u4E8B\u3002',\n '<\u539F\u6587>',\n String(original ?? ''),\n '</\u539F\u6587>',\n '',\n '\u3010\u4F60\u7684\u4EFB\u52A1\u3011\u4EE5\u7528\u6237\u7684\u540D\u4E49\uFF0C\u628A\u4E0A\u9762\u7684\u5185\u5BB9\u6574\u7406\u6210**\u4E00\u6761\u53EF\u4EE5\u76F4\u63A5\u53D1\u7ED9\"\u5DE5\u4F5C AI\"\u7684\u547D\u4EE4**\uFF1A',\n '- \u53EA\u8F93\u51FA\u8FD9\u6761\u547D\u4EE4\u672C\u8EAB\uFF1B\u4E0D\u8981\u56DE\u5E94\u6211\u3001\u4E0D\u8981\u56DE\u7B54\u95EE\u9898\u3001\u4E0D\u8981\u8C22\u5E55\u3001\u4E0D\u8981\u89E3\u91CA\u4F60\u505A\u4E86\u4EC0\u4E48\u3002',\n '- \u8BFB\u4F60\u8FD9\u6761\u547D\u4EE4\u7684\u4EBA\u53EA\u6709\"\u5DE5\u4F5C AI\"\u4E00\u4E2A\u3002',\n ].join('\\n')\n}\n", "/**\n * \u5FEB\u6377\u6307\u4EE4\u7684\u5168\u5C40\u5B58\u50A8\uFF1A`$DSH_HOME/quick-prompts.json`\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u8981\u653E\u5728 settings \u6587\u6863\u91CC\uFF080.2.x \u7684\u505A\u6CD5\uFF09\uFF1A\n * 1. \u8BBE\u7F6E\u6587\u6863\u5BF9**\u6570\u7EC4**\u662F\u6574\u4EFD\u66FF\u6362\uFF0C\u4E14\u53D7 schema \u957F\u5EA6\u4E0A\u9650\u7EA6\u675F\u2014\u2014\u65E7\u4E0A\u9650 4000 \u5B57\u4F1A\u628A\n * \u957F\u63D0\u793A\u8BCD**\u9759\u9ED8\u622A\u65AD**\uFF1B\n * 2. \u5FEB\u6377\u6307\u4EE4\u662F\u300C\u7528\u6237\u5185\u5BB9\u300D\u800C\u4E0D\u662F\u300C\u63D2\u4EF6\u914D\u7F6E\u300D\uFF0C\u5355\u72EC\u4E00\u4E2A\u6587\u4EF6\u4FBF\u4E8E\u5907\u4EFD\u3001\u642C\u8FC1\u3001\n * \u624B\u5DE5\u7F16\u8F91\uFF0C\u63D2\u4EF6\u88AB\u7981\u7528/\u5378\u8F7D\u4E5F\u4E0D\u7275\u8FDE\u5B83\uFF1B\n * 3. \u4E0E\u4F1A\u8BDD\u3001\u9879\u76EE\u65E0\u5173\uFF08DSH_HOME \u7EA7\u522B\uFF09\uFF0C\u6362\u4E2A\u4ED3\u5E93\u3001\u6362\u4E2A\u4F1A\u8BDD\u90FD\u8FD8\u5728\u3002\n *\n * \u4E0E lnyuqian/dsh-quick-prompts \u7684\u4E24\u5904\u5DEE\u522B\uFF08\u90FD\u5F80\u4E25\u683C\u7684\u65B9\u5411\u8D70\uFF09\uFF1A\n * \u00B7 \u5B83\u662F `writeFile(...)` \u76F4\u63A5\u8986\u76D6 \u2014\u2014 \u4E2D\u9014\u5931\u8D25\u4F1A\u7559\u4E0B**\u622A\u65AD\u7684 JSON**\uFF1B\u8FD9\u91CC\u7528\n * \u300C\u4E34\u65F6\u6587\u4EF6 \u2192 fsync \u2192 rename\u300D\u539F\u5B50\u66FF\u6362\uFF0C\u8BFB\u8005\u53EA\u4F1A\u770B\u5230\u65E7\u6587\u4EF6\u6216\u65B0\u6587\u4EF6\u3002\n * \u00B7 \u5B83\u8BFB\u76D8\u5931\u8D25\u65F6 `catch { return [] }` \u2014\u2014 \u4E8E\u662F UI \u663E\u793A\u7A7A\u5217\u8868\uFF0C\u7528\u6237\u4E00\u4FDD\u5B58\u5C31\u628A\n * \u7A7A\u5217\u8868\u5199\u56DE\u53BB\uFF0C**\u771F\u6570\u636E\u88AB\u8986\u76D6**\uFF1B\u8FD9\u91CC\u89E3\u6790\u5931\u8D25\u5148**\u9694\u79BB**\u574F\u6587\u4EF6\n * \uFF08\u6539\u540D\u6210 `.bad-<\u65F6\u95F4\u6233>`\uFF09\u518D\u5982\u5B9E\u62A5\u9519\uFF0C\u7EDD\u4E0D\u8FD4\u56DE\u7A7A\u672C\u3001\u7EDD\u4E0D\u5199\u5165\u3002\n */\nimport { mkdir, open, readFile, rename, unlink } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport {\n QUICK_BOOK_VERSION, bookToFile, defaultQuickBook, sanitizeBook,\n type QuickPromptBook,\n} from './settings-contract.ts'\n\n/** \u6587\u4EF6\u540D\u3002\u4E0E\u53C2\u8003\u5B9E\u73B0\u540C\u8DEF\u5F84\uFF0C\u6240\u4EE5\u4E24\u8FB9\u80FD\u8BFB\u540C\u4E00\u4EFD\u6570\u636E\u3002 */\nexport const QUICK_STORE_FILE = 'quick-prompts.json'\n\n/** \u62FF\u9501\u7684\u91CD\u8BD5\u8282\u594F\u4E0E\u603B\u65F6\u957F\u3002 */\nconst LOCK_RETRY_MS = 50\nconst LOCK_RETRY_MAX = 40\n\n/** \u8D85\u8FC7\u8FD9\u4E2A\u5E74\u9F84\u7684\u9501\u89C6\u4E3A\u300C\u4E0A\u6B21\u5199\u5165\u5D29\u6E83\u7559\u4E0B\u7684\u300D\uFF0C\u53EA\u63D0\u793A\u64CD\u4F5C\u8005\u624B\u5DE5\u5904\u7406\uFF0C\u4E0D\u81EA\u52A8\u62A2\u5360\u3002 */\nconst LOCK_STALE_MS = 30_000\n\n/** \u8BFB\u76D8\u7ED3\u679C\u3002`missing` = \u8FD8\u6CA1\u6709\u6587\u4EF6\uFF0C\u53EF\u4EE5\u8FC1\u79FB\uFF1B`broken` = \u6587\u4EF6\u5728\u4F46\u8BFB\u4E0D\u4E86\uFF08\u5DF2\u9694\u79BB\uFF09\u3002 */\nexport type ReadOutcome =\n | { readonly kind: 'missing' }\n | { readonly kind: 'ok'; readonly book: QuickPromptBook }\n | { readonly kind: 'broken'; readonly error: string; readonly quarantined?: string }\n\n/** `$DSH_HOME`\uFF1B\u73AF\u5883\u53D8\u91CF\u7F3A\u5931\u65F6\u56DE\u9000 `~/.dsh`\u3002 */\nexport function dshHome(): string {\n const fromEnv = process.env.DSH_HOME?.trim()\n return fromEnv !== undefined && fromEnv !== '' ? fromEnv : join(homedir(), '.dsh')\n}\n\n/** \u5FEB\u6377\u6307\u4EE4\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002 */\nexport function quickStorePath(): string {\n return join(dshHome(), QUICK_STORE_FILE)\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction hasCode(error: unknown, code: string): boolean {\n return typeof error === 'object' && error !== null && (error as { code?: unknown }).code === code\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => { setTimeout(resolve, ms) })\n}\n\n/** \u628A\u574F\u6587\u4EF6\u6539\u540D\u9694\u79BB\uFF0C\u8FD4\u56DE\u65B0\u8DEF\u5F84\uFF08\u6539\u540D\u5931\u8D25\u5219\u8FD4\u56DE undefined\uFF0C\u4F46\u7EDD\u4E0D\u5220\u9664\uFF09\u3002 */\nasync function quarantine(file: string): Promise<string | undefined> {\n const stamp = new Date().toISOString().replace(/[:.]/g, '-')\n const target = `${file}.bad-${stamp}`\n try {\n await rename(file, target)\n return target\n } catch {\n return undefined\n }\n}\n\n/**\n * \u8BFB\u76D8\u3002\n * @param file \u6587\u4EF6\u8DEF\u5F84\u3002\n * @returns \u4E09\u79CD\u7ED3\u5C40\u4E4B\u4E00\uFF1B**\u89E3\u6790\u5931\u8D25\u7EDD\u4E0D\u5F53\u6210\u7A7A\u672C**\u3002\n */\nexport async function readQuickBook(file: string = quickStorePath()): Promise<ReadOutcome> {\n let raw: string\n try {\n raw = await readFile(file, 'utf8')\n } catch (error) {\n if (hasCode(error, 'ENOENT')) return { kind: 'missing' }\n return { kind: 'broken', error: `\u8BFB\u53D6\u5931\u8D25\uFF1A${errorText(error)}` }\n }\n if (raw.trim() === '') return { kind: 'broken', error: '\u6587\u4EF6\u662F\u7A7A\u7684', quarantined: await quarantine(file) }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n return { kind: 'broken', error: `\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${errorText(error)}`, quarantined: await quarantine(file) }\n }\n const book = sanitizeBook(parsed)\n if (book === undefined) {\n return {\n kind: 'broken',\n error: '\u7ED3\u6784\u8BA4\u4E0D\u51FA\uFF08\u65E2\u4E0D\u662F categories \u4E5F\u4E0D\u662F\u5E73\u94FA prompts\uFF09',\n quarantined: await quarantine(file),\n }\n }\n return { kind: 'ok', book }\n}\n\n/** \u62FF\u5199\u9501\uFF1A`<file>.lock` \u7528 `wx` \u72EC\u5360\u521B\u5EFA\uFF0C\u62FF\u5230\u624D\u7B97\u8FDB\u5165\u4E34\u754C\u533A\u3002 */\nasync function acquireLock(file: string): Promise<() => Promise<void>> {\n const lock = `${file}.lock`\n for (let attempt = 0; attempt < LOCK_RETRY_MAX; attempt += 1) {\n try {\n const handle = await open(lock, 'wx', 0o600)\n await handle.close()\n return async () => { try { await unlink(lock) } catch { /* \u5DF2\u88AB\u91CA\u653E */ } }\n } catch (error) {\n if (!hasCode(error, 'EEXIST')) throw error\n // \u9057\u7559\u9501\u4E0D\u81EA\u52A8\u62A2\u5360\uFF1A\u9501\u7684\u65B0\u65E7\u65E0\u6CD5\u533A\u5206\u300C\u5D29\u6E83\u7684\u6240\u6709\u8005\u300D\u4E0E\u300C\u53EA\u662F\u88AB\u6682\u505C\u7684\u5199\u8005\u300D\uFF0C\n // \u6240\u4EE5\u53EA\u628A\u5904\u7F6E\u529E\u6CD5\u8BF4\u6E05\u695A\uFF0C\u4EA4\u7ED9\u64CD\u4F5C\u8005\u3002\n let ageMs: number | undefined\n try {\n const info = await open(lock, 'r')\n try {\n const stat = await info.stat()\n ageMs = Date.now() - stat.mtimeMs\n } finally {\n await info.close()\n }\n } catch { /* \u9501\u521A\u597D\u88AB\u91CA\u653E\uFF0C\u4E0B\u4E00\u8F6E\u91CD\u8BD5 */ }\n if (ageMs !== undefined && ageMs > LOCK_STALE_MS) {\n throw new Error(\n `\u5199\u5165\u9501 ${lock} \u5DF2\u5B58\u5728 ${Math.round(ageMs / 1000)} \u79D2\uFF0C\u50CF\u662F\u4E0A\u6B21\u5199\u5165\u5D29\u6E83\u7559\u4E0B\u7684\uFF1B`\n + '\u786E\u8BA4\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684 DSH \u540E\u5220\u9664\u5B83\u518D\u91CD\u8BD5',\n )\n }\n await delay(LOCK_RETRY_MS)\n }\n }\n throw new Error(`\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u6B63\u5728\u5199\u5165 ${file}\uFF08\u7B49\u5F85 ${String((LOCK_RETRY_MS * LOCK_RETRY_MAX) / 1000)} \u79D2\u4ECD\u672A\u62FF\u5230\u9501\uFF09`)\n}\n\n/**\n * \u539F\u5B50\u5199\uFF1A\u4E34\u65F6\u6587\u4EF6 \u2192 fsync \u2192 rename\u3002\n * @param book \u5F85\u5199\u5165\u7684\u672C\uFF08\u5199\u524D\u4ECD\u4F1A\u6536\u7A84\u4E00\u6B21\uFF09\u3002\n * @param file \u76EE\u6807\u8DEF\u5F84\u3002\n */\nexport async function writeQuickBook(book: QuickPromptBook, file: string = quickStorePath()): Promise<void> {\n await mkdir(dirname(file), { recursive: true })\n const release = await acquireLock(file)\n try {\n await writeLocked(book, file)\n } finally {\n await release()\n }\n}\n\n/** \u771F\u6B63\u7684\u5199\u5165\u52A8\u4F5C\uFF1B\u8C03\u7528\u65B9\u5FC5\u987B\u5DF2\u7ECF\u6301\u9501\u3002 */\nasync function writeLocked(book: QuickPromptBook, file: string): Promise<void> {\n const safe = sanitizeBook(book) ?? { version: QUICK_BOOK_VERSION, categories: [] }\n const tmp = `${file}.${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.tmp`\n const handle = await open(tmp, 'w', 0o600)\n try {\n await handle.writeFile(`${JSON.stringify(bookToFile(safe), null, 2)}\\n`, 'utf8')\n await handle.sync()\n } finally {\n await handle.close()\n }\n // \u540C\u76EE\u5F55 rename \u662F\u539F\u5B50\u7684\uFF1A\u5E76\u53D1\u8BFB\u8005\u8981\u4E48\u770B\u5230\u65E7\u6587\u4EF6\u3001\u8981\u4E48\u770B\u5230\u65B0\u6587\u4EF6\uFF0C\u4E0D\u4F1A\u770B\u5230\u534A\u622A\u3002\n await rename(tmp, file)\n}\n\n/**\n * \u53D6\u5F53\u524D\u8FD9\u672C\uFF1B\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u505A\u4E00\u6B21\u8FC1\u79FB\u3002\n *\n * @param seed settings \u91CC\u65E7\u7684\u5E73\u94FA\u5217\u8868\uFF080.2.x \u7684 `quickPrompts`\uFF09\uFF1B\u7F3A\u5931\u6216\u4E3A\u7A7A\u5219\u7528\u5185\u7F6E 9 \u6761\u3002\n * @param file \u6587\u4EF6\u8DEF\u5F84\u3002\n * @returns \u8BFB\u76D8\u7ED3\u679C\uFF08\u8FC1\u79FB\u6210\u529F\u540E\u4E3A `ok`\uFF09\u3002\n */\nexport async function ensureQuickBook(\n seed: readonly unknown[] | undefined,\n file: string = quickStorePath(),\n): Promise<ReadOutcome> {\n const current = await readQuickBook(file)\n if (current.kind !== 'missing') return current\n\n // \u300C\u6587\u4EF6\u4E0D\u5B58\u5728\u300D\u662F\u4E00\u4E2A\u9700\u8981**\u590D\u6838**\u7684\u5224\u65AD\uFF1A\u5E76\u53D1\u8BF7\u6C42\u53EF\u80FD\u540C\u65F6\u770B\u5230\u7F3A\u5931\uFF0C\u5982\u679C\u5404\u81EA\n // \u5C31\u5730\u521D\u59CB\u5316\uFF0C\u540E\u5230\u7684\u90A3\u4E2A\u4F1A\u628A\u5148\u5230\u7684\u7528\u6237\u6570\u636E\u8986\u76D6\u6210\u9ED8\u8BA4\u672C\u3002\u6240\u4EE5\u5728\u5199\u9501\u91CC\u518D\u8BFB\u4E00\u6B21\uFF0C\n // \u53EA\u6709\u4ECD\u7136\u7F3A\u5931\u624D\u521D\u59CB\u5316\u3002\n await mkdir(dirname(file), { recursive: true })\n const release = await acquireLock(file)\n try {\n const again = await readQuickBook(file)\n if (again.kind !== 'missing') return again\n const migrated = seed === undefined ? undefined : sanitizeBook({ prompts: seed })\n const book = migrated !== undefined && migrated.categories.length > 0 ? migrated : defaultQuickBook()\n await writeLocked(book, file)\n return { kind: 'ok', book }\n } finally {\n await release()\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["value", "Binary", "result", "a", "b", "Time", "date", "template", "options", "pattern", "value", "extra", "resolve", "toJSON", "date", "toString", "name", "key", "existsSync", "dirname", "join", "resolve", "name", "name", "sep", "isAbsolute", "controller", "handle", "name", "found", "resolve", "dirname", "set", "name", "errorText", "resolve", "objectOf", "textOf", "name", "errorText", "existsSync", "resolve", "dirname", "join"]
3
+ "sources": ["../../../../DeepSeek Harness/vendor/cosmokit/lib/index.js", "../../../../DeepSeek Harness/vendor/schemastery/lib/index.mjs", "../src/host.ts", "../src/terminal/discover.ts", "../src/terminal/contracts.ts", "../src/settings-contract.ts", "../src/terminal/host.ts", "../src/terminal/sandbox.ts", "../src/terminal/render.ts", "../src/terminal/tool.ts", "../src/restart.ts", "../src/optimizer-prompt.ts", "../src/optimizer-assemble.ts", "../src/quick-store.ts", "../src/settings-lock.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", "/**\n * Host half\u3002\u4E24\u4EF6\u4E8B\uFF1A\n *\n * 1. \u5F53 settings \u670D\u52A1\u5B58\u5728\u65F6\uFF0C\u4E3A\u6D4F\u89C8\u5668\u4FA7\u6CE8\u518C\u300Ccomposer-ux\u300D\u8BBE\u7F6E\u533A\uFF08schema\uFF09\uFF1B\n * 2. \u628A\u8BBE\u7F6E\u9875\u7684\u300COpenCode \u8BF7\u6C42\u5934\u300D\u955C\u50CF\u8FDB llm-pi-ai \u7684 provider profile\u3002\n * \u5F15\u64CE/\u83DC\u5355\u884C\u4E3A\u4ECD\u5168\u90E8\u7531 client \u534A\u5B9E\u73B0\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8BF7\u6C42\u5934\u5FC5\u987B\u843D\u5728\u5BBF\u4E3B\u534A\uFF1A\u51FA\u7F51\u8BF7\u6C42\u7531\u5BBF\u4E3B\u7684\u6A21\u578B\u9002\u914D\u5668\u53D1\u51FA\uFF0C\u6D4F\u89C8\u5668\u4FA7\u78B0\u4E0D\u5230\u3002\n * \u800C DSH \u91CC\u552F\u4E00\u53D7\u652F\u6301\u7684\u8BF7\u6C42\u5934\u5165\u53E3\u5C31\u662F llm-pi-ai \u7684 `providers.<route>.headers`\n * \u2014\u2014 \u5B83\u4F5C\u4E3A pi-ai \u7684 optionsHeaders \u5728\u6700\u540E\u5408\u5E76\uFF08\u80FD\u8986\u76D6\u9ED8\u8BA4\u5934\uFF09\uFF0C\u4E14\u8BE5\u9002\u914D\u5668\u6BCF\u6B21\n * \u8BF7\u6C42\u90FD\u91CD\u8BFB\u914D\u7F6E\uFF0C\u6240\u4EE5\u300C\u6539\u5B8C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u5373\u751F\u6548\u3001\u4E0D\u7528\u91CD\u542F\u300D\u3002\n *\n * \u5199\u5165\u65B9\u5F0F\u7528 `settings.mutate` \u7684\u8DEF\u5F84\u5BFB\u5740\uFF1A\u53EA\u52A8\u6211\u4EEC\u81EA\u5DF1\u90A3\u4E00\u4E2A\u952E\uFF0C\n * \u65E2\u4E0D\u91CD\u8FF0\u4E5F\u4E0D\u5220\u9664\u7528\u6237\u5199\u5728\u540C\u4E00\u4E2A profile \u91CC\u7684\u5176\u5B83\u5B57\u6BB5\u3002\n */\nimport type { Context } from '@deepseek-ai/cordis'\nimport z from '@deepseek-ai/schemastery'\nimport { spawn } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport inspector from 'node:inspector'\nimport {\n DEFAULT_HEADER_NAME, DEFAULT_QUICK_PROMPTS, DEFAULT_SETTINGS, ENABLED_FIELD,\n KEYS_ENABLED_FIELD, MENU_ENABLED_FIELD, PANEL_ENABLED_FIELD, QUICK_ENABLED_FIELD,\n TERMINAL_ENABLED_FIELD,\n HEADER_APPLIED_NAME_FIELD,\n HEADER_APPLIED_VALUE_FIELD, HEADER_ENABLED_FIELD, HEADER_NAME_FIELD, HEADER_NAME_MAX,\n HEADER_ROUTES_FIELD, HEADER_STATUS_FIELD, HEADER_VALUE_FIELD, HEADER_VALUE_MAX,\n LLM_NAMESPACE, MENU_FIELDS, MENU_MODE_FIELD, MENU_NATIVE_FIELD, NAMESPACE, NEWLINE_KEY_FIELD,\n OPENCODE_HOSTS, OPENCODE_ROUTE_PREFIX, OPTIMIZE_OUTPUT_MAX, OPTIMIZE_TEXT_MAX,\n OPTIMIZER_API_PATH, OPTIMIZER_PROMPT_FIELDS, OPTIMIZER_TIER_FIELD, PANEL_HEIGHT_FIELD, PANEL_RESIZE_FIELD,\n PANEL_WIDTH_FIELD, QUICK_PROMPTS_API_PATH, QUICK_PROMPTS_FIELD,\n RESTART_API_PATH,\n SEND_KEY_FIELD, defaultQuickBook, newSessionId, optimizerPromptFieldOf, parseRouteList, sanitizeBook, DEFAULT_OPTIMIZER_TIER,\n type QuickPromptBook,\n} from './settings-contract.ts'\nimport {\n TERMINAL_BASH_PATH_FIELD, TERMINAL_CANDIDATES_FIELD, TERMINAL_EFFECTIVE_FIELD,\n TERMINAL_MODE_FIELD, TERMINAL_STATUS_FIELD,\n} from './terminal/contracts.ts'\nimport { installTerminalPolicy } from './terminal/host.ts'\nimport type { BashToolDeps } from './terminal/tool.ts'\nimport {\n RESTART_LOG_PREFIX, bootId, detectedDebugger, detectedSupervisor, gracefulStop, planRestart,\n scheduleRestart, servingPort, trustedRestartRequest,\n} from './restart.ts'\nimport type { RestartIo } from './restart.ts'\nimport { buildOptimizeSystem, buildOptimizeTemperature, buildOptimizeUser, optimizePromptSource } from './optimizer-prompt.ts'\nimport { runOptimizePipeline } from './optimizer-assemble.ts'\nimport { ensureQuickBook, quickStorePath, readQuickBook, writeQuickBook } from './quick-store.ts'\nimport { profileDirOfPatchPath, recoverStaleSettingsLock } from './settings-lock.ts'\n\nexport const name = 'composer-ux'\n\n/** \u8BBE\u7F6E\u9762\u677F\u53EF\u8C03\u5C3A\u5BF8\u7684\u4E0A\u4E0B\u9650\uFF08\u4E0E client \u4FA7\u7684 clamp \u4FDD\u6301\u4E00\u81F4\uFF09\u3002 */\nconst PANEL_MIN = 560\nconst PANEL_MAX = 4000\n\n/** \u8DEF\u5F84\u5BFB\u5740\u5199\u5165\uFF1A\u4E0E settings \u670D\u52A1\u7684 SettingsPathOp \u7ED3\u6784\u4E00\u81F4\u3002 */\ntype PathOp =\n | { op: 'set'; path: readonly string[]; value: unknown }\n | { op: 'unset'; path: readonly string[] }\n\n/**\n * \u672C\u63D2\u4EF6\u7528\u5230\u7684 settings \u80FD\u529B\uFF08\u4FDD\u6301\u7ED3\u6784\u6700\u5C0F\uFF0C\u907F\u514D\u4F9D\u8D56\u5177\u4F53\u5B9E\u73B0\u7C7B\uFF09\u3002\n *\n * \u26A0\uFE0F \u4E24\u4EE3 DSH \u7684\u670D\u52A1\u5F62\u72B6\u4E0D\u540C\uFF082026-09 \u5B9E\u6D4B\uFF09\uFF1A\n * \u00B7 0.1.6 \u53CA\u4EE5\u524D\uFF1A\u6709 `get(ns)` \u8BFB\u89E3\u6790\u540E\u7684\u503C\u3001\u6709 `register(ns, schema)` \u6CE8\u518C\u547D\u540D\u7A7A\u95F4\u3002\n * \u00B7 0.1.7 \u8D77\uFF1A`get` \u4E0E `register` \u90FD\u88AB\u5220\u9664\uFF1B\u547D\u540D\u7A7A\u95F4\u7531\u5BFC\u51FA\u7684 Config \u63A8\u5BFC\uFF0C\n * \u522B\u4EBA\u7684\u884C\u53EA\u80FD\u4ECE `describe()` \u7684\u5FEB\u7167\u91CC\u8BFB\u3002\n * \u6240\u4EE5\u4E09\u4E2A\u6210\u5458\u90FD\u58F0\u660E\u6210\u53EF\u9009\uFF0C\u6309\u80FD\u529B\u7528 \u2014\u2014 \u89C1 {@link makeReader} \u4E0E {@link ownSchema}\u3002\n */\ninterface SettingsLike {\n get?(ns: string): unknown\n register?(ns: string, schema: unknown): unknown\n describe?(options?: { redactSecrets?: boolean }): readonly { ns?: string; value?: unknown }[]\n mutate(ns: string, ops: readonly PathOp[]): Promise<void>\n}\n\n/** \u8BFB\u4E00\u4E2A\u547D\u540D\u7A7A\u95F4\u7684\u666E\u901A\u503C\u3002 */\ntype ReadRow = (ns: string) => Record<string, unknown> | undefined\n\n/** \u628A volatile \u5F15\u7528\u89E3\u5F15\u7528\u6210\u666E\u901A\u503C\uFF080.1.6 \u7684\u666E\u901A\u503C\u539F\u6837\u8FD4\u56DE\uFF09\u3002 */\nfunction plainConfig(value: unknown): unknown {\n if (typeof value === 'object' && value !== null\n && typeof (value as { get?: unknown }).get === 'function') {\n return plainConfig((value as { get: () => unknown }).get())\n }\n if (Array.isArray(value)) return value.map(plainConfig)\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, plainConfig(child)]))\n }\n return value\n}\n\n/**\n * \u9020\u4E00\u4E2A\u300C\u6309\u547D\u540D\u7A7A\u95F4\u8BFB\u503C\u300D\u7684\u8BFB\u53E3\uFF0C\u628A\u4E24\u4EE3 settings \u670D\u52A1\u7684\u8BFB\u53D6\u5DEE\u5F02\u6536\u5728\u8FD9\u4E00\u5904\u3002\n *\n * - 0.1.6 \u53CA\u4EE5\u524D\uFF1A\u670D\u52A1\u6709 `get(ns)`\uFF0C\u76F4\u63A5\u53D6\u89E3\u6790\u540E\u7684\u503C\u3002\n * - 0.1.7 \u8D77\uFF1A`get` \u6CA1\u4E86\u3002**\u81EA\u5DF1\u7684\u884C**\u7531\u5BFC\u51FA\u7684 {@link Config} \u7ED9\u51FA \u2014\u2014 \u5B57\u6BB5\u662F\n * volatile \u5F15\u7528\uFF0C\u5F97\u5148\u89E3\u5F15\u7528\uFF08{@link plainConfig}\uFF09\uFF1B**\u522B\u4EBA\u7684\u884C**\uFF08\u672C\u63D2\u4EF6\u53EA\u8BFB\n * llm-pi-ai \u7684 providers.headers\uFF09\u53EA\u80FD\u4ECE `describe()` \u7684\u5FEB\u7167\u91CC\u627E\u3002\n *\n * @param settings \u8BBE\u7F6E\u670D\u52A1\uFF08\u53EF\u80FD\u7F3A\u5E2D\uFF09\u3002\n * @param config \u672C\u884C\u7684 Config\uFF1A0.1.7 \u662F volatile \u5F15\u7528\u6811\uFF0C0.1.6 \u662F\u89E3\u6790\u540E\u7684\u666E\u901A\u503C\u3002\n */\nfunction makeReader(settings: SettingsLike | undefined, config: unknown): ReadRow {\n return (ns: string) => {\n try {\n if (typeof settings?.get === 'function') return objectOf(settings.get(ns))\n if (ns === NAMESPACE) {\n const own = objectOf(plainConfig(config))\n // Config \u8BFB\u4E0D\u51FA\u4E1C\u897F\u65F6\u7EE7\u7EED\u8D70 describe\uFF0C\u800C\u4E0D\u662F\u5F53\u6210\"\u8FD9\u4E00\u884C\u6CA1\u6709\u503C\"\u2014\u2014\n // \u8FD9\u6761\u8DEF\u5F84\u5728 Config \u7F3A\u5E2D\uFF08\u7EC4\u5408\u6CA1\u7ED9 config\uFF09\u65F6\u662F\u771F\u4F1A\u8D70\u5230\u7684\u3002\n if (own !== undefined) return own\n }\n const row = (settings?.describe?.() ?? []).find(candidate => candidate?.ns === ns)\n return objectOf(row?.value)\n } catch {\n // \u8BFB\u4E0D\u5230\u5C31\u5F53\u4F5C\"\u6CA1\u6709\"\uFF1A\u8C03\u7528\u65B9\u5168\u90FD\u6309\"\u7F3A\u5E2D \u21D2 \u4E0D\u5199\"\u5904\u7406\uFF08\u5E42\u7B49\u3001\u4E0D\u4F1A\u8BEF\u5220\u7528\u6237\u914D\u7F6E\uFF09\u3002\n return undefined\n }\n }\n}\n\n/** \u6536\u7A84\u6210\u666E\u901A\u5BF9\u8C61\uFF08\u6570\u7EC4\u4E0E null \u90FD\u4E0D\u7B97\uFF09\u3002 */\nfunction objectOf(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n}\n\n/** \u53EA\u63A5\u53D7\u5B57\u7B26\u4E32\uFF0C\u5176\u4F59\u4E00\u5F8B\u89C6\u4E3A\u7A7A\u4E32\u3002 */\nfunction textOf(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\n/**\n * \u8BFB\u672C\u63D2\u4EF6\u81EA\u5DF1\u90A3\u4E00\u884C\u91CC\u7684\u4E00\u4E2A\u5B57\u7B26\u4E32\u5B57\u6BB5\uFF08\u8BFB\u4E0D\u5230\u4E00\u5F8B\u8FD4\u56DE\u7A7A\u4E32\uFF09\u3002\n *\n * \u26A0\uFE0F \u4E3A\u4EC0\u4E48\u4E0D\u7528 `ctx.settings` \u90A3\u79CD\u88F8\u5C5E\u6027\u8BFB\uFF1A\u4E0D\u5728 `inject` \u5217\u8868\u91CC\u7684\u670D\u52A1\uFF0C\n * \u88F8\u5C5E\u6027\u8BFB\u4F1A\u5728 cordis \u7684 Proxy \u4E0A\u629B\uFF08\u672C\u63D2\u4EF6\u8E29\u8FC7\u4E00\u6B21\uFF0C\u89C1 client.tsx \u7684 peekService\uFF09\uFF1B\n * \u800C `get(name)` \u4E0D\u629B\u3002\u63D0\u793A\u8BCD\u4F18\u5316\u8DEF\u7531\u53EA inject \u4E86 webServer / llm \u2014\u2014\n * \u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u5C5E\u4E8E\"\u9526\u4E0A\u6DFB\u82B1\"\uFF0C\u4E0D\u8BE5\u8BA9\u6574\u6761\u8DEF\u7531\u56E0\u4E3A settings \u7F3A\u5E2D\u800C\u5E72\u8106\u4E0D\u6CE8\u518C\uFF0C\n * \u6240\u4EE5\u8FD9\u91CC\u8D70 `get` + try/catch\uFF1A\u8BFB\u4E0D\u5230\u5C31\u9000\u56DE\u5185\u7F6E\u63D0\u793A\u8BCD\u3002\n *\n * @param scope - \u4EFB\u610F\u5E26 `get` \u7684\u4E0A\u4E0B\u6587\uFF08\u5BBF\u4E3B ctx \u6216\u6CE8\u5165\u540E\u7684\u5B50 ctx\uFF09\u3002\n * @param config - \u672C\u884C\u7684 Config\uFF080.1.7 \u662F volatile \u5F15\u7528\u6811\uFF0C\u89E3\u5F15\u7528\u540E\u5373\u5F53\u524D\u503C\uFF09\u3002\n * @param field - \u5B57\u6BB5\u540D\u3002\n * @returns \u5B57\u6BB5\u503C\uFF1B\u4EFB\u4F55\u5F02\u5E38\u90FD\u5F52\u4E00\u6210\u7A7A\u4E32\u3002\n */\nfunction readOwnSetting(scope: unknown, config: unknown, field: string): string {\n try {\n const get = (scope as { get?: (name: string) => unknown } | undefined)?.get\n if (typeof get !== 'function') return ''\n const service = get.call(scope, 'settings') as SettingsLike | undefined\n return textOf(makeReader(service, config)(NAMESPACE)?.[field])\n } catch {\n return ''\n }\n}\n\n/** \u53D6\u5934\u503C\u7684\u7B2C\u4E00\u4E2A\uFF08Node \u5BF9\u91CD\u590D\u5934\u4F1A\u7ED9\u51FA\u6570\u7EC4\uFF09\u3002 */\nfunction firstHeaderValue(value: string | readonly string[] | undefined): string | undefined {\n if (value === undefined) return undefined\n return typeof value === 'string' ? value : value[0]\n}\n\n/**\n * \u4E66\u672C\u91CC\u6709\u6CA1\u6709\"\u975E\u5185\u7F6E\"\u7684\u5185\u5BB9 \u2014\u2014 \u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u8FC1\u79FB\u7684\u5224\u636E\uFF08\u89C1 apply \u91CC\u90A3\u6BB5\u8BF4\u660E\uFF09\u3002\n * @param book \u8BFB\u5230\u7684\u4E66\u672C\u3002\n * @returns \u4E0E\u5185\u7F6E\u9ED8\u8BA4\u672C\u4E0D\u540C\u5219\u4E3A true\u3002\n */\nfunction bookLooksCustom(book: QuickPromptBook): boolean {\n return JSON.stringify(sanitizeBook(book)) !== JSON.stringify(defaultQuickBook())\n}\n\n/** \u5934\u540D\u662F\u5426\u5408\u6CD5\uFF1A\u4E0E llm-pi-ai \u7684 assertValidHeaders \u540C\u89C4\u5219\uFF08Fetch \u63A5\u53D7\u624D\u7B97\uFF09\u3002 */\nfunction nameIsValid(name: string): boolean {\n if (name === '' || name.length > HEADER_NAME_MAX) return false\n try {\n new Headers([[name, 'probe']])\n return true\n } catch {\n return false\n }\n}\n\n/** \u5934\u503C\u662F\u5426\u5408\u6CD5\uFF1A\u975E\u7A7A\u3001\u4E0D\u8D85\u957F\u3001\u5355\u884C\u4E14\u53EF\u8868\u793A\u4E3A\u5B57\u8282\uFF08Fetch \u63A5\u53D7\u624D\u7B97\uFF09\u3002 */\nfunction valueIsValid(value: string): boolean {\n if (value === '' || value.length > HEADER_VALUE_MAX) return false\n try {\n new Headers([['x-dsh-probe', value]])\n return true\n } catch {\n return false\n }\n}\n\n/**\n * provider \u7684 baseURL \u662F\u5426\u6307\u5411 OpenCode\uFF08\u542B\u5B50\u57DF\uFF09\u3002\n * \u7528\u6237\u81EA\u5EFA\u8DEF\u7531\u7684\u540D\u5B57\u53EF\u4EE5\u662F\u4EFB\u610F\u5B57\u7B26\u4E32\uFF08\u4F8B\u5982 `go`\uFF09\uFF0C\u7AEF\u70B9\u5374\u4ECD\u662F OpenCode\uFF0C\n * \u6240\u4EE5\u300C\u6309 URL \u8BA4\u300D\u6BD4\u300C\u6309\u540D\u5B57\u8BA4\u300D\u53EF\u9760\uFF1BURL \u89E3\u6790\u5931\u8D25\u65F6\u9000\u56DE\u5B50\u4E32\u5224\u65AD\u3002\n */\nfunction isOpencodeBaseUrl(value: unknown): boolean {\n const raw = textOf(value).trim()\n if (raw === '') return false\n let host = ''\n try {\n host = new URL(raw).hostname.toLowerCase()\n } catch {\n return raw.toLowerCase().includes('opencode.ai')\n }\n return OPENCODE_HOSTS.some(name => host === name || host.endsWith(`.${name}`))\n}\n\n/**\n * \u672C\u6B21\u8981\u5199\u7684\u76EE\u6807\u8DEF\u7531\u3002\n * \u663E\u5F0F\u540D\u5355\u53EA\u4FDD\u7559 llm-pi-ai \u91CC**\u5DF2\u5B58\u5728**\u7684\u8DEF\u7531\u2014\u2014profile \u7684 `models` \u662F\u5FC5\u586B\u9879\uFF0C\n * \u51ED\u7A7A\u9020\u4E00\u4E2A\u53EA\u6709 headers \u7684 profile \u4F1A\u8BA9\u6574\u4EFD\u914D\u7F6E\u6821\u9A8C\u5931\u8D25\u3002\n * \u7559\u7A7A\u65F6\u7684\u81EA\u52A8\u5339\u914D\uFF1A\u8DEF\u7531\u540D\u4EE5 `opencode` \u5F00\u5934\uFF08\u5185\u7F6E `opencode-go` \u8D70\u8FD9\u6761\uFF0C\u5B83\u7684\n * baseURL \u7531 pi-ai \u76EE\u5F55\u5185\u7F6E\u3001\u914D\u7F6E\u91CC\u6CA1\u6709\uFF09\uFF0C**\u6216**\u8BE5\u8DEF\u7531\u7684 `baseURL` \u6307\u5411 opencode.ai\n * \uFF08\u81EA\u5EFA\u8DEF\u7531\u5E38\u8D77\u522B\u540D\uFF0C\u6309 URL \u8BA4\u66F4\u51C6\uFF09\u3002\n * @param providers - llm-pi-ai \u5F53\u524D\u7684 providers \u5B57\u5178\u3002\n * @param listed - \u8BBE\u7F6E\u91CC\u7684\u300C\u4F5C\u7528\u8DEF\u7531\u300D\u540D\u5355\uFF08\u7559\u7A7A\u8868\u793A\u81EA\u52A8\u5339\u914D\uFF09\u3002\n * @returns \u76EE\u6807\u8DEF\u7531\u540D\uFF0C\u987A\u5E8F\u8DDF\u968F providers \u7684\u952E\u987A\u5E8F\u3002\n */\nfunction pickRoutes(\n providers: Record<string, unknown>,\n listed: readonly string[],\n): readonly string[] {\n const keys = Object.keys(providers)\n if (listed.length === 0) {\n return keys.filter(key => key.startsWith(OPENCODE_ROUTE_PREFIX)\n || isOpencodeBaseUrl(objectOf(providers[key])?.baseURL))\n }\n return listed.filter(key => Object.prototype.hasOwnProperty.call(providers, key))\n}\n\n/** \u9519\u8BEF\u8F6C\u4E00\u884C\u53EF\u8BFB\u6587\u672C\uFF08\u5199\u8FDB headerStatus\uFF0C\u4F9B\u8BBE\u7F6E\u9875\u5C55\u793A\uFF09\u3002 */\nfunction errorText(error: unknown): string {\n if (error instanceof Error && error.message !== '') return error.message\n return String(error)\n}\n\n/**\n * \u628A\u300C\u8BF7\u6C42\u5934\u300D\u680F\u76EE\u5BF9\u9F50\u5230 llm-pi-ai \u914D\u7F6E\u3002\u5E42\u7B49\uFF1A\u7B97\u51FA\u7684\u76EE\u6807\u4E0E\u73B0\u72B6\u4E00\u81F4\u65F6\u4E0D\u5199\u4EFB\u4F55\u4E1C\u897F\uFF0C\n * \u56E0\u6B64\u672C\u51FD\u6570\u65E2\u53EF\u5728\u63D2\u4EF6\u542F\u52A8\u65F6\u8DD1\u4E00\u6B21\uFF0C\u4E5F\u53EF\u5728\u6BCF\u6B21 settings \u53D8\u66F4\u540E\u88AB\u53CD\u590D\u8C03\u7528\u3002\n * @param settings - settings \u670D\u52A1\uFF08\u7528\u4E8E\u5199\u5165\uFF09\u3002\n * @param read - \u6309\u547D\u540D\u7A7A\u95F4\u8BFB\u503C\u7684\u8BFB\u53E3\uFF08\u4E24\u4EE3\u670D\u52A1\u5DEE\u5F02\u5728 {@link makeReader} \u91CC\u6536\u53E3\uFF09\u3002\n */\nasync function mirrorHeader(settings: SettingsLike, read: ReadRow): Promise<void> {\n const own = read(NAMESPACE)\n if (own === undefined) return\n\n const enabled = own[ENABLED_FIELD] === true && own[HEADER_ENABLED_FIELD] === true\n const name = textOf(own[HEADER_NAME_FIELD])\n const nameOk = nameIsValid(name)\n const routesText = parseRouteList(textOf(own[HEADER_ROUTES_FIELD]))\n\n // \u9996\u6B21\u542F\u7528\u4E14\u503C\u4E3A\u7A7A\uFF1A\u751F\u6210\u4E00\u4E2A\u7A33\u5B9A ID \u5E76\u843D\u76D8\uFF0C\u6B64\u540E\u6BCF\u6B21\u90FD\u7528\u540C\u4E00\u4E2A\u3002\n let value = textOf(own[HEADER_VALUE_FIELD])\n if (enabled && nameOk && value === '') {\n value = newSessionId()\n await settings.mutate(NAMESPACE, [{ op: 'set', path: [HEADER_VALUE_FIELD], value }])\n }\n\n const llm = read(LLM_NAMESPACE)\n const providers = llm === undefined ? undefined : objectOf(llm.providers)\n\n const writes: PathOp[] = []\n const applied: string[] = []\n let status = ''\n\n if (!enabled) {\n status = ''\n } else if (providers === undefined) {\n status = '\u672A\u6302\u8F7D llm-pi-ai\uFF08\u6A21\u578B\u8DEF\u7531\uFF09\u8BBE\u7F6E\uFF0C\u6682\u672A\u5199\u5165'\n } else if (!nameOk) {\n status = '\u5934\u540D\u4E0D\u5408\u6CD5\uFF0C\u672A\u5199\u5165'\n } else if (!valueIsValid(value)) {\n status = `\u5934\u503C\u4E0D\u5408\u6CD5\uFF08\u9700 1\u2013${HEADER_VALUE_MAX} \u5B57\u7B26\u4E14\u5355\u884C\uFF09\uFF0C\u672A\u5199\u5165`\n } else {\n for (const route of pickRoutes(providers, routesText)) {\n const headers = objectOf(objectOf(providers[route])?.headers)\n if (headers?.[name] !== value) {\n writes.push({ op: 'set', path: ['providers', route, 'headers', name], value })\n }\n applied.push(route)\n }\n status = applied.length === 0\n ? `\u5DF2\u542F\u7528\uFF0C\u4F46\u6CA1\u6709\u53EF\u5199\u5165\u7684\u8DEF\u7531\uFF08\u76EE\u6807\uFF1A${routesText.length === 0 ? `\u81EA\u52A8\uFF08\u540D\u5B57\u4EE5 ${OPENCODE_ROUTE_PREFIX} \u5F00\u5934\uFF0C\u6216 baseURL \u6307\u5411 opencode.ai\uFF09` : routesText.join('\u3001')}\uFF09`\n : `\u5DF2\u5199\u5165 ${applied.join('\u3001')}`\n }\n\n // \u64A4\u9500\uFF1A\u4E0A\u6B21\u5199\u5165\u8FC7\u3001\u8FD9\u6B21\u4E0D\u518D\u662F\u76EE\u6807\u7684\u4F4D\u7F6E\uFF08\u505C\u7528\u3001\u6539\u540D\u3001\u503C\u88AB\u6362\u3001\u8DEF\u7531\u88AB\u79FB\u9664\uFF09\u3002\n // \u53EA\u5220\u300C\u786E\u5B9E\u662F\u6211\u4EEC\u5199\u7684\u300D\uFF1A\u503C\u5FC5\u987B\u7B49\u4E8E\u5F53\u524D\u914D\u7F6E\u503C\u6216\u8BB0\u8D26\u503C\uFF0C\u5426\u5219\u89C6\u4E3A\u7528\u6237\u81EA\u5DF1\u5199\u7684\uFF0C\u4E0D\u78B0\u3002\n const stale: PathOp[] = []\n if (providers !== undefined) {\n const previousName = textOf(own[HEADER_APPLIED_NAME_FIELD])\n const previousValue = textOf(own[HEADER_APPLIED_VALUE_FIELD])\n const ours = new Set([textOf(own[HEADER_VALUE_FIELD]), previousValue])\n ours.delete('')\n // \u672C\u8F6E\u7684\u76EE\u6807\u952E\uFF08\u54EA\u6015\u503C\u5DF2\u7ECF\u5BF9\u3001\u4E0D\u9700\u8981\u5199\uFF09\u2014\u2014\u5B83\u4EEC\u7EDD\u4E0D\u80FD\u88AB\u5F53\u6210\u8FC7\u671F\u9879\u64A4\u9500\u3002\n const targets = new Set(applied.map(route => `${route}\\u0000${name}`))\n const candidates = new Set([previousName, nameOk ? name : ''])\n candidates.delete('')\n for (const candidate of candidates) {\n for (const [route, profile] of Object.entries(providers)) {\n if (targets.has(`${route}\\u0000${candidate}`)) continue\n const headers = objectOf(objectOf(profile)?.headers)\n const current = headers?.[candidate]\n if (typeof current !== 'string' || !ours.has(current)) continue\n stale.push({ op: 'unset', path: ['providers', route, 'headers', candidate] })\n }\n }\n }\n\n const providerOps = [...writes, ...stale]\n let failed = false\n if (providerOps.length > 0) {\n try {\n await settings.mutate(LLM_NAMESPACE, providerOps)\n } catch (error: unknown) {\n failed = true\n status = `\u5199\u5165\u5931\u8D25\uFF1A${errorText(error)}`\n }\n }\n\n // \u8BB0\u8D26 + \u72B6\u6001\u56DE\u5199\uFF1A\u53EA\u6709\u771F\u6B63\u5199\u6210\u529F\u624D\u8BB0\u8D26\uFF0C\u4E14\u503C\u4E0D\u53D8\u65F6\u4E0D\u5199\uFF08\u4FDD\u8BC1\u5E42\u7B49\u3001\u4E0D\u4EA7\u751F\u56DE\u73AF\uFF09\u3002\n const nextAppliedName = !failed && applied.length > 0 ? name : ''\n const nextAppliedValue = !failed && applied.length > 0 ? value : ''\n const ownOps: PathOp[] = []\n if (textOf(own[HEADER_APPLIED_NAME_FIELD]) !== nextAppliedName) {\n ownOps.push({ op: 'set', path: [HEADER_APPLIED_NAME_FIELD], value: nextAppliedName })\n }\n if (textOf(own[HEADER_APPLIED_VALUE_FIELD]) !== nextAppliedValue) {\n ownOps.push({ op: 'set', path: [HEADER_APPLIED_VALUE_FIELD], value: nextAppliedValue })\n }\n if (textOf(own[HEADER_STATUS_FIELD]) !== status) {\n ownOps.push({ op: 'set', path: [HEADER_STATUS_FIELD], value: status })\n }\n if (ownOps.length > 0) await settings.mutate(NAMESPACE, ownOps)\n}\n\n/**\n * \u672C\u63D2\u4EF6\u7684\u5B57\u6BB5\u8868 \u2014\u2014 \u8BBE\u7F6E\u9875\u53EF\u7F16\u8F91\u7684\u5B57\u6BB5\u5168\u5728\u8FD9\u91CC\u3002\n *\n * \u62BD\u6210\u51FD\u6570\u662F\u4E3A\u4E86\u8BA9\u6A21\u5757\u7EA7\u5E38\u91CF {@link Config} \u4E0E\u65E7\u7248\u7684\u663E\u5F0F\u6CE8\u518C\u5171\u7528\u4E00\u4EFD\u771F\u76F8\n * \uFF080.1.6 \u53CA\u4EE5\u524D\u5FC5\u987B `settings.register(NAMESPACE, schema)`\uFF09\u3002\n */\nfunction ownSchema(): z {\n return z.object({\n [ENABLED_FIELD]: z.boolean().default(DEFAULT_SETTINGS.enabled),\n // \u4E94\u680F\u5F00\u5173\u3002**\u6545\u610F\u4E0D\u7ED9\u9ED8\u8BA4\u503C\u3001\u58F0\u660E\u6210\u53EF\u9009**\uFF1A\u8FC1\u79FB\u8981\u7528\u7684\u4FE1\u606F\u5C31\u662F\"\u6587\u6863\u91CC\u6709\u6CA1\u6709\u8FD9\u4E2A\u952E\"\n // \u2014\u2014 \u6CA1\u6709 \u21D2 \u4ECE\u6CA1\u78B0\u8FC7\u8FD9\u4E00\u680F \u21D2 \u5173\u95ED\uFF1B\u6709 \u21D2 \u7528\u6237\u78B0\u8FC7 \u21D2 \u4FDD\u6301\u4ED6\u5199\u4E0B\u7684\u503C\u3002\n // \u7ED9\u4E86\u9759\u6001\u9ED8\u8BA4\u503C\u5C31\u518D\u4E5F\u5206\u4E0D\u51FA\u8FD9\u4E24\u79CD\u60C5\u51B5\u4E86\uFF08\u51C0\u5316\u7684 sectionEnabledOf \u9760\u5B83\uFF09\u3002\n [KEYS_ENABLED_FIELD]: z.boolean().required(false),\n [MENU_ENABLED_FIELD]: z.boolean().required(false),\n [QUICK_ENABLED_FIELD]: z.boolean().required(false),\n [PANEL_ENABLED_FIELD]: z.boolean().required(false),\n [TERMINAL_ENABLED_FIELD]: z.boolean().required(false),\n [SEND_KEY_FIELD]: z.string().default(DEFAULT_SETTINGS.sendKey),\n [NEWLINE_KEY_FIELD]: z.string().default(DEFAULT_SETTINGS.newlineKey),\n ...Object.fromEntries(MENU_FIELDS.map(field => [\n field,\n z.boolean().default(DEFAULT_SETTINGS[field]),\n ])),\n // \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF080.5.0 \u8D77\u4E09\u6863\uFF09\u3002**\u6545\u610F\u4E0D\u7ED9\u9ED8\u8BA4\u503C\u3001\u4E14\u58F0\u660E\u6210\u53EF\u9009**\uFF1A\n // \u300C\u6587\u6863\u91CC\u6CA1\u6709\u8FD9\u4E2A\u952E\u300D\u672C\u8EAB\u5C31\u662F\u8FC1\u79FB\u8981\u7528\u7684\u4FE1\u606F\u2014\u2014\u51C0\u5316\u636E\u6B64\u6309\u65E7\u5E03\u5C14 menuNative\n // \u63A8\u65AD\uFF08\u89C1 menuModeFrom\uFF09\u3002\u7ED9\u4E86\u9ED8\u8BA4\u503C\u5C31\u518D\u4E5F\u5206\u4E0D\u51FA\u300C\u4ECE\u6CA1\u8BBE\u7F6E\u8FC7\u300D\u4E0E\u300C\u660E\u786E\u8BBE\u6210\u4E86\u5B83\u300D\u3002\n [MENU_MODE_FIELD]: z.string().required(false),\n // \u65E7\u7684\u5E03\u5C14\u5B57\u6BB5\uFF1A\u53EA\u4F5C\u8FC1\u79FB\u7EBF\u7D22\uFF0C\u6545\u540C\u6837\u4E0D\u7ED9\u9ED8\u8BA4\u503C\u2014\u2014\u65E7\u6587\u6863\u91CC\u7684 true / false\n // \u90FD\u8981\u4FDD\u4F4F\u539F\u610F\uFF08true = \u6D4F\u89C8\u5668\u83DC\u5355\u3001false = \u660E\u786E\u9009\u8FC7\u81EA\u5B9A\u4E49\u83DC\u5355\uFF09\u3002\n [MENU_NATIVE_FIELD]: z.boolean().required(false),\n // \u300C\u5BFC\u822A\u6EDA\u52A8\u300D\u5728 0.6.0 \u968F\u529F\u80FD\u4E00\u8D77\u5220\u6389\u4E86\uFF08DSH 0.1.7 \u7684\u5B98\u65B9\u8BBE\u7F6E\u9875\u81EA\u5E26\u5BFC\u822A\u5217\u6EDA\u52A8\uFF09\u3002\n // \u65E7\u6587\u6863\u91CC\u53EF\u80FD\u4ECD\u7559\u7740 panelScroll\uFF1Aschemastery \u5BF9\u672A\u58F0\u660E\u952E\u662F**\u539F\u6837\u653E\u884C**\uFF08\u5DF2\u5B9E\u6D4B\uFF09\uFF0C\n // \u6240\u4EE5\u4E0D\u9700\u8981\u4E3A\u5B83\u4FDD\u7559\u4E00\u4E2A\u5BBD\u5BB9\u5B57\u6BB5\uFF0C\u5347\u7EA7\u65F6\u4E5F\u4E0D\u4F1A\u56E0\u6B64\u5224\u975E\u6CD5\u3002\n [PANEL_RESIZE_FIELD]: z.boolean().default(DEFAULT_SETTINGS.panelResize),\n // schemastery \u65E0 .optional()\uFF1A\u53EF\u9009\u952E\u7528 .required(false)\u3002\n [PANEL_WIDTH_FIELD]: z.number().min(PANEL_MIN).max(PANEL_MAX).required(false),\n [PANEL_HEIGHT_FIELD]: z.number().min(320).max(PANEL_MAX).required(false),\n // OpenCode \u8BF7\u6C42\u5934\u680F\u76EE\uFF08\u503C\u7531\u5BBF\u4E3B\u534A\u6309 llm-pi-ai \u7684 Fetch \u89C4\u5219\u81EA\u6821\u9A8C\u540E\u518D\u5199\u5165\uFF09\u3002\n [HEADER_ENABLED_FIELD]: z.boolean().default(DEFAULT_SETTINGS.headerEnabled),\n [HEADER_NAME_FIELD]: z.string().default(DEFAULT_HEADER_NAME),\n [HEADER_VALUE_FIELD]: z.string().default(DEFAULT_SETTINGS.headerValue),\n [HEADER_ROUTES_FIELD]: z.string().default(DEFAULT_SETTINGS.headerRoutes),\n [HEADER_APPLIED_NAME_FIELD]: z.string().default(DEFAULT_SETTINGS.headerAppliedName),\n [HEADER_APPLIED_VALUE_FIELD]: z.string().default(DEFAULT_SETTINGS.headerAppliedValue),\n [HEADER_STATUS_FIELD]: z.string().default(DEFAULT_SETTINGS.headerStatus),\n // \u5FEB\u6377\u6307\u4EE4\u5217\u8868\uFF1A\u7ED3\u6784\u56FA\u5B9A\u4E3A {id,label,prompt,always}\uFF0C\u9010\u6761\u81EA\u5E26\u9ED8\u8BA4\u503C\uFF0C\n // \u8BA9\u65E7\u8BBE\u7F6E\u6587\u6863\uFF08\u6CA1\u6709\u8FD9\u4E2A\u952E\uFF09\u5728\u8BFB\u53D6\u65F6\u76F4\u63A5\u5F97\u5230\u5185\u7F6E 9 \u6761\u3002\n [QUICK_PROMPTS_FIELD]: z.array(z.object({\n id: z.string().default(''),\n label: z.string().default(''),\n prompt: z.string().default(''),\n always: z.boolean().default(false),\n })).default(DEFAULT_QUICK_PROMPTS.map(item => ({ ...item }))),\n [OPTIMIZER_TIER_FIELD]: z.string().default(DEFAULT_SETTINGS.optimizerTier),\n // \u4E09\u6863\u7684\u81EA\u5B9A\u4E49\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF1A\u9ED8\u8BA4\u7A7A\u4E32 = \u7528\u5185\u7F6E\u90A3\u4EFD\uFF08\u7A7A\u4E32\u540C\u65F6\u5C31\u662F\u300C\u6062\u590D\u5185\u7F6E\u300D\u5199\u56DE\u7684\u503C\uFF09\u3002\n [OPTIMIZER_PROMPT_FIELDS.basic]: z.string().default(DEFAULT_SETTINGS.optimizerPromptBasic),\n [OPTIMIZER_PROMPT_FIELDS.advanced]: z.string().default(DEFAULT_SETTINGS.optimizerPromptAdvanced),\n [OPTIMIZER_PROMPT_FIELDS.extreme]: z.string().default(DEFAULT_SETTINGS.optimizerPromptExtreme),\n // \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\uFF080.5.0 \u8D77\uFF09\uFF1A\u7528\u6237\u6863\u4F4D\u4E0E\u53EF\u9009\u8DEF\u5F84\u3002\n [TERMINAL_MODE_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalMode),\n [TERMINAL_BASH_PATH_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalBashPath),\n // \u5BBF\u4E3B\u534A\u81EA\u6301\u7684\u4E09\u9879\uFF1A\u63A2\u6D4B\u5019\u9009\u3001\u72B6\u6001\u884C\u3001\u5F53\u524D\u751F\u6548 shell\uFF08\u89C1 HOST_OWNED_FIELDS\uFF09\u3002\n [TERMINAL_CANDIDATES_FIELD]: z.array(z.object({\n path: z.string().default(''),\n label: z.string().default(''),\n kind: z.string().default('path'),\n explicit: z.boolean().default(false),\n })).default([]),\n [TERMINAL_STATUS_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalStatus),\n [TERMINAL_EFFECTIVE_FIELD]: z.string().default(DEFAULT_SETTINGS.terminalEffective),\n })\n}\n\n/**\n * \u7ED9\u4E00\u4E2A schema \u8282\u70B9\u6253 volatile \u6807\u8BB0\u3002\n *\n * \u26A0\uFE0F \u4E3A\u4EC0\u4E48\u4E0D\u65E0\u6761\u4EF6\u8C03 `.volatile()`\uFF1A\u5BBF\u4E3B\u534A\u628A schemastery **\u5185\u8054**\u8FDB lib/index.js\n * \uFF08\u89C1 build.mjs \u7684 HOST_ALIASES\uFF0C\u53D6\u81EA DSH \u68C0\u51FA\u7684 vendor/ \u76EE\u5F55\uFF09\uFF0C\u6240\u4EE5\"\u8FD9\u4E2A\u65B9\u6CD5\u5B58\u4E0D\u5B58\u5728\"\n * \u53D6\u51B3\u4E8E**\u6784\u5EFA\u65F6**\u90A3\u4EFD DSH \u2014\u2014 \u5728 0.1.6 \u4E0A\u6784\u5EFA\u51FA\u6765\u7684\u5305\u62FF\u5230\u7684\u662F schemastery 3.18.2\uFF0C\n * \u5B83\u6839\u672C\u6CA1\u6709 `volatile()`\uFF083.18.3 \u624D\u52A0\u7684\uFF09\u3002\u800C\u6807\u8BB0\u771F\u6B63\u8D77\u4F5C\u7528\u7684\u5F62\u6001\u662F\n * `schema.meta.volatile` \u8FD9\u4E2A**\u6570\u636E**\uFF1A0.1.7 \u7684\u8BBE\u7F6E\u670D\u52A1\u8BFB\u7684\u5C31\u662F\u5B83\n * \uFF08`volatileForm` \u5224\u6839\u3001`isVolatilePath` \u5224\u8DEF\u5F84\uFF09\uFF0C\u8DDF\u8FD9\u68F5\u6811\u662F\u8C01\u6784\u9020\u7684\u65E0\u5173\u3002\n * \u6240\u4EE5\uFF1A\u6709\u65B9\u6CD5\u5C31\u7528\u65B9\u6CD5\uFF0C\u6CA1\u6709\u5C31\u76F4\u63A5\u5199 meta \u2014\u2014 \u4E24\u6761\u8DEF\u7684\u7ED3\u679C\u4E00\u81F4\uFF0C\n * \u4E8E\u662F\u540C\u4E00\u4E2A\u4EA7\u7269\u5728 0.1.6 \u4E0E 0.1.7 \u4E0A\u90FD\u80FD\u88AB\u6B63\u786E\u8BC6\u522B\u3002\n * @param node \u5F85\u6807\u8BB0\u7684 schema \u8282\u70B9\uFF08`ownSchema()` \u7684\u4E00\u4E2A\u5B57\u6BB5\uFF09\u3002\n * @returns \u5E26\u6807\u8BB0\u7684\u8282\u70B9\uFF08\u6709 `.volatile()` \u65F6\u662F\u5B83\u7684\u514B\u9686\uFF0C\u5426\u5219\u662F\u539F\u8282\u70B9\uFF09\u3002\n */\nfunction markVolatileField(node: z): z {\n const withMethod = node as unknown as { volatile?: () => z }\n if (typeof withMethod.volatile === 'function') return withMethod.volatile()\n const target = node as unknown as { meta?: { volatile?: boolean } }\n if (target.meta !== undefined) target.meta.volatile = true\n return node\n}\n\n/**\n * \u9010\u5B57\u6BB5\u6253\u6807\u8BB0\uFF1A**\u6807\u5B57\u6BB5\uFF0C\u4E0D\u6807\u6839**\u3002\n *\n * \u26A0\uFE0F \u4E3A\u4EC0\u4E48\u4E0D\u80FD\u6807\u6839\uFF082026-09-23 \u5B9E\u6D4B\uFF0CDSH 0.1.7 + \u968F\u5305 schemastery 3.18.4\uFF09\uFF1A\n * \u89E3\u6790\u65F6\u4E00\u65E6\u770B\u5230**\u6839**\u5E26 volatile\uFF0Cschemastery \u5C31\u628A**\u6574\u68F5\u89E3\u6790\u7ED3\u679C**\u5305\u6210**\u4E00\u4E2A\u6839\u5F15\u7528** \u2014\u2014\n * `Config({}).enabled === undefined`\uFF0C\u503C\u53EA\u5728 `.get()` \u91CC\u3002\u5B98\u65B9\u5F62\u72B6\u5219\u662F\"\u666E\u901A\u5BF9\u8C61\u58F3 +\n * \u53F6\u5B50\u5F15\u7528\"\uFF1A`ui-theme` / `locale` / `llm-deepseek` / `ui-conversation` \u2026\n * **\u4E00\u5F8B\u9010\u5B57\u6BB5\u6807\uFF0C\u6CA1\u6709\u4E00\u4E2A\u6807\u6839**\u3002\u6839\u5F15\u7528\u4E0E\u672C\u63D2\u4EF6\u5BF9\u4E0D\u4E0A\u7684\u662F\u8FD0\u884C\u65F6\u628A\u914D\u7F6E\u53D8\u66F4\u63D0\u4EA4\u56DE\n * **\u8FD0\u884C\u4E2D\u5F15\u7528**\u7684\u90A3\u6761\u8DEF\uFF08loader \u7684 `_commitVolatile`\uFF0C\u6309**\u53F6\u5B50\u8DEF\u5F84**\u8BBE\u8BA1\uFF09\uFF1A\n * \u771F\u673A\u8868\u73B0\u5C31\u662F**\u5199\u5165\u843D\u4E86\u76D8\u3001\u754C\u9762\u5374\u8FD8\u662F\u65E7\u503C**\uFF08\u5F00\u5173\"\u70B9\u4E86\u6CA1\u53CD\u5E94\"\uFF09\u3002\n * @param schema `ownSchema()` \u7684\u7ED3\u679C\u3002\n * @returns \u540C\u4E00\u68F5 schema\uFF08\u5F62\u72B6\u4E0D\u53D8\uFF0C\u53EA\u7ED9\u6BCF\u4E2A\u5B57\u6BB5\u8865\u4E0A volatile \u6570\u636E\uFF09\u3002\n */\nfunction markVolatile(schema: z): z {\n const dict = (schema as unknown as { dict?: Record<string, z> }).dict\n if (dict === undefined) return schema\n for (const key of Object.keys(dict)) dict[key] = markVolatileField(dict[key]!)\n return schema\n}\n\n/**\n * \u63D2\u4EF6 Config \u2014\u2014 DSH 0.1.7 \u8D77\uFF0C`settings.register()` \u88AB\u5220\u9664\uFF0C\u547D\u540D\u7A7A\u95F4\u6539\u7531\n * **\u63D2\u4EF6\u5BFC\u51FA\u7684 Config** \u63A8\u5BFC\u3002\n *\n * \u26A0\uFE0F \u5173\u952E\u5728\u4E8E volatile\uFF1A\u65B0\u7248**\u53EA\u6709** volatile \u5B57\u6BB5\u4F1A\u88AB\u670D\u52A1\uFF08`volatileForm`\uFF09\u3001\n * \u4E5F**\u53EA\u6709** volatile \u8DEF\u5F84\u80FD\u88AB\u8BBE\u7F6E\u9875\u5199\u5165\uFF08`isVolatilePath`\uFF09\u3002\u672C\u8282\u5B57\u6BB5\u5168\u90E8\u662F\u7528\u6237\u53EF\u7F16\u8F91\u9879\n * \uFF08\u542B\u5BBF\u4E3B\u534A\u56DE\u5199\u7684\u72B6\u6001\u5B57\u6BB5\uFF09\uFF0C\u6240\u4EE5**\u4E00\u4E2A\u4E0D\u6F0F\u5730\u9010\u5B57\u6BB5\u6807**\u2014\u2014\u6F0F\u4E00\u4E2A\uFF0C\u90A3\u4E2A\u5B57\u6BB5\u5728\u8BBE\u7F6E\u9875\u4E0A\n * \u5C31\u8BFB\u4E0D\u5230 / \u5199\u4E0D\u8FDB\u53BB\u3002\u6807\u8BB0\u653E\u5728**\u5B57\u6BB5**\u4E0A\u800C\u4E0D\u662F\u6574\u68F5\u5BF9\u8C61\u4E0A\uFF0C\u7406\u7531\u89C1 {@link markVolatile}\u3002\n *\n * 0.1.6 \u6CA1\u6709 volatile\uFF1A\u90A3\u65F6 Config \u53EA\u662F\u4E00\u4EFD\u540C\u5F62\u72B6\u7684 schema\uFF0C\n * \u547D\u540D\u7A7A\u95F4\u4ECD\u7531 `apply` \u91CC\u7684 `settings.register(NAMESPACE, Config)` \u663E\u5F0F\u6CE8\u518C\u3002\n */\nexport const Config: z = markVolatile(ownSchema())\n\n/**\n * \u6CE8\u518C durable section\uFF1Bsettings \u670D\u52A1\u7F3A\u5E2D\uFF08\u65E0 provider\uFF09\u65F6\u9759\u9ED8\u8DF3\u8FC7\u3002\n *\n * \u4E24\u4EE3 DSH \u7684\u5DEE\u522B\uFF082026-09 \u5B9E\u6D4B\uFF0C\u89C1\u6587\u4EF6\u5934\u4E0E {@link Config}\uFF09\uFF1A\n * \u00B7 0.1.6 \u53CA\u4EE5\u524D\uFF1A`settings.register(\u547D\u540D\u7A7A\u95F4, schema)` \u662F**\u552F\u4E00**\u7684\u6CE8\u518C\u5165\u53E3\u3002\n * \u00B7 0.1.7 \u8D77\uFF1A\u6CA1\u6709 register\uFF0C\u547D\u540D\u7A7A\u95F4\u7531\u5BFC\u51FA\u7684 {@link Config} \u81EA\u52A8\u88AB\u670D\u52A1\u3002\n * \u6240\u4EE5\u8FD9\u91CC\u6309\u80FD\u529B\u5206\u652F\uFF0C\u4E24\u4EE3\u90FD\u80FD\u6302\u4E0A\u3002\n *\n * @param ctx \u5BBF\u4E3B\u534A\u4E0A\u4E0B\u6587\u3002\n * @param config \u672C\u884C\u7684 Config\uFF1A0.1.7 \u662F volatile \u5F15\u7528\u6811\uFF1B0.1.6 \u662F\u89E3\u6790\u540E\u7684\u666E\u901A\u503C\n * \uFF08\u90A3\u65F6\u8BFB\u503C\u4ECD\u8D70 `settings.get`\uFF0C\u8FD9\u4E2A\u53C2\u6570\u53EA\u7528\u4F5C\u515C\u5E95\uFF09\u3002\n */\nexport function apply(ctx: Context, config?: unknown): void {\n /** \u628A\u300C\u8BFB\u53E3\u300D\u5305\u6210\u7EC8\u7AEF\u5B50\u7CFB\u7EDF\u671F\u671B\u7684\u5F62\u72B6\uFF1A\u53EA\u66FF\u6362 `get`\uFF0C`mutate` \u539F\u6837\u8F6C\u53D1\u3002 */\n const readView = (\n service: unknown,\n ): { get: (ns: string) => unknown; mutate: (ns: string, ops: readonly PathOp[]) => Promise<void> } | undefined => {\n if (service === null || service === undefined) return undefined\n const real = service as SettingsLike\n return { get: makeReader(real, config), mutate: (ns, ops) => real.mutate(ns, ops) }\n }\n\n /**\n * \u5B64\u513F\u5199\u5165\u9501\u7684\u56DE\u6536\uFF08\u80CC\u666F\u4E0E\u5224\u636E\u89C1 `src/settings-lock.ts`\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u653E\u5728\u542F\u52A8\u8DEF\u5F84\u4E0A\uFF1A\u8BBE\u7F6E\u5199\u5165\u7528\u7684\u9501\u662F `<profile>/package.json.lock`\uFF0C\u800C**\u786C\u6740**\n * \uFF08`restart-webui.bat` \u7684 `taskkill /T /F`\uFF09\u6B63\u597D\u843D\u5728\u4E00\u6B21\u8BBE\u7F6E\u5199\u5165\u4E2D\u95F4\u65F6\u4F1A\u628A\u5B83\u7559\u4E0B\uFF1B\n * \u6B64\u540E\u8BE5 profile \u7684**\u6BCF\u4E00\u6B21**\u8BBE\u7F6E\u5199\u5165\u90FD\u8D85\u65F6\u5931\u8D25\uFF0C\u754C\u9762\u4E0A\u53EA\u8868\u73B0\u4E3A\"\u70B9\u4E86\u6CA1\u53CD\u5E94\"\uFF0C\n * \u4E00\u53E5\u62A5\u9519\u90FD\u6CA1\u6709\u3002\u5199\u5165\u5931\u8D25\u4E4B\u540E\u518D\u505A\u5C31\u5DF2\u7ECF\u665A\u4E86\uFF0C\u6240\u4EE5\u8FD9\u4EF6\u4E8B\u53EA\u5728\u542F\u52A8\u65F6\u505A\u4E00\u6B21\u3002\n *\n * \u5224\u636E\u6536\u7D27\u5230\"\u80FD\u8BC1\u660E\u6301\u6709\u8005\u5DF2\u4E0D\u5B58\u5728\"\uFF1A\u8BA4\u4E0D\u51FA PID\u3001PID \u8FD8\u6D3B\u7740\u3001\u6743\u9650\u4E0D\u8DB3\u65E0\u6CD5\u5224\u5B9A\n * \u2192 \u4E00\u5F8B\u4FDD\u6301\u4E0D\u52A8\u3002\u8BEF\u5220\u4E00\u628A\u6D3B\u9501\u4F1A\u8BA9\u4E24\u4E2A\u5199\u5165\u8005\u4EA4\u9519\u63D0\u4EA4\u540C\u4E00\u4E2A profile patch\uFF0C\n * \u6BD4\u4E0D\u5220\u66F4\u7CDF\uFF08\u771F\u673A\u4E8B\u6545\u89C1 `README.md`\u300C\u8BBE\u7F6E\u5199\u4E0D\u8FDB\u53BB\u300D\u4E00\u8282\uFF09\u3002\n */\n ctx.inject(['configEditor'], (lockCtx) => {\n try {\n const documentPath = (lockCtx.configEditor as { documentPath?: unknown }).documentPath\n if (typeof documentPath !== 'string' || documentPath === '') return\n void recoverStaleSettingsLock(profileDirOfPatchPath(documentPath), message => {\n console.warn(`[composer-ux] ${message}`)\n }).catch((error: unknown) => {\n console.error('[composer-ux] \u5B64\u513F\u5199\u5165\u9501\u68C0\u67E5\u5931\u8D25', error)\n })\n } catch (error: unknown) {\n console.error('[composer-ux] \u5B64\u513F\u5199\u5165\u9501\u68C0\u67E5\u5931\u8D25', error)\n }\n })\n\n ctx.inject(['settings'], (settingsCtx) => {\n const settings = settingsCtx.settings as unknown as SettingsLike\n // 0.1.6 \u53CA\u4EE5\u524D\uFF1A\u547D\u540D\u7A7A\u95F4\u5FC5\u987B\u663E\u5F0F\u6CE8\u518C\u30020.1.7 \u8D77 register \u4E0D\u5B58\u5728\uFF0C\u4EC0\u4E48\u90FD\u4E0D\u505A\u3002\n if (typeof settings.register === 'function') settings.register(NAMESPACE, Config)\n const read = makeReader(settings, config)\n // \u4E32\u884C\u5316\uFF1A\u672C\u63D2\u4EF6\u81EA\u5DF1\u7684\u5199\u5165\u4E5F\u4F1A\u518D\u89E6\u53D1 settings/updated\uFF0C\u7528 busy/again \u4FDD\u8BC1\n // \u4E00\u6B21\u53EA\u8DD1\u4E00\u8F6E\u955C\u50CF\uFF0C\u4E14\u4E0D\u6F0F\u6389\u671F\u95F4\u5230\u8FBE\u7684\u53D8\u66F4\u3002\n let busy = false\n let again = false\n const sync = (): void => {\n if (busy) {\n again = true\n return\n }\n busy = true\n void mirrorHeader(settings, read)\n .catch((error: unknown) => {\n console.error('[composer-ux] \u8BF7\u6C42\u5934\u955C\u50CF\u5931\u8D25', error)\n })\n .finally(() => {\n busy = false\n if (again) {\n again = false\n sync()\n }\n })\n }\n\n /**\n * \u8BBE\u7F6E\u53D8\u5316\u540E\u91CD\u8DD1\u955C\u50CF\u3002\n *\n * \u26A0\uFE0F \u4E8B\u4EF6\u540D\u4E5F\u6362\u4EE3\u4E86\uFF1A0.1.7 \u8D77\u662F `settings/document-updated`\uFF08\u53C2\u6570\u662F `(ns, revision)`\uFF09\uFF0C\n * \u800C\u65E7\u540D `settings/updated` \u5728 0.1.7 \u91CC**\u6574\u4E2A\u4E0D\u5B58\u5728**\uFF08\u670D\u52A1\u5DF2\u7ECF\u4E0D\u53D1\u5B83\u4E86\uFF09\u3002\n * \u4E24\u4E2A\u90FD\u542C\uFF1A\u4EFB\u4E00\u4E16\u4EE3\u53EA\u4F1A\u6709\u4E00\u4E2A\u771F\u7684\u89E6\u53D1\uFF0C\u4E14 `sync()` \u672C\u8EAB\u5E42\u7B49\u3001\u4E0D\u4EA7\u751F\u56DE\u73AF\u3002\n */\n const onSettingsUpdated = (ns: unknown): void => {\n if (ns === NAMESPACE || ns === LLM_NAMESPACE) sync()\n }\n for (const event of ['settings/updated', 'settings/document-updated']) {\n ctx.on(event as never, onSettingsUpdated as never)\n }\n // \u542F\u52A8\u5373\u5BF9\u9F50\u4E00\u6B21\uFF1A\u542F\u7528\u72B6\u6001\u4E0B\u7684\u5934\u5373\u4F7F\u5728\u522B\u5904\u88AB\u62B9\u6389\uFF0C\u4E5F\u4F1A\u5728\u6B64\u8865\u56DE\u3002\n sync()\n })\n\n // \u2500\u2500 \u63D0\u793A\u8BCD\u4F18\u5316\u63A5\u53E3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u4E3A\u4EC0\u4E48\u5FC5\u987B\u5728\u5BBF\u4E3B\u534A\uFF1A\u51FA\u7F51\u8BF7\u6C42\u7531\u5BBF\u4E3B\u7684\u6A21\u578B\u9002\u914D\u5668\u53D1\u51FA\uFF0C\u6D4F\u89C8\u5668\u4FA7\u78B0\u4E0D\u5230\u6A21\u578B\u8DEF\u7531\u3002\n // \u6240\u4EE5\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u662F\u4E00\u6B21\u300C\u6D4F\u89C8\u5668 POST \u539F\u6587 -> \u5BBF\u4E3B\u72EC\u7ACB\u8DD1\u4E00\u6B21\u6A21\u578B\u8C03\u7528 ->\n // \u628A\u4F18\u5316\u540E\u7684\u6B63\u6587\u56DE\u7ED9\u6D4F\u89C8\u5668\u586B\u8FDB\u8F93\u5165\u6846\u300D\u7684\u5F80\u8FD4\u3002\u8FD9\u4E0E\n // WestFox-AwA/dsh-prompt-optimizer \u7684\u67B6\u6784\u4E00\u81F4\uFF08\u5B83\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\u4E5F\u5DF2\u63D0\u53D6\u5230\n // ./optimizer-prompt.ts\uFF09\u3002\n ctx.inject(['webServer', 'llm'], (optCtx) => {\n /** \u5355\u6B21\u4F18\u5316\u7684\u5899\u949F\u4E0A\u9650\uFF1A\u591F\u6162\u6A21\u578B\u8DD1\u5B8C\uFF0C\u4F46\u4E0D\u4F1A\u8BA9\u8BF7\u6C42\u6C38\u8FDC\u6302\u7740\u3002 */\n const LLM_TIMEOUT_MS = 180_000\n /** \u8BF7\u6C42\u4F53\u4E0A\u9650\uFF08\u8F93\u5165\u6846\u91CC\u7684\u539F\u6587\uFF0C\u6B63\u5E38\u90FD\u662F\u51E0 KB\uFF09\u3002 */\n const BODY_MAX_BYTES = 1_000_000\n /**\n * \u76F4\u63A5\u9001\u53BB\u4F18\u5316\u7684\u539F\u6587\u957F\u5EA6\u4E0A\u9650\u3002\n *\n * \u4E0E\u65E7\u5B9E\u73B0\u7B49\u503C\uFF08\u65E7 `QUICK_TEXT_MAX * 2` = 8000\uFF09\uFF1A\u5FEB\u6377\u6307\u4EE4\u7684\u5B58\u50A8\u4E0A\u9650\u5DF2\u7ECF\u63D0\u5230\n * 20 \u4E07\uFF0C\u4F46**\u4F18\u5316\u8BF7\u6C42**\u7684\u8F93\u5165\u4E0A\u9650\u5FC5\u987B\u7559\u5728\u539F\u5730\uFF0C\u5426\u5219\u8D85\u957F\u6587\u672C\u4F1A\u88AB\u4E22\u7ED9\u6A21\u578B\u3002\n */\n const TEXT_MAX = OPTIMIZE_TEXT_MAX\n\n const sendJson = (\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n code: number,\n payload: unknown,\n ): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })\n res.end(JSON.stringify(payload))\n }\n\n const readBody = async (req: AsyncIterable<unknown>): Promise<string> => {\n const chunks: Buffer[] = []\n let total = 0\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n total += buf.length\n if (total > BODY_MAX_BYTES) throw new Error('\u8BF7\u6C42\u4F53\u8FC7\u5927')\n chunks.push(buf)\n }\n return Buffer.concat(chunks).toString('utf8')\n }\n\n /** \u89E3\u6790\u672C\u6B21\u4F18\u5316\u7528\u54EA\u6761\u8DEF\u7531\uFF1A\u8BF7\u6C42\u4F53\u4F18\u5148\uFF0C\u5176\u6B21\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002 */\n const resolveRoute = (payload: Record<string, unknown>): { provider: string; model: string } => {\n const provider = textOf(payload.provider)\n const model = textOf(payload.model)\n if (provider !== '' && model !== '') return { provider, model }\n try {\n const selector = optCtx.get('agentDefaultModel') as\n { currentSelection?: () => { provider?: unknown; model?: unknown } } | undefined\n const current = selector?.currentSelection?.()\n return { provider: textOf(current?.provider), model: textOf(current?.model) }\n } catch {\n return { provider: '', model: '' }\n }\n }\n\n const handle = async (\n req: { method?: string; [key: string]: unknown },\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n ): Promise<void> => {\n if ((req.method ?? 'GET').toUpperCase() !== 'POST') {\n sendJson(res, 405, { ok: false, error: '\u53EA\u63A5\u53D7 POST' })\n return\n }\n let payload: Record<string, unknown>\n try {\n payload = objectOf(JSON.parse(await readBody(req as unknown as AsyncIterable<unknown>)))\n ?? {}\n } catch (error: unknown) {\n sendJson(res, 400, { ok: false, error: `\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${errorText(error)}` })\n return\n }\n\n const text = textOf(payload.text).trim()\n if (text === '') {\n sendJson(res, 400, { ok: false, error: '\u8F93\u5165\u6846\u662F\u7A7A\u7684\uFF0C\u6CA1\u6709\u53EF\u4F18\u5316\u7684\u5185\u5BB9' })\n return\n }\n if (text.length > TEXT_MAX) {\n sendJson(res, 400, { ok: false, error: `\u539F\u6587\u8FC7\u957F\uFF08\u4E0A\u9650 ${TEXT_MAX} \u5B57\u7B26\uFF09` })\n return\n }\n\n const tier = textOf(payload.tier) === '' ? DEFAULT_OPTIMIZER_TIER : textOf(payload.tier)\n const route = resolveRoute(payload)\n if (route.provider === '' || route.model === '') {\n sendJson(res, 200, { ok: false, error: '\u62FF\u4E0D\u5230\u5F53\u524D\u7684\u6A21\u578B\u8DEF\u7531\uFF0C\u65E0\u6CD5\u4F18\u5316\uFF08\u8BF7\u5148\u5728\u8F93\u5165\u6846\u65C1\u7684\u6A21\u578B\u9009\u62E9\u5668\u91CC\u9009\u4E00\u4E2A\u6A21\u578B\uFF09' })\n return\n }\n\n // \u672C\u6863\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF1A\u8BBE\u7F6E\u9875\u91CC\u5199\u8FC7\u5C31\u7528\u7528\u6237\u90A3\u4EFD\uFF0C\u5426\u5219\u7528\u5185\u7F6E\u90A3\u4EFD\u3002\n // \u8BFB\u8BBE\u7F6E\u8D70 `optCtx.get('settings')`\uFF08**\u4E0D\u5728 inject \u5217\u8868**\u91CC\u4E5F\u5B89\u5168\uFF1A`get` \u4E0D\u629B\uFF0C\n // \u88F8\u5C5E\u6027\u8BFB\u624D\u4F1A\u629B\uFF09\u3002\u8BFB\u4E0D\u5230\u5C31\u5F53\u4F5C\"\u6CA1\u6709\u81EA\u5B9A\u4E49\"\u2014\u2014\u5185\u7F6E\u90A3\u4EFD\u6C38\u8FDC\u53EF\u7528\u3002\n const customPrompt = readOwnSetting(optCtx, config, optimizerPromptFieldOf(tier))\n const system = buildOptimizeSystem(tier, customPrompt)\n\n const controller = new AbortController()\n const timer = setTimeout(() => { controller.abort() }, LLM_TIMEOUT_MS)\n\n /** \u8DD1\u4E00\u6B21\u6A21\u578B\u8C03\u7528\uFF0C\u8FD4\u56DE\u539F\u59CB\u6B63\u6587\u4E0E\u5931\u8D25\u539F\u56E0\uFF08\u91CD\u8BD5\u65F6\u4F1A\u88AB\u8C03\u7528\u7B2C\u4E8C\u6B21\uFF09\u3002 */\n const runOnce = async (userText: string): Promise<{ out: string; failure: string }> => {\n let out = ''\n let failure = ''\n try {\n const stream = optCtx.llm.stream({\n provider: route.provider,\n model: route.model,\n system,\n temperature: buildOptimizeTemperature(tier),\n signal: controller.signal,\n messages: [{\n id: `optimize-${Date.now().toString(36)}`,\n role: 'user',\n content: [{ type: 'text', text: userText }],\n source: { kind: 'user' },\n }],\n })\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n if (chunk.type === 'text-delta') {\n out += String(chunk.text ?? '')\n // \u539F\u59CB JSON \u4F1A\u6BD4\u6210\u54C1\u957F\u4E0D\u5C11\uFF08\u6BCF\u6761\u90FD\u5E26\u5F15\u6587\u4E0E\u5B57\u6BB5\u540D\uFF09\uFF0C\u4E0A\u9650\u6309\u6210\u54C1\u7684 4 \u500D\u7ED9\u3002\n if (out.length > OPTIMIZE_OUTPUT_MAX * 4) break\n } else if (chunk.type === 'finish') {\n const reason = objectOf(chunk.reason)\n if (reason?.kind === 'error' || reason?.kind === 'aborted') {\n const detail = objectOf(reason.failure)\n failure = textOf(detail?.message) || (reason.kind === 'aborted' ? '\u4F18\u5316\u88AB\u4E2D\u65AD' : '\u6A21\u578B\u8FD4\u56DE\u9519\u8BEF')\n }\n }\n }\n } catch (error: unknown) {\n failure = errorText(error)\n }\n return { out, failure }\n }\n\n let retried = false\n let result: { out: string; failure: string }\n try {\n result = await runOnce(buildOptimizeUser(text))\n // \u7A7A\u4EA7\u51FA\u91CD\u8BD5\u4E00\u6B21\uFF1A\u673A\u5236\u4E0E\u8BDD\u672F\u53D6\u81EA\u5BF9\u65B9 0.6 \u7684 `retryEmpty` \u2014\u2014 \u5BF9\u65B9\u771F\u673A\u4E0A\u7684\n // \"\u601D\u8003\u5B8C\u6210\u5374\u6CA1\u6709\u4EA7\u51FA\"\u591A\u534A\u662F\u6A21\u578B\u628A JSON \u5FD8\u5728\u8111\u540E\uFF0C\u70B9\u4E00\u904D\u89C4\u5219\u5C31\u80FD\u6551\u56DE\u6765\u3002\n // \u53EA\u5728**\u6CA1\u62A5\u9519**\u65F6\u91CD\u8BD5\uFF08\u62A5\u9519\u91CD\u8BD5\u4E00\u6B21\u53EA\u662F\u767D\u7B49\u4E00\u8F6E\uFF09\u3002\n if (result.out.trim() === '' && result.failure === '') {\n retried = true\n const second = await runOnce(buildOptimizeUser(text, { retry: true, reason: '\u5BBF\u4E3B\u6CA1\u6709\u6536\u5230\u4EFB\u4F55\u6761\u76EE' }))\n if (second.out.trim() !== '') result = second\n else if (result.failure === '') result = second\n }\n } finally {\n clearTimeout(timer)\n }\n\n if (result.out.trim() === '') {\n sendJson(res, 200, {\n ok: false,\n error: result.failure === '' ? '\u6A21\u578B\u6CA1\u6709\u4EA7\u51FA\u4EFB\u4F55\u5185\u5BB9' : `\u4F18\u5316\u5931\u8D25\uFF1A${result.failure}`,\n retried,\n })\n return\n }\n\n // \u89E3\u6790 \u2192 \u9010\u6761\u6838\u5BF9\u9010\u5B57\u4F9D\u636E \u2192 \u88C5\u914D\u6210\u6210\u54C1\uFF08\u89C1 optimizer-assemble.ts\uFF09\u3002\n const assembled = runOptimizePipeline(result.out, text, { tier })\n if (!assembled.ok) {\n sendJson(res, 200, {\n ok: false,\n error: `\u6A21\u578B\u8F93\u51FA\u4E0D\u662F\u53EF\u7528\u7684\u6761\u76EE JSON\uFF08${assembled.code}\uFF09\uFF1A${assembled.reason}`,\n retried,\n })\n return\n }\n const optimized = assembled.text.trim()\n if (optimized === '') {\n sendJson(res, 200, { ok: false, error: '\u88C5\u914D\u540E\u662F\u7A7A\u7684\uFF08\u6A21\u578B\u6CA1\u6709\u7ED9\u51FA\u53EF\u6838\u5B9E\u7684\u6761\u76EE\uFF09', retried })\n return\n }\n sendJson(res, 200, {\n ok: true,\n text: optimized,\n // \u8BED\u4E49\u6536\u7A84\uFF1A`truncated` \u73B0\u5728\u4E13\u6307\"\u7BC7\u5E45\u95F8\u95E8\u771F\u7684\u52A8\u8FC7\u624B\"\uFF08\u88C5\u4E86\u5FC5\u4FDD\u8282\u4ECD\u8D85\u9884\u7B97\uFF09\u3002\n truncated: assembled.overBudget,\n provider: route.provider,\n model: route.model,\n // \u2500\u2500 \u4EE5\u4E0B\u4E3A 0.6.0 \u65B0\u589E\u7684**\u9644\u52A0**\u5B57\u6BB5\uFF1A\u8001\u5BA2\u6237\u7AEF\u4E0D\u8BFB\u5B83\u4EEC\u4E5F\u4E0D\u4F1A\u574F\u3002\n promptSource: optimizePromptSource(customPrompt),\n retried,\n fallback: assembled.fallback,\n itemCount: assembled.itemCount,\n rewrittenChars: assembled.rewrittenChars,\n dropped: assembled.dropped,\n warnings: assembled.warnings,\n budget: assembled.budget,\n chars: assembled.chars,\n })\n }\n\n optCtx.effect(() => optCtx.webServer.register({\n kind: 'exact',\n path: OPTIMIZER_API_PATH,\n handler: handle as never,\n }), 'composer-ux: prompt optimizer route')\n })\n\n // \u2500\u2500 \u5FEB\u6377\u6307\u4EE4\u7684\u5168\u5C40\u5B58\u50A8 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // 0.3.0 \u8D77\u5FEB\u6377\u6307\u4EE4\u4E0D\u518D\u5199\u5165 settings \u6587\u6863\uFF0C\u6539\u5B58 `$DSH_HOME/quick-prompts.json`\uFF1A\n // \u8BBE\u7F6E\u6587\u6863\u5BF9\u6570\u7EC4\u662F\u6574\u4EFD\u66FF\u6362\u3001\u4E14\u53D7 schema \u957F\u5EA6\u4E0A\u9650\u622A\u65AD\uFF0C\u800C\u5FEB\u6377\u6307\u4EE4\u662F**\u7528\u6237\u5185\u5BB9**\n // \uFF08\u957F\u63D0\u793A\u8BCD\u662F\u5E38\u6001\uFF09\uFF0C\u5E76\u4E14\u9700\u8981\u4E00\u4EFD\u4E0E\u4F1A\u8BDD\u3001\u9879\u76EE\u65E0\u5173\u3001\u53EF\u4EE5\u5355\u72EC\u5907\u4EFD\u7684\u843D\u70B9\u3002\n //\n // \u672C\u5757\u53EA\u8D1F\u8D23\u300C\u8BFB\u3001\u8FC1\u79FB\u3001\u6574\u672C\u5199\u56DE\u300D\uFF1B\u539F\u5B50\u5199\u3001\u5199\u9501\u3001\u574F\u6587\u4EF6\u9694\u79BB\u90FD\u5728\n // ./quick-store.ts\uFF0C\u5BA2\u6237\u7AEF\u534A\u901A\u8FC7\u8FD9\u6761\u8DEF\u7531\u8BFB\u5199\uFF08\u89C1 client/prompt-book.ts\uFF09\u3002\n ctx.inject(['webServer'], (storeCtx) => {\n /** \u8BF7\u6C42\u4F53\u4E0A\u9650\uFF1A\u6574\u672C\u5FEB\u6377\u6307\u4EE4\u90FD\u5728\u91CC\u9762\uFF0C\u7ED9\u8DB3\u4F59\u91CF\uFF08\u6B63\u5E38\u53EA\u6709\u51E0\u5341 KB\uFF09\u3002 */\n const BODY_MAX_BYTES = 8_000_000\n\n const sendJson = (\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n code: number,\n payload: unknown,\n ): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })\n res.end(JSON.stringify(payload))\n }\n\n const readBody = async (req: AsyncIterable<unknown>): Promise<string> => {\n const chunks: Buffer[] = []\n let total = 0\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n total += buf.length\n if (total > BODY_MAX_BYTES) throw new Error('\u8BF7\u6C42\u4F53\u8FC7\u5927')\n chunks.push(buf)\n }\n return Buffer.concat(chunks).toString('utf8')\n }\n\n /**\n * \u8FC1\u79FB\u79CD\u5B50\uFF1A0.2.x \u5B58\u5728 settings \u91CC\u7684\u5E73\u94FA\u5217\u8868\u3002\n *\n * \u53D6\u4E0D\u5230\u5C31\u662F undefined \u2014\u2014 \u90A3\u65F6\u7528\u5185\u7F6E 9 \u6761\u521D\u59CB\u5316\uFF08\u89C1 quick-store \u7684 ensureQuickBook\uFF09\u3002\n * \u65E7\u503C**\u4FDD\u7559\u5728\u8BBE\u7F6E\u6587\u6863\u91CC\u3001\u4E0D\u6E05\u7A7A**\uFF1A\u4E07\u4E00\u56DE\u6EDA\u5230\u65E7\u7248\u672C\uFF0C\u7528\u6237\u8FD8\u80FD\u770B\u5230\u81EA\u5DF1\u90A3\u51E0\u6761\u3002\n */\n const legacyPrompts = (): readonly unknown[] | undefined => {\n try {\n const settings = storeCtx.get('settings') as SettingsLike | undefined\n const row = makeReader(settings, config)(NAMESPACE)\n const list = row?.[QUICK_PROMPTS_FIELD]\n return Array.isArray(list) ? list as readonly unknown[] : undefined\n } catch {\n return undefined\n }\n }\n\n const handle = async (\n req: { method?: string; [key: string]: unknown },\n res: { writeHead: (code: number, headers: Record<string, string>) => void; end: (body: string) => void },\n ): Promise<void> => {\n const method = (req.method ?? 'GET').toUpperCase()\n if (method !== 'GET' && method !== 'POST') {\n sendJson(res, 405, { ok: false, error: '\u53EA\u63A5\u53D7 GET / POST' })\n return\n }\n\n const file = quickStorePath()\n // \u6BCF\u6B21\u8BF7\u6C42\u90FD\u5C1D\u8BD5\u4E00\u6B21\u300C\u7F3A\u5931\u5373\u8FC1\u79FB\u300D\uFF1B\u6587\u4EF6\u5B58\u5728\u65F6\u5B83\u4EC0\u4E48\u4E5F\u4E0D\u505A\u3002\n const outcome = await ensureQuickBook(legacyPrompts(), file)\n if (outcome.kind === 'broken') {\n // \u574F\u6587\u4EF6\u5DF2\u88AB\u6539\u540D\u9694\u79BB\uFF0C\u8FD9\u91CC**\u4E0D\u505A\u4EFB\u4F55\u5199\u5165**\uFF0C\u5982\u5B9E\u628A\u539F\u56E0\u4EA4\u7ED9 UI \u663E\u793A\u3002\n sendJson(res, 200, {\n ok: false,\n file,\n error: `\u5FEB\u6377\u6307\u4EE4\u6587\u4EF6\u8BFB\u4E0D\u4E86\uFF1A${outcome.error}`,\n quarantined: outcome.quarantined ?? '',\n })\n return\n }\n if (method === 'GET') {\n sendJson(res, 200, { ok: true, file, book: outcome.book })\n return\n }\n\n let payload: Record<string, unknown>\n try {\n payload = objectOf(JSON.parse(await readBody(req as unknown as AsyncIterable<unknown>))) ?? {}\n } catch (error: unknown) {\n sendJson(res, 400, { ok: false, error: `\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${errorText(error)}` })\n return\n }\n\n const candidate = payload.book !== undefined ? payload.book : payload\n const next = sanitizeBook(candidate)\n if (next === undefined) {\n sendJson(res, 400, {\n ok: false,\n error: '\u63D0\u4EA4\u7684\u7ED3\u6784\u8BA4\u4E0D\u51FA\uFF08\u671F\u671B { book: { categories: [...] } } \u6216 { categories: [...] }\uFF09',\n })\n return\n }\n try {\n await writeQuickBook(next, file)\n } catch (error: unknown) {\n sendJson(res, 500, { ok: false, error: `\u5199\u5165\u5931\u8D25\uFF1A${errorText(error)}` })\n return\n }\n // \u5199\u5B8C\u91CD\u8BFB\u4E00\u904D\uFF1A\u56DE\u7ED9\u5BA2\u6237\u7AEF\u7684\u662F**\u78C1\u76D8\u4E0A\u7684\u771F\u5B9E\u5185\u5BB9**\uFF0C\u4E0D\u662F\u6211\u4EEC\u4EE5\u4E3A\u5199\u8FDB\u53BB\u7684\u4E1C\u897F\uFF0C\n // \u8FD9\u6837\u4EFB\u4F55\u88AB\u6536\u7A84/\u4E22\u5F03\u7684\u5B57\u6BB5\u90FD\u4F1A\u7ACB\u523B\u5728 UI \u4E0A\u66B4\u9732\u51FA\u6765\u3002\n const verified = await readQuickBook(file)\n sendJson(res, 200, { ok: true, file, book: verified.kind === 'ok' ? verified.book : next })\n }\n\n storeCtx.effect(() => storeCtx.webServer.register({\n kind: 'exact',\n path: QUICK_PROMPTS_API_PATH,\n handler: handle as never,\n }), 'composer-ux: quick prompt store route')\n })\n\n // \u2500\u2500 \u9ED8\u8BA4\u7EC8\u7AEF\uFF08Windows\uFF1A\u628A\u7EC8\u7AEF\u7684 pwsh \u6362\u6210 Git Bash\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u673A\u5236\uFF1A**\u6309 agent \u4F1A\u8BDD\u4E0B\u53D1**\u3002\u5B98\u65B9 `tools.restrict()` \u5728\u5168\u5C40\u4E0A\u4E0B\u6587\u4F1A\u629B\u9519\n // \uFF08\"a context-global restriction would mask every agent\"\uFF09\uFF0C\u6240\u4EE5\u538B\u5236 pwsh \u5FC5\u987B\u53D1\u751F\u5728\n // \u8BE5 agent \u81EA\u5DF1\u7684 scope \u91CC\uFF1B\u4E3A\u4E86\u8BA9\"\u6539\u5B8C\u8BBE\u7F6E\u7ACB\u523B\u751F\u6548\"\uFF0C\u8FD9\u91CC\u5728\u8BBE\u7F6E\u53D8\u5316\u65F6\u904D\u5386\n // `ctx.agents.list()` \u5BF9\u6BCF\u4E2A\u5728\u8DD1\u4F1A\u8BDD\u91CD\u65B0\u4E0B\u53D1\uFF08\u89C1 terminal/host.ts \u7684\u6CE8\u91CA\uFF09\u3002\n //\n // \u5E73\u53F0\uFF1A\u975E Windows \u76F4\u63A5\u4E0D\u63A5\u7BA1\uFF08\u5B98\u65B9 bash \u5DE5\u5177\u672C\u6765\u5C31\u5728\uFF09\uFF0C\u53EA\u628A\u72B6\u6001\u5982\u5B9E\u56DE\u62A5\u7ED9\u8BBE\u7F6E\u9875\u3002\n ctx.inject(['settings', 'webServer'], (termCtx) => {\n /** \u91C7\u96C6\u5DE5\u5177\u8FD0\u884C\u6240\u9700\u7684\u5BBF\u4E3B\u670D\u52A1\uFF1B\u7F3A subprocess \u5C31\u6CA1\u6CD5\u8DD1\u547D\u4EE4\uFF08\u53EA\u964D\u7EA7\u4E3A\u538B\u5236 pwsh\uFF09\u3002 */\n const readToolDeps = (): BashToolDeps | undefined => {\n const subprocess = termCtx.get('subprocess')\n if (subprocess === undefined) return undefined\n const sandbox = termCtx.get('sandbox')\n const sandboxPolicy = termCtx.get('sandboxPolicy')\n const approval = termCtx.get('approval')\n const jobs = termCtx.get('jobs')\n const shellEnv = termCtx.get('shellEnv')\n return {\n subprocess: subprocess as never,\n ...(sandbox === undefined ? {} : { sandbox: sandbox as never }),\n ...(sandboxPolicy === undefined ? {} : { sandboxPolicy: sandboxPolicy as never }),\n ...(approval === undefined ? {} : { approval: approval as never }),\n ...(jobs === undefined ? {} : { jobs: jobs as never }),\n ...(shellEnv === undefined ? {} : { shellEnv: shellEnv as never }),\n }\n }\n // \u7EC8\u7AEF\u5B50\u7CFB\u7EDF\u53EA\u7528\u5230\u300C\u8BFB\u81EA\u5DF1\u8FD9\u4E00\u884C + mutate\u300D\u4E24\u4EF6\u4E8B\uFF0C\u800C\u8BFB\u53E3\u6309\u4E16\u4EE3\u4E0D\u540C\uFF08\u89C1 makeReader\uFF09\uFF0C\n // \u6240\u4EE5\u8FD9\u91CC\u628A\u5B83\u5305\u6210\u8BE5\u5B50\u7CFB\u7EDF\u671F\u671B\u7684 get/mutate \u5F62\u72B6 \u2014\u2014 terminal/host.ts \u4E00\u884C\u90FD\u4E0D\u7528\u6539\u3002\n installTerminalPolicy(\n termCtx as never,\n NAMESPACE,\n readView(termCtx.get('settings')) as never,\n readToolDeps,\n )\n })\n\n // \u2500\u2500 \u8FC1\u79FB\uFF1A\u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u5BF9\u8001\u7528\u6237\u4FDD\u6301\u5F00\u7740\uFF08\u4E00\u6B21\u6027\u5199\u56DE\u6587\u6863\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u4E3A\u4EC0\u4E48\u8FD9\u4E00\u680F\u4E0D\u80FD\u53EA\u9760\u8BBE\u7F6E\u6587\u6863\u5224\u65AD\uFF1A0.3.0 \u8D77\u6761\u76EE\u642C\u5230\u4E86 `quick-prompts.json`\uFF0C\n // **\"\u7528\u8FC7\u5FEB\u6377\u6307\u4EE4\u7684\u4EBA\"\u548C\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u4EBA\"\u7684\u8BBE\u7F6E\u6587\u6863\u53EF\u4EE5\u4E00\u6A21\u4E00\u6837**\uFF08\u90FD\u662F\u5185\u7F6E 9 \u6761 + \u9ED8\u8BA4\u6863\u4F4D\uFF09\uFF0C\n // \u7EAF\u51C0\u51FD\u6570\u90A3\u5957\"\u503C\u4E0D\u7B49\u4E8E\u9ED8\u8BA4\u503C\"\u7684\u5224\u636E\u5728\u4ED6\u8EAB\u4E0A\u4F1A\u5F97\u51FA\"\u6CA1\u78B0\u8FC7 \u21D2 \u5173\"\uFF0C\u628A\u5165\u53E3\u6309\u94AE\u6536\u6389\u3002\n // \u6240\u4EE5\u8FD9\u91CC\u8BFB\u4E00\u6B21\u4E66\u672C\u6587\u4EF6\uFF1A\u6709\u975E\u5185\u7F6E\u5185\u5BB9 \u21D2 \u8BA4\u5B9A\u4ED6\u5728\u7528 \u21D2 \u5199\u56DE `quickEnabled: true`\u3002\n // \u5199\u56DE\u4E4B\u540E\u4E24\u7AEF\u90FD\u53EA\u9700\u8981\u770B\u90A3\u4E00\u4E2A\u5E03\u5C14\uFF0C\u4E0D\u5FC5\u5404\u81EA\u77E5\u9053\u6587\u4EF6\u7684\u5B58\u5728\u3002\n // **\u53EA\u5728\u6587\u6863\u91CC\u8FD8\u6CA1\u6709\u8FD9\u4E2A\u952E\u65F6\u5199**\uFF1A\u7528\u6237\u660E\u786E\u5173\u6389\u4E4B\u540E\u6587\u6863\u91CC\u5C31\u662F `false`\uFF0C\u4E0D\u4F1A\u88AB\u91CD\u65B0\u6253\u5F00\u3002\n ctx.inject(['settings'], (migrateCtx) => {\n void (async () => {\n const service = migrateCtx.get('settings') as SettingsLike | undefined\n if (service === undefined) return\n const row = makeReader(service, config)(NAMESPACE)\n if (row === undefined || row[QUICK_ENABLED_FIELD] !== undefined) return\n try {\n const outcome = await readQuickBook(quickStorePath())\n if (outcome.kind !== 'ok' || !bookLooksCustom(outcome.book)) return\n await service.mutate(NAMESPACE, [\n { op: 'set', path: [QUICK_ENABLED_FIELD], value: true },\n ])\n } catch (error: unknown) {\n // \u8FC1\u79FB\u5931\u8D25\u4E0D\u662F\u81F4\u547D\u9519\u8BEF\uFF1A\u7528\u6237\u9876\u591A\u5728\u8BBE\u7F6E\u9875\u624B\u52A8\u6253\u5F00\u8FD9\u4E00\u680F\u3002\n console.error('[composer-ux] quick section migration skipped', error)\n }\n })()\n })\n\n // \u2500\u2500 \u91CD\u542F DSH \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n //\n // \u53EA\u6709\u5BBF\u4E3B\u8FDB\u7A0B\u80FD\u628A\u81EA\u5DF1\u91CD\u65B0\u62C9\u8D77\u6765\uFF08\u6D4F\u89C8\u5668\u78B0\u4E0D\u5230\u8FDB\u7A0B\uFF09\uFF0CDSH \u4E5F\u6CA1\u6709\u5B98\u65B9\u91CD\u542F\u673A\u5236\n // \uFF08\u63D2\u4EF6\u5E02\u573A\u90A3\u8FB9\u53EA\u8BF4\u300C\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u751F\u6548\u300D\uFF09\u3002\u673A\u5236\u7167\u642C\u63D2\u4EF6\u5E02\u573A\uFF1A\u5206\u79BB\u4E00\u4E2A node \u52A9\u624B\n // \u8FDB\u7A0B \u2192 \u81EA\u5DF1\u9000\u51FA \u2192 \u52A9\u624B\u7B49\u7AEF\u53E3\u771F\u7684\u7A7A\u51FA\u6765 \u2192 \u7528\u9690\u85CF\u63A7\u5236\u53F0\u7684 PowerShell \u8D77\u65B0\u5BBF\u4E3B \u2192\n // 20 \u79D2\u5185\u786E\u8BA4\u7AEF\u53E3\u6709\u4EBA\u76D1\u542C\uFF0C\u6CA1\u8D77\u6765\u628A\u8BCA\u65AD\u5199\u8FDB\u65E5\u5FD7\u3002\u7EC6\u8282\u4E0E\u7406\u7531\u5168\u5728 `src/restart.ts`\u3002\n //\n // \u8FD9\u4E00\u6574\u5757\u662F**\u5BBF\u4E3B\u534A**\uFF0C\u6240\u4EE5\u6539\u5B8C\u5FC5\u987B\u91CD\u542F DSH \u624D\u4F1A\u751F\u6548\uFF08\u8FD9\u4E5F\u6B63\u662F\u5B83\u8981\u89E3\u51B3\u7684\u95EE\u9898\uFF09\u3002\n ctx.inject(['webServer'], (restartCtx) => {\n /** \u8FD9\u6B21\u542F\u52A8\u7684\u6807\u8BC6\uFF1A\u754C\u9762\u9760\"\u53F7\u53D8\u4E86\"\u5224\u65AD\u65B0\u8FDB\u7A0B\u771F\u7684\u8D77\u6765\u4E86\u3002 */\n const BOOT_ID = bootId(process.pid, Date.now())\n /** \u5F53\u524D\u5BBF\u4E3B\u662F\u5426\u5904\u4E8E\"\u4E0D\u8BE5\u88AB\u4ECE\u754C\u9762\u91CC\u6740\u6389\"\u7684\u72B6\u6001\u3002 */\n const blockedBy = (): string | null => {\n const supervisor = detectedSupervisor({\n env: process.env,\n ppid: process.ppid,\n parentComm: (pid) => {\n try {\n return readFileSync(`/proc/${String(pid)}/comm`, 'utf8').trim()\n } catch {\n // /proc \u53EA\u5728 Linux \u4E0A\u6709\uFF1B\u8BFB\u4E0D\u5230\u5C31\u8BF4\u660E\"\u4E0D\u662F systemd \u7684\u4E3B\u8FDB\u7A0B\"\u3002\n return null\n }\n },\n })\n if (supervisor !== null) return `supervised:${supervisor}`\n if (detectedDebugger({\n inspectorUrl: inspector.url(),\n execArgv: process.execArgv,\n nodeOptions: process.env.NODE_OPTIONS,\n }) !== null) return 'debugger'\n return null\n }\n /** \u7EC4\u88C5\u6CE8\u5165\u9762\uFF08\u771F\u5B9E\u5B9E\u73B0\uFF1B\u6D4B\u8BD5\u91CC\u6362\u5047\u7684\uFF09\u3002 */\n const buildIo = (): RestartIo => ({\n platform: process.platform,\n pid: process.pid,\n argv0: process.argv0,\n execPath: process.execPath,\n argv1: process.argv[1],\n execArgv: process.execArgv,\n // argv[0] \u662F node \u81EA\u5DF1\u3001argv[1] \u662F\u5165\u53E3\uFF1B\u91CD\u653E\u7684\u662F\"\u5165\u53E3 + \u4E4B\u540E\u7684\u53C2\u6570\"\u3002\n rest: process.argv.slice(2),\n cwd: process.cwd(),\n env: process.env,\n tmpdir: tmpdir(),\n stamp: new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19),\n exists: (path) => existsSync(path),\n resolve: (path) => resolve(path),\n dirname: (path) => dirname(path),\n join: (...parts) => join(...parts),\n spawn: (command, args, options) => spawn(command, [...args], {\n detached: options.detached,\n stdio: options.stdio,\n windowsHide: options.windowsHide,\n env: options.env as NodeJS.ProcessEnv,\n }),\n stop: () => {\n gracefulStop({\n emitSignal: (signal) => { process.emit(signal as 'SIGTERM') },\n exit: (code) => { process.exit(code) },\n timer: (ms, run) => { setTimeout(run, ms) },\n })\n },\n wait: (ms) => new Promise<void>((done) => { setTimeout(done, ms) }),\n })\n /** \u5DF2\u7ECF\u6392\u8FC7\u4E00\u6B21\u91CD\u542F\uFF1A\u9632\u6B62\u754C\u9762\u91CD\u590D\u70B9 / \u4E24\u4E2A\u6807\u7B7E\u9875\u540C\u65F6\u70B9\u3002 */\n let restarting = false\n /** GET \u53EA\u8BFB\u5C55\u793A\uFF1A\u4F1A\u600E\u4E48\u91CD\u542F\u3001\u65E5\u5FD7\u843D\u5728\u54EA\u3002 */\n const planForDisplay = (): { command: string; execPath: string; logHint: string } => {\n const io = buildIo()\n const plan = planRestart(io, null)\n return {\n command: [plan.respawn.file, ...plan.respawn.args].join(' '),\n execPath: plan.node,\n logHint: join(io.tmpdir, `${RESTART_LOG_PREFIX}*.err.log`),\n }\n }\n\n restartCtx.effect(() => restartCtx.webServer.register({\n kind: 'exact',\n path: RESTART_API_PATH,\n handler: (req: {\n method?: string\n headers?: Readonly<Record<string, string | readonly string[] | undefined>>\n socket?: { remoteAddress?: string }\n }, res: {\n statusCode?: number\n writeHead: (code: number, headers: Record<string, string>) => void\n end: (body?: string) => void\n }): void => {\n const send = (code: number, payload: unknown): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' })\n res.end(JSON.stringify(payload))\n }\n // \u7B2C\u4E00\u9053\uFF1A\u5B98\u65B9\u90A3\u9053\u4FE1\u4EFB\u5173\u5361\uFF08\u672C\u673A webServer \u7ED1 0.0.0.0\uFF1AHost/Origin \u56F4\u680F + \u6D4F\u89C8\u5668\u4EE4\u724C\uFF09\u3002\n // \u4E0E\u53E6\u5916\u4E24\u6761\u8DEF\u7531\u4E00\u81F4\uFF0C\u5148\u95EE\u5B83\uFF0C\u88AB\u62D2\u5C31\u76F4\u63A5\u7ED3\u675F\u3002\n const connection = restartCtx.get('connection') as\n { requestRejection?: (request: unknown) => number | undefined } | undefined\n const rejection = connection?.requestRejection?.(req)\n if (rejection !== undefined) {\n res.statusCode = rejection\n res.end()\n return\n }\n\n const agents = restartCtx.get('agents') as { list?: () => readonly unknown[] } | undefined\n const running = agents?.list?.().length ?? 0\n const blocked = blockedBy()\n const method = (req.method ?? 'GET').toUpperCase()\n\n if (method !== 'GET' && method !== 'POST') {\n res.writeHead(405, { allow: 'GET, POST' })\n res.end()\n return\n }\n if (method === 'GET') {\n const plan = planForDisplay()\n send(200, { ok: true, ...plan, running, blocked, boot: BOOT_ID })\n return\n }\n\n // \u7B2C\u4E8C\u9053\uFF1A\u8FD9\u662F\"\u6740\u8FDB\u7A0B\"\u7684\u63A5\u53E3\uFF0C\u6240\u4EE5\u989D\u5916\u8981\u6C42\u8BF7\u6C42\u786E\u5B9E\u6765\u81EA\u672C\u673A\u540C\u6E90\u9875\u9762 \u2014\u2014\n // \u56DE\u73AF peer\u3001\u65E0\u8F6C\u53D1\u75D5\u8FF9\u3001Origin \u4E0E Host \u540C\u6E90\u3002\u8DE8\u7AD9\u9875\u9762\u4E00\u5B9A\u5E26\u81EA\u5DF1\u7684 Origin\uFF0C\u6321\u5728\u8FD9\u91CC\u3002\n if (!trustedRestartRequest({\n remoteAddress: req.socket?.remoteAddress,\n headers: req.headers ?? {},\n })) {\n send(403, { ok: false, error: 'restart is limited to same-origin loopback requests' })\n return\n }\n if (blocked !== null) {\n send(403, { ok: false, error: blocked === 'debugger'\n ? 'self-restart is disabled while the host is under a debugger'\n : `restart belongs to the ${blocked.slice('supervised:'.length)} supervisor on this host` })\n return\n }\n if (restarting) {\n send(409, { ok: false, error: 'restart already scheduled' })\n return\n }\n restarting = true\n try {\n const scheduled = scheduleRestart(buildIo(), servingPort(firstHeaderValue(req.headers?.host)))\n send(202, { ok: true, boot: BOOT_ID, running, ...scheduled })\n } catch (error: unknown) {\n restarting = false\n send(500, { ok: false, error: error instanceof Error ? error.message : String(error) })\n }\n },\n }), 'composer-ux: restart route')\n })\n}\n", "/**\n * bash \u63A2\u6D4B\uFF08\u7EAF\u51FD\u6570\uFF0C\u96F6 import\uFF0Chost \u4E0E\u6D4B\u8BD5\u5171\u7528\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u80FD\"\u626B PATH \u91CC\u7684 bash.exe \u5C31\u5B8C\u4E8B\"\uFF1A\n *\n * 1. **Windows \u4E0A `bash.exe` \u6709\u4E24\u4E2A\u6765\u6E90\uFF0C\u5176\u4E2D\u4E00\u4E2A\u5FC5\u987B\u6392\u9664\u3002**\n * `C:\\Windows\\System32\\bash.exe` \u4E0E `\u2026\\Microsoft\\WindowsApps\\bash.exe` \u662F WSL \u7684\n * \u542F\u52A8\u5668\u3002\u628A\u5B83\u4EA4\u7ED9\u6A21\u578B\uFF0C\u7B49\u4E8E\u628A Windows \u8DEF\u5F84\u4F53\u7CFB\u6362\u6389\uFF1A`D:\\a\\b` \u8981\u5199\u6210 `/mnt/d/a/b`\uFF0C\n * \u76D8\u7B26\u3001\u53CD\u659C\u6760\u3001`%TEMP%` \u5168\u90FD\u4E0D\u901A\uFF0C\u800C\u6A21\u578B\u624B\u91CC\u8FD8\u62FF\u7740 Windows \u98CE\u683C\u7684\u8DEF\u5F84\u4E0E\u5DE5\u4F5C\u76EE\u5F55\u3002\n * \u6240\u4EE5\u8FD9\u91CC\u662F**\u786C\u6392\u9664**\uFF08`isWslBash`\uFF09\uFF0C\u4E0D\u662F\"\u6392\u5E8F\u9760\u540E\"\u3002\n *\n * 2. **Git for Windows \u4E0D\u4E00\u5B9A\u88C5\u5728 Program Files\u3002** \u5B89\u88C5\u5668\u4EE5\u7BA1\u7406\u5458\u8FD0\u884C\u65F6\u9ED8\u8BA4\u843D\n * `C:\\Program Files\\Git`\uFF0C**\u4EE5\u666E\u901A\u7528\u6237\u8FD0\u884C\u65F6\u9ED8\u8BA4\u843D `%LOCALAPPDATA%\\Programs\\Git`**\uFF1B\n * \u8FD8\u6709 Scoop / Chocolatey / GitHub Desktop \u5185\u5D4C / \u81EA\u89E3\u538B PortableGit \u7B49\u6765\u6E90\u3002\n * \u672C\u673A\u5C31\u662F\u53CD\u4F8B\uFF1AGit \u88C5\u5728 `D:\\Git`\uFF08\u53EA\u6709\u56E0\u4E3A `D:\\Git\\cmd` \u5728 PATH \u4E0A\u624D\u88AB\u627E\u5230\uFF09\u3002\n * \u6240\u4EE5\u63A2\u6D4B\u662F**\u5148\u627E git\uFF0C\u518D\u7531\u540C\u4E00\u4E2A\u5B89\u88C5\u53CD\u63A8 bash**\uFF0C\u518D\u53E0\u52A0\u4E00\u4EFD\"\u5E38\u89C1\u6765\u6E90\"\u5019\u9009\u8868\u3002\n *\n * 3. **Niubash\uFF08\u725B bash\uFF0C`niu.exe`\uFF09\u662F\u5019\u9009\u800C\u4E0D\u662F\u9ED8\u8BA4\u3002** \u5B83\u7684\u547D\u4EE4\u96C6\uFF08winuxcmd\uFF09\u5BF9\n * \u975E ASCII \u53C2\u6570\u7684\u5904\u7406\u6709\u95EE\u9898\uFF08\u5B9E\u6D4B\uFF1A`grep <\u4E2D\u6587\u6587\u4EF6\u540D>` \u76F4\u63A5 `cannot open` \u5E76\u4EE5\n * `0xC0000409` \u9000\u51FA\uFF09\uFF0C\u6240\u4EE5\u6392\u5728\u771F Git Bash \u4E4B\u540E\uFF0C\u4F46\u4ECD\u7136\u5217\u51FA\u6765 \u2014\u2014 \u7528\u6237\u53EF\u80FD\u7279\u610F\u9009\u4E86\u5B83\u3002\n *\n * \u8986\u76D6\u7684\u6765\u6E90\uFF08\u987A\u5E8F\u5373\u4F18\u5148\u7EA7\uFF0C\u540C\u7C7B\u5185\u4FDD\u6301\u8FD9\u91CC\u7684\u5148\u540E\uFF09\uFF1A\n * \u663E\u5F0F\u8DEF\u5F84 \u2192 PATH \u4E0A\u7684 git \u53CD\u63A8 \u2192 Program Files / x86 / W6432 / `%LOCALAPPDATA%\\Programs`\n * \u2192 Scoop \u2192 Chocolatey \u4FBF\u643A\u5305 \u2192 GitHub Desktop \u5185\u5D4C \u2192 \u65E7 GitHub \u7684 PortableGit\n * \u2192 Visual Studio \u5185\u5D4C \u2192 MSYS2 \u2192 Cygwin \u2192 **\u5404\u76D8\u7B26\u6839\u4E0B\u7684 Git / PortableGit / msys64 / cygwin64**\n * \u2192 Niubash \u2192 PATH \u515C\u5E95\u3002\n *\n * \u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF08GitHub Desktop \u7684 `app-*`\u3001\u65E7 GitHub \u7684 `PortableGit_*`\u3001VS \u7684\n * `<\u5E74\u4EFD>\\<\u7248\u672C>`\uFF09\u9700\u8981\"\u5217\u4E00\u773C\u5B50\u76EE\u5F55\"\uFF0C\u6240\u4EE5\u8F93\u5165\u91CC\u591A\u4E86\u4E00\u4E2A\u53EF\u6CE8\u5165\u7684 `listDirs`\uFF1B\n * **\u4E0D\u6CE8\u5165\u5C31\u9000\u5316\u6210\u7EAF\u5B58\u5728\u6027\u68C0\u67E5**\uFF08\u4E0D\u8BFB\u76EE\u5F55\uFF09\u3002\u5168\u7A0B\u4E0D\u8FD0\u884C\u4EFB\u4F55\u8FDB\u7A0B\uFF1A\u7248\u672C\u63A2\u6D4B\u5C5E\u4E8E\u5BBF\u4E3B\u534A\u3002\n */\n\n/** \u5019\u9009\u7684\u79CD\u7C7B\uFF08\u51B3\u5B9A\u6392\u5E8F\u6743\u91CD\u4E0E\u9ED8\u8BA4\u6807\u7B7E\uFF09\u3002 */\nexport type BashKind = 'git' | 'msys2' | 'cygwin' | 'niubash' | 'path'\n\n/** \u4E00\u4E2A\u5019\u9009 shell\u3002 */\nexport interface BashCandidate {\n /** \u5F52\u4E00\u5316\u540E\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u6B63\u659C\u6760\uFF09\uFF0C\u53EF\u76F4\u63A5\u843D\u76D8\u4E0E\u56DE\u663E\u3002 */\n readonly path: string\n readonly kind: BashKind\n /** \u7ED9\u7528\u6237\u770B\u7684\u6765\u6E90\u6807\u7B7E\uFF08\u5177\u4F53\u6765\u6E90\u4F18\u5148\uFF0C\u4F8B\u5982 'Scoop \u7684 git'\uFF0C\u5426\u5219\u7528\u79CD\u7C7B\u6807\u7B7E\uFF09\u3002 */\n readonly label: string\n /** \u662F\u5426\u662F\u7528\u6237\u5728\u8BBE\u7F6E\u91CC\u663E\u5F0F\u6307\u5B9A\u7684\uFF08\u754C\u9762\u6807\u6CE8\u300C\u4F60\u6307\u5B9A\u7684\u300D\uFF0C\u4E14\u6392\u5E8F\u6C38\u8FDC\u5728\u6700\u524D\uFF09\u3002 */\n readonly explicit: boolean\n}\n\n/** \u88AB\u786C\u6392\u9664\u7684\u8DEF\u5F84\u53CA\u539F\u56E0\uFF08\u8BBE\u7F6E\u9875\u8981\u5982\u5B9E\u8BF4\u660E\"\u4E3A\u4EC0\u4E48\u4E0D\u9009\u5B83\"\uFF09\u3002 */\nexport interface ExcludedPath {\n readonly path: string\n readonly reason: string\n}\n\n/** \u663E\u5F0F\u8DEF\u5F84\uFF08\u8BBE\u7F6E\u91CC\u586B\u7684\uFF09\u7684\u72B6\u6001\u3002 */\nexport interface ExplicitState {\n readonly path: string\n readonly state: 'ok' | 'missing' | 'wsl'\n}\n\n/** \u63A2\u6D4B\u7684\u8F93\u5165\uFF08\u5168\u90E8\u53EF\u6CE8\u5165\uFF0C\u6D4B\u8BD5\u91CC\u7ED9\u5047\u5B9E\u73B0\u5373\u53EF\uFF09\u3002 */\nexport interface DiscoverInput {\n /** \u8DEF\u5F84\u662F\u5426\u5B58\u5728\u3002 */\n readonly exists: (path: string) => boolean\n /** \u6309\u987A\u5E8F\u7684 PATH \u6761\u76EE\uFF08\u672A\u6E05\u6D17\uFF09\u3002 */\n readonly pathEntries: readonly string[]\n /** \u73AF\u5883\u53D8\u91CF\u53D6\u503C\u3002 */\n readonly env: (name: string) => string | undefined\n /** \u8BBE\u7F6E\u91CC\u663E\u5F0F\u586B\u7684 bash \u8DEF\u5F84\uFF08\u53EF\u7A7A\uFF09\u3002 */\n readonly explicitPath?: string\n /**\n * \u5217\u51FA\u67D0\u4E2A\u76EE\u5F55\u4E0B\u7684**\u5B50\u76EE\u5F55\u540D**\uFF08\u53EA\u7528\u4E8E\u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF1AGitHub Desktop / \u65E7 GitHub / VS\uFF09\u3002\n * \u4E0D\u6CE8\u5165\u3001\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6CA1\u6709\u6743\u9650\u65F6\u90FD\u5F53\u4F5C\"\u7A7A\"\uFF0C\u63A2\u6D4B\u9000\u5316\u6210\u7EAF\u5B58\u5728\u6027\u68C0\u67E5\u3002\n */\n readonly listDirs?: (parent: string) => readonly string[]\n}\n\n/** \u63A2\u6D4B\u7ED3\u679C\u3002 */\nexport interface DiscoverResult {\n /** \u6309\u4F18\u5148\u7EA7\u6392\u597D\u5E8F\u3001\u5DF2\u53BB\u91CD\u3001\u5DF2\u5254\u9664 WSL \u7684\u5019\u9009\u3002 */\n readonly candidates: readonly BashCandidate[]\n /** \u88AB\u786C\u6392\u9664\u7684\u8DEF\u5F84\uFF08\u5F53\u524D\u53EA\u6709 WSL\uFF09\u3002 */\n readonly excluded: readonly ExcludedPath[]\n /** \u663E\u5F0F\u8DEF\u5F84\u7684\u72B6\u6001\uFF1B\u6CA1\u586B\u5C31\u662F undefined\u3002 */\n readonly explicit?: ExplicitState\n}\n\n/** WSL \u6392\u9664\u539F\u56E0\uFF08\u8BBE\u7F6E\u9875\u76F4\u63A5\u5C55\u793A\u8FD9\u53E5\u8BDD\uFF09\u3002 */\nexport const WSL_REASON = 'WSL \u7684 bash\uFF1A\u5B83\u6309 Linux \u89C4\u5219\u89E3\u91CA\u8DEF\u5F84\uFF08D:\\\\x \u8981\u5199\u6210 /mnt/d/x\uFF09\uFF0C'\n + '\u4E0E\u6A21\u578B\u624B\u91CC\u7684 Windows \u5DE5\u4F5C\u76EE\u5F55\u4E0D\u517C\u5BB9\uFF0C\u6545\u4E0D\u91C7\u7528'\n\n/** \u5F52\u4E00\u5316\uFF1A\u53CD\u659C\u6760\u8F6C\u6B63\u659C\u6760\u3001\u53BB\u6389\u5305\u88F9\u5F15\u53F7\u4E0E\u7ED3\u5C3E\u659C\u6760\u3001\u5408\u5E76\u91CD\u590D\u5206\u9694\u7B26\u3002 */\nexport function normalizePath(value: string): string {\n const trimmed = value.trim().replace(/^\"|\"$/g, '')\n const slashed = trimmed.replace(/\\\\/g, '/').replace(/\\/{2,}/g, '/')\n return slashed.length > 1 ? slashed.replace(/\\/+$/, '') : slashed\n}\n\n/** \u662F\u5426 WSL \u7684 bash\uFF08System32 \u7684\u542F\u52A8\u5668\u4E0E WindowsApps \u7684\u522B\u540D\uFF09\u3002 */\nexport function isWslBash(value: string): boolean {\n const path = normalizePath(value).toLowerCase()\n return /\\/windows\\/system32\\/bash\\.exe$/.test(path) || /\\/windowsapps\\/bash\\.exe$/.test(path)\n}\n\n/** \u6309\u8DEF\u5F84\u5F62\u6001\u5224\u65AD\u79CD\u7C7B\uFF08\u663E\u5F0F\u8DEF\u5F84\u4E5F\u80FD\u56E0\u6B64\u62FF\u5230\u6B63\u786E\u7684\u6807\u7B7E\u4E0E\u4F18\u5148\u7EA7\uFF09\u3002 */\nexport function candidateKindOf(value: string): BashKind {\n const path = normalizePath(value).toLowerCase()\n if (path.endsWith('/niu.exe') || path.includes('/niubash/')) return 'niubash'\n if (path.includes('/msys64/') || path.includes('/msys32/') || path.includes('/msys2/')) return 'msys2'\n if (path.includes('/cygwin')) return 'cygwin'\n // `PortableGit` \u4E5F\u7B97 git\uFF08\u6B63\u5219\u91CC\u628A\u53EF\u9009\u524D\u7F00\u5199\u4E0A\uFF09\uFF0C\u53EA\u662F\u6807\u7B7E\u4E0D\u540C\u3002\n if (/(^|\\/)(portable)?git(\\/|$)/.test(path)) return 'git'\n return 'path'\n}\n\n/** \u79CD\u7C7B \u2192 \u754C\u9762\u6807\u7B7E\uFF08\u5177\u4F53\u6765\u6E90\u6CA1\u7ED9\u65F6\u7528\u5B83\uFF09\u3002 */\nexport function kindLabel(kind: BashKind): string {\n switch (kind) {\n case 'git': return 'Git for Windows'\n case 'msys2': return 'MSYS2'\n case 'cygwin': return 'Cygwin'\n case 'niubash': return 'Niubash\uFF08\u725B bash\uFF09'\n default: return 'PATH'\n }\n}\n\n/** \u79CD\u7C7B\u6392\u5E8F\u6743\u91CD\uFF08\u6570\u5B57\u8D8A\u5C0F\u8D8A\u4F18\u5148\uFF09\uFF1Bniubash \u4F4E\u4E8E MSYS2/Cygwin\uFF0C\u9AD8\u4E8E\u6742\u9879 PATH\u3002 */\nconst KIND_RANK: Record<BashKind, number> = { git: 0, msys2: 1, cygwin: 2, niubash: 3, path: 4 }\n\n/** \u76D8\u7B26\u626B\u63CF\u7684\u5B57\u6BCD\uFF08\u8DF3\u8FC7 A:/B: \u8F6F\u9A71\u4F4D\uFF09\u3002 */\nconst DRIVE_LETTERS = 'CDEFGHIJKLMNOPQRSTUVWXYZ'\n\n/** \u4ECE PATH \u6761\u76EE\u91CC\u8BA4\u51FA git \u5B89\u88C5\u6839\uFF08`<root>\\cmd` / `<root>\\bin` / `<root>\\mingw64\\bin` \u90FD\u5F52\u5230 root\uFF09\u3002 */\nfunction gitRootOf(entry: string): string | undefined {\n const path = normalizePath(entry)\n if (path === '') return undefined\n const lower = path.toLowerCase()\n for (const suffix of ['/mingw64/bin', '/mingw32/bin', '/usr/bin', '/cmd', '/bin']) {\n if (lower.endsWith(suffix)) return path.slice(0, path.length - suffix.length)\n }\n return path\n}\n\n/** \u4E00\u4E2A\u5B89\u88C5\u6839\u4E0B\u6240\u6709\u53EF\u80FD\u7684 bash \u4F4D\u7F6E\uFF08\u987A\u5E8F\u5373\u4F18\u5148\u7EA7\uFF09\u3002 */\nfunction bashPathsUnder(root: string): readonly string[] {\n return [`${root}/bin/bash.exe`, `${root}/usr/bin/bash.exe`, `${root}/mingw64/bin/bash.exe`]\n}\n\n/**\n * `usr/bin` / `mingw64/bin` \u4E0B\u7684 bash \u662F**\u88F8\u672C\u4F53**\uFF1A\u76F4\u63A5\u8DD1\u5B83\u4E0D\u4F1A\u51C6\u5907 MSYS \u73AF\u5883\u3002\n *\n * \u672C\u673A\u5B9E\u6D4B\uFF08`D:\\Git` \u4E24\u4E2A\u90FD\u8DD1\u4E86\u4E00\u904D\uFF09\uFF1A`bin\\bash.exe` \u7ED9\u51FA `MSYSTEM=MINGW64`\u3001\n * `PATH` \u524D\u7F6E `/mingw64/bin:/usr/bin`\uFF0C`head` / `grep` / `uname` \u90FD\u5728\uFF08\u4E2D\u6587\u6587\u4EF6\u540D\u5F53\u53C2\u6570\u4E5F\u6B63\u5E38\uFF09\uFF1B\n * \u800C `usr\\bin\\bash.exe` \u7684 `MSYSTEM` \u4E3A\u7A7A\u3001`PATH` \u53EA\u6709\u7EE7\u627F\u6765\u7684 Windows PATH\uFF08\u91CC\u9762\u53EA\u6709 `D:\\Git\\cmd`\uFF09\uFF0C\n * \u4E8E\u662F `head` / `grep` / `uname` **\u5168\u90E8 command not found** \u2014\u2014 \u4EA4\u7ED9\u6A21\u578B\u5C31\u662F\u5927\u9762\u79EF\u5931\u8D25\u3002\n *\n * \u6240\u4EE5\uFF1A\u540C\u4E00\u4E2A\u6839\u4E0B\u53EA\u8981\u6709 `bin/bash.exe`\uFF0C\u5C31\u4E0D\u518D\u5217\u8FD9\u4E2A\u88F8\u672C\u4F53\uFF08\u7528\u6237\u4ECD\u53EF\u624B\u586B\uFF09\u3002\n * \u6CA1\u6709 `bin/bash.exe` \u5144\u5F1F\u7684\uFF08\u4F8B\u5982 MSYS2 \u53EA\u63D0\u4F9B `usr\\bin\\bash.exe`\uFF09\u7167\u5E38\u5217\u51FA\u3002\n * @param value \u5019\u9009\u8DEF\u5F84\u3002\n * @returns \u5B89\u88C5\u6839\uFF1B\u4E0D\u662F\u88F8\u672C\u4F53\u65F6 undefined\u3002\n */\nexport function unpreparedBashRoot(value: string): string | undefined {\n const match = /^(.*)\\/(usr|mingw32|mingw64)\\/bin\\/bash\\.exe$/i.exec(normalizePath(value))\n return match?.[1]\n}\n\n/** \u4E00\u4E2A\u5019\u9009\u6765\u6E90\uFF1A\u4E00\u7EC4\u5B89\u88C5\u6839 + \u53EF\u9009\u7684\u5177\u4F53\u6807\u7B7E\u3002 */\ninterface SourceGroup {\n readonly roots: readonly string[]\n readonly label?: string\n}\n\n/**\n * \u63A2\u6D4B\u5019\u9009 bash\u3002\n * @param input \u6CE8\u5165\u7684 exists/PATH/\u73AF\u5883\u53D8\u91CF\uFF0C\u4EE5\u53CA\u53EF\u9009\u7684 listDirs\uFF08\u5217\u5B50\u76EE\u5F55\uFF09\u3002\n * @returns \u5019\u9009\u3001\u88AB\u6392\u9664\u7684\u8DEF\u5F84\u3001\u663E\u5F0F\u8DEF\u5F84\u72B6\u6001\u3002\n */\nexport function discoverBashCandidates(input: DiscoverInput): DiscoverResult {\n const seen = new Set<string>()\n const excluded: ExcludedPath[] = []\n const ordered: BashCandidate[] = []\n\n /** \u5217\u5B50\u76EE\u5F55\uFF1B\u6CA1\u6709\u6CE8\u5165\u3001\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6CA1\u6743\u9650\u90FD\u5F53\u7A7A\u3002 */\n const dirsOf = (parent: string): readonly string[] => {\n if (input.listDirs === undefined) return []\n try {\n return input.listDirs(parent)\n } catch {\n return []\n }\n }\n\n /** \u8BB0\u4E00\u4E2A\u5019\u9009\uFF1BWSL \u4E00\u5F8B\u8F6C\u6210\u6392\u9664\u9879\uFF0C\u91CD\u590D\u8DEF\u5F84\u53EA\u7559\u7B2C\u4E00\u6B21\uFF08\u5373\u4F18\u5148\u7EA7\u6700\u9AD8\u7684\u90A3\u4E00\u6B21\uFF09\u3002 */\n const consider = (raw: string, label?: string, isExplicit = false): void => {\n const path = normalizePath(raw)\n if (path === '') return\n if (isWslBash(path)) {\n // \u53EA\u5728\u5B83**\u786E\u5B9E\u5B58\u5728**\u65F6\u62A5\"\u5DF2\u6392\u9664\"\uFF1A\u5426\u5219\u6BCF\u53F0\u673A\u5668\u90FD\u4F1A\u51ED\u7A7A\u591A\u51FA\u4E00\u6761 WSL \u8B66\u544A\u3002\n if (!input.exists(path)) return\n if (!excluded.some(item => item.path.toLowerCase() === path.toLowerCase())) {\n excluded.push({ path, reason: WSL_REASON })\n }\n return\n }\n // \u88F8\u672C\u4F53\uFF08usr/bin\u3001mingw64/bin\uFF09\uFF1A\u540C\u6839\u4E0B\u5DF2\u6709\u4F1A\u51C6\u5907\u73AF\u5883\u7684 `bin/bash.exe` \u65F6\u4E0D\u518D\u4F5C\u4E3A\u5019\u9009\uFF0C\n // \u514D\u5F97\u7528\u6237\u70B9\u5230\u4E00\u4E2A\"\u547D\u4EE4\u5168\u627E\u4E0D\u5230\"\u7684 shell\u3002**\u663E\u5F0F\u8DEF\u5F84\u4E0D\u53D7\u6B64\u9650**\uFF1A\u90A3\u662F\u7528\u6237\u81EA\u5DF1\u7684\u9009\u62E9\u3002\n if (!isExplicit) {\n const root = unpreparedBashRoot(path)\n if (root !== undefined && input.exists(`${root}/bin/bash.exe`)) return\n }\n const key = path.toLowerCase()\n if (seen.has(key)) return\n if (!input.exists(path)) return\n seen.add(key)\n const kind = candidateKindOf(path)\n ordered.push({ path, kind, label: label ?? kindLabel(kind), explicit: isExplicit })\n }\n\n /** \u4E00\u7EC4\u6765\u6E90\uFF1A\u53EA\u8BD5\u5B58\u5728\u7684\u5B89\u88C5\u6839\uFF0C\u518D\u628A\u8BE5\u6839\u4E0B\u6240\u6709\u53EF\u80FD\u7684 bash \u4F4D\u7F6E\u4E22\u7ED9 consider\u3002 */\n const addGroup = (group: SourceGroup): void => {\n for (const root of group.roots) {\n if (root === '' || !input.exists(root)) continue\n for (const path of bashPathsUnder(root)) consider(path, group.label)\n }\n }\n\n // 1) \u663E\u5F0F\u8DEF\u5F84\uFF1A\u7528\u6237\u81EA\u5DF1\u586B\u7684\uFF0C\u4F18\u5148\u7EA7\u6700\u9AD8\uFF08\u586B\u9519\u4E5F\u4F1A\u5982\u5B9E\u62A5\u544A\uFF09\u3002\n const explicitRaw = normalizePath(input.explicitPath ?? '')\n let explicit: ExplicitState | undefined\n if (explicitRaw !== '') {\n if (isWslBash(explicitRaw)) {\n explicit = { path: explicitRaw, state: 'wsl' }\n // \u7528\u6237\u660E\u786E\u586B\u4E86 WSL\uFF1A\u8981\u8BA9\u4ED6\u770B\u5230\"\u4E3A\u4EC0\u4E48\u4E0D\u91C7\u7528\"\uFF0C\u800C\u4E0D\u662F\u770B\u5230\u5019\u9009\u91CC\u6084\u6084\u5C11\u4E86\u4E00\u6761\u3002\n if (input.exists(explicitRaw)) excluded.push({ path: explicitRaw, reason: WSL_REASON })\n } else if (input.exists(explicitRaw)) explicit = { path: explicitRaw, state: 'ok' }\n else explicit = { path: explicitRaw, state: 'missing' }\n }\n\n const entries = input.pathEntries\n .map(entry => normalizePath(entry))\n .filter(entry => entry !== '')\n const env = (name: string): string | undefined => {\n const value = input.env(name)\n return value === undefined || value === '' ? undefined : normalizePath(value)\n }\n\n const programFiles = env('ProgramFiles') ?? 'C:/Program Files'\n const programFilesX86 = env('ProgramFiles(x86)') ?? 'C:/Program Files (x86)'\n const programW6432 = env('ProgramW6432')\n const localAppData = env('LOCALAPPDATA')\n const home = env('USERPROFILE') ?? env('HOME')\n const scoop = env('SCOOP') ?? (home === undefined ? undefined : `${home}/scoop`)\n const choco = env('ChocolateyInstall')\n ?? (env('ProgramData') === undefined ? 'C:/ProgramData/chocolatey' : `${env('ProgramData') as string}/chocolatey`)\n\n // \u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF1A\u5217\u4E00\u773C\u5B50\u76EE\u5F55\uFF0C\u6309\u540D\u5B57**\u5012\u5E8F**\uFF08`app-3.4.3` \u8FD9\u79CD\u540D\u5B57\uFF0C\u65B0\u7684\u6392\u5728\u524D\u9762\uFF09\u3002\n const versioned: string[] = []\n if (localAppData !== undefined) {\n const desktop = `${localAppData}/GitHubDesktop`\n for (const dir of [...dirsOf(desktop)].sort().reverse()) {\n if (dir.startsWith('app-')) versioned.push(`${desktop}/${dir}/resources/app/git`)\n }\n const github = `${localAppData}/GitHub`\n for (const dir of [...dirsOf(github)].sort().reverse()) {\n if (dir.startsWith('PortableGit')) versioned.push(`${github}/${dir}`)\n }\n }\n const vsRoot = `${programFiles}/Microsoft Visual Studio`\n for (const year of dirsOf(vsRoot)) {\n const yearRoot = `${vsRoot}/${year}`\n for (const edition of dirsOf(yearRoot)) {\n versioned.push(`${yearRoot}/${edition}/Common7/IDE/CommonExtensions/Microsoft/TeamFoundation/Team Explorer/Git`)\n }\n }\n\n // \u5404\u76D8\u7B26\u6839\u4E0B\u7684\u5E38\u89C1\u540D\u5B57\uFF1A\u8986\u76D6\"\u88C5\u5728 D:\\Git / D:\\PortableGit / \u81EA\u5DF1\u89E3\u538B\"\u7684\u60C5\u51B5\u3002\n const drives: string[] = []\n for (const letter of DRIVE_LETTERS) {\n const root = `${letter}:`\n if (input.exists(`${root}/`)) drives.push(root)\n }\n const driveRoots = (names: readonly string[]): readonly string[] =>\n drives.flatMap(root => names.map(name => `${root}/${name}`))\n\n const groups: readonly SourceGroup[] = [\n // 2) PATH \u4E0A\u8BA4\u51FA\u6765\u7684 git \u6839 \u2014\u2014 \u90A3\u624D\u662F\u7528\u6237\u5B9E\u9645\u5728\u7528\u7684\u90A3\u4EFD\u3002\n ...entries.map(entry => gitRootOf(entry))\n .filter((root): root is string => root !== undefined)\n .map(root => ({ roots: [root] })),\n // 3) \u5B98\u65B9\u5B89\u88C5\u5668\u7684\u4E24\u4E2A\u9ED8\u8BA4\u843D\u70B9 + 32 \u4F4D / \u91CD\u5B9A\u5411\u540E\u7684 Program Files\u3002\n { roots: [programFiles, programFilesX86, programW6432, localAppData === undefined ? undefined : `${localAppData}/Programs`]\n .filter((base): base is string => base !== undefined)\n .map(base => `${base}/Git`) },\n // 4) Scoop\uFF08`scoop install git` \u4F1A\u5E26\u4E00\u4EFD bash\uFF09\u3002\n ...(scoop === undefined ? [] : [{ roots: [`${scoop}/apps/git/current`, `${scoop}/apps/git`], label: 'Scoop \u7684 git' }]),\n // 5) Chocolatey \u7684\u4FBF\u643A\u5305\uFF08`git.install` \u88C5\u7684\u4ECD\u5728 Program Files\uFF0C\u4E0A\u9762\u90A3\u6761\u5DF2\u8986\u76D6\uFF09\u3002\n { roots: [`${choco}/lib/git.portable/tools`, `${choco}/lib/git.portable/tools/git`], label: 'Chocolatey \u4FBF\u643A\u5305' },\n // 6) GitHub Desktop / \u65E7 GitHub for Windows / Visual Studio \u81EA\u5E26\uFF08\u90FD\u5E26\u7248\u672C\u53F7\uFF0C\u9760 listDirs\uFF09\u3002\n { roots: versioned.filter(path => path.includes('GitHubDesktop')), label: 'GitHub Desktop \u5185\u5D4C' },\n { roots: versioned.filter(path => path.includes('/GitHub/PortableGit')), label: 'GitHub PortableGit' },\n { roots: versioned.filter(path => path.includes('/Microsoft Visual Studio/')), label: 'Visual Studio \u5185\u5D4C' },\n // 7) MSYS2 / Cygwin \u7684\u5E38\u89C1\u4F4D\u7F6E\uFF08\u542B\u5404\u76D8\u7B26\u6839\u4E0B\u7684\u540C\u540D\u76EE\u5F55\uFF09\u3002\n { roots: [`${programFiles}/msys64`, 'C:/msys64', ...driveRoots(['msys64'])], label: 'MSYS2' },\n { roots: [`${programFiles}/cygwin64`, 'C:/cygwin64', 'C:/cygwin', ...driveRoots(['cygwin64', 'cygwin'])], label: 'Cygwin' },\n // 8) \u5404\u76D8\u7B26\u6839\u4E0B\u7684 Git / PortableGit\uFF08\u88C5\u5728 D:\\Git\u3001D:\\PortableGit \u8FD9\u7C7B\uFF09\u3002\n { roots: driveRoots(['Git', 'Program Files/Git', 'Program Files (x86)/Git']), label: 'Git for Windows' },\n { roots: driveRoots(['PortableGit']), label: 'PortableGit\uFF08\u81EA\u89E3\u538B\uFF09' },\n ]\n for (const group of groups) addGroup(group)\n\n // 9) Niubash\uFF08\u7528\u6237\u53EF\u80FD\u7279\u610F\u88C5\u7684 bash \u517C\u5BB9\u73AF\u5883\uFF09\u3002\u5B83\u7684\u53EF\u6267\u884C\u6587\u4EF6\u53EB `niu.exe` \u4E14\u5C31\u5728\u6839\u76EE\u5F55\uFF0C\n // \u4E0D\u7B26\u5408\"\u5B89\u88C5\u6839 / bin|usr/bin|mingw64/bin\"\u7684\u5F62\u72B6\uFF0C\u6240\u4EE5\u5355\u72EC\u8003\u8651\uFF0C\u4E0D\u80FD\u585E\u8FDB\u5206\u7EC4\u3002\n if (localAppData !== undefined) consider(`${localAppData}/Programs/Niubash/niu.exe`, 'Niubash\uFF08\u725B bash\uFF09')\n\n // 10) PATH \u515C\u5E95\uFF1A\u6700\u5BB9\u6613\u547D\u4E2D\u7684\u662F WSL\uFF0C\u9760 consider() \u91CC\u7684 isWslBash \u62E6\u6389\u3002\n for (const entry of entries) consider(`${entry}/bash.exe`)\n\n // \u663E\u5F0F\u8DEF\u5F84\u4E5F\u4EA4\u7ED9 consider \u53C2\u4E0E\u53BB\u91CD\uFF1B\u5B83\u9760 `explicit` \u6807\u8BB0\u5728\u6392\u5E8F\u91CC\u62FF\u7B2C\u4E00\uFF0C\n // \u800C\u4E0D\u662F\u9760\u5728\u6570\u7EC4\u91CC\u63D2\u961F \u2014\u2014 \u5426\u5219\u540C\u4E00\u6761\u8DEF\u5F84\u53EF\u80FD\u51FA\u73B0\u4E24\u6B21\u3002\n if (explicit?.state === 'ok') consider(explicit.path, undefined, true)\n\n // \u6392\u5E8F\uFF1A\u663E\u5F0F\u4F18\u5148 \u2192 \u79CD\u7C7B\u6743\u91CD \u2192 \u540C\u4E00\u7EC4\u5185\u4FDD\u6301\u4E0A\u9762\u7684\u641C\u7D22\u5148\u540E\u3002\n const ranked = ordered\n .map((candidate, index) => ({ candidate, index }))\n .sort((a, b) => {\n if (a.candidate.explicit !== b.candidate.explicit) return a.candidate.explicit ? -1 : 1\n const rank = KIND_RANK[a.candidate.kind] - KIND_RANK[b.candidate.kind]\n return rank !== 0 ? rank : a.index - b.index\n })\n .map(item => item.candidate)\n\n return {\n candidates: ranked,\n excluded,\n ...(explicit === undefined ? {} : { explicit }),\n }\n}\n\n/**\n * \u9ED8\u8BA4\u9009\u8C01\uFF1A\u5019\u9009\u8868\u91CC\u7684\u7B2C\u4E00\u4E2A\uFF08\u63A2\u6D4B\u987A\u5E8F\u5DF2\u7ECF\u628A\"\u663E\u5F0F\u8DEF\u5F84 \u2192 \u771F Git Bash \u2192 \u5176\u5B83\"\u6392\u597D\u4E86\uFF09\u3002\n * @param result \u63A2\u6D4B\u7ED3\u679C\u3002\n * @returns \u8DEF\u5F84\uFF1B\u4E00\u4E2A\u5019\u9009\u90FD\u6CA1\u6709\u65F6\u8FD4\u56DE\u7A7A\u4E32\u3002\n */\nexport function defaultBashPath(result: DiscoverResult): string {\n return result.candidates[0]?.path ?? ''\n}\n", "/**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u516C\u5171\u5951\u7EA6\uFF1A\u8BBE\u7F6E\u5B57\u6BB5\u3001\u4E09\u6863\u5143\u6570\u636E\u3001\u5019\u9009\u5F62\u72B6\u3001\u51C0\u5316\u4E0E\"\u6700\u7EC8\u7528\u8C01\"\u7684\u5224\u5B9A\u3002\n *\n * \u96F6 import\uFF08host \u4E0E client \u4E24\u534A\u5171\u7528\uFF0C\u8DE8\u7AEF\u4E0D\u5171\u4EAB\u4EFB\u4F55\u8FD0\u884C\u65F6\u8EAB\u4EFD\uFF09\u3002\n *\n * \u8FD9\u91CC\u7684\u5B57\u6BB5\u5206\u4E24\u7C7B\uFF0C**\u4E0D\u8981\u6DF7**\uFF1A\n * - \u7528\u6237\u914D\u7F6E\uFF1A`terminalMode` / `terminalBashPath` \u2014\u2014 \u7531\u8BBE\u7F6E\u9875\u5199\uFF0C\u5BBF\u4E3B\u534A\u8BFB\uFF1B\n * - \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A`terminalCandidates` / `terminalStatus` / `terminalEffective` \u2014\u2014\n * \u53EA\u7531\u5BBF\u4E3B\u534A\u5199\uFF08\u63A2\u6D4B\u7ED3\u679C\u4E0E\u8FD0\u884C\u72B6\u6001\uFF09\uFF0C\u8BBE\u7F6E\u9875\u53EA\u8BFB\u5C55\u793A\uFF1B\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u4E0D\u5F97\u6E05\u7A7A\u5B83\u4EEC\n * \uFF08\u89C1 settings-contract \u7684 HOST_OWNED_FIELDS\uFF09\uFF0C\u5426\u5219\u754C\u9762\u4F1A\u5931\u53BB\u63A2\u6D4B\u7ED3\u679C\u4E0E\u72B6\u6001\u3002\n */\nimport type { BashCandidate, BashKind, DiscoverResult, ExplicitState } from './discover.ts'\nimport { defaultBashPath, discoverBashCandidates, normalizePath } from './discover.ts'\n\n/** \u7528\u6237\u914D\u7F6E\u5B57\u6BB5\uFF1A\u7EC8\u7AEF\u6863\u4F4D\u3002 */\nexport const TERMINAL_MODE_FIELD = 'terminalMode'\n\n/** \u7528\u6237\u914D\u7F6E\u5B57\u6BB5\uFF1AGit Bash \u8DEF\u5F84\uFF08\u7559\u7A7A = \u7528\u63A2\u6D4B\u5230\u7684\u7B2C\u4E00\u4E2A\u5019\u9009\uFF09\u3002 */\nexport const TERMINAL_BASH_PATH_FIELD = 'terminalBashPath'\n\n/** \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A\u63A2\u6D4B\u5230\u7684\u5019\u9009\u5217\u8868\u3002 */\nexport const TERMINAL_CANDIDATES_FIELD = 'terminalCandidates'\n\n/** \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A\u72B6\u6001\u884C\uFF08\u5F53\u524D\u751F\u6548 shell / \u4E3A\u4EC0\u4E48\u6CA1\u751F\u6548\uFF09\u3002 */\nexport const TERMINAL_STATUS_FIELD = 'terminalStatus'\n\n/** \u5BBF\u4E3B\u534A\u81EA\u6301\uFF1A\u5F53\u524D\u5B9E\u9645\u751F\u6548\u7684 shell\uFF08'bash' / 'pwsh'\uFF09\u3002 */\nexport const TERMINAL_EFFECTIVE_FIELD = 'terminalEffective'\n\n/** \u5BBF\u4E3B\u534A\u6CE8\u518C\u7684\u72B6\u6001/\u53D1\u73B0\u63A5\u53E3\u8DEF\u5F84\uFF08\u5BA2\u6237\u7AEF\u534A\u8BFB\u5199\uFF09\u3002 */\nexport const TERMINAL_API_PATH = '/composer-ux/terminal'\n\n/** \u6863\u4F4D\u3002 */\nexport type TerminalMode = 'auto' | 'gitbash' | 'pwsh'\n\n/** \u4E09\u6863\u5143\u6570\u636E\uFF08\u6570\u7EC4\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const TERMINAL_MODES: readonly {\n readonly id: TerminalMode\n readonly label: string\n readonly hint: string\n}[] = [\n {\n id: 'auto',\n label: '\u81EA\u52A8',\n hint: '\u63A2\u6D4B\u5230 Git Bash \u5C31\u7528\u5B83\uFF08\u627E\u4E0D\u5230\u5219\u4FDD\u6301 PowerShell\uFF09\uFF1B\u5F00\u7BB1\u5373\u7528\uFF0C\u4E0D\u7528\u624B\u586B\u8DEF\u5F84',\n },\n {\n id: 'gitbash',\n label: 'Git Bash',\n hint: '\u5F3A\u5236\u6362\u6210 Git Bash\uFF1B\u6CA1\u63A2\u6D4B\u5230\u5C31\u56DE\u843D PowerShell\uFF0C\u5E76\u5728\u72B6\u6001\u884C\u5199\u660E\u539F\u56E0',\n },\n {\n id: 'pwsh',\n label: 'PowerShell',\n hint: '\u4FDD\u6301 DSH \u9ED8\u8BA4\uFF08\u672C\u63D2\u4EF6\u5B8C\u5168\u4E0D\u78B0\u7EC8\u7AEF\u5DE5\u5177\u9762\uFF09',\n },\n]\n\n/** \u9ED8\u8BA4\u6863\u4F4D\uFF1A\u81EA\u52A8\uFF08\u96F6\u914D\u7F6E\u5373\u5F97\u6536\u76CA\uFF0C\u4E14\u627E\u4E0D\u5230 bash \u65F6\u4E0D\u4F1A\u628A\u73AF\u5883\u5F04\u574F\uFF09\u3002 */\nexport const DEFAULT_TERMINAL_MODE: TerminalMode = 'auto'\n\n/** \u843D\u76D8\u7684\u5019\u9009\u5F62\u72B6\uFF08\u6BD4\u63A2\u6D4B\u7ED3\u679C\u591A\u4E00\u70B9\uFF1Akind \u4E0E explicit \u4F9B\u754C\u9762\u6807\u6CE8\uFF09\u3002 */\nexport interface TerminalCandidate {\n readonly path: string\n readonly label: string\n readonly kind: BashKind\n readonly explicit: boolean\n}\n\n/** \u6536\u7A84\u6863\u4F4D\u3002 */\nexport function terminalModeFrom(value: unknown): TerminalMode {\n return value === 'auto' || value === 'gitbash' || value === 'pwsh' ? value : DEFAULT_TERMINAL_MODE\n}\n\n/** \u63A2\u6D4B\u7ED3\u679C \u2192 \u843D\u76D8\u5019\u9009\uFF08\u53BB\u6389\u8FD0\u884C\u671F\u624D\u77E5\u9053\u7684\u5B57\u6BB5\uFF09\u3002 */\nexport function candidatesToStored(candidates: readonly BashCandidate[]): readonly TerminalCandidate[] {\n return candidates.map(candidate => ({\n path: candidate.path,\n label: candidate.label,\n kind: candidate.kind,\n explicit: candidate.explicit,\n }))\n}\n\n/** \u6536\u7A84\u843D\u76D8\u5019\u9009\uFF08\u9632\u810F\u6570\u636E\uFF1B\u4E0A\u9650 20 \u6761\u591F\u7528\uFF09\u3002 */\nexport function sanitizeTerminalCandidates(value: unknown): readonly TerminalCandidate[] {\n if (!Array.isArray(value)) return []\n const out: TerminalCandidate[] = []\n const seen = new Set<string>()\n for (const item of value) {\n if (out.length >= 20) break\n if (typeof item !== 'object' || item === null) continue\n const row = item as Record<string, unknown>\n const path = typeof row.path === 'string' ? normalizePath(row.path).slice(0, 400) : ''\n if (path === '') continue\n const key = path.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n const label = typeof row.label === 'string' ? row.label.slice(0, 40) : ''\n const kind = row.kind === 'git' || row.kind === 'msys2' || row.kind === 'cygwin'\n || row.kind === 'niubash' || row.kind === 'path' ? row.kind : 'path'\n out.push({ path, label: label === '' ? 'PATH' : label, kind, explicit: row.explicit === true })\n }\n return out\n}\n\n/**\n * \u8FD9\u4E00\u8F6E\u5B9E\u9645\u8BE5\u7528\u54EA\u4E2A bash\u3002\n *\n * \u4E09\u6863\u7684\u5DEE\u522B\u53EA\u5728\u8FD9\u91CC\uFF0C\u522B\u5728\u8C03\u7528\u5904\u518D\u5224\u4E00\u6B21\uFF1A\n * - `pwsh`\uFF1A\u4E0D\u7528 bash\uFF08\u8FD4\u56DE\u7A7A\u4E32\uFF09\uFF1B\n * - `gitbash` / `auto`\uFF1A\u4F18\u5148\u7528\u6237\u586B\u7684\u8DEF\u5F84\uFF0C\u5176\u6B21\u5019\u9009\u8868\u7B2C\u4E00\u4E2A\uFF08\u63A2\u6D4B\u987A\u5E8F\u5DF2\u6392\u597D\uFF1A\n * \u663E\u5F0F \u2192 Git Bash \u2192 MSYS2/Cygwin \u2192 Niubash \u2192 PATH\uFF09\uFF1B\n * - \u4E24\u8005\u90FD\u4E0D\u8981\u6C42\"\u5FC5\u987B\u627E\u5230\"\uFF1A\u627E\u4E0D\u5230\u65F6\u8FD4\u56DE\u7A7A\u4E32\uFF0C\u7531\u8C03\u7528\u65B9\u56DE\u843D PowerShell\n * \uFF08`auto` \u9759\u9ED8\u56DE\u843D\uFF0C`gitbash` \u4F1A\u5728\u72B6\u6001\u884C\u91CC\u8BF4\u660E\u2014\u2014\u5DEE\u522B\u53EA\u662F\"\u8981\u4E0D\u8981\u89E3\u91CA\"\uFF09\u3002\n * @param mode \u5F53\u524D\u6863\u4F4D\u3002\n * @param bashPath \u7528\u6237\u586B\u7684\u8DEF\u5F84\uFF08\u53EF\u7A7A\uFF09\u3002\n * @param candidates \u5BBF\u4E3B\u534A\u4E0A\u6B21\u63A2\u6D4B\u5230\u7684\u5019\u9009\u3002\n * @returns \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF1B\u7A7A\u4E32\u8868\u793A\u8FD9\u4E00\u8F6E\u4E0D\u7528 bash\u3002\n */\nexport function activeBashPath(\n mode: TerminalMode,\n bashPath: string,\n candidates: readonly TerminalCandidate[],\n explicitState?: ExplicitState,\n): string {\n if (mode === 'pwsh') return ''\n const explicit = normalizePath(bashPath)\n // \u663E\u5F0F\u8DEF\u5F84\u53EA\u6709\u5728\"\u786E\u5B9E\u5B58\u5728\"\uFF08\u6216\u8C03\u7528\u65B9\u5DF2\u7ECF\u9A8C\u8BC1\u8FC7\u3001\u6CA1\u7ED9\u72B6\u6001\uFF09\u65F6\u624D\u538B\u8FC7\u63A2\u6D4B\u7ED3\u679C\u3002\n if (explicit !== '' && (explicitState === undefined || explicitState.state === 'ok')) return explicit\n return defaultBashPath({ candidates, excluded: [] })\n}\n\n/** \u63A2\u6D4B\uFF08\u628A\u5199\u6B7B\u7684\u73AF\u5883\u8BFB\u53D6\u96C6\u4E2D\u5728\u8FD9\u91CC\uFF0C\u5176\u4F59\u903B\u8F91\u90FD\u5728\u7EAF\u51FD\u6570\u91CC\uFF09\u3002 */\nexport function probeBash(\n explicitPath: string,\n pathValue: string,\n env: (name: string) => string | undefined,\n exists: (path: string) => boolean,\n listDirs?: (parent: string) => readonly string[],\n): DiscoverResult {\n return discoverBashCandidates({\n exists,\n pathEntries: pathValue.split(';'),\n env,\n explicitPath,\n ...(listDirs === undefined ? {} : { listDirs }),\n })\n}\n\n/** \u72B6\u6001\u884C\u7684\u8F93\u5165\uFF08\u5BBF\u4E3B\u534A\u7B97\u597D\u8FD9\u4E9B\u4E8B\u5B9E\uFF0C\u6587\u6848\u672C\u8EAB\u662F\u7EAF\u51FD\u6570\uFF0C\u4FBF\u4E8E\u5355\u6D4B\uFF09\u3002 */\nexport interface StatusInput {\n /** `process.platform`\u3002 */\n readonly platform: string\n readonly mode: TerminalMode\n /** \u63A2\u6D4B\u5230\u7684\u5019\u9009\uFF08\u5DF2\u6392\u5E8F\uFF09\u3002 */\n readonly candidates: readonly TerminalCandidate[]\n /** \u88AB\u786C\u6392\u9664\u7684 WSL \u8DEF\u5F84\u6761\u6570\u3002 */\n readonly excludedCount: number\n /** \u7528\u6237\u663E\u5F0F\u586B\u7684\u8DEF\u5F84\u72B6\u6001\uFF08\u6CA1\u586B\u5219 undefined\uFF09\u3002 */\n readonly explicit?: ExplicitState\n /** \u8FD9\u4E00\u8F6E\u5B9E\u9645\u751F\u6548\u7684 shell\u3002 */\n readonly effective: 'bash' | 'pwsh' | 'unsupported'\n /** \u751F\u6548\u65F6\u7528\u7684\u5177\u4F53\u8DEF\u5F84\uFF08effective \u4E3A bash \u65F6\u7ED9\u51FA\uFF09\u3002 */\n readonly effectivePath?: string\n /** \u4E0B\u53D1\u5230 agent \u65F6\u9047\u5230\u7684\u5931\u8D25\u539F\u56E0\uFF08restrict/register \u5931\u8D25\uFF09\u3002 */\n readonly failure?: string\n /**\n * \u8FD9\u4E00\u8F6E**\u6CA1\u80FD\u771F\u7684\u6362\u4E0A**\uFF08\u4F8B\u5982 `tools.register` \u5931\u8D25\uFF0Crestrict \u5DF2\u56DE\u6EDA\uFF09\u3002\n *\n * \u7528\u6765\u628A\u90A3\u53E5\"\u5019\u9009\u4E0D\u53EF\u7528\"\u6362\u6210\u51C6\u786E\u8BF4\u6CD5\uFF1A\u5019\u9009\u662F\u6709\u7684\u3001bash \u4E5F\u5B58\u5728\uFF0C\u53EA\u662F\u6CA1\u88C5\u4E0A\u3002\n */\n readonly deliveryFailed?: boolean\n /**\n * \u63A5\u7BA1**\u4E4B\u524D**\u7684\u81EA\u68C0\u6CA1\u901A\u8FC7\uFF082026-09-25 \u65B0\u589E\uFF09\uFF1A\u539F\u56E0\u3002\n *\n * \u4E0E `deliveryFailed` \u662F\u4E24\u4EF6\u4E8B\uFF1A\u90A3\u6761\u662F\"\u8BD5\u4E86\u4F46\u6CA1\u88C5\u4E0A\"\uFF0C\u8FD9\u6761\u662F\"\u9884\u68C0\u5C31\u6CA1\u8FC7\u3001\u6839\u672C\u6CA1\u8BD5\"\u2014\u2014\n * \u7528\u4E8E\u684C\u9762\u7248\u53D7\u9650\u7B56\u7565\u4E0B\u4F1A\u51FA\u73B0\u7684 `0xC0000142`\uFF08\u6C99\u7BB1 runner \u5728\u6253\u5305\u5F62\u6001\u8D77\u4E0D\u6765\uFF09\uFF0C\n * \u90A3\u65F6\u82E5\u7167\u65E7\u63A5\u7BA1\u4F1A\u628A\u8BE5\u4F1A\u8BDD\u7684 shell \u6253\u6B7B\uFF0C\u6240\u4EE5\u5B81\u53EF\u4FDD\u6301 PowerShell\u3002\n */\n readonly probeFailed?: string\n}\n\n/**\n * \u751F\u6210\u72B6\u6001\u884C\uFF08\u8BBE\u7F6E\u9875\u76F4\u63A5\u5C55\u793A\u8FD9\u53E5\u8BDD\uFF09\u3002\n *\n * \u539F\u5219\uFF1A**\u53EA\u8BF4\u4E8B\u5B9E\uFF0C\u4E0D\u7ED9\u5EFA\u8BAE**\u3002\u751F\u6548\u65F6\u7ED9\u51FA\u8DEF\u5F84\u4E0E\u6765\u6E90\uFF1B\u4E0D\u751F\u6548\u65F6\u89E3\u91CA\u4E3A\u4EC0\u4E48\n * \uFF08\u6CA1\u627E\u5230 / \u8DEF\u5F84\u4E0D\u5B58\u5728 / \u5E73\u53F0\u4E0D\u5BF9\uFF09\uFF0C\u5E76\u4E14\u660E\u786E\u8BF4\u51FA\"\u5DF2\u6392\u9664 WSL\"\u8FD9\u79CD\u6211\u4EEC\u4E3B\u52A8\u505A\u7684\u51B3\u5B9A\u3002\n * @param input \u4E8B\u5B9E\u3002\n * @returns \u4E00\u884C\u4E2D\u6587\u72B6\u6001\uFF08\u6700\u957F 400 \u5B57\u7B26\uFF0C\u4E0E schema \u4E0A\u9650\u4E00\u81F4\uFF09\u3002\n */\nexport function terminalStatusText(input: StatusInput): string {\n const text = (() => {\n if (input.platform !== 'win32') {\n return `\u672C\u63D2\u4EF6\u53EA\u5728 Windows \u4E0A\u63A5\u7BA1\u7EC8\u7AEF\uFF08\u5F53\u524D\u5E73\u53F0 ${input.platform}\uFF09\uFF0C\u6B64\u5904\u4E0D\u751F\u6548`\n }\n if (input.mode === 'pwsh') {\n return '\u4FDD\u6301 DSH \u9ED8\u8BA4\uFF08PowerShell\uFF09\u2014\u2014\u672C\u63D2\u4EF6\u4E0D\u4ECB\u5165\u7EC8\u7AEF\u5DE5\u5177\u9762'\n }\n if (input.probeFailed !== undefined && input.probeFailed !== '') {\n return `\u5DF2\u542F\u7528\uFF0C\u4F46\u81EA\u68C0\u672A\u901A\u8FC7\uFF1A${input.probeFailed} \u2014\u2014 \u4E3A\u907F\u514D\u628A\u4F1A\u8BDD\u7684 shell \u6253\u6B7B\uFF0C\u6682\u4E0D\u63A5\u7BA1\uFF08\u4FDD\u6301 PowerShell\uFF09`\n }\n if (input.effective === 'bash') {\n const path = input.effectivePath ?? ''\n const candidate = input.candidates.find(item => item.path === path)\n const suffix = input.explicit?.state === 'missing'\n ? `\uFF08\u4F60\u586B\u7684\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${input.explicit.path}\uFF09`\n : input.explicit?.state === 'wsl'\n ? `\uFF08\u4F60\u586B\u7684\u662F WSL \u7684 bash\uFF1A${input.explicit.path}\uFF09`\n : ''\n return `\u5DF2\u751F\u6548\uFF1A${path}${candidate === undefined ? '' : `\uFF08${candidate.label}\uFF09`}${suffix}`\n }\n if (input.candidates.length === 0) {\n const excluded = input.excludedCount > 0 ? `\uFF08\u5DF2\u6392\u9664 ${input.excludedCount} \u4E2A WSL \u7684 bash.exe\uFF09` : ''\n return `\u6CA1\u627E\u5230\u53EF\u7528\u7684 bash${excluded}\uFF0C\u6682\u65F6\u4FDD\u6301 PowerShell`\n }\n if (input.deliveryFailed === true) {\n return '\u627E\u5230\u4E86 bash \u4F46\u6CA1\u80FD\u6362\u4E0A\uFF08\u5DF2\u56DE\u6EDA\uFF0Cpwsh \u7167\u65E7\u53EF\u7528\uFF09\uFF0C\u6682\u65F6\u4FDD\u6301 PowerShell'\n }\n return `\u5019\u9009\u4E0D\u53EF\u7528\uFF0C\u6682\u65F6\u4FDD\u6301 PowerShell`\n })()\n const failure = input.failure === undefined || input.failure === '' ? '' : `\uFF1B\u4E0B\u53D1\u5931\u8D25\uFF1A${input.failure}`\n return `${text}${failure}`.slice(0, 400)\n}\n", "/**\n * dsh-composer-ux \u516C\u5171\u5951\u7EA6\uFF1A\u8BBE\u7F6E\u5B57\u6BB5\u3001\u9ED8\u8BA4\u503C\u3001\u5C55\u793A\u5143\u6570\u636E\u3002\n * \u672C\u6A21\u5757\u5FC5\u987B\u96F6 import\uFF08host \u4E0E client \u4E24\u534A\u5171\u7528\uFF0C\u8DE8\u7AEF\u4E0D\u5171\u4EAB\u4EFB\u4F55\u8FD0\u884C\u65F6\u8EAB\u4EFD\uFF09\u3002\n *\n * \u552F\u4E00\u7684\u4F8B\u5916\u662F `./terminal/` \u4E0B\u90A3\u51E0\u4E2A**\u7EAF\u51FD\u6570**\u6A21\u5757\uFF08\u96F6\u5916\u90E8\u4F9D\u8D56\u3001\u65E0 DOM\u3001\u65E0 node API\uFF09\uFF0C\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u5B57\u6BB5\u4E0E\u5224\u5B9A\u653E\u5728\u90A3\u91CC\uFF0C\u8FD9\u91CC\u53EA\u628A\u5B83\u4EEC\u5E76\u8FDB\u8BBE\u7F6E\u5951\u7EA6\u3002\n */\nimport {\n DEFAULT_TERMINAL_MODE, TERMINAL_BASH_PATH_FIELD, TERMINAL_CANDIDATES_FIELD,\n TERMINAL_EFFECTIVE_FIELD, TERMINAL_MODE_FIELD, TERMINAL_STATUS_FIELD,\n sanitizeTerminalCandidates, terminalModeFrom,\n type TerminalCandidate, type TerminalMode,\n} from './terminal/contracts.ts'\n\n/** Host settings namespace\uFF08\u5C0F\u5199\u5B57\u6BCD/\u6570\u5B57/\u8FDE\u5B57\u7B26\uFF09\u3002 */\nexport const NAMESPACE = 'composer-ux'\n\n/**\n * \u4ED3\u5E93\u5730\u5740\uFF1A\u8BBE\u7F6E\u9875\u62AC\u5934\u90A3\u4E2A\u300CGitHub \u2197\u300D\u94FE\u63A5\u7528\u5B83\u3002\n *\n * \u5FC5\u987B\u4E0E `package.json` \u7684 `repository.url` \u4E00\u81F4 \u2014\u2014 `test/client-registration.mjs`\n * \u6709\u4E00\u6761\u62A4\u680F\u76EF\u7740\u4E24\u5904\uFF0C\u514D\u5F97\u5404\u5199\u4E00\u4EFD\u7136\u540E\u6162\u6162\u5206\u53C9\uFF08\u5BA2\u6237\u7AEF\u4E5F\u4E0D\u8BB8\u786C\u7F16\u7801\u7B2C\u4E8C\u4EFD\u5730\u5740\uFF09\u3002\n */\nexport const REPO_URL = 'https://github.com/fangwen9527/dsh-composer-ux'\n\n// \u2500\u2500 \u300C\u91CD\u542F DSH\u300D\u6309\u94AE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// \u4E3A\u4EC0\u4E48\u8FD9\u4EF6\u4E8B\u5FC5\u987B\u843D\u5728\u5BBF\u4E3B\u534A\uFF1A\u53EA\u6709\u5BBF\u4E3B\u8FDB\u7A0B\u80FD\u628A\u81EA\u5DF1\u91CD\u65B0\u62C9\u8D77\u6765\uFF08\u6D4F\u89C8\u5668\u78B0\u4E0D\u5230\u8FDB\u7A0B\uFF09\u3002\n// \u673A\u5236\u7167\u642C\u63D2\u4EF6\u5E02\u573A\uFF08\u5206\u79BB\u4E00\u4E2A node \u52A9\u624B\u8FDB\u7A0B\u3001\u7B49\u7AEF\u53E3\u7A7A\u95F2\u3001\u7528\u9690\u85CF\u63A7\u5236\u53F0\u7684 PowerShell \u8D77\u65B0\u5BBF\u4E3B\uFF09\uFF0C\n// \u5168\u90E8\u7EC6\u8282\u5728 `src/restart.ts`\u3002\u8FD9\u91CC\u53EA\u6709\u4E24\u7AEF\u5171\u7528\u7684\u90A3\u4E00\u4E2A\u5E38\u91CF\u3002\n// 0.5.0 \u91CC\u90A3\u4E2A\u300C\u53EF\u9009\u91CD\u542F\u547D\u4EE4\u300D\u5B57\u6BB5\u5DF2\u53BB\u6389\uFF1A\u673A\u5236\u8DB3\u591F\u53EF\u9760\u4E4B\u540E\u5B83\u53EA\u5269\"\u591A\u4E00\u4E2A\u4F1A\u586B\u9519\u7684\u5730\u65B9\"\u3002\n\n/** \u91CD\u542F\u63A5\u53E3\u8DEF\u5F84\uFF08\u5BBF\u4E3B\u534A\u6CE8\u518C\uFF0C\u5BA2\u6237\u7AEF\u534A\u8C03\u7528\uFF09\u3002 */\nexport const RESTART_API_PATH = '/composer-ux/restart'\n\n/** \u5168\u5C40\u603B\u5F00\u5173\u5B57\u6BB5\u540D\u3002 */\nexport const ENABLED_FIELD = 'enabled'\n\n// \u2500\u2500 \u300C\u6BCF\u4E00\u680F\u4E00\u4E2A\u5F00\u5173\u300D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// \u516D\u5F20\u6298\u53E0\u5361\u5404\u6709\u4E00\u4E2A\"\u8FD9\u4E00\u680F\u8981\u4E0D\u8981\u751F\u6548\"\u7684\u5F00\u5173\uFF0C**\u9ED8\u8BA4\u5173**\uFF1B\u603B\u5F00\u5173\uFF08`enabled`\uFF09\u9ED8\u8BA4\u5F00\uFF0C\n// \u5B83\u662F\u4E00\u9053\u603B\u95F8\uFF1A`enabled && \u8BE5\u680F\u5F00\u5173` \u624D\u751F\u6548\u3002\n//\n// \u4E3A\u4EC0\u4E48\u8981\u6709\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u680F\u624D\u9ED8\u8BA4\u5173\"\u8FD9\u6761\u8FC1\u79FB\u89C4\u5219\uFF08\u7528\u6237\u62CD\u677F A \u65B9\u6848\uFF09\uFF1A\u672C\u63D2\u4EF6\u5DF2\u7ECF\u53D1\u5E03\u8FC7\uFF0C\n// \u8001\u7528\u6237\u8BBE\u7F6E\u6587\u6863\u91CC\u5168\u662F\"\u6211\u6B63\u5728\u7528\"\u7684\u75D5\u8FF9\u3002\u82E5\u4E00\u5F8B\u9ED8\u8BA4\u5173\uFF0C\u5347\u7EA7\u90A3\u4E00\u523B\u4ED6\u7684\u952E\u4F4D\u5C31\u56DE\u5230 DSH \u539F\u751F\u3001\n// OpenCode \u8DEF\u7531\u76F4\u63A5 400\uFF08\u8BF7\u6C42\u5934\u4E0D\u518D\u6CE8\u5165\uFF09\u3001Git Bash \u6362\u56DE PowerShell \u2014\u2014 \u5168\u662F\u8981\u7528\u5230\u624D\u53D1\u73B0\u7684\u7834\u574F\u3002\n// \u6240\u4EE5\uFF1A**\u8FD9\u4E00\u680F\u7684\u503C\u4E0D\u7B49\u4E8E\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u6837\u5B50\" \u21D2 \u8BA4\u5B9A\u78B0\u8FC7 \u21D2 \u5F00**\uFF08\u5224\u636E\u89C1 `sectionEnabledOf`\uFF09\u3002\n// \u5168\u65B0\u5B89\u88C5\uFF08\u4EC0\u4E48\u75D5\u8FF9\u90FD\u6CA1\u6709\uFF09\u56E0\u6B64\u662F\u516D\u680F\u5168\u5173\u3002\u89C4\u5219\u7684\u5B9E\u73B0\u5728\u4E0B\u9762 `sectionEnabledOf`\u3002\n//\n// \u300COpenCode \u8BF7\u6C42\u5934\u300D\u90A3\u4E00\u680F**\u6CA1\u6709\u65B0\u952E**\uFF1A\u5B83\u539F\u6765\u7684 `headerEnabled`\uFF08\u9ED8\u8BA4 false\uFF09\u672C\u6765\u5C31\u662F\n// \"\u8FD9\u4E00\u680F\u8981\u4E0D\u8981\u751F\u6548\"\uFF0C\u76F4\u63A5\u642C\u5230\u6807\u9898\u884C\u5F53\u5361\u7EA7\u5F00\u5173\uFF0C\u4E0D\u518D\u9020\u4E00\u4E2A\u540C\u4E49\u7684\u952E\u3002\n\n/** \u300C\u952E\u4F4D\u300D\u680F\u5F00\u5173\u3002 */\nexport const KEYS_ENABLED_FIELD = 'keysEnabled'\n/** \u300C\u53F3\u952E\u83DC\u5355\u300D\u680F\u5F00\u5173\u3002 */\nexport const MENU_ENABLED_FIELD = 'menuEnabled'\n/** \u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u5F00\u5173\u3002 */\nexport const QUICK_ENABLED_FIELD = 'quickEnabled'\n/** \u300C\u8BBE\u7F6E\u9762\u677F\u300D\u680F\u5F00\u5173\u3002 */\nexport const PANEL_ENABLED_FIELD = 'panelEnabled'\n/** \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u680F\u5F00\u5173\u3002 */\nexport const TERMINAL_ENABLED_FIELD = 'terminalEnabled'\n\n/** \u952E\u4F4D\u5B57\u6BB5\u540D\u3002 */\nexport const SEND_KEY_FIELD = 'sendKey'\nexport const NEWLINE_KEY_FIELD = 'newlineKey'\n\n/**\n * \u8BBE\u7F6E\u9762\u677F\u5B57\u6BB5\u540D\u3002\n *\n * 0.6.0 \u8D77**\u6CA1\u6709** `panelScroll`\uFF1ADSH 0.1.7 \u7684\u5B98\u65B9\u8BBE\u7F6E\u9875\u7ED9\u5BFC\u822A\u5217\u81EA\u5E26\n * `overflow-y: auto`\uFF08`ui-settings-general` \u7684 `.navList`\uFF09\uFF0C\u6211\u4EEC\u90A3\u5957\n * `html.dsh-ux-panel-scroll` \u6CE8\u5165\u6837\u5F0F\u5DF2\u88AB\u5B98\u65B9\u53D6\u4EE3\uFF0C\u6545\u6574\u9879\u5220\u9664\u3002\n */\nexport const PANEL_RESIZE_FIELD = 'panelResize'\nexport const PANEL_WIDTH_FIELD = 'panelWidth'\nexport const PANEL_HEIGHT_FIELD = 'panelHeight'\n\n/** \u53F3\u952E\u83DC\u5355\u5F00\u5173\u5B57\u6BB5\u540D\u3002 */\nexport const MENU_FIELDS = [\n 'menuUndo',\n 'menuRedo',\n 'menuCut',\n 'menuCopy',\n 'menuPaste',\n 'menuDelete',\n 'menuSelectAll',\n] as const\n\nexport type MenuField = (typeof MENU_FIELDS)[number]\n\n/**\n * \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\u5B57\u6BB5\u540D\uFF080.5.0 \u8D77\u4E09\u6863\uFF09\u3002\n *\n * 0.2.x\uFF5E0.4.0 \u7528\u7684\u662F\u5E03\u5C14 `menuNative`\uFF1Atrue = \u6D4F\u89C8\u5668\u539F\u751F\u83DC\u5355\u3001false = \u81EA\u5B9A\u4E49\u83DC\u5355\u3002\n * \u5E03\u5C14\u53EA\u6709\u4E24\u4F4D\uFF0C\u8868\u8FBE\u4E0D\u4E86\u300C\u63D2\u4EF6\u5B8C\u5168\u4E0D\u4ECB\u5165\u300D\uFF08\u4E0D\u6321\u522B\u7684\u63D2\u4EF6\u7684\u83DC\u5355\uFF09\u8FD9\u4E00\u6863\uFF0C\u6240\u4EE5\u6362\u6210\n * \u5B57\u7B26\u4E32\u4E09\u6863\u3002\u65E7\u5B57\u6BB5**\u53EA\u4F5C\u4E3A\u8FC1\u79FB\u7EBF\u7D22\u4FDD\u7559**\uFF1A\u672C\u5B57\u6BB5\u4E3A\u7A7A\u65F6\u6309\u65E7\u5B57\u6BB5\u63A8\u65AD\uFF08\u89C1 `menuModeFrom`\uFF09\u3002\n */\nexport const MENU_MODE_FIELD = 'menuMode'\n\n/** 0.2.x\uFF5E0.4.0 \u7684\u65E7\u5B57\u6BB5\u540D\uFF1A\u8FC1\u79FB\u7EBF\u7D22\uFF0C0.5.0 \u8D77\u4E0D\u518D\u5199\u5B83\u3002 */\nexport const MENU_NATIVE_FIELD = 'menuNative'\n\n/** \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF1A\u5B98\u65B9\u4E0D\u4ECB\u5165 / \u6D4F\u89C8\u5668\u83DC\u5355 / \u81EA\u5B9A\u4E49\u83DC\u5355\u3002 */\nexport type MenuMode = 'official' | 'browser' | 'custom'\n\n/** \u4E09\u6863\u7684\u5143\u6570\u636E\uFF08\u6570\u7EC4\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const MENU_MODES: readonly {\n readonly id: MenuMode\n readonly label: string\n readonly hint: string\n}[] = [\n {\n id: 'official',\n label: '\u5B98\u65B9',\n hint: '\u672C\u63D2\u4EF6\u5B8C\u5168\u4E0D\u4ECB\u5165\uFF1ADSH \u4E0E\u5176\u5B83\u63D2\u4EF6\u81EA\u5DF1\u7684\u53F3\u952E\u5904\u7406\u539F\u6837\u751F\u6548\uFF08DSH \u5B98\u65B9\u8F93\u5165\u6846\u672C\u8EAB\u6CA1\u6709\u53F3\u952E\u83DC\u5355\uFF0C\u901A\u5E38\u770B\u5230\u7684\u5C31\u662F\u6D4F\u89C8\u5668\u7684\u83DC\u5355\uFF09',\n },\n {\n id: 'browser',\n label: '\u6D4F\u89C8\u5668',\n hint: '\u56FA\u5B9A\u4F7F\u7528\u6D4F\u89C8\u5668\u81EA\u5E26\u7684\u83DC\u5355\uFF0C\u5E76\u5728\u672C\u63D2\u4EF6\u8FD9\u4E00\u5C42\u6321\u4F4F\u5176\u5B83\u63D2\u4EF6\u7684\u83DC\u5355\uFF1B\u7C98\u8D34\u514D\u6388\u6743\u3001\u96F6\u914D\u7F6E',\n },\n {\n id: 'custom',\n label: '\u81EA\u5B9A\u4E49',\n hint: '\u4F7F\u7528\u672C\u63D2\u4EF6\u7684\u56FA\u5B9A\u6837\u5F0F\u83DC\u5355\uFF1B\u672A\u9009\u4E2D\u6587\u672C\u65F6\u300C\u526A\u5207 / \u590D\u5236 / \u5220\u9664\u300D\u7F6E\u7070\uFF0C\u7C98\u8D34\u9700\u8981\u6D4F\u89C8\u5668\u526A\u8D34\u677F\u6388\u6743',\n },\n]\n\n/**\n * \u5B9A\u51FA\u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF1A\u65B0\u5B57\u6BB5\u4F18\u5148\uFF0C\u5176\u6B21\u6309\u65E7\u5E03\u5C14\u63A8\u65AD\uFF0C\u90FD\u6CA1\u6709\u5C31\u7528\u9ED8\u8BA4\u6863\u3002\n *\n * \u4E09\u79CD\u60C5\u51B5\u5224\u65AD\u5F97\u51FA\u6765\uFF0C\u662F\u56E0\u4E3A\u5BBF\u4E3B\u534A\u628A\u65E7\u5B57\u6BB5\u58F0\u660E\u6210**\u53EF\u9009**\uFF08\u6CA1\u6709 `.default(false)`\uFF09\uFF1A\n * \u300C\u4ECE\u6CA1\u78B0\u8FC7\u90A3\u4E2A\u5F00\u5173\u300D\u4E0E\u300C\u660E\u786E\u5173\u4E86\u5B83\u300D\u5728\u6587\u6863\u91CC\u957F\u5F97\u4E0D\u4E00\u6837\uFF08\u952E\u4E0D\u5B58\u5728 / \u952E\u4E3A false\uFF09\uFF0C\n * \u524D\u8005\u843D\u5230\u65B0\u9ED8\u8BA4\u6863\uFF08\u5B98\u65B9\u4E0D\u4ECB\u5165\uFF09\uFF0C\u540E\u8005\u4FDD\u6301\u539F\u6765\u7684\u81EA\u5B9A\u4E49\u83DC\u5355\u3002\n * @param storedMode - \u6587\u6863\u91CC\u7684\u65B0\u5B57\u6BB5\u503C\uFF08\u53EF\u80FD\u662F\u810F\u6570\u636E\uFF09\u3002\n * @param legacyNative - \u6587\u6863\u91CC\u7684\u65E7\u5E03\u5C14\u503C\uFF08\u53EF\u80FD\u4E0D\u5B58\u5728\uFF09\u3002\n * @returns \u4E09\u6863\u4E4B\u4E00\u3002\n */\nexport function menuModeFrom(storedMode: unknown, legacyNative: unknown): MenuMode {\n if (storedMode === 'official' || storedMode === 'browser' || storedMode === 'custom') return storedMode\n if (legacyNative === true) return 'browser'\n if (legacyNative === false) return 'custom'\n return DEFAULT_SETTINGS.menuMode\n}\n\n// \u2500\u2500 \u5FEB\u6377\u6307\u4EE4\u4E0E\u63D0\u793A\u8BCD\u4F18\u5316 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5FEB\u6377\u6307\u4EE4\u5217\u8868\u5B57\u6BB5\u540D\u3002 */\nexport const QUICK_PROMPTS_FIELD = 'quickPrompts'\n\n/** \u4F18\u5316\u5F3A\u5EA6\u6863\u4F4D\u5B57\u6BB5\u540D\u3002 */\nexport const OPTIMIZER_TIER_FIELD = 'optimizerTier'\n\n/** \u5355\u4E2A\u5206\u7C7B\u5185\u7684\u6761\u6570\u4E0A\u9650\u3002 */\nexport const QUICK_PROMPT_MAX = 60\n\n/** \u5206\u7C7B\u6570\u4E0A\u9650\u3002 */\nexport const QUICK_CATEGORY_MAX = 20\n\n/** \u5206\u7C7B\u540D\u7684\u5B57\u7B26\u4E0A\u9650\u3002 */\nexport const QUICK_CATEGORY_NAME_MAX = 40\n\n/** \u5355\u6761\u300C\u540D\u79F0\u300D\u7684\u5B57\u7B26\u4E0A\u9650\u3002 */\nexport const QUICK_LABEL_MAX = 40\n\n/**\n * \u5355\u6761\u300C\u63D0\u793A\u8BCD\u300D\u7684\u5B57\u7B26\u4E0A\u9650\u3002\n *\n * 0.3.0 \u8D77\u5FEB\u6377\u6307\u4EE4\u6539\u5B58 `$DSH_HOME/quick-prompts.json`\uFF0C\u4E0D\u518D\u53D7\u8BBE\u7F6E\u6587\u6863\u7684\u4F53\u79EF\u7EA6\u675F\uFF0C\n * \u6240\u4EE5\u8FD9\u91CC\u4ECE 4000 \u63D0\u5230 20 \u4E07\u2014\u2014\u53EA\u505A\u300C\u522B\u628A\u51E0\u767E MB \u585E\u8FDB\u6765\u300D\u7684\u9632\u5446\uFF0C\u6B63\u5E38\u63D0\u793A\u8BCD\u4E0D\u518D\u88AB\u622A\u65AD\u3002\n */\nexport const QUICK_TEXT_MAX = 200_000\n\n/**\n * \u9001\u53BB\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u7684\u539F\u6587\u4E0A\u9650\u3002\n *\n * \u4E0E\u539F `QUICK_TEXT_MAX * 2`\uFF08= 8000\uFF09\u7B49\u503C\uFF1A\u62AC\u9AD8\u7B49\u5FEB\u6377\u6307\u4EE4\u7684\u5B58\u50A8\u4E0A\u9650\u65F6**\u4E0D\u80FD**\n * \u987A\u5E26\u628A\u4F18\u5316\u8BF7\u6C42\u7684\u8F93\u5165\u4E0A\u9650\u4E5F\u62AC\u4E0A\u53BB\uFF0C\u5426\u5219\u8D85\u957F\u6587\u672C\u4F1A\u88AB\u4E22\u7ED9\u6A21\u578B\u3002\n */\nexport const OPTIMIZE_TEXT_MAX = 8_000\n\n/**\n * \u5FEB\u6377\u6307\u4EE4\u5B58\u50A8\u7684 HTTP \u8DEF\u5F84\uFF08\u5BBF\u4E3B\u534A\u6CE8\u518C\uFF0C\u5BA2\u6237\u7AEF\u534A\u8BFB\u5199\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5B58\u50A8\u4E5F\u5FC5\u987B\u8D70 HTTP\uFF1A\u6D4F\u89C8\u5668\u4FA7\u6CA1\u6709\u6587\u4EF6\u7CFB\u7EDF\uFF0C\u800C\u300C\u7528\u6237\u5185\u5BB9\u300D\u9700\u8981\u4E00\u4EFD\n * \u5168\u5C40\u3001\u4E0E\u4F1A\u8BDD/\u9879\u76EE\u65E0\u5173\u7684\u843D\u70B9\uFF0C\u53EA\u6709\u5BBF\u4E3B\u534A\u80FD\u63D0\u4F9B\u3002\n */\nexport const QUICK_PROMPTS_API_PATH = '/composer-ux/prompts'\n\n/** \u6587\u4EF6\u683C\u5F0F\u7248\u672C\uFF1B\u4E0E lnyuqian/dsh-quick-prompts \u7684 v2 \u5BF9\u9F50\uFF08\u89C1 bookToFile \u6CE8\u91CA\uFF09\u3002 */\nexport const QUICK_BOOK_VERSION = 2\n\n/** \u8FC1\u79FB/\u515C\u5E95\u5206\u7C7B\u540D\u3002 */\nexport const DEFAULT_CATEGORY_NAME = '\u9ED8\u8BA4'\n\n/** \u4F18\u5316\u7ED3\u679C\u957F\u5EA6\u4E0A\u9650\uFF08\u8D85\u8FC7\u89C6\u4E3A\u5F02\u5E38\u4EA7\u51FA\uFF0C\u622A\u65AD\u5E76\u63D0\u793A\uFF09\u3002 */\nexport const OPTIMIZE_OUTPUT_MAX = 12000\n\n/**\n * \u5BBF\u4E3B\u534A\u4E3A\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u6CE8\u518C\u7684 HTTP \u63A5\u53E3\u8DEF\u5F84\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u8D70 HTTP\uFF1A\u51FA\u7F51\u8BF7\u6C42\u7531\u5BBF\u4E3B\u7684\u6A21\u578B\u9002\u914D\u5668\u53D1\u51FA\uFF08\u6D4F\u89C8\u5668\u4FA7\u78B0\u4E0D\u5230\u6A21\u578B\u8DEF\u7531\uFF09\uFF0C\n * \u800C\u5BBF\u4E3B\u534A <-> \u5BA2\u6237\u7AEF\u534A\u4E4B\u95F4\u6CA1\u6709\u522B\u7684\u53D7\u652F\u6301\u901A\u9053 \u2014\u2014 \u4E0E\n * WestFox-AwA/dsh-prompt-optimizer \u7684\u505A\u6CD5\u4E00\u81F4\u3002\n */\nexport const OPTIMIZER_API_PATH = '/composer-ux/optimize'\n\n/**\n * \u4E00\u6761\u5FEB\u6377\u6307\u4EE4\u3002\n *\n * `always` \u5C31\u662F\u754C\u9762\u4E0A\u7684\u300C\u9ED8\u8BA4\u63D2\u5165\u300D\uFF1A\u52FE\u4E0A\u4E4B\u540E\uFF0C\u70B9\u53D1\u9001\u65F6\u8FD9\u6761\u63D0\u793A\u8BCD\u4F1A\u88AB\n * \u81EA\u52A8\u62FC\u5230\u6D88\u606F**\u672B\u5C3E**\u4E00\u8D77\u53D1\u51FA\u53BB\uFF08\u8F93\u5165\u6846\u91CC\u4E0D\u63D0\u524D\u663E\u793A\uFF09\uFF0C\u89C1\n * `client/quick-commands.ts` \u7684 `appendAlwaysPrompts()`\u3002\n */\nexport interface QuickPrompt {\n /** \u7A33\u5B9A id\uFF1A\u7F16\u8F91\u540D\u79F0/\u5185\u5BB9\u65F6\u4E0D\u53D8\uFF0C\u7528\u4E8E\u52FE\u9009\u72B6\u6001\u4E0E\u5217\u8868 diff\u3002 */\n readonly id: string\n /** \u6309\u94AE\u4E0A\u663E\u793A\u7684\u540D\u79F0\u3002 */\n readonly label: string\n /** \u70B9\u51FB\u540E\u63D2\u5165\u8F93\u5165\u6846\u7684\u63D0\u793A\u8BCD\u6B63\u6587\u3002 */\n readonly prompt: string\n /** \u300C\u6BCF\u6B21\u300D\uFF1A\u6BCF\u6B21\u53D1\u9001\u90FD\u81EA\u52A8\u9644\u52A0\u5230\u6D88\u606F\u672B\u5C3E\u3002\u4E0E `firstOnly` \u4E92\u65A5\u3002 */\n readonly always: boolean\n /**\n * \u300C\u4EC5\u9996\u6B21\u300D\uFF1A\u53EA\u5728**\u8FD9\u4E2A\u4F1A\u8BDD\u7684\u7B2C\u4E00\u6761\u6D88\u606F**\u4E0A\u9644\u52A0\u3002\n *\n * \u5224\u636E\u662F\u4F1A\u8BDD\u5FEB\u7167\u7684 `blank`\uFF08\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u4EFB\u4F55\u6D88\u606F\uFF09\u2014\u2014\u53D1\u5B8C\u7B2C\u4E00\u6761\u5B83\u81EA\u5DF1\u5C31\u53D8\u6210 false\uFF0C\n * \u6240\u4EE5\u4E0D\u9700\u8981\u6211\u4EEC\u81EA\u5DF1\u8BB0\u300C\u8FD9\u6B21\u4F1A\u8BDD\u9644\u52A0\u8FC7\u6CA1\u6709\u300D\uFF0C\u5237\u65B0\u9875\u9762\u4E5F\u4E0D\u4F1A\u91CD\u590D\u9644\u52A0\u3002\n * \u4E0E `always` \u4E92\u65A5\uFF08\u754C\u9762\u4E0A\u662F\u4E09\u9009\u4E00\uFF09\u3002\n */\n readonly firstOnly: boolean\n}\n\n/** \u63D2\u5165\u6A21\u5F0F\uFF1A\u754C\u9762\u4E0A\u90A3\u6761\u4E09\u9009\u4E00\u3002 */\nexport type InsertMode = 'never' | 'always' | 'first'\n\n/** \u4E09\u9009\u4E00\u7684\u5143\u6570\u636E\uFF08\u6570\u7EC4\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const INSERT_MODES: readonly {\n readonly id: InsertMode\n readonly label: string\n readonly hint: string\n}[] = [\n { id: 'never', label: '\u5173', hint: '\u70B9\u6761\u76EE\u53EA\u63D2\u5165\u8F93\u5165\u6846\uFF0C\u53D1\u9001\u65F6\u4E0D\u9644\u52A0' },\n { id: 'always', label: '\u6BCF\u6B21', hint: '\u6BCF\u6B21\u53D1\u9001\u90FD\u628A\u8FD9\u6761\u9644\u52A0\u5230\u6D88\u606F\u672B\u5C3E' },\n { id: 'first', label: '\u4EC5\u9996\u6B21', hint: '\u53EA\u5728\u5F53\u524D\u4F1A\u8BDD\u7684\u7B2C\u4E00\u6761\u6D88\u606F\u4E0A\u9644\u52A0' },\n]\n\n/**\n * \u8BFB\u4E00\u6761\u7684\u63D2\u5165\u6A21\u5F0F\u3002\n *\n * \u4E24\u4E2A\u6807\u5FD7\u90FD\u662F true \u65F6\u6309\u300C\u6BCF\u6B21\u300D\u5904\u7406\uFF08\u624B\u5DE5\u7F16\u8F91\u7684\u6587\u4EF6\u53EF\u80FD\u5199\u6210\u8FD9\u6837\uFF1B\u300C\u6BCF\u6B21\u300D\u672C\u6765\u5C31\n * \u5305\u542B\u7B2C\u4E00\u6B21\uFF09\uFF0C\u5E76\u4E14\u4E0B\u4E00\u6B21\u5199\u76D8\u4F1A\u628A\u4E92\u65A5\u6027\u4FEE\u6B63\u56DE\u6765\u3002\n */\nexport function insertModeOf(prompt: Pick<QuickPrompt, 'always' | 'firstOnly'>): InsertMode {\n if (prompt.always) return 'always'\n if (prompt.firstOnly) return 'first'\n return 'never'\n}\n\n/**\n * \u4F18\u5316\u5F3A\u5EA6\u6863\u4F4D\u3002\n *\n * \u63D0\u793A\u8BCD\u521D\u7248\u9010\u5B57\u63D0\u53D6\u81EA WestFox-AwA/dsh-prompt-optimizer\uFF08BSD-3-Clause\uFF0C\u4F5C\u8005\u300C\u5543\u8F6E\u80CE\u7684\u897F\u72D0\u300D\uFF09\uFF1B\n * 0.6.0 \u8D77\u6309\u5BF9\u65B9 **0.6 \u7EBF**\uFF08`po06/lib/interpreter.js`\uFF09\u7684\u673A\u5236\u91CD\u5199\uFF1A\u6A21\u578B\u4E0D\u518D\u81EA\u7531\u6539\u5199\uFF0C\n * \u800C\u662F\u4EA7\u51FA\u300C\u53EF\u5B9A\u4F4D\u5230\u539F\u8BDD\u67D0\u4E00\u6BB5\u300D\u7684\u6761\u76EE\uFF0C\u7531\u5BBF\u4E3B\u9010\u6761\u505A\u5B57\u9762\u6BD4\u5BF9\u540E\u518D\u88C5\u914D\u6210\u4E00\u6761\u547D\u4EE4\u3002\n * \u6863\u4F4D\u8BED\u4E49\u4E5F\u968F\u4E4B\u5BF9\u9F50\u5BF9\u65B9\u300C\u6863\u4F4D = \u4F9D\u636E\u9884\u7B97\u300D\u7684\u8BF4\u6CD5\uFF08\u89C1 `optimizer-prompt.ts`\uFF09\u3002\n */\nexport type OptimizerTier = 'basic' | 'advanced' | 'extreme'\n\n/** \u6863\u4F4D\u5143\u6570\u636E\uFF08\u987A\u5E8F\u5373\u754C\u9762\u987A\u5E8F\uFF09\u3002 */\nexport const OPTIMIZER_TIERS: readonly {\n readonly id: OptimizerTier\n readonly label: string\n readonly hint: string\n}[] = [\n { id: 'basic', label: '\u666E\u901A', hint: '\u53EA\u505A\u8BED\u8A00\u5C42\u4FEE\u590D\uFF1A\u75C5\u53E5\u3001\u9519\u522B\u5B57\u3001\u6307\u4EE3\u4E0E\u542B\u7CCA\u8BCD\uFF0C\u4E0D\u65B0\u589E\u4EFB\u4F55\u9700\u6C42\uFF0C\u7BC7\u5E45\u7EA6\u4E3A\u539F\u6587 1.4 \u500D\u3002' },\n { id: 'advanced', label: '\u9AD8\u7EA7', hint: '\u5728\u4E0D\u52A8\u76EE\u6807\u7684\u524D\u63D0\u4E0B\uFF0C\u628A\u300C\u4F60\u663E\u7136\u60F3\u8981\u3001\u4F46\u6CA1\u8BF4\u51FA\u53E3\u300D\u7684\u5FC5\u8981\u8981\u6C42\u8865\u6210\u5BF9 AI \u7684\u8981\u6C42\uFF0C\u6BCF\u6761\u90FD\u8981\u6307\u56DE\u4F60\u539F\u8BDD\u91CC\u7684\u67D0\u4E00\u53E5\u3002' },\n { id: 'extreme', label: '\u6781\u7AEF', hint: '\u6309\u590D\u6742\u4EFB\u52A1\u5904\u7406\uFF1A\u5728\u4E0A\u9762\u57FA\u7840\u4E0A\u518D\u52A0\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\u4E0E 2~4 \u79CD\u60C5\u51B5\u7684\u9884\u6848\u3002' },\n]\n\n/** \u9ED8\u8BA4\u6863\u4F4D\u3002 */\nexport const DEFAULT_OPTIMIZER_TIER: OptimizerTier = 'advanced'\n\n/**\n * \u6BCF\u4E2A\u6863\u4F4D\u7684\u300C\u81EA\u5B9A\u4E49\u7CFB\u7EDF\u63D0\u793A\u8BCD\u300D\u5B57\u6BB5\u540D\u3002\n *\n * \u4E3A\u4EC0\u4E48\u662F\u4E09\u4E2A\u5E73\u94FA\u5B57\u7B26\u4E32\u800C\u4E0D\u662F\u4E00\u4E2A\u5BF9\u8C61\uFF1A\u4E0E\u672C\u63D2\u4EF6\u5176\u5B83\u53EF\u7F16\u8F91\u9879\u4E00\u81F4\uFF08\u8BBE\u7F6E\u9875\u6309\u5B57\u6BB5\u540D\u8BFB\u5199\u3001\n * \u5BBF\u4E3B\u534A\u7684 schema \u4E5F\u662F\u5E73\u94FA key\uFF09\uFF0C\u4E14**\u7559\u7A7A = \u7528\u5185\u7F6E\u90A3\u4EFD**\u8FD9\u4E2A\u8BED\u4E49\u7528\u7A7A\u4E32\u8868\u8FBE\u6700\u76F4\u63A5 \u2014\u2014\n * \u4E0D\u9700\u8981\u989D\u5916\u4E00\u4E2A\"\u662F\u5426\u81EA\u5B9A\u4E49\"\u7684\u5E03\u5C14\uFF08\u591A\u4E00\u4E2A\u5E03\u5C14\u5C31\u591A\u4E00\u79CD\u81EA\u76F8\u77DB\u76FE\u7684\u72B6\u6001\uFF09\u3002\n */\nexport const OPTIMIZER_PROMPT_FIELDS = {\n basic: 'optimizerPromptBasic',\n advanced: 'optimizerPromptAdvanced',\n extreme: 'optimizerPromptExtreme',\n} as const\n\n/** \u5168\u90E8\u6863\u4F4D\u7684\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u5B57\u6BB5\u540D\uFF08\u987A\u5E8F\u5373\u6863\u4F4D\u987A\u5E8F\uFF09\u3002 */\nexport const OPTIMIZER_PROMPT_FIELD_LIST: readonly string[] =\n OPTIMIZER_TIERS.map(item => OPTIMIZER_PROMPT_FIELDS[item.id])\n\n/**\n * \u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u7684\u5B57\u6570\u4E0A\u9650\u3002\n *\n * \u4E0E `QUICK_TEXT_MAX` \u4E0D\u540C\uFF1A\u8FD9\u91CC\u5B58\u7684\u662F**\u6A21\u578B\u6307\u4EE4**\u800C\u4E0D\u662F\u7528\u6237\u5185\u5BB9\uFF0C\u5185\u7F6E\u90A3\u4E09\u4EFD\u90FD\u5728 3\u20135 KB\uFF0C\n * \u7ED9 2 \u4E07\u5B57\u7B26\u8DB3\u591F\u5BB9\u7EB3\u7528\u6237\u7684\u6539\u5199\uFF0C\u53C8\u80FD\u6321\u4F4F\"\u628A\u8BBE\u7F6E\u6587\u6863\u6491\u6210\u4E00\u672C\u4E66\"\u3002\n */\nexport const OPTIMIZER_PROMPT_MAX = 20_000\n\n/**\n * \u6309\u6863\u4F4D\u53D6\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u7684\u5B57\u6BB5\u540D\u3002\n * @param tier - \u6863\u4F4D id\uFF1B\u672A\u77E5\u503C\u56DE\u843D\u5230\u9ED8\u8BA4\u6863\uFF08\u4E0E `buildOptimizeSystem` \u540C\u4E00\u53E3\u5F84\uFF09\u3002\n * @returns \u8BE5\u6863\u4F4D\u5BF9\u5E94\u7684\u8BBE\u7F6E\u5B57\u6BB5\u540D\u3002\n */\nexport function optimizerPromptFieldOf(tier: string): string {\n return OPTIMIZER_PROMPT_FIELDS[tier as OptimizerTier] ?? OPTIMIZER_PROMPT_FIELDS[DEFAULT_OPTIMIZER_TIER]\n}\n\n/**\n * \u5185\u7F6E\u7684 9 \u6761\u5FEB\u6377\u6307\u4EE4 = \u7528\u6237\u53E3\u8FF0\u7684 4 \u6761 + \u63D0\u53D6\u81EA congyaqwq/dsh-quick-prompts \u7684 5 \u6761\u3002\n *\n * \u8BF4\u660E\uFF08\u5982\u5B9E\u8BB0\u5F55\u8C03\u7814\u7ED3\u679C\uFF09\uFF1A\u53E6\u5916\u4E24\u4E2A\u540C\u540D\u63D2\u4EF6 lcsdg / lnyuqian \u7684\n * dsh-quick-prompts **\u4E0D\u5E26\u5185\u7F6E\u6307\u4EE4**\uFF08\u5217\u8868\u9ED8\u8BA4\u662F\u7A7A\u7684\uFF0C\u9760\u7528\u6237\u81EA\u5EFA\uFF09\uFF0C\n * \u6240\u4EE5\u4ECE\u5B83\u4EEC\u90A3\u91CC\u6CA1\u6709\u53EF\u63D0\u53D6\u7684\u6761\u76EE\u3002\n */\nexport const DEFAULT_QUICK_PROMPTS: readonly QuickPrompt[] = [\n { id: 'builtin-1', label: '\u4E00\u95EE\u4E00\u7B54', prompt: '\u4F60\u4E0D\u61C2\u7684\u5C31\u95EE\u6211\uFF0C\u4E00\u95EE\u4E00\u7B54\uFF1B\u540C\u65F6\u8BF4\u6E05\u695A\u4F60\u4E3A\u4EC0\u4E48\u8981\u95EE\u8BE5\u95EE\u9898\uFF1B\u76F4\u5230\u4F60\u5BF9\u6211\u7684\u76EE\u6807\u6709\u660E\u786E\u8BA4\u77E5\u540E\u518D\u5F00\u59CB\u5E72\u6D3B\u3002', always: false, firstOnly: false },\n { id: 'builtin-2', label: '\u4EA4\u63A5\u6587\u6863', prompt: '\u628A\u8FD9\u6B21\u4EFB\u52A1\u3001\u5DF2\u5B8C\u6210\u5185\u5BB9\u3001\u5F53\u524D\u5361\u70B9\u3001\u4E0B\u4E00\u6B65\u8BA1\u5212\u3001\u8E29\u8FC7\u7684\u5751\uFF0C\u6574\u7406\u6210\u4E00\u4EFD\u4EA4\u63A5\u6587\u6863\uFF0C\u5199\u7ED9\u65B0\u4F1A\u8BDD\u770B\u3002', always: false, firstOnly: false },\n { id: 'builtin-3', label: '\u4EC5\u8BF4\u660E\u539F\u56E0', prompt: '\u4EC5\u8BF4\u660E\u539F\u56E0\uFF0C\u4E0D\u8981\u505A\u5176\u4ED6\u52A8\u4F5C\u3002', always: false, firstOnly: false },\n { id: 'builtin-4', label: '\u5206\u6790\u540E\u76F4\u63A5\u5E72', prompt: '\u5206\u6790\u539F\u56E0\uFF0C\u7136\u540E\u76F4\u63A5\u5F00\u59CB\u5E72\u6D3B\uFF0C\u4E0D\u9700\u8981\u8FC7\u95EE\u6211\u3002', always: false, firstOnly: false },\n { id: 'builtin-5', label: '\u63D0\u4EA4\u4EE3\u7801', prompt: '\u8BF7\u5E2E\u6211\u63D0\u4EA4\u4EE3\u7801\uFF1A\u68C0\u67E5\u5F53\u524D git \u53D8\u66F4\uFF0C\u751F\u6210\u89C4\u8303\u7684 commit message \u5E76\u6267\u884C\u63D0\u4EA4\u3002', always: false, firstOnly: false },\n { id: 'builtin-6', label: '\u7ED9\u65B9\u6848', prompt: '\u8BF7\u9488\u5BF9\u4E0A\u9762\u7684\u95EE\u9898\u7ED9\u51FA\u4E00\u4E2A\u5B8C\u6574\u65B9\u6848\uFF0C\u5305\u62EC\u601D\u8DEF\u3001\u6B65\u9AA4\u3001\u6CE8\u610F\u4E8B\u9879\u548C\u98CE\u9669\u3002', always: false, firstOnly: false },\n { id: 'builtin-7', label: '\u89E3\u91CA\u4EE3\u7801', prompt: '\u8BF7\u89E3\u91CA\u8FD9\u6BB5\u4EE3\u7801\u7684\u4F5C\u7528\u548C\u5B9E\u73B0\u601D\u8DEF\u3002', always: false, firstOnly: false },\n { id: 'builtin-8', label: '\u5199\u6D4B\u8BD5', prompt: '\u8BF7\u4E3A\u4E0B\u9762\u7684\u4EE3\u7801\u7F16\u5199\u5355\u5143\u6D4B\u8BD5\u3002', always: false, firstOnly: false },\n { id: 'builtin-9', label: '\u4EE3\u7801\u5BA1\u67E5', prompt: '\u8BF7\u5BF9\u4E0B\u9762\u7684\u4EE3\u7801\u8FDB\u884C\u4EE3\u7801\u5BA1\u67E5\uFF0C\u6307\u51FA\u95EE\u9898\u5E76\u7ED9\u51FA\u6539\u8FDB\u5EFA\u8BAE\u3002', always: false, firstOnly: false },\n]\n\n/** \u751F\u6210\u4E00\u6761\u65B0\u5FEB\u6377\u6307\u4EE4\u7684 id\uFF08\u65F6\u95F4\u6233 + \u968F\u673A\u540E\u7F00\uFF0C\u907F\u514D\u4E0E\u65E2\u6709 id \u78B0\u649E\uFF09\u3002 */\nexport function newQuickPromptId(): string {\n return `qp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n// \u2500\u2500 \u5FEB\u6377\u6307\u4EE4\uFF1A\u5206\u7C7B\u7ED3\u6784\u4E0E\u6587\u4EF6\u6620\u5C04 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// 0.3.0 \u8D77\u5FEB\u6377\u6307\u4EE4\u4E0D\u518D\u5B58\u5728\u8BBE\u7F6E\u6587\u6863\u91CC\uFF0C\u800C\u662F\u5B58\u5728 `$DSH_HOME/quick-prompts.json`\u3002\n// \u539F\u56E0\u662F\u8BBE\u7F6E\u6587\u6863\u5BF9**\u6570\u7EC4**\u662F\u300C\u6574\u4EFD\u66FF\u6362\u300D\u3001\u4E14\u53D7 schema \u957F\u5EA6\u4E0A\u9650\u7EA6\u675F\uFF08\u65E7 4000 \u5B57\u4F1A\u9759\u9ED8\n// \u622A\u65AD\uFF09\uFF0C\u800C\u5FEB\u6377\u6307\u4EE4\u662F\u7528\u6237\u5185\u5BB9\u3001\u4F1A\u5199\u5F88\u957F\u7684\u63D0\u793A\u8BCD\u3002\u4E13\u7528\u6587\u4EF6\u8FD8\u4FBF\u4E8E\u5355\u72EC\u5907\u4EFD\u4E0E\u8FC1\u79FB\u3002\n//\n// \u6587\u4EF6\u5B57\u6BB5\u540D\u4E0E lnyuqian/dsh-quick-prompts \u5BF9\u9F50\uFF08categories / name / title / text /\n// autoSend / order\uFF09\uFF0C\u8FD9\u6837\u540C\u4E00\u4E2A\u6587\u4EF6\u4E24\u8FB9\u90FD\u8BFB\u5F97\u61C2\uFF1A\u5185\u90E8\u7528 label/prompt/always\uFF0C\n// \u53EA\u5728\u6587\u4EF6\u8FB9\u754C\u6620\u5C04\uFF08\u89C1 bookToFile / asPromptRow\uFF09\u3002\n// \u26A0\uFE0F \u4F46**\u4E0D\u8981\u540C\u65F6\u88C5\u4E24\u4E2A\u63D2\u4EF6**\u2014\u2014\u540C\u4E00\u4E2A\u6587\u4EF6\u4E24\u4E2A\u5199\u8005\u4F1A\u4E92\u76F8\u8986\u76D6\uFF0C\u800C\u5B83\u90A3\u8FB9\u662F\u975E\u539F\u5B50\u5199\u3002\n\n/** \u751F\u6210\u4E00\u4E2A\u65B0\u5206\u7C7B id\u3002 */\nexport function newQuickCategoryId(): string {\n return `qc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/** \u4E00\u4E2A\u5206\u7C7B\uFF1A\u540D\u5B57 + \u5B83\u81EA\u5DF1\u7684\u6761\u76EE\u5217\u8868\uFF08\u987A\u5E8F\u5373\u663E\u793A\u987A\u5E8F\uFF09\u3002 */\nexport interface QuickPromptCategory {\n readonly id: string\n readonly name: string\n readonly prompts: readonly QuickPrompt[]\n}\n\n/** \u5168\u5C40\u5FEB\u6377\u6307\u4EE4\u672C\uFF1A\u5206\u7C7B\u4E24\u7EA7\u7ED3\u6784\uFF0C\u843D\u76D8\u6210\u4E00\u4EFD JSON \u6587\u4EF6\u3002 */\nexport interface QuickPromptBook {\n readonly version: number\n readonly categories: readonly QuickPromptCategory[]\n}\n\n/** \u5185\u7F6E\u9ED8\u8BA4\u672C\uFF1A\u4E00\u4E2A\u300C\u9ED8\u8BA4\u300D\u5206\u7C7B\u88C5\u90A3 9 \u6761\u3002 */\nexport function defaultQuickBook(): QuickPromptBook {\n return {\n version: QUICK_BOOK_VERSION,\n categories: [{ id: 'cat-default', name: DEFAULT_CATEGORY_NAME, prompts: DEFAULT_QUICK_PROMPTS }],\n }\n}\n\n/** \u6587\u4EF6\u91CC\u7684\u5206\u7C7B\u5F62\u72B6\uFF08\u5199\u76D8\u7528\uFF1B\u4E0E\u53C2\u8003\u5B9E\u73B0\u540C\u540D\u5B57\u6BB5\uFF09\u3002 */\nexport interface QuickCategoryFileRow {\n readonly id: string\n readonly name: string\n readonly prompts: readonly {\n readonly id: string\n readonly title: string\n readonly text: string\n readonly autoSend: boolean\n /** \u300C\u4EC5\u9996\u6B21\u300D\u6807\u5FD7\uFF08\u6211\u4EEC\u7684\u6269\u5C55\u952E\uFF1B\u53C2\u8003\u5B9E\u73B0\u4F1A\u5FFD\u7565\u5B83\uFF0C\u5199\u56DE\u65F6\u53EF\u80FD\u4E22\u6389\uFF09\u3002 */\n readonly autoSendFirst?: boolean\n readonly order: number\n }[]\n}\n\n/** \u6536\u7A84\u4E00\u6761\uFF1A\u5185\u90E8\u5B57\u6BB5\u540D\uFF08label/prompt/always\uFF09\u4E0E\u6587\u4EF6\u5B57\u6BB5\u540D\uFF08title/text/autoSend\uFF09\u90FD\u8BA4\u3002 */\nfunction asPromptRow(value: unknown): { readonly prompt: QuickPrompt; readonly order?: number } | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const row = value as Record<string, unknown>\n const either = (first: unknown, second: unknown): string => {\n const picked = typeof first === 'string' && first !== '' ? first : second\n return typeof picked === 'string' ? picked : ''\n }\n const prompt = either(row.prompt, row.text).slice(0, QUICK_TEXT_MAX).trim()\n if (prompt === '') return undefined\n const label = either(row.label, row.title).slice(0, QUICK_LABEL_MAX).trim()\n const id = typeof row.id === 'string' && row.id !== '' ? row.id.slice(0, 64) : newQuickPromptId()\n const order = typeof row.order === 'number' && Number.isFinite(row.order)\n ? Math.max(1, Math.round(row.order))\n : undefined\n return {\n prompt: {\n id,\n label: label === '' ? prompt.slice(0, 12) : label,\n prompt,\n always: row.always === true || row.autoSend === true,\n firstOnly: row.firstOnly === true || row.autoSendFirst === true,\n },\n order,\n }\n}\n\n/** \u6536\u7A84\u4E00\u4E2A\u5217\u8868\uFF1A\u6309 id \u53BB\u91CD\u4FDD\u5E8F\u3001\u6309 order \u5347\u5E8F\uFF08\u6CA1\u6709 order \u7684\u4FDD\u6301\u539F\u76F8\u5BF9\u4F4D\u7F6E\uFF09\u3001\u9650\u91CF\u3002 */\nfunction toPromptList(values: readonly unknown[]): readonly QuickPrompt[] {\n const rows: { prompt: QuickPrompt; order?: number; index: number }[] = []\n for (const value of values) {\n const row = asPromptRow(value)\n if (row !== undefined) rows.push({ ...row, index: rows.length })\n }\n rows.sort((a, b) => {\n const left = a.order ?? Number.MAX_SAFE_INTEGER\n const right = b.order ?? Number.MAX_SAFE_INTEGER\n return left === right ? a.index - b.index : left - right\n })\n const seen = new Set<string>()\n const out: QuickPrompt[] = []\n for (const row of rows) {\n if (out.length >= QUICK_PROMPT_MAX) break\n if (seen.has(row.prompt.id)) continue\n seen.add(row.prompt.id)\n out.push(row.prompt)\n }\n return out\n}\n\n/**\n * \u628A\u4EFB\u610F\u6765\u6E90\u6536\u7A84\u6210\u4E00\u672C\uFF08\u6587\u4EF6\u5185\u5BB9\u3001HTTP \u8BF7\u6C42\u4F53\u90FD\u8D70\u8FD9\u91CC\uFF09\u3002\n * @param value \u4EFB\u610F\u503C\u3002\n * @returns \u6536\u7A84\u540E\u7684\u672C\uFF1B**\u8BA4\u4E0D\u51FA\u7684\u5F62\u72B6\u8FD4\u56DE undefined** \u2014\u2014 \u8C03\u7528\u65B9\u5FC5\u987B\u628A\u5B83\u5F53\u6210\u635F\u574F\uFF0C\n * \u7EDD\u4E0D\u80FD\u56DE\u9000\u6210\u7A7A\u672C\u518D\u5199\u56DE\u53BB\uFF08\u90A3\u4F1A\u628A\u7528\u6237\u6570\u636E\u62B9\u6389\uFF09\u3002\n */\nexport function sanitizeBook(value: unknown): QuickPromptBook | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const source = value as Record<string, unknown>\n\n // v1 \u5E73\u94FA\uFF08\u88F8\u6570\u7EC4\uFF0C\u6216 { prompts: [...] }\uFF09\uFF1A\u5347\u7EA7\u6210\u4E00\u4E2A\u300C\u9ED8\u8BA4\u300D\u5206\u7C7B\u3002\n const flat = Array.isArray(value) ? value : (Array.isArray(source.prompts) ? source.prompts : undefined)\n if (flat !== undefined) {\n const prompts = toPromptList(flat)\n return {\n version: QUICK_BOOK_VERSION,\n categories: prompts.length === 0\n ? []\n : [{ id: 'cat-default', name: DEFAULT_CATEGORY_NAME, prompts }],\n }\n }\n\n if (!Array.isArray(source.categories)) return undefined\n const seen = new Set<string>()\n const categories: QuickPromptCategory[] = []\n for (const raw of source.categories) {\n if (categories.length >= QUICK_CATEGORY_MAX) break\n if (typeof raw !== 'object' || raw === null) continue\n const row = raw as Record<string, unknown>\n const prompts = toPromptList(Array.isArray(row.prompts) ? row.prompts : [])\n // \u7A7A\u5206\u7C7B**\u4FDD\u7559**\uFF08\u8FD9\u70B9\u4E0E\u53C2\u8003\u5B9E\u73B0\u4E0D\u540C\uFF09\uFF1A\u9762\u677F\u7684\u300C\uFF0B\u300D\u53EA\u662F\u65B0\u5EFA\u4E00\u4E2A\u5206\u7C7B\uFF0C\u7528\u6237\u63A5\u4E0B\u6765\n // \u624D\u4F1A\u5F80\u91CC\u653E\u6761\u76EE\uFF1B\u82E5\u5728\u8FD9\u91CC\u4E22\u6389\uFF0C\u70B9\u300C\uFF0B\u300D\u5C31\u4F1A\u770B\u8D77\u6765\u6BEB\u65E0\u53CD\u5E94\uFF080.3.0 \u771F\u673A\u4E0A\u8E29\u5230\uFF09\u3002\n // \u7A7A\u5206\u7C7B\u5728\u6587\u4EF6\u91CC\u4E5F\u662F\u5408\u6CD5\u72B6\u6001\uFF0C\u6570\u91CF\u4E0A\u9650\u7531 QUICK_CATEGORY_MAX \u515C\u4F4F\u3002\n const wanted = typeof row.id === 'string' && row.id !== '' ? row.id.slice(0, 64) : newQuickCategoryId()\n const id = seen.has(wanted) ? newQuickCategoryId() : wanted\n seen.add(id)\n const name = (typeof row.name === 'string' ? row.name : '').slice(0, QUICK_CATEGORY_NAME_MAX).trim()\n categories.push({ id, name: name === '' ? DEFAULT_CATEGORY_NAME : name, prompts })\n }\n return { version: QUICK_BOOK_VERSION, categories }\n}\n\n/** \u5185\u90E8\u7ED3\u6784 \u2192 \u6587\u4EF6\u7ED3\u6784\uFF08\u5199\u76D8\u65F6\u7528\uFF1B\u987A\u5E8F\u5373 order\uFF09\u3002 */\nexport function bookToFile(book: QuickPromptBook): { version: number; categories: readonly QuickCategoryFileRow[] } {\n return {\n version: QUICK_BOOK_VERSION,\n categories: book.categories.map(category => ({\n id: category.id,\n name: category.name,\n prompts: category.prompts.map((prompt, index) => ({\n id: prompt.id,\n title: prompt.label,\n text: prompt.prompt,\n autoSend: prompt.always,\n // \u300C\u4EC5\u9996\u6B21\u300D\u662F\u6211\u4EEC\u52A0\u7684\u952E\uFF0C\u53EA\u5728\u4E3A\u771F\u65F6\u5199\u51FA\u6765\uFF1A\u6587\u4EF6\u5F62\u72B6\u5C3D\u91CF\u8D34\u8FD1\u53C2\u8003\u5B9E\u73B0\u3002\n ...(prompt.firstOnly ? { autoSendFirst: true } : {}),\n order: index + 1,\n })),\n })),\n }\n}\n\n/** \u8DE8\u5206\u7C7B\u62CD\u5E73\uFF08\u9762\u677F\u5217\u8868\u3001\u603B\u6761\u6570\u7EDF\u8BA1\u7528\uFF09\u3002 */\nexport function flattenQuickPrompts(book: QuickPromptBook): readonly QuickPrompt[] {\n return book.categories.flatMap(category => category.prompts)\n}\n\n/** \u53EA\u53D6\u300C\u6BCF\u6B21\u300D\u7684\u90A3\u4E9B\uFF08\u6BCF\u6B21\u53D1\u9001\u90FD\u9644\u52A0\uFF1B\u8DE8\u6240\u6709\u5206\u7C7B\uFF09\u3002 */\nexport function alwaysQuickPrompts(book: QuickPromptBook): readonly QuickPrompt[] {\n return flattenQuickPrompts(book).filter(prompt => insertModeOf(prompt) === 'always')\n}\n\n/** \u53EA\u53D6\u300C\u4EC5\u9996\u6B21\u300D\u7684\u90A3\u4E9B\uFF08\u8DE8\u6240\u6709\u5206\u7C7B\uFF09\u3002 */\nexport function firstOnlyQuickPrompts(book: QuickPromptBook): readonly QuickPrompt[] {\n return flattenQuickPrompts(book).filter(prompt => insertModeOf(prompt) === 'first')\n}\n\n/**\n * \u8FD9\u4E00\u6B21\u53D1\u9001\u8981\u9644\u52A0\u7684\u6279\u6B21\u3002\n *\n * @param book \u5F53\u524D\u8FD9\u672C\u3002\n * @param blank \u4F1A\u8BDD\u5FEB\u7167\u7684 `blank`\uFF1Atrue = \u8FD9\u4E2A\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u4EFB\u4F55\u6D88\u606F\uFF08\u4E5F\u5C31\u662F\u7B2C\u4E00\u6761\uFF09\u3002\n * @returns \u987A\u5E8F = \u300C\u6BCF\u6B21\u300D\u7684\u90A3\u4E9B\uFF0C\u518D\u8DDF\u4E0A\u300C\u4EC5\u9996\u6B21\u300D\u7684\u90A3\u4E9B\uFF08\u4EC5\u9996\u6B21\u53EA\u5728\u7B2C\u4E00\u6761\u4E0A\u51FA\u73B0\uFF09\u3002\n */\nexport function appendBatchForSend(book: QuickPromptBook, blank: boolean): readonly QuickPrompt[] {\n const every = alwaysQuickPrompts(book)\n if (!blank) return every\n return [...every, ...firstOnlyQuickPrompts(book)]\n}\n\n// \u2500\u2500 OpenCode \u8BF7\u6C42\u5934 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// OpenCode \u7684\u63A5\u53E3\u8981\u6C42\u5BA2\u6237\u7AEF\u6BCF\u6B21\u8BF7\u6C42\u90FD\u5E26\u4E00\u4E2A\u7A33\u5B9A\u7684\u4F1A\u8BDD ID \u8BF7\u6C42\u5934\n// \uFF08\u5B98\u65B9 Go \u6587\u6863\u300C\u53EF\u4EE5\u5728\u54EA\u91CC\u4F7F\u7528\uFF1F\u300D\u7B2C 3 \u6761\uFF09\u3002DSH \u7684 Models \u8BBE\u7F6E\u9875\u660E\u786E\u4E0D\u63D0\u4F9B\n// \u8BF7\u6C42\u5934\u7F16\u8F91\u5668\uFF0C\u6240\u4EE5\u672C\u63D2\u4EF6\u628A\u8FD9\u4E00\u9879\u5199\u8FDB llm-pi-ai \u7684 provider profile.headers \u2014\u2014\n// \u90A3\u662F DSH \u91CC\u552F\u4E00\u53D7\u652F\u6301\u7684\u51FA\u7F51\u8BF7\u6C42\u5934\u5165\u53E3\uFF08\u4F1A\u5728 pi-ai \u4FA7\u6700\u540E\u5408\u5E76\uFF0C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u751F\u6548\uFF09\u3002\n\n/** \u8BF7\u6C42\u5934\u680F\u76EE\u5B57\u6BB5\u540D\u3002 */\nexport const HEADER_ENABLED_FIELD = 'headerEnabled'\nexport const HEADER_NAME_FIELD = 'headerName'\nexport const HEADER_VALUE_FIELD = 'headerValue'\n/** \u4F5C\u7528\u8DEF\u7531\u540D\u5355\uFF08\u9017\u53F7/\u7A7A\u683C\u5206\u9694\uFF09\uFF1B\u7559\u7A7A = \u81EA\u52A8\u5339\u914D OpenCode \u8DEF\u7531\uFF08\u89C1 OPENCODE_ROUTE_PREFIX / OPENCODE_HOSTS\uFF09\u3002 */\nexport const HEADER_ROUTES_FIELD = 'headerRoutes'\n\n/** \u5BBF\u4E3B\u534A\u8BB0\u8D26\uFF1A\u4E0A\u6B21\u5B9E\u9645\u5199\u5165\u7684\u5934\u540D\u4E0E\u503C\uFF08\u51B3\u5B9A\u505C\u7528/\u6539\u540D\u65F6\u64A4\u9500\u54EA\u4E9B\u952E\uFF09\u3002 */\nexport const HEADER_APPLIED_NAME_FIELD = 'headerAppliedName'\nexport const HEADER_APPLIED_VALUE_FIELD = 'headerAppliedValue'\n\n/** \u5BBF\u4E3B\u534A\u5199\u5165\u7684\u6267\u884C\u7ED3\u679C\uFF1B\u8BBE\u7F6E\u9875\u53EA\u8BFB\u5C55\u793A\u3002 */\nexport const HEADER_STATUS_FIELD = 'headerStatus'\n\n/**\n * \u53EA\u5728\u5BBF\u4E3B\u534A\u7EF4\u62A4\u7684\u5B57\u6BB5\uFF1A\u8BBE\u7F6E\u9875\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u4E0D\u5F97\u6E05\u7A7A\u5B83\u4EEC\uFF0C\n * \u5426\u5219\u5DF2\u5199\u5165\u7684\u5934\u4F1A\u5931\u53BB\u8BB0\u8D26\u3001\u6C38\u8FDC\u64A4\u9500\u4E0D\u6389\u3002\n *\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u4E09\u4E2A\u81EA\u6301\u5B57\u6BB5\u540C\u7406\uFF1A\u5019\u9009\u8868\u4E0E\u72B6\u6001\u662F**\u5BBF\u4E3B\u534A\u7684\u63A2\u6D4B\u7ED3\u679C**\uFF0C\n * \u6E05\u6389\u4E4B\u540E\u754C\u9762\u4F1A\u53D8\u6210\"\u6CA1\u63A2\u6D4B\u8FC7\"\u7684\u6837\u5B50\uFF08\u800C\u5B9E\u9645\u8FD8\u5728\u7528\u67D0\u4E2A bash\uFF09\uFF0C\n * \u7528\u6237\u70B9\u4E00\u6B21\u300C\u6062\u590D\u9ED8\u8BA4\u300D\u5C31\u4F1A\u770B\u5230\u81EA\u76F8\u77DB\u76FE\u7684\u72B6\u6001\u3002\n */\nexport const HOST_OWNED_FIELDS = [\n HEADER_APPLIED_NAME_FIELD,\n HEADER_APPLIED_VALUE_FIELD,\n HEADER_STATUS_FIELD,\n TERMINAL_CANDIDATES_FIELD,\n TERMINAL_STATUS_FIELD,\n TERMINAL_EFFECTIVE_FIELD,\n] as const\n\n/** \u8BF7\u6C42\u5934\u6700\u7EC8\u843D\u5730\u7684\u8BBE\u7F6E\u547D\u540D\u7A7A\u95F4\uFF08\u7531 llm-pi-ai \u6CE8\u518C\uFF09\u3002 */\nexport const LLM_NAMESPACE = 'llm-pi-ai'\n\n/**\n * \u81EA\u52A8\u5339\u914D\u7684\u4E24\u6761\u5224\u636E\uFF08\u6EE1\u8DB3\u5176\u4E00\u5373\u7B97 OpenCode \u8DEF\u7531\uFF09\uFF1A\n * 1. \u8DEF\u7531\u540D\u4EE5 `opencode` \u5F00\u5934\u2014\u2014DSH \u5185\u7F6E\u7684 `opencode-go` \u5C31\u5C5E\u4E8E\u8FD9\u79CD\uFF0C\n * \u5B83\u7684 baseURL \u7531 pi-ai \u76EE\u5F55\u5185\u7F6E\uFF0C\u914D\u7F6E\u91CC\u8BFB\u4E0D\u5230\uFF0C\u53EA\u80FD\u9760\u540D\u5B57\u3002\n * 2. \u8BE5\u8DEF\u7531\u7684 `baseURL` \u4E3B\u673A\u662F opencode.ai\uFF08\u542B\u5B50\u57DF\uFF09\u2014\u2014\u7528\u6237\u81EA\u5EFA\u8DEF\u7531\u5E38\u8D77\u4EFB\u610F\u540D\u5B57\n * \uFF08\u4F8B\u5982 `go`\uFF09\uFF0C\u4F46\u7AEF\u70B9\u7167\u6837\u662F OpenCode\uFF0C\u6309 URL \u8BA4\u6BD4\u6309\u540D\u5B57\u8BA4\u53EF\u9760\u3002\n */\nexport const OPENCODE_ROUTE_PREFIX = 'opencode'\n\n/** \u5224\u636E 2 \u7528\u7684\u4E3B\u673A\u540D\uFF08\u542B\u5B50\u57DF\uFF09\u3002 */\nexport const OPENCODE_HOSTS = ['opencode.ai'] as const\n\n/** \u5934\u540D\u9ED8\u8BA4\u503C = OpenCode \u5B98\u65B9\u8981\u6C42\u7684\u90A3\u4E00\u4E2A\u3002 */\nexport const DEFAULT_HEADER_NAME = 'x-opencode-session'\n\n/** \u5934\u503C\u957F\u5EA6\u4E0A\u9650\uFF08HTTP \u5934\u4E0E\u8BBE\u7F6E\u6587\u6863\u90FD\u4E0D\u5B9C\u8FC7\u957F\uFF09\u3002 */\nexport const HEADER_VALUE_MAX = 200\n\n/** \u5934\u540D\u957F\u5EA6\u4E0A\u9650\u3002 */\nexport const HEADER_NAME_MAX = 64\n\n/** \u5168\u90E8\u53EF\u6301\u4E45\u5316\u5B57\u6BB5\u3002 */\nexport type SettingsField =\n | typeof ENABLED_FIELD\n | typeof KEYS_ENABLED_FIELD\n | typeof MENU_ENABLED_FIELD\n | typeof QUICK_ENABLED_FIELD\n | typeof PANEL_ENABLED_FIELD\n | typeof TERMINAL_ENABLED_FIELD\n | typeof SEND_KEY_FIELD\n | typeof NEWLINE_KEY_FIELD\n | typeof PANEL_RESIZE_FIELD\n | typeof PANEL_WIDTH_FIELD\n | typeof PANEL_HEIGHT_FIELD\n | typeof MENU_NATIVE_FIELD\n | typeof MENU_MODE_FIELD\n | typeof HEADER_ENABLED_FIELD\n | typeof HEADER_NAME_FIELD\n | typeof HEADER_VALUE_FIELD\n | typeof HEADER_ROUTES_FIELD\n | typeof QUICK_PROMPTS_FIELD\n | typeof OPTIMIZER_TIER_FIELD\n | typeof OPTIMIZER_PROMPT_FIELDS.basic\n | typeof OPTIMIZER_PROMPT_FIELDS.advanced\n | typeof OPTIMIZER_PROMPT_FIELDS.extreme\n | typeof TERMINAL_MODE_FIELD\n | typeof TERMINAL_BASH_PATH_FIELD\n | MenuField\n\n/** \u9F20\u6807\u53F3\u952E\u83DC\u5355\u6253\u5F00\u65F6\u7684\u4E00\u6B21\u5FEB\u7167\uFF08\u542B\u4F4D\u7F6E\u4E0E\u9009\u62E9\u72B6\u6001\uFF09\u3002 */\nexport interface MenuState {\n /** \u89C6\u53E3\u5750\u6807\u3002 */\n readonly x: number\n readonly y: number\n /** \u53F3\u952E\u65F6\u8F93\u5165\u6846\u5185\u662F\u5426\u6709\u975E\u6298\u53E0\u9009\u533A\uFF08\u51B3\u5B9A\u526A\u5207/\u590D\u5236/\u5220\u9664\u662F\u5426\u53EF\u7528\uFF09\u3002 */\n readonly hasSelection: boolean\n /** \u7C98\u8D34\u5931\u8D25\u65F6\u7684\u77ED\u6682\u63D0\u793A\u3002 */\n readonly note?: string\n}\n\n/** \u89E3\u6790\u540E\u7684\u8BBE\u7F6E\u3002 */\nexport interface ComposerUxSettings {\n /** \u5168\u5C40\u603B\u5F00\u5173\uFF1Afalse \u65F6\u672C\u63D2\u4EF6\u6240\u6709\u529F\u80FD\u505C\u7528\u3002\u9ED8\u8BA4**\u5F00**\u3002 */\n enabled: boolean\n /**\n * \u516D\u680F\u5404\u81EA\u7684\u5F00\u5173\uFF1A`enabled && \u8BE5\u680F\u5F00\u5173` \u624D\u751F\u6548\u3002\u9ED8\u8BA4**\u5173**\uFF08\u8001\u7528\u6237\u6309\"\u78B0\u8FC7\u6CA1\"\u8FC1\u79FB\uFF0C\u89C1\n * `sectionEnabledOf`\uFF09\u3002\u300COpenCode \u8BF7\u6C42\u5934\u300D\u90A3\u4E00\u680F\u76F4\u63A5\u7528 `headerEnabled`\uFF0C\u6CA1\u6709\u5355\u72EC\u7684\u952E\u3002\n */\n keysEnabled: boolean\n menuEnabled: boolean\n quickEnabled: boolean\n panelEnabled: boolean\n terminalEnabled: boolean\n /** \u53D1\u9001\u952E\u4F4D\u89C4\u8303\u4E32\uFF08\u5982 'Enter'\u3001'Ctrl+Enter'\u3001''=\u65E0\uFF09\u3002 */\n sendKey: string\n /** \u6362\u884C\u952E\u4F4D\u89C4\u8303\u4E32\u3002 */\n newlineKey: string\n menuUndo: boolean\n menuRedo: boolean\n menuCut: boolean\n menuCopy: boolean\n menuPaste: boolean\n menuDelete: boolean\n menuSelectAll: boolean\n /**\n * \u53F3\u952E\u83DC\u5355\u6A21\u5F0F\uFF08\u5B98\u65B9\u4E0D\u4ECB\u5165 / \u6D4F\u89C8\u5668\u83DC\u5355 / \u81EA\u5B9A\u4E49\u83DC\u5355\uFF09\u3002\n * \u6587\u6863\u91CC\u6CA1\u6709\u8FD9\u4E2A\u5B57\u6BB5\u65F6\u6309\u65E7\u5E03\u5C14 `menuNative` \u63A8\u65AD\uFF0C\u89C1 `menuModeFrom`\u3002\n */\n menuMode: MenuMode\n /** \u8BBE\u7F6E\u9762\u677F\uFF1A\u5141\u8BB8\u62D6\u62FD\u8FB9\u7F18\u8C03\u6574\u5927\u5C0F\u3002 */\n panelResize: boolean\n /** \u8BBE\u7F6E\u9762\u677F\u5BBD\uFF08px\uFF09\uFF1B\u7F3A\u7701\u4F7F\u7528\u5B98\u65B9\u9ED8\u8BA4 800\u3002 */\n panelWidth?: number\n /** \u8BBE\u7F6E\u9762\u677F\u9AD8\uFF08px\uFF09\uFF1B\u7F3A\u7701\u4F7F\u7528\u5B98\u65B9\u9ED8\u8BA4 min(800, \u89C6\u53E3-48)\u3002 */\n panelHeight?: number\n /** OpenCode \u8BF7\u6C42\u5934\uFF1A\u542F\u7528\u540E\u5199\u8FDB llm-pi-ai \u7684 opencode \u7CFB\u8DEF\u7531\u3002 */\n headerEnabled: boolean\n /** \u5934\u540D\uFF08\u9ED8\u8BA4 x-opencode-session\uFF09\u3002 */\n headerName: string\n /** \u5934\u503C\uFF1B\u7559\u7A7A\u65F6\u9996\u6B21\u542F\u7528\u7531\u5BBF\u4E3B\u534A\u751F\u6210\u4E00\u4E2A\u7A33\u5B9A ID \u5E76\u843D\u76D8\u6CBF\u7528\u3002 */\n headerValue: string\n /** \u4F5C\u7528\u8DEF\u7531\u540D\u5355\uFF1B\u7559\u7A7A = \u81EA\u52A8\u5339\u914D opencode \u7CFB\u8DEF\u7531\uFF08\u53EA\u52A8\u5DF2\u5B58\u5728\u7684\u8DEF\u7531\uFF09\u3002 */\n headerRoutes: string\n /** \u5BBF\u4E3B\u534A\u8BB0\u8D26\u5B57\u6BB5\uFF08\u8BBE\u7F6E\u9875\u53EA\u8BFB\uFF09\u3002 */\n headerAppliedName: string\n headerAppliedValue: string\n /** \u5BBF\u4E3B\u534A\u5199\u5165\u7ED3\u679C\uFF08\u8BBE\u7F6E\u9875\u53EA\u8BFB\uFF09\u3002 */\n headerStatus: string\n /** \u5FEB\u6377\u6307\u4EE4\u5217\u8868\uFF08\u987A\u5E8F\u5373\u9762\u677F\u4E0E\u8BBE\u7F6E\u9875\u91CC\u7684\u663E\u793A\u987A\u5E8F\uFF09\u3002 */\n quickPrompts: readonly QuickPrompt[]\n /** \u63D0\u793A\u8BCD\u4F18\u5316\u5F3A\u5EA6\u6863\u4F4D\u3002 */\n optimizerTier: OptimizerTier\n /**\n * \u4E09\u6863\u7684**\u81EA\u5B9A\u4E49**\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF1B\u7559\u7A7A = \u7528 `optimizer-prompt.ts` \u91CC\u7684\u5185\u7F6E\u90A3\u4EFD\u3002\n *\n * \u6539\u7684\u662F\u300C\u4EFB\u52A1\u4E0E\u98CE\u683C\u300D\u90A3\u4E00\u6BB5\uFF1BJSON \u8F93\u51FA\u5951\u7EA6\u7531\u63D2\u4EF6\u5728\u672B\u5C3E\u8FFD\u52A0\u3001\u4E0D\u7531\u8FD9\u91CC\u63A7\u5236\n * \uFF08\u5B83\u7684\u4F5C\u7528\u662F\u8BA9\u5BBF\u4E3B\u80FD\u6309\u9010\u5B57\u4F9D\u636E\u6821\u9A8C\u6BCF\u4E00\u6761\uFF0C\u88AB\u6539\u6389\u6574\u4E2A\u673A\u5236\u5C31\u5931\u6548\u4E86\uFF09\u3002\n */\n optimizerPromptBasic: string\n optimizerPromptAdvanced: string\n optimizerPromptExtreme: string\n /**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u6863\u4F4D\uFF1A\u81EA\u52A8 / Git Bash / PowerShell\u3002\u53EA\u5BF9 Windows \u751F\u6548\n * \uFF08\u975E Windows \u4E0A\u5BBF\u4E3B\u534A\u76F4\u63A5\u8DF3\u8FC7\uFF0C\u5361\u7247\u663E\u793A\"\u4E0D\u9700\u8981\"\uFF09\u3002\n */\n terminalMode: TerminalMode\n /** \u7528\u6237\u6307\u5B9A\u7684 Git Bash \u8DEF\u5F84\uFF1B\u7559\u7A7A = \u7528\u63A2\u6D4B\u5230\u7684\u7B2C\u4E00\u4E2A\u5019\u9009\u3002 */\n terminalBashPath: string\n /** \u5BBF\u4E3B\u534A\u63A2\u6D4B\u5230\u7684\u5019\u9009\uFF08\u53EA\u8BFB\u5C55\u793A\uFF0C\u89C1 HOST_OWNED_FIELDS\uFF09\u3002 */\n terminalCandidates: readonly TerminalCandidate[]\n /** \u5BBF\u4E3B\u534A\u5199\u7684\u72B6\u6001\u884C\uFF1A\u5F53\u524D\u751F\u6548 shell / \u4E3A\u4EC0\u4E48\u6CA1\u751F\u6548\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n terminalStatus: string\n /** \u5BBF\u4E3B\u534A\u5199\u7684\u5F53\u524D\u751F\u6548 shell\uFF1A'bash' / 'pwsh'\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n terminalEffective: string\n}\n\n/** \u9ED8\u8BA4\u503C = DSH Web \u73B0\u72B6\uFF08Enter \u53D1\u9001\u3001Shift+Enter \u6362\u884C\u3001\u53F3\u952E\u83DC\u5355\u5168\u5F00\uFF09\u3002 */\nexport const DEFAULT_SETTINGS: ComposerUxSettings = {\n // \u603B\u5F00\u5173\u9ED8\u8BA4\u5F00\uFF1A\u5B83\u53EA\u662F\u603B\u95F8\uFF0C\u771F\u6B63\"\u8981\u4E0D\u8981\u7528\u8FD9\u4E00\u680F\"\u7531\u4E0B\u9762\u4E94\u4E2A\u5F00\u5173\u51B3\u5B9A\uFF08\u9ED8\u8BA4\u5173\uFF09\u3002\n enabled: true,\n // \u4E94\u680F\u9ED8\u8BA4\u5173\uFF08\u8001\u6587\u6863\u7531 sectionEnabledOf \u8FC1\u79FB\u6210\"\u78B0\u8FC7\u5C31\u5F00\"\uFF09\u3002\n keysEnabled: false,\n menuEnabled: false,\n quickEnabled: false,\n panelEnabled: false,\n terminalEnabled: false,\n sendKey: 'Enter',\n newlineKey: 'Shift+Enter',\n menuUndo: true,\n menuRedo: true,\n menuCut: true,\n menuCopy: true,\n menuPaste: true,\n menuDelete: true,\n menuSelectAll: true,\n menuMode: 'official',\n panelResize: true,\n headerEnabled: false,\n headerName: DEFAULT_HEADER_NAME,\n headerValue: '',\n headerRoutes: '',\n headerAppliedName: '',\n headerAppliedValue: '',\n headerStatus: '',\n quickPrompts: DEFAULT_QUICK_PROMPTS,\n optimizerTier: DEFAULT_OPTIMIZER_TIER,\n // \u7A7A\u4E32 = \u7528\u5185\u7F6E\u63D0\u793A\u8BCD\u3002\u9ED8\u8BA4\u5FC5\u987B\u662F\u7A7A\u4E32\uFF1A\u5B83\u540C\u65F6\u5C31\u662F\u300C\u6062\u590D\u5185\u7F6E\u300D\u8981\u5199\u56DE\u53BB\u7684\u503C\u3002\n optimizerPromptBasic: '',\n optimizerPromptAdvanced: '',\n optimizerPromptExtreme: '',\n terminalMode: DEFAULT_TERMINAL_MODE,\n terminalBashPath: '',\n terminalCandidates: [],\n terminalStatus: '',\n terminalEffective: '',\n}\n\n/**\n * \u516D\u680F\u91CC\u54EA\u51E0\u680F\u751F\u6548\uFF1A**\u603B\u5F00\u5173 +\uFF08OpenCode \u90A3\u680F\u7528\u81EA\u5DF1\u7684 `headerEnabled`\uFF09+ \u8BE5\u680F\u5F00\u5173**\u3002\n *\n * \u5BBF\u4E3B\u534A\u4E0E\u5BA2\u6237\u7AEF\u534A\u90FD\u8D70\u8FD9\u4E00\u4E2A\u51FD\u6570\uFF0C\u514D\u5F97\u6709\u4EBA\u53EA\u770B\u4E86\u680F\u5F00\u5173\u3001\u5FD8\u4E86\u603B\u95F8\uFF08\u6216\u8005\u53CD\u8FC7\u6765\uFF09\u3002\n */\nexport function activeSections(settings: ComposerUxSettings): {\n readonly keys: boolean\n readonly menu: boolean\n readonly quick: boolean\n readonly panel: boolean\n readonly header: boolean\n readonly terminal: boolean\n} {\n const on = settings.enabled\n return {\n keys: on && settings.keysEnabled,\n menu: on && settings.menuEnabled,\n quick: on && settings.quickEnabled,\n panel: on && settings.panelEnabled,\n header: on && settings.headerEnabled,\n terminal: on && settings.terminalEnabled,\n }\n}\n\n/** \u8BBE\u7F6E\u9875\u300C\u952E\u4F4D\u300D\u4E00\u8282\u7684\u9884\u8BBE\u3002 */\nexport const SEND_PRESETS: readonly string[] = ['Enter', 'Ctrl+Enter', 'Alt+Enter', 'Shift+Enter']\nexport const NEWLINE_PRESETS: readonly string[] = ['Shift+Enter', 'Enter', 'Ctrl+Enter', 'Alt+Enter']\n\n/** \u53F3\u952E\u83DC\u5355\u6761\u76EE\uFF08\u987A\u5E8F\u5373\u663E\u793A\u987A\u5E8F\uFF1Bshortcut \u4E0E\u56FE\u7247\u4E00\u81F4\uFF09\u3002 */\nexport const MENU_ITEMS: readonly {\n readonly field: MenuField\n readonly label: string\n readonly shortcut: string\n}[] = [\n { field: 'menuUndo', label: '\u64A4\u9500', shortcut: 'Ctrl+Z' },\n { field: 'menuRedo', label: '\u91CD\u505A', shortcut: 'Ctrl+Y' },\n { field: 'menuCut', label: '\u526A\u5207', shortcut: 'Ctrl+X' },\n { field: 'menuCopy', label: '\u590D\u5236', shortcut: 'Ctrl+C' },\n { field: 'menuPaste', label: '\u7C98\u8D34', shortcut: 'Ctrl+V' },\n { field: 'menuDelete', label: '\u5220\u9664', shortcut: '' },\n { field: 'menuSelectAll', label: '\u5168\u9009', shortcut: 'Ctrl+A' },\n]\n\n/**\n * \u751F\u6210\u4E00\u4E2A\u7A33\u5B9A\u7684\u4F1A\u8BDD ID\uFF08UUID v4\uFF1B\u65E0 crypto \u65F6\u9000\u56DE\u7B49\u4EF7\u7684\u968F\u673A\u5341\u516D\u8FDB\u5236\uFF09\u3002\n * \u503C\u672C\u8EAB\u4E0D\u53C2\u4E0E\u9274\u6743\uFF0C\u53EA\u7528\u4E8E\u8BA9\u7F51\u5173\u628A\u540C\u4E00\u6BB5\u5BF9\u8BDD\u56FA\u5B9A\u5230\u540C\u4E00\u4E2A\u4E0A\u6E38\uFF0C\u6545 Math.random \u515C\u5E95\u53EF\u63A5\u53D7\u3002\n * @returns 36 \u5B57\u7B26\u7684 UUID \u5B57\u7B26\u4E32\u3002\n */\nexport function newSessionId(): string {\n const bag = globalThis as unknown as { crypto?: { randomUUID?: () => string } }\n if (typeof bag.crypto?.randomUUID === 'function') return bag.crypto.randomUUID()\n const hex = (count: number): string => Array.from(\n { length: count },\n () => Math.floor(Math.random() * 16).toString(16),\n ).join('')\n return `${hex(8)}-${hex(4)}-4${hex(3)}-a${hex(3)}-${hex(12)}`\n}\n\n/** \u89E3\u6790\u300C\u4F5C\u7528\u8DEF\u7531\u300D\u6587\u672C\uFF1A\u9017\u53F7 / \u7A7A\u683C / \u6362\u884C\u5206\u9694\uFF0C\u53BB\u91CD\u4FDD\u5E8F\u3002 */\nexport function parseRouteList(text: string): readonly string[] {\n const parts = text.split(/[\\s,\uFF0C\u3001]+/).map(item => item.trim()).filter(item => item !== '')\n return [...new Set(parts)]\n}\n\n/**\n * \u6BCF\u680F\u7684\"\u7528\u6237\u78B0\u8FC7\u6CA1\"\u5224\u636E\uFF08\u8FC1\u79FB\u89C4\u5219\u7528\uFF0C\u89C1\u6587\u4EF6\u4E0A\u65B9\u90A3\u6BB5\u8BF4\u660E\uFF09\u3002\n *\n * \u26A0\uFE0F \u5224\u636E\u5FC5\u987B\u662F\u300C**\u503C\u4E0D\u7B49\u4E8E\"\u4ECE\u6CA1\u78B0\u8FC7\"\u7684\u6837\u5B50**\u300D\uFF0C\u4E0D\u80FD\u662F\u300C\u952E\u5B58\u5728\u300D\uFF1A\n * `settings.get()` \u7ED9\u7684\u662F**\u5DF2\u89E3\u6790**\u7684\u503C\uFF08schema \u9ED8\u8BA4\u503C + \u7EC4\u5408 base + \u7528\u6237\u5C42\uFF09\uFF0C\n * \u6240\u4EE5\u4ECE\u6CA1\u78B0\u8FC7\u7684\u4EBA\u7684\u6587\u6863\u91CC\u4E5F\u7167\u6837\u6709 `sendKey: 'Enter'`\u3001`panelScroll: true` \u8FD9\u4E9B\u9ED8\u8BA4\u503C \u2014\u2014\n * \u6309\"\u952E\u5B58\u5728\"\u5224\u65AD\u4F1A\u8BA9\u5168\u65B0\u5B89\u88C5\u516D\u680F\u5168\u5F00\uFF0C\u4E0E\"\u9ED8\u8BA4\u5173\"\u6B63\u597D\u76F8\u53CD\u3002\n * \uFF08\u7B2C\u4E00\u7248\u5C31\u5199\u6210\u4E86\"\u952E\u5B58\u5728\"\uFF0C\u662F\u63A8\u7406 + \u6D4B\u8BD5\u5F53\u573A\u902E\u4F4F\u7684\uFF0C\u6CE8\u91CA\u7559\u5728\u8FD9\u91CC\u9632\u590D\u53D1\u3002\uFF09\n *\n * \u53E6\u5916\uFF1A\u5BBF\u4E3B\u534A\u81EA\u6301\u5B57\u6BB5\uFF08`terminalStatus` / `terminalCandidates` / `terminalEffective` /\n * `headerApplied*`\uFF09**\u4E0D\u8BB8**\u5F53\u5224\u636E \u2014\u2014 \u5B83\u4EEC\u662F\u63D2\u4EF6\u81EA\u5DF1\u5199\u7684\uFF0C\u5168\u65B0\u5B89\u88C5\u4E5F\u4F1A\u51FA\u73B0\u3002\n *\n * \u300C\u5FEB\u6377\u6307\u4EE4\u300D\u680F\u8FD8\u6709\u4E00\u4E2A\u6587\u6863\u91CC\u770B\u4E0D\u51FA\u6765\u7684\u4FE1\u53F7\uFF1A0.3.0 \u8D77\u6761\u76EE\u642C\u5230\u4E86 `quick-prompts.json`\uFF0C\n * \u7528\u8FC7\u7684\u4EBA\u548C\u6CA1\u7528\u8FC7\u7684\u4EBA\u7684\u8BBE\u7F6E\u6587\u6863\u53EF\u4EE5\u4E00\u6A21\u4E00\u6837\u3002\u90A3\u4E00\u6761\u7531\u5BBF\u4E3B\u534A\u8BFB\u6587\u4EF6\u540E**\u4E00\u6B21\u6027\u5199\u56DE\u6587\u6863**\n * \uFF08\u89C1 `src/host.ts` \u7684 `migrateQuickSection`\uFF09\uFF0C\u6240\u4EE5\u8FD9\u91CC\u53EA\u5269\"\u6587\u6863\u91CC\u7684\u5217\u8868\u88AB\u6539\u8FC7\"\u8FD9\u4E00\u6B21\u7EA7\u4FE1\u53F7\u3002\n */\nconst SECTION_SIGNALS: Readonly<Record<string, (source: Record<string, unknown>) => boolean>> = {\n [KEYS_ENABLED_FIELD]: source =>\n touched(source, SEND_KEY_FIELD, DEFAULT_SETTINGS.sendKey)\n || touched(source, NEWLINE_KEY_FIELD, DEFAULT_SETTINGS.newlineKey),\n // \u300C\u5B98\u65B9\u300D\uFF1D\u672C\u63D2\u4EF6\u4E0D\u4ECB\u5165\uFF0C\u7B49\u4EF7\u4E8E\u5173\uFF1B\u6240\u4EE5\u53EA\u6709\u9009\u8FC7\u53E6\u5916\u4E24\u6863\u624D\u7B97\"\u78B0\u8FC7\"\u3002\n // \uFF08`menuModeFrom` \u5BF9\"\u4E24\u4E2A\u952E\u90FD\u6CA1\u6709\"\u7ED9\u7684\u5C31\u662F 'official'\uFF0C\u5929\u7136\u6EE1\u8DB3\"\u7F3A\u7701 = \u9ED8\u8BA4\"\u3002\uFF09\n [MENU_ENABLED_FIELD]: source =>\n menuModeFrom(source[MENU_MODE_FIELD], source[MENU_NATIVE_FIELD]) !== 'official',\n [QUICK_ENABLED_FIELD]: source =>\n (Array.isArray(source[QUICK_PROMPTS_FIELD])\n && source[QUICK_PROMPTS_FIELD].length !== DEFAULT_QUICK_PROMPTS.length)\n || touched(source, OPTIMIZER_TIER_FIELD, DEFAULT_OPTIMIZER_TIER),\n [PANEL_ENABLED_FIELD]: source =>\n touched(source, PANEL_RESIZE_FIELD, true)\n || source[PANEL_WIDTH_FIELD] !== undefined\n || source[PANEL_HEIGHT_FIELD] !== undefined,\n [TERMINAL_ENABLED_FIELD]: source =>\n touched(source, TERMINAL_MODE_FIELD, DEFAULT_TERMINAL_MODE)\n || touched(source, TERMINAL_BASH_PATH_FIELD, ''),\n}\n\n/**\n * \u8FD9\u4E2A\u952E\u5728\u6587\u6863\u91CC**\u51FA\u73B0\u8FC7**\uFF0C\u4E14\u503C\u4E0D\u7B49\u4E8E\"\u4ECE\u6CA1\u78B0\u8FC7\u7684\u6837\u5B50\"\u3002\n *\n * \u4E24\u4E2A\u6761\u4EF6\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u800C\u4E14\u7B2C\u4E8C\u534A\u6781\u6613\u6F0F\uFF1A\u6587\u6863\u91CC\u6CA1\u6709\u8FD9\u4E2A\u952E\u65F6\u503C\u662F `undefined`\uFF0C\n * \u62FF\u5B83\u53BB\u6BD4\u9ED8\u8BA4\u503C\u4F1A\u5F97\u51FA\"\u4E0D\u76F8\u7B49 \u21D2 \u78B0\u8FC7\"\uFF08`'' !== 'Enter'`\u3001`undefined !== true` \u90FD\u662F\u771F\uFF09\uFF0C\n * \u4E8E\u662F\u5168\u65B0\u5B89\u88C5\u516D\u680F\u5168\u5F00 \u2014\u2014 \u4E0E\"\u9ED8\u8BA4\u5173\"\u6B63\u597D\u76F8\u53CD\u3002\u7B2C\u4E00\u7248\u5C31\u662F\u8FD9\u4E48\u5199\u7684\uFF0C\u88AB\u6D4B\u8BD5\u5F53\u573A\u902E\u4F4F\u3002\n */\nfunction touched(source: Record<string, unknown>, field: string, untouched: unknown): boolean {\n const value = source[field]\n return value !== undefined && value !== untouched\n}\n\n/**\n * \u7B97\u51FA\u4E00\u680F\u5F00\u5173\u7684\u503C\uFF1A\u663E\u5F0F\u5199\u8FC7\u5C31\u542C\u5B83\u7684\uFF0C\u5426\u5219\u6309\"\u7528\u6237\u78B0\u8FC7\u6CA1\"\u63A8\u65AD\u3002\n * @param field \u680F\u5F00\u5173\u5B57\u6BB5\u540D\u3002\n * @param source \u8BBE\u7F6E\u6587\u6863\uFF08\u89E3\u6790\u540E\u7684\u503C\uFF1B\u7F3A\u7701\u7684\u952E\u4F1A\u88AB schemastery \u7701\u6389\uFF0C\u6240\u4EE5 undefined \u5C31\u662F\"\u6CA1\u5199\u8FC7\"\uFF09\u3002\n * @returns \u8BE5\u680F\u662F\u5426\u751F\u6548\u3002\n */\nexport function sectionEnabledOf(field: string, source: Record<string, unknown>): boolean {\n const explicit = source[field]\n if (typeof explicit === 'boolean') return explicit\n const signal = SECTION_SIGNALS[field]\n return signal === undefined ? false : signal(source)\n}\n\n/** \u8BBE\u7F6E\u6570\u636E\u51C0\u5316\uFF1A\u628A\u7EBF\u4E0A\u503C\u6536\u7A84\u4E3A\u5B89\u5168\u5F62\u72B6\uFF08\u9632\u810F\u6570\u636E\uFF09\u3002 */\nexport function sanitizeSettings(value: unknown): ComposerUxSettings {\n const source = (typeof value === 'object' && value !== null ? value : {}) as Record<string, unknown>\n const asString = (field: string): string => {\n const v = source[field]\n return typeof v === 'string' && v.length > 0 && v.length <= 64 ? v : ''\n }\n const asText = (field: string, max: number): string => {\n const v = source[field]\n return typeof v === 'string' && v.length <= max ? v : ''\n }\n /**\n * \u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u4E13\u7528\uFF1A**\u8D85\u4E0A\u9650\u5C31\u622A\u65AD**\uFF0C\u800C\u4E0D\u662F\u50CF `asText` \u90A3\u6837\u6574\u4EFD\u4E22\u6389\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8FD9\u91CC\u4E0E headerName \u90A3\u6761\u76F8\u53CD\uFF1A\u5934\u540D\u975E\u6CD5\u662F\"\u5199\u8FDB\u53BB\u4F1A\u51FA\u7F51\u51FA\u9519\"\uFF0C\u4E22\u6389\u662F\u5BF9\u7684\uFF1B\n * \u800C\u63D0\u793A\u8BCD\u662F**\u7528\u6237\u81EA\u5DF1\u6572\u7684\u5185\u5BB9**\uFF0C\u9759\u9ED8\u4E22\u5F03\u7B49\u4E8E\u628A\u4ED6\u7684\u5DE5\u4F5C\u5F04\u6CA1\u4E86\u3002\u622A\u65AD\u81F3\u5C11\u7559\u5F97\u4E0B\u5927\u534A\uFF0C\n * \u4E14\u8BBE\u7F6E\u9875\u91CC\u5F53\u573A\u770B\u5F97\u89C1\u88AB\u622A\u65AD\u540E\u7684\u6837\u5B50\uFF08textarea \u6709 maxLength\uFF0C\u6B63\u5E38\u6839\u672C\u8D70\u4E0D\u5230\u8FD9\u91CC\uFF0C\n * \u53EA\u6709\u624B\u6539 settings.yaml \u624D\u4F1A\uFF09\u3002\n */\n const asPrompt = (field: string, max: number): string => {\n const v = source[field]\n return typeof v === 'string' ? v.slice(0, max) : ''\n }\n const asBool = (field: string): boolean => {\n const v = source[field]\n return typeof v === 'boolean' ? v : (DEFAULT_SETTINGS as unknown as Record<string, unknown>)[field] as boolean\n }\n const asSize = (field: string): number | undefined => {\n const v = source[field]\n return typeof v === 'number' && Number.isFinite(v) && v >= 320 && v <= 4000 ? Math.round(v) : undefined\n }\n /**\n * \u51C0\u5316\u5FEB\u6377\u6307\u4EE4\u5217\u8868\uFF1A\u9010\u6761\u6536\u7A84\u5F62\u72B6\uFF0C\u4E22\u6389\u6B8B\u7F3A\u9879\uFF0C\u5E76\u6309 id \u53BB\u91CD\u4FDD\u5E8F\u3002\n * \u5B57\u6BB5\u7F3A\u5931 / \u4E0D\u662F\u6570\u7EC4\uFF08\u9996\u6B21\u542F\u7528\uFF09\u2192 \u56DE\u843D\u5230\u5185\u7F6E 9 \u6761\uFF1B\u5B57\u6BB5\u662F\u6570\u7EC4\u5C31\u7167\u5B83\u6765\uFF0C\n * \u7A7A\u6570\u7EC4\u4E5F\u662F\u5408\u6CD5\u72B6\u6001\uFF08\u7528\u6237\u628A\u6761\u76EE\u5168\u5220\u5149\uFF0C\u5C31\u5E94\u5F53\u4FDD\u6301\u5168\u7A7A\uFF0C\u4E0D\u518D\u81EA\u52A8\u5192\u51FA\u6765\uFF09\u3002\n */\n const asQuickPrompts = (): readonly QuickPrompt[] => {\n const raw = source[QUICK_PROMPTS_FIELD]\n if (!Array.isArray(raw)) return DEFAULT_QUICK_PROMPTS\n const seen = new Set<string>()\n const out: QuickPrompt[] = []\n for (const item of raw) {\n if (out.length >= QUICK_PROMPT_MAX) break\n if (typeof item !== 'object' || item === null) continue\n const row = item as Record<string, unknown>\n const prompt = typeof row.prompt === 'string' ? row.prompt.slice(0, QUICK_TEXT_MAX).trim() : ''\n if (prompt === '') continue\n const label = typeof row.label === 'string' ? row.label.slice(0, QUICK_LABEL_MAX).trim() : ''\n const id = typeof row.id === 'string' && row.id !== '' ? row.id.slice(0, 64) : newQuickPromptId()\n if (seen.has(id)) continue\n seen.add(id)\n out.push({\n id,\n label: label === '' ? prompt.slice(0, 12) : label,\n prompt,\n always: row.always === true,\n firstOnly: row.firstOnly === true,\n })\n }\n return out\n }\n const asTier = (): OptimizerTier => {\n const v = source[OPTIMIZER_TIER_FIELD]\n return v === 'basic' || v === 'advanced' || v === 'extreme' ? v : DEFAULT_OPTIMIZER_TIER\n }\n return {\n enabled: asBool(ENABLED_FIELD),\n // \u4E94\u680F\u5F00\u5173\uFF1A\u663E\u5F0F\u5199\u8FC7\u542C\u5B83\u7684\uFF0C\u5426\u5219\u6309\"\u7528\u6237\u78B0\u8FC7\u6CA1\"\u8FC1\u79FB\uFF08\u89C1 sectionEnabledOf\uFF09\u3002\n keysEnabled: sectionEnabledOf(KEYS_ENABLED_FIELD, source),\n menuEnabled: sectionEnabledOf(MENU_ENABLED_FIELD, source),\n quickEnabled: sectionEnabledOf(QUICK_ENABLED_FIELD, source),\n panelEnabled: sectionEnabledOf(PANEL_ENABLED_FIELD, source),\n terminalEnabled: sectionEnabledOf(TERMINAL_ENABLED_FIELD, source),\n sendKey: asString(SEND_KEY_FIELD),\n newlineKey: asString(NEWLINE_KEY_FIELD),\n menuUndo: asBool('menuUndo'),\n menuRedo: asBool('menuRedo'),\n menuCut: asBool('menuCut'),\n menuCopy: asBool('menuCopy'),\n menuPaste: asBool('menuPaste'),\n menuDelete: asBool('menuDelete'),\n menuSelectAll: asBool('menuSelectAll'),\n menuMode: menuModeFrom(source[MENU_MODE_FIELD], source[MENU_NATIVE_FIELD]),\n panelResize: asBool(PANEL_RESIZE_FIELD),\n panelWidth: asSize(PANEL_WIDTH_FIELD),\n panelHeight: asSize(PANEL_HEIGHT_FIELD),\n headerEnabled: asBool(HEADER_ENABLED_FIELD),\n // \u5934\u540D\u7559\u7A7A\u662F\u4E0D\u5408\u6CD5\u72B6\u6001\uFF08\u5BBF\u4E3B\u534A\u4F1A\u62D2\u7EDD\u5199\u5165\u5E76\u628A\u539F\u56E0\u5199\u8FDB headerStatus\uFF09\uFF0C\n // \u6545\u51C0\u5316\u53EA\u505A\u957F\u5EA6\u6536\u7A84\u3001\u4FDD\u7559\u539F\u6837\uFF0C\u8BA9\u7528\u6237\u770B\u5F97\u89C1\u81EA\u5DF1\u8F93\u9519\u4E86\u4EC0\u4E48\u3002\n headerName: asText(HEADER_NAME_FIELD, HEADER_NAME_MAX),\n headerValue: asText(HEADER_VALUE_FIELD, HEADER_VALUE_MAX),\n headerRoutes: asText(HEADER_ROUTES_FIELD, HEADER_VALUE_MAX),\n headerAppliedName: asText(HEADER_APPLIED_NAME_FIELD, HEADER_NAME_MAX),\n headerAppliedValue: asText(HEADER_APPLIED_VALUE_FIELD, HEADER_VALUE_MAX),\n headerStatus: asText(HEADER_STATUS_FIELD, HEADER_VALUE_MAX),\n quickPrompts: asQuickPrompts(),\n optimizerTier: asTier(),\n optimizerPromptBasic: asPrompt(OPTIMIZER_PROMPT_FIELDS.basic, OPTIMIZER_PROMPT_MAX),\n optimizerPromptAdvanced: asPrompt(OPTIMIZER_PROMPT_FIELDS.advanced, OPTIMIZER_PROMPT_MAX),\n optimizerPromptExtreme: asPrompt(OPTIMIZER_PROMPT_FIELDS.extreme, OPTIMIZER_PROMPT_MAX),\n terminalMode: terminalModeFrom(source[TERMINAL_MODE_FIELD]),\n // \u8DEF\u5F84\u53EA\u505A\u957F\u5EA6\u4E0E\u5F52\u4E00\u5316\u6536\u7A84\uFF0C\u4E0D\u5728\u8FD9\u91CC\u5224\"\u5B58\u4E0D\u5B58\u5728\"\u2014\u2014\u90A3\u662F\u5BBF\u4E3B\u534A\u7684\u63A2\u6D4B\u7ED3\u8BBA\uFF0C\n // \u7531\u72B6\u6001\u884C\u544A\u8BC9\u7528\u6237\uFF08\u7528\u6237\u770B\u5F97\u89C1\u81EA\u5DF1\u586B\u4E86\u4EC0\u4E48\uFF0C\u6BD4\u6084\u6084\u6E05\u7A7A\u597D\uFF09\u3002\n terminalBashPath: asText(TERMINAL_BASH_PATH_FIELD, 400),\n terminalCandidates: sanitizeTerminalCandidates(source[TERMINAL_CANDIDATES_FIELD]),\n terminalStatus: asText(TERMINAL_STATUS_FIELD, 400),\n terminalEffective: asText(TERMINAL_EFFECTIVE_FIELD, 16),\n }\n}\n", "/**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684\u5BBF\u4E3B\u534A\uFF1A\u63A2\u6D4B \u2192 \u51B3\u7B56 \u2192 **\u6309\u4F1A\u8BDD\u4E0B\u53D1** \u2192 \u72B6\u6001\u56DE\u5199 \u2192 \u7ED9\u8BBE\u7F6E\u9875\u4E00\u4E2A\u67E5\u8BE2\u63A5\u53E3\u3002\n *\n * \u4E3A\u4EC0\u4E48\u662F\"\u6309\u4F1A\u8BDD\u4E0B\u53D1\"\u800C\u4E0D\u662F\"\u5168\u5C40\u9690\u85CF pwsh\"\uFF1A\u5B98\u65B9 `tools.restrict()` \u5728**\u5168\u5C40\u4E0A\u4E0B\u6587\u4F1A\u76F4\u63A5\u629B\u9519**\n * \uFF08`packages/core/tools/src/index.ts:1077`\uFF0C\u539F\u6587\uFF1Aa context-global restriction would mask every agent\n * \u2014 deny the tool for the intended agent instead\uFF09\u3002\u6240\u4EE5\u6B63\u786E\u505A\u6CD5\u53EA\u6709\u4E00\u6761\uFF1A\u5728\u8BE5 agent \u81EA\u5DF1\u7684 scope \u91CC\n * restrict\u3002\u4E3A\u4E86\u8BA9\"\u6539\u5B8C\u8BBE\u7F6E\u7ACB\u523B\u751F\u6548\"\uFF0C\u8FD9\u91CC\u5728\u8BBE\u7F6E\u53D8\u5316\u65F6**\u904D\u5386\u6240\u6709\u5728\u8DD1 agent** \u91CD\u65B0\u4E0B\u53D1 \u2014\u2014 \u8FD9\u6B63\u662F\n * \u5B98\u65B9 fixture \u7684\u5199\u6CD5\uFF08`packages/subagent/.../scoped-tool-subagent.ts`\uFF1A`ctx.on('agent/created')`\n * + `for (const agent of ctx.agents.list()) install(agent)`\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u5FC5\u518D\u5199 `system-prompt/assemble` \u8FC7\u6EE4\u5668\uFF1A\u5DE5\u5177\u6CE8\u518C\u8868**\u81EA\u5DF1**\u628A schema \u5582\u7ED9\u63D0\u793A\u8BCD\n * \uFF08`packages/core/tools/src/index.ts:834` \u2192 `systemPrompt.tools(context => this.wireSchemas(context.scope))`\uFF09\uFF0C\n * \u800C `wireSchemas(scope)` \u53D6\u7684\u662F\"\u53EF\u89C1\uFF08\u5DF2\u8FC7\u6EE4\uFF09\"\u7684 schema \u2014\u2014 \u6240\u4EE5 deny \u4F1A\u540C\u65F6\u4ECE**\u53EF\u8C03\u7528\u6CE8\u518C\u8868**\n * \u4E0E**\u63D0\u793A\u8BCD\u5DE5\u5177\u5217\u8868**\u91CC\u6D88\u5931\u3002\n *\n * \u5931\u8D25\u4E00\u5F8B\"\u53EA\u964D\u7EA7\u3001\u4E0D\u4F24\u4F1A\u8BDD\"\uFF08A \u7684\u505A\u6CD5\uFF09\uFF1Arestrict \u5931\u8D25\uFF08\u4F8B\u5982\u8BE5 agent \u672C\u6765\u5C31\u770B\u4E0D\u5230 pwsh\uFF09\n * \u53EA\u8BB0\u4E00\u884C\u539F\u56E0\uFF1Bregister \u5931\u8D25\u53EA\u8BB0\u539F\u56E0\uFF1B\u4E24\u79CD\u60C5\u51B5\u90FD\u4E0D\u629B\u3001\u4E0D veto \u522B\u7684\u63D2\u4EF6\u3002\n */\nimport { existsSync, readdirSync } from 'node:fs'\nimport { isAbsolute, sep } from 'node:path'\nimport type { DiscoverResult } from './discover.ts'\nimport {\n TERMINAL_BASH_PATH_FIELD, TERMINAL_CANDIDATES_FIELD, TERMINAL_EFFECTIVE_FIELD,\n TERMINAL_MODE_FIELD, TERMINAL_STATUS_FIELD, activeBashPath, candidatesToStored, probeBash,\n sanitizeTerminalCandidates, terminalModeFrom, terminalStatusText,\n type TerminalCandidate, type TerminalMode,\n} from './contracts.ts'\nimport { BASH_SECTION_TEXT, PROBE_TIMEOUT_MS, TOOL_BASH_SECTION_ORDER, TOOL_PWSH_SECTION_ORDER, createBashTool, probeBashExecution } from './tool.ts'\nimport type { BashToolDeps, ProbeOutcome, ToolDefinitionLike, ToolRunContextLike } from './tool.ts'\nimport { TERMINAL_ENABLED_FIELD, sectionEnabledOf } from '../settings-contract.ts'\n\n/**\n * \u8FD9\u4E00\u680F\u6CA1\u542F\u7528\uFF08\u6216\u603B\u5F00\u5173\u5173\u7740\uFF09\u65F6\u5199\u8FDB\u72B6\u6001\u884C\u7684\u90A3\u53E5\u8BDD\u3002\n *\n * \u5199\u72B6\u6001\u884C\u800C\u4E0D\u662F\u4EC0\u4E48\u90FD\u4E0D\u5199\uFF1A\u8BBE\u7F6E\u9875\u90A3\u884C\u53EA\u8BFB\u6587\u5B57\u662F\u7528\u6237\u5224\u65AD\"\u5230\u5E95\u751F\u6548\u4E86\u6CA1\"\u7684\u552F\u4E00\u4F9D\u636E\uFF0C\n * \u7559\u7A7A\u4F1A\u88AB\u8BFB\u6210\"\u8FD8\u6CA1\u63A2\u6D4B\"\u3002\n */\nexport const TERMINAL_OFF_TEXT = '\u672A\u542F\u7528\uFF1A\u6253\u5F00\u8FD9\u4E00\u680F\u7684\u5F00\u5173\u540E\u624D\u4F1A\u63A5\u7BA1\uFF08\u73B0\u5728\u4FDD\u6301 PowerShell\uFF09'\n\n/** \u5BBF\u4E3B\u534A\u7528\u5230\u7684 settings \u80FD\u529B\uFF08\u4E0E src/host.ts \u540C\u4E00\u5957\u7ED3\u6784\u7A84\u5316\uFF09\u3002 */\nexport interface SettingsLike {\n get(ns: string): unknown\n mutate(ns: string, ops: readonly (\n | { op: 'set'; path: readonly string[]; value: unknown }\n | { op: 'unset'; path: readonly string[] }\n )[]): Promise<void>\n}\n\n/** \u5DE5\u5177\u9762\uFF08\u53EA\u53D6\u672C\u63D2\u4EF6\u7528\u5F97\u5230\u7684\u4E24\u4EF6\u4E8B\uFF09\u3002 */\ninterface ToolServiceLike {\n register(definition: unknown): (() => void) | undefined\n restrict(filter: { deny?: readonly string[]; allow?: readonly string[] }): (() => void) | undefined\n}\n\n/** \u63D0\u793A\u8BCD\u9762\u3002 */\ninterface PromptServiceLike {\n section(section: { name: string; order: number; text: string }): (() => void) | undefined\n}\n\n/** agent \u81EA\u5DF1 scope \u4E0A\u7684\u4E0A\u4E0B\u6587\uFF08\u5B98\u65B9\u6A21\u677F `const scoped = agent.ctx` \u76F4\u63A5\u53D6\uFF09\u3002 */\ninterface ScopedLike {\n readonly tools?: ToolServiceLike\n readonly systemPrompt?: PromptServiceLike\n /** \u4F5C\u7528\u57DF\u4E8B\u4EF6\uFF1A\u6CE8\u518C\u5728 agent.ctx \u4E0A\u7684 `system-prompt/assemble` \u53EA\u6536\u5230\u8BE5 agent \u7684\u88C5\u914D\u3002 */\n on?(event: string, listener: (...args: never[]) => unknown): (() => void) | undefined\n}\n\n/** \u4E00\u4E2A\u6D3B\u7740\u7684 agent\uFF08\u53EA\u53D6\u672C\u63D2\u4EF6\u7528\u5F97\u5230\u7684\u90E8\u5206\uFF09\u3002 */\ninterface AgentLike {\n readonly ctx: ScopedLike\n}\n\ninterface AgentsLike {\n list(): readonly AgentLike[]\n}\n\n/** \u5BBF\u4E3B\u534A\u9700\u8981\u7684\u670D\u52A1\u96C6\u5408\u3002 */\ninterface CtxLike {\n get(name: string): unknown\n /** \u4E8B\u4EF6\u63A5\u7EBF\uFF1B\u771F\u5B9E cordis \u4E0A\u4E0B\u6587\u4E00\u5B9A\u6709\uFF0C\u6D4B\u8BD5\u66FF\u8EAB\u53EF\u80FD\u6CA1\u6709\uFF08\u6CA1\u6709\u65F6\u964D\u7EA7\u5E76\u5728\u72B6\u6001\u884C\u8BF4\u660E\uFF09\u3002 */\n on?(event: string, listener: (...args: never[]) => void): unknown\n inject?(deps: string[], callback: (ctx: CtxLike) => void): unknown\n effect?(callback: () => unknown, label?: string): unknown\n webServer: {\n register(route: { kind: 'exact' | 'prefix'; path: string; handler: unknown }): () => void\n }\n}\n\n/** \u6BCF\u4E2A agent \u7684\u4E0B\u53D1\u8BB0\u8D26\u3002 */\ninterface Installed {\n readonly path: string\n readonly dispose: () => void\n /** \u4E0B\u53D1\u65F6\u9047\u5230\u7684\u95EE\u9898\uFF08\u7B2C\u4E00\u6761\uFF09\uFF0C\u7528\u4E8E\u72B6\u6001\u884C\u5982\u5B9E\u8BF4\u660E\u3002 */\n readonly failure?: string\n /** \u826F\u6027\u8DF3\u8FC7\uFF08\u4F8B\u5982\u8BE5 agent \u5DF2\u7EE7\u627F\u7236\u5C42\u7684\u5904\u7406\u7ED3\u679C\uFF09\u2014\u2014 \u4E0D\u7B97\u5931\u8D25\uFF0C\u53EA\u5728\u6392\u969C\u65F6\u6709\u7528\u3002 */\n readonly skipped?: string\n}\n\n/** \u53D6\u666E\u901A\u5BF9\u8C61\u3002 */\nfunction objectOf(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n}\n\n/** \u53D6\u5B57\u7B26\u4E32\u3002 */\nfunction textOf(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\n/** \u9519\u8BEF \u2192 \u4E00\u884C\u3002 */\nfunction errorText(error: unknown): string {\n return error instanceof Error && error.message !== '' ? error.message : String(error)\n}\n\n/**\n * \u88C5\u4E0A\u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u5B50\u7CFB\u7EDF\u3002\n *\n * @param ctx \u5BBF\u4E3B\u534A\u4E0A\u4E0B\u6587\uFF08\u7EC4\u5408\u5C42\uFF09\u3002\n * @param namespace \u672C\u63D2\u4EF6\u7684 settings \u547D\u540D\u7A7A\u95F4\u3002\n * @param settings settings \u670D\u52A1\uFF08\u7F3A\u5E2D\u65F6\u53EA\u6302\u72B6\u6001\u8DEF\u7531\uFF0C\u4E0D\u63A5\u7BA1\u7EC8\u7AEF\uFF09\u3002\n * @param readToolDeps \u91C7\u96C6\u5DE5\u5177\u8FD0\u884C\u6240\u9700\u7684\u5BBF\u4E3B\u670D\u52A1\uFF1B`subprocess` \u7F3A\u5E2D\u65F6\u8FD4\u56DE undefined\uFF08\u964D\u7EA7\u4E3A\u53EA\u538B\u5236 pwsh\uFF09\u3002\n */\nexport function installTerminalPolicy(\n ctx: CtxLike,\n namespace: string,\n settings: SettingsLike | undefined,\n readToolDeps: () => BashToolDeps | undefined,\n options: {\n /** \u5E73\u53F0\uFF08\u9ED8\u8BA4 process.platform\uFF1B\u6D4B\u8BD5\u7528\u6765\u8D70\u975E Windows \u5206\u652F\uFF09\u3002 */\n readonly platform?: string\n /** \u63A2\u6D4B\uFF08\u9ED8\u8BA4\u8BFB\u771F\u5B9E PATH \u4E0E\u6587\u4EF6\u7CFB\u7EDF\uFF1B\u6D4B\u8BD5\u6CE8\u5165\u5047\u7ED3\u679C\uFF09\u3002 */\n readonly discover?: (explicitPath: string) => DiscoverResult\n /** \u5B58\u5728\u6027\u5224\u5B9A\uFF08\u9ED8\u8BA4 existsSync\uFF09\u3002 */\n readonly exists?: (path: string) => boolean\n /**\n * \u63A5\u7BA1\u524D\u7684\u81EA\u68C0\u63A2\u9488\uFF08\u9ED8\u8BA4 {@link probeBashExecution}\uFF1A\u8D70\u4E0E\u771F\u5DE5\u5177\u5B8C\u5168\u76F8\u540C\u7684\u6267\u884C\u8DEF\u5F84\uFF09\u3002\n *\n * \u53EA\u5728**\u53D7\u9650\u6A21\u5F0F**\u4E0B\u624D\u4F1A\u88AB\u8C03\u7528\uFF08`danger-full-access` \u8DF3\u8FC7 confine\uFF0C\u5B9E\u6D4B\u90A3\u6761\u8DEF\u5F84\u6B63\u5E38\uFF09\u3002\n * \u53EF\u6CE8\u5165\uFF1A\u6D4B\u8BD5\u7528\u5B83\u628A\"\u63A2\u9488\u4E0D\u8FC7\"\u8FD9\u4E00\u652F\u53D8\u6210\u786E\u5B9A\u6027\u8F93\u5165\u3002\n */\n readonly probe?: (\n deps: BashToolDeps,\n options: { readonly bashPath: string; readonly sep?: string; readonly isAbsolute?: (path: string) => boolean },\n exec: ToolRunContextLike,\n ) => Promise<ProbeOutcome>\n } = {},\n): void {\n const platform = options.platform ?? process.platform\n const isWindows = platform === 'win32'\n const existsFn = options.exists ?? existsSync\n const installed = new Map<AgentLike, Installed>()\n let lastStatus = ''\n let lastEffective = ''\n let lastCandidates = ''\n let failure = ''\n /**\n * \u4E0A\u4E00\u8F6E\"\u6CA1\u80FD\u771F\u7684\u6362\u4E0A\"\u7684\u539F\u56E0\uFF08\u4F8B\u5982 `tools.register` \u5931\u8D25\uFF09\u3002\n *\n * \u4E0E `failure` \u5206\u5F00\u8BB0\uFF1A`failure` \u662F\"\u8FD9\u4E2A\u5B50\u7CFB\u7EDF\u672C\u8EAB\u4E0D\u5065\u5168\"\uFF08\u4F8B\u5982\u4E0A\u4E0B\u6587\u6CA1\u6709\u4E8B\u4EF6\u80FD\u529B\uFF09\uFF0C\n * \u8FD9\u91CC\u662F\"\u8BBE\u7F6E\u8BF4\u8981\u7528 bash\u3001\u5019\u9009\u4E5F\u6709\uFF0C\u4F46\u67D0\u4E2A agent \u90A3\u4FA7\u6CA1\u88C5\u4E0A\" \u2014\u2014 \u540E\u8005\u5FC5\u987B\u8BA9\n * `terminalEffective` \u56DE\u843D\u6210 pwsh\uFF0C\u5426\u5219\u72B6\u6001\u884C\u662F\u5728\u8BF4\u8C0E\uFF08\u8BE6\u89C1 install \u7684\u6536\u5C3E\u56DE\u6EDA\uFF09\u3002\n */\n let lastDeliveryFailure = ''\n let busy = false\n let again = false\n /**\n * \u81EA\u68C0\u7ED3\u8BBA\u7F13\u5B58\uFF1A\u952E\u662F `<bashPath>|<\u6C99\u7BB1\u6A21\u5F0F>`\u3002\n *\n * \u952E\u53D8\u4E86\uFF08\u6362\u8DEF\u5F84 / \u6362\u6587\u4EF6\u7B56\u7565\uFF09\u5C31\u91CD\u63A2 \u2014\u2014 \u8FD9\u6B63\u662F\u7528\u6237\u4ECE\u53D7\u9650\u6A21\u5F0F\u5207\u5230 `danger-full-access`\n * \uFF08\u6216\u53CD\u8FC7\u6765\uFF09\u540E\u80FD\u81EA\u6108\u7684\u8DEF\u5F84\u3002\u8BBE\u7F6E\u6539\u52A8\u4F1A\u91CD\u8F7D\u63D2\u4EF6\u3001\u7F13\u5B58\u968F\u4E4B\u6E05\u96F6\uFF0C\u6240\u4EE5\u4E0D\u4F1A\u957F\u671F\u5361\u5728\u65E7\u7ED3\u8BBA\u4E0A\u3002\n */\n let probeKey = ''\n let probeOutcome: ProbeOutcome | undefined\n\n /** \u8D70\u4E00\u904D\u63A2\u6D4B\uFF08\u552F\u4E00\u78B0 node API \u7684\u5730\u65B9\u90FD\u5728\u8FD9\u91CC\uFF09\u3002 */\n const discover = options.discover ?? ((explicitPath: string): DiscoverResult => probeBash(\n explicitPath,\n process.env.PATH ?? '',\n name => process.env[name],\n path => existsFn(path),\n // \u53EA\u8BFB\u5B50\u76EE\u5F55\u540D\uFF08\u5E26\u7248\u672C\u53F7\u7684\u6765\u6E90\uFF1AGitHub Desktop \u7684 app-*\u3001\u65E7 GitHub \u7684 PortableGit_*\u3001VS \u7684\u5E74\u4EFD/\u7248\u672C\uFF09\uFF1B\n // \u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6CA1\u6743\u9650\u4E00\u5F8B\u5F53\u7A7A\uFF0C\u63A2\u6D4B\u5C31\u9000\u5316\u6210\u7EAF\u5B58\u5728\u6027\u68C0\u67E5\u3002\n parent => {\n try {\n return readdirSync(parent, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n } catch {\n return []\n }\n },\n ))\n\n /**\n * \u5728\u4E00\u4E2A agent \u81EA\u5DF1\u7684 scope \u91CC\u4E0B\u53D1\uFF1A\u538B\u5236 pwsh + \u6CE8\u518C bash + \u6362\u63D0\u793A\u8BCD\u6BB5\u3002\n * @param agent \u76EE\u6807 agent\u3002\n * @param bashPath \u8FD9\u4E00\u8F6E\u751F\u6548\u7684 bash \u8DEF\u5F84\uFF08\u6362\u8DEF\u5F84\u65F6\u4F1A\u91CD\u65B0\u4E0B\u53D1\uFF09\u3002\n * @returns \u8BB0\u8D26\uFF1B\u62FF\u4E0D\u5230 scoped \u670D\u52A1\u65F6\u8FD4\u56DE undefined\u3002\n */\n const install = (agent: AgentLike, bashPath: string): Installed | undefined => {\n const scoped: ScopedLike = agent.ctx\n const cleanups: (() => void)[] = []\n /** \u771F\u5931\u8D25\uFF08\u8981\u56DE\u6EDA\u3001\u8981\u8FDB\u72B6\u6001\u884C\u7684\u90A3\u4E9B\uFF09\u3002 */\n const notes: string[] = []\n /** \u826F\u6027\u8DF3\u8FC7\uFF08\u4F8B\u5982\u5B50\u4EE3\u7406\u5DF2\u7EE7\u627F\u7236\u5C42\u7684\u5904\u7406\u7ED3\u679C\uFF09\u3002**\u4E0D\u7B97\u5931\u8D25**\uFF0C\u4E0D\u8FDB\u72B6\u6001\u884C\u3002 */\n const skips: string[] = []\n\n // 1) \u538B\u6389\u9884\u8BBE\u7684 pwsh\u3002\u540D\u5B57\u5FC5\u987B\u5DF2\u5728\u5168\u5C40\u6CE8\u518C\u8868\u91CC\uFF0C\u5426\u5219\u5B98\u65B9\u4F1A\u629B\n // `names unknown global tool \"pwsh\"` \u2014\u2014 \u90A3\u79CD\u60C5\u51B5\u8BF4\u660E\u8BE5 agent \u672C\u6765\u5C31\u770B\u4E0D\u5230 pwsh\uFF0C\n // \u8BB0\u4E00\u884C\u539F\u56E0\u8DF3\u8FC7\u5373\u53EF\uFF08A \u7684\u65E5\u5FD7\u91CC\u4E5F\u662F\u8FD9\u4E48\u5904\u7406\u7684\uFF09\u3002\n try {\n const lift = scoped.tools?.restrict({ deny: ['pwsh'] })\n if (typeof lift === 'function') cleanups.push(lift)\n } catch (error: unknown) {\n skips.push(`restrict(pwsh) \u8DF3\u8FC7\uFF1A${errorText(error)}`)\n }\n\n // 2) \u6CE8\u518C bash \u5DE5\u5177\u3002\u6CE8\u518C\u5728**\u8BE5 agent \u81EA\u5DF1\u7684 scope**\uFF1Arestrict \u53EA\u4F5C\u7528\u4E8E\u5168\u5C40\u5DE5\u5177\uFF0C\n // \u4E0D\u4F1A\u9690\u85CF\u81EA\u8EAB\u6CE8\u518C\uFF08\u5B98\u65B9 view() \u7684\u8BED\u4E49\uFF09\u3002\n // `registered` \u662F\"\u6574\u5957\u6362\u4E0A\"\u7684\u552F\u4E00\u51ED\u636E\uFF1A\u62FF\u4E0D\u5230 disposer \u5C31\u7B49\u4E8E\u6CA1\u88C5\u4E0A\uFF0C\n // \u6B64\u65F6\u7B2C 1 \u6B65\u7684 restrict \u5FC5\u987B\u56DE\u6EDA\uFF08\u89C1\u4E0B\u9762\u6536\u5C3E\u90A3\u6BB5\uFF09\u3002\n let registered = false\n try {\n const deps = readToolDeps()\n if (deps === undefined) {\n notes.push('\u5BBF\u4E3B\u6CA1\u6709 subprocess \u670D\u52A1\uFF0C\u65E0\u6CD5\u6CE8\u518C bash')\n } else {\n const definition = createBashTool(deps, { bashPath, sep, isAbsolute })\n const unregister = scoped.tools?.register(definition as ToolDefinitionLike)\n if (typeof unregister === 'function') {\n cleanups.push(unregister)\n registered = true\n } else {\n notes.push('tools.register \u6CA1\u6709\u8FD4\u56DE disposer\uFF08\u8FD9\u4E00\u7248\u7684\u6CE8\u518C\u9762\u4E0D\u53EF\u7528\uFF09')\n }\n }\n } catch (error: unknown) {\n notes.push(`\u6CE8\u518C bash \u5931\u8D25\uFF1A${errorText(error)}`)\n }\n\n // 3) \u63D0\u793A\u8BCD\uFF1A\u52A0 bash \u7684\u90A3\u53E5\uFF08\u5B98\u65B9 `tool:bash` \u6BB5\uFF09\uFF0C\u5E76\u5728**\u672C scope \u7684\u88C5\u914D**\u91CC\n // \u6458\u6389\u9884\u8BBE\u7684 `tool:pwsh` \u6BB5\u3002\u7528\u7011\u5E03\u800C\u4E0D\u662F\"\u6CE8\u518C\u7A7A\u540C\u540D\u6BB5\"\uFF1A\u5B98\u65B9\u660E\u786E\n // \u300C\u6BB5\u540D\u552F\u4E00\u3001\u91CD\u590D\u6CE8\u518C\u4F1A\u629B\u300D\uFF0C\u800C\u6309\u540D\u5B57\u8FC7\u6EE4 sections \u662F\u5B98\u65B9\u73B0\u6210\u505A\u6CD5\n // \uFF08`browser-use-runtime` \u7684 mcp.ts \u5C31\u662F\u8FD9\u4E48\u6458\u6389\u81EA\u5DF1\u90A3\u6BB5\uFF09\u3002\n try {\n const bashSection = scoped.systemPrompt?.section({\n name: 'tool:bash', order: TOOL_BASH_SECTION_ORDER, text: BASH_SECTION_TEXT,\n })\n if (typeof bashSection === 'function') cleanups.push(bashSection)\n const dropPwsh = scoped.on?.('system-prompt/assemble', (async (\n _assembly: unknown, _context: unknown, next: () => Promise<{ sections: { name: string }[] }>,\n ) => {\n const assembly = await next()\n return { ...assembly, sections: assembly.sections.filter(section => section.name !== 'tool:pwsh') }\n }) as never)\n if (typeof dropPwsh === 'function') cleanups.push(dropPwsh)\n } catch (error: unknown) {\n notes.push(`\u63D0\u793A\u8BCD\u6BB5\u5931\u8D25\uFF1A${errorText(error)}`)\n }\n\n // \u6536\u5C3E\uFF1A**\u8981\u4E48\u6574\u5957\u6362\u4E0A\u3001\u8981\u4E48\u4E00\u70B9\u4E0D\u6362**\u3002\n //\n // bash \u6CA1\u6CE8\u518C\u4E0A\u5C31\u4E0D\u80FD\u7559\u7740 pwsh \u7684\u538B\u5236 \u2014\u2014 \u5426\u5219\u8BE5\u4F1A\u8BDD\u53D8\u6210\u300Cpwsh \u88AB\u6321\u4F4F + bash \u4E0D\u5728\u300D\uFF0C\n // \u4E00\u4E2A shell \u5DE5\u5177\u90FD\u8C03\u4E0D\u5230\uFF0C\u800C\u72B6\u6001\u884C\u8FD8\u4F1A\u8BF4\"\u5DF2\u751F\u6548\"\u3002\u8FD9\u4E00\u6B65\u662F A \u7684\u5B9E\u73B0\u91CC\u4E13\u95E8\u505A\u7684\u56DE\u6EDA\n // \uFF08`git-bash-terminal-tool/src/host/replace.ts` \u6CE8\u518C\u5931\u8D25\u65F6\u8C03 `releaseRestriction()`\uFF0C\n // \u6CE8\u91CA\u539F\u8BDD\u662F\"\u907F\u514D\u7559\u4E0B\u300E\u4E24\u4E2A\u90FD\u770B\u4E0D\u89C1\u300F\u7684\u574F\u72B6\u6001\"\uFF09\u3002\n //\n // \u6CE8\u610F\u533A\u5206\uFF1A\u7B2C 1 \u6B65 `restrict` \u81EA\u5DF1\u629B\u9519\uFF08\u5B50\u4EE3\u7406\u5DF2\u7EE7\u627F\u7236\u5C42\u7684\u5904\u7406\u7ED3\u679C\uFF09\u5C5E\u4E8E\u826F\u6027\u8DF3\u8FC7\uFF0C\n // \u90A3\u79CD\u60C5\u51B5\u4F1A\u5E26\u7740 `skips` \u8D70\u5230\u4E0B\u9762\u6B63\u5E38\u8FD4\u56DE\uFF0C\u4E0D\u4F1A\u89E6\u53D1\u8FD9\u6761\u56DE\u6EDA\u3002\n if (!registered) {\n for (const cleanup of [...cleanups].reverse()) {\n try { cleanup() } catch { /* \u5DF2\u968F agent \u91CA\u653E */ }\n }\n lastDeliveryFailure = notes.length === 0 ? 'bash \u5DE5\u5177\u6CA1\u6709\u6CE8\u518C\u4E0A' : notes.join('\uFF1B')\n return undefined\n }\n\n return {\n path: bashPath,\n dispose: () => {\n for (const cleanup of [...cleanups].reverse()) {\n try { cleanup() } catch { /* \u5DF2\u968F agent \u91CA\u653E */ }\n }\n },\n ...(notes.length === 0 ? {} : { failure: notes.join('\uFF1B') }),\n ...(skips.length === 0 ? {} : { skipped: skips.join('\uFF1B') }),\n }\n }\n\n /**\n * \u8FD9\u4E00\u8F6E\u8981\u4E0D\u8981\u505A\u81EA\u68C0\uFF1A**\u53EA\u6709\u53D7\u9650\u6A21\u5F0F**\u624D\u505A\u3002\n *\n * `danger-full-access` \u4F1A\u8DF3\u8FC7 `confine()`\uFF08\u5B98\u65B9\u4E0E\u63D2\u4EF6\u540C\u5224\u636E\uFF0C\u89C1 tool.ts \u7684\u6267\u884C\u4F53\uFF09\uFF0C\n * \u90A3\u6761\u8DEF\u4E0A\u6C99\u7BB1 runner \u6839\u672C\u4E0D\u53C2\u4E0E \u2014\u2014 2026-09-25 \u5728\u540C\u4E00\u53F0\u684C\u9762\u7248\u4E0A\u5B9E\u6D4B\u6B63\u5E38\uFF0C\u6240\u4EE5\u4E0D\u5FC5\u591A\u8D77\n * \u4E00\u4E2A\u8FDB\u7A0B\uFF0C\u4E5F\u4E0D\u8BE5\u56E0\u4E3A\u4E00\u6B21\u63A2\u9488\u6296\u52A8\u628A\u529F\u80FD\u5173\u6389\u3002\n * @param deps \u5DE5\u5177\u4F9D\u8D56\uFF08\u53EF\u80FD\u7F3A\u5E2D\uFF09\u3002\n * @param agent \u76EE\u6807\u4F1A\u8BDD\uFF08**\u5FC5\u987B**\uFF1A\u89C1\u4E0B\u9762\u90A3\u6761 \u26A0\uFE0F\uFF09\u3002\n * @returns \u9700\u8981\u81EA\u68C0\u65F6\u8FD4\u56DE\u8BE5\u53D7\u9650\u6A21\u5F0F\u540D\uFF0C\u5426\u5219\u7A7A\u4E32\u3002\n */\n const confinedModeOf = (deps: BashToolDeps | undefined, agent: AgentLike | undefined): string => {\n if (deps?.sandbox === undefined || deps.sandboxPolicy === undefined) return ''\n try {\n // \u26A0\uFE0F \u5FC5\u987B\u5E26 `session` \u89E3\u6790\u3002\u4E0D\u5E26 session \u62FF\u5230\u7684\u662F**\u90E8\u7F72\u9ED8\u8BA4**\n // \uFF08base bundle\uFF1A`mode: process.env.DSH_PERMISSION_MODE ?? 'workspace-write'`\uFF09\uFF0C\n // \u800C\u5DE5\u5177\u771F\u6B63\u6267\u884C\u65F6\u7528\u7684\u662F**\u8BE5\u4F1A\u8BDD\u81EA\u5DF1**\u7684\u7B56\u7565\uFF08tool.ts\uFF1A`{ session: exec.agent.session }`\uFF09\u3002\n // 2026-09-25 \u771F\u673A\u5B9E\u6D4B\u8E29\u5230\u8FC7\u8FD9\u4E2A\u5751\uFF1A\u4F1A\u8BDD\u8BF4 danger-full-access\uFF08\u547D\u4EE4\u672C\u6765\u8DD1\u5F97\u901A\uFF09\uFF0C\n // \u95E8\u63A7\u5374\u6309\u90E8\u7F72\u9ED8\u8BA4\u7684 workspace-write \u53BB\u63A2\uFF0C\u4E8E\u662F\u81EA\u68C0\u6309\u9884\u671F\u5931\u8D25\u3001\u6574\u680F\u88AB\u8BEF\u64A4\u3002\n // \u540C\u4E00\u4E2A `resolve` \u8C03\u7528\u5F62\u72B6\u5FC5\u987B\u4E0E\u5DE5\u5177\u4FA7\u4E00\u81F4\uFF0C\u5426\u5219\u8FD9\u9053\u95F8\u95E8\u4F1A\u81EA\u5DF1\u5236\u9020\u8BEF\u5224\u3002\n const session = (agent as { session?: unknown } | undefined)?.session\n const mode = deps.sandboxPolicy.resolve(session === undefined ? {} : { session }).mode\n return mode === 'read-only' || mode === 'workspace-write' ? mode : ''\n } catch {\n return ''\n }\n }\n\n /**\n * \u8DD1\u4E00\u6B21\u81EA\u68C0\uFF08\u7ED3\u679C\u6309 `\u8DEF\u5F84|\u6A21\u5F0F` \u7F13\u5B58\uFF1B\u5F02\u5E38\u6536\u655B\u6210\"\u4E0D\u8FC7\" \u2014\u2014 fail-closed\uFF09\u3002\n * @param deps \u5DE5\u5177\u4F9D\u8D56\u3002\n * @param bashPath \u672C\u8F6E\u8981\u7528\u7684 bash\u3002\n * @param mode \u672C\u6B21\u5224\u5B9A\u7684\u53D7\u9650\u6A21\u5F0F\uFF08\u8FDB\u7F13\u5B58\u952E\u4E0E\u72B6\u6001\u884C\uFF09\u3002\n * @param agent \u501F\u5B83\u7684\u6267\u884C\u4E0A\u4E0B\u6587\uFF08\u62FF\u5B83\u7684 session \u89E3\u6790\u7B56\u7565/\u5DE5\u4F5C\u76EE\u5F55\uFF09\u2014\u2014\u5FC5\u987B\u4E0E\n * {@link confinedModeOf} \u7528\u7684\u662F\u540C\u4E00\u4E2A agent\uFF0C\u5426\u5219\u63A2\u7684\u5C31\u4E0D\u662F\u8FD9\u4E2A\u4F1A\u8BDD\u8981\u8D70\u7684\u8DEF\u3002\n * @returns \u63A2\u9488\u7ED3\u8BBA\u3002\n */\n const runProbe = async (\n deps: BashToolDeps,\n bashPath: string,\n mode: string,\n agent: AgentLike | undefined,\n ): Promise<ProbeOutcome> => {\n const key = `${bashPath}|${mode}`\n if (probeOutcome !== undefined && probeKey === key) return probeOutcome\n const controller = new AbortController()\n const timer = setTimeout(() => { controller.abort() }, PROBE_TIMEOUT_MS * 2)\n try {\n probeOutcome = await (options.probe ?? probeBashExecution)(\n deps,\n { bashPath, sep, isAbsolute },\n {\n callId: 'composer-ux-self-check',\n signal: controller.signal,\n ...(agent === undefined ? {} : { agent: agent as never }),\n },\n )\n } catch (error: unknown) {\n probeOutcome = { ok: false, detail: error instanceof Error ? error.message : String(error) }\n } finally {\n clearTimeout(timer)\n }\n probeKey = key\n return probeOutcome\n }\n\n /** \u6309\u5F53\u524D\u8BBE\u7F6E\u91CD\u65B0\u4E0B\u53D1\uFF08\u5E42\u7B49\uFF1B\u53EA\u6709\u771F\u7684\u53D8\u5316\u624D\u52A8\uFF09\u3002 */\n const reconcile = (): void => {\n if (busy) {\n again = true\n return\n }\n busy = true\n void (async () => {\n const row = settings === undefined ? undefined : objectOf(settings.get(namespace))\n const mode = terminalModeFrom(row?.[TERMINAL_MODE_FIELD])\n const explicit = textOf(row?.[TERMINAL_BASH_PATH_FIELD])\n const agents = (ctx.get('agents') as AgentsLike | undefined)\n const ops: { op: 'set'; path: readonly string[]; value: unknown }[] = []\n // \u603B\u95F8 + \u8FD9\u4E00\u680F\u7684\u5F00\u5173\uFF1A`enabled`\uFF08\u7F3A\u7701\u89C6\u4E3A\u5F00\uFF09\u4E0E\u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u680F\u5F00\u5173\u90FD\u4E3A\u771F\u624D\u63A5\u7BA1\u3002\n const sectionOn = row?.['enabled'] !== false && sectionEnabledOf(TERMINAL_ENABLED_FIELD, row ?? {})\n\n if (!isWindows) {\n // \u975E Windows\uFF1A\u4E0D\u63A5\u7BA1\uFF08\u5B98\u65B9 bash \u5DE5\u5177\u672C\u6765\u5C31\u5728\uFF09\uFF0C\u53EA\u5982\u5B9E\u56DE\u62A5\u3002\n for (const entry of installed.values()) entry.dispose()\n installed.clear()\n failure = ''\n writeState(ops, {\n status: terminalStatusText({ platform, mode, candidates: [], excludedCount: 0, effective: 'unsupported' }),\n effective: 'unsupported',\n candidates: [],\n })\n await flush(ops)\n return\n }\n\n if (!sectionOn) {\n // \u8FD9\u4E00\u680F\uFF08\u6216\u603B\u5F00\u5173\uFF09\u5173\u7740\uFF1A\u4E00\u5F8B\u4E0D\u63A5\u7BA1\uFF0C\u5E76\u628A\u539F\u56E0\u5199\u8FDB\u72B6\u6001\u884C\u3002\n // \u5019\u9009\u4E5F\u6E05\u7A7A\uFF1A\u6CA1\u63A5\u7BA1\u65F6\u5217\u4E00\u5806\u8DEF\u5F84\u53EA\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u5DF2\u7ECF\u751F\u6548\u4E86\u3002\n for (const entry of installed.values()) entry.dispose()\n installed.clear()\n failure = ''\n writeState(ops, { status: TERMINAL_OFF_TEXT, effective: 'pwsh', candidates: [] })\n await flush(ops)\n return\n }\n\n const found = discover(explicit)\n const candidates = candidatesToStored(found.candidates)\n const bashPath = activeBashPath(mode, explicit, candidates, found.explicit)\n const usable = bashPath !== '' && existsFn(bashPath)\n /**\n * \u81EA\u68C0\u6CA1\u8FC7\u7684\u90A3\u6761\u539F\u56E0\uFF08\u672C\u8F6E\uFF1B\u5199\u5165\u72B6\u6001\u884C\u65F6\u4F18\u5148\u4E8E\u6CDB\u6CDB\u7684\"\u6CA1\u80FD\u6362\u4E0A\"\uFF09\u3002\n *\n * \u58F0\u660E\u5728\u8FD9\u91CC\u800C\u4E0D\u662F `if (usable)` \u91CC\u9762\uFF1A\u72B6\u6001\u56DE\u5199\u5728\u90A3\u5757\u4E4B\u5916\u3002\n */\n let probeFailure = ''\n\n if (usable) {\n // \u63A5\u7BA1\u524D\u81EA\u68C0\uFF08**\u53EA\u5728\u53D7\u9650\u6A21\u5F0F\u4E0B**\uFF0C\u4E14\u9010\u4F1A\u8BDD\u5224\u5B9A\uFF09\uFF1A\u684C\u9762\u7248\u6253\u5305\u5F62\u6001\u4E0B\u6C99\u7BB1 runner \u8D77\u4E0D\u6765\u65F6\uFF0C\n // \u7167\u65E7\u63A5\u7BA1\u4F1A\u628A\u8BE5\u4F1A\u8BDD\u7684 shell \u6253\u6B7B\uFF08restrict \u5DF2\u751F\u6548 + \u81EA\u5E26 bash \u8DD1\u4E0D\u52A8\uFF09\u3002\n // \u8BE6\u89C1 tool.ts \u7684 probeBashExecution \u4E0E\u4EA4\u63A5\u6587\u6863 \u00A77.32/\u00A77.34\u3002\n const probeDeps = readToolDeps()\n // \u672C\u8F6E\u91CD\u65B0\u8BB0\u8D26\uFF1A\u4E0B\u9762\u6BCF\u4E2A agent \u53EA\u8981\u6709\u4E00\u4E2A\"\u6CA1\u771F\u7684\u6362\u4E0A\"\uFF0C\u5C31\u4F1A\u628A\u5B83\u5199\u56DE\u6765\u3002\n lastDeliveryFailure = ''\n for (const agent of agents?.list() ?? []) {\n // \u26A0\uFE0F \u9010\u4F1A\u8BDD\u89E3\u6790\u7B56\u7565\uFF08\u4E0D\u80FD\u62FF\u90E8\u7F72\u9ED8\u8BA4\u53BB\u5957\uFF09\uFF0C\u7406\u7531\u89C1 confinedModeOf \u7684\u6CE8\u91CA\u3002\n const confinedMode = probeDeps === undefined ? '' : confinedModeOf(probeDeps, agent)\n if (confinedMode !== '') {\n const probe = await runProbe(probeDeps as BashToolDeps, bashPath, confinedMode, agent)\n if (!probe.ok) {\n // \u8FD9\u4E2A\u4F1A\u8BDD**\u4E0D\u63A5\u7BA1**\uFF08\u5E76\u64A4\u6389\u5148\u524D\u4E0B\u53D1\u7684\uFF09\uFF0C\u4F46\u522B\u7684\u4F1A\u8BDD\u4E0D\u53D7\u8FDE\u5E26\u5F71\u54CD\u3002\n probeFailure = `${probe.detail}\uFF1B\u53D7\u9650\u6A21\u5F0F ${confinedMode}`\n const current = installed.get(agent)\n if (current !== undefined) {\n current.dispose()\n installed.delete(agent)\n }\n continue\n }\n }\n const current = installed.get(agent)\n if (current !== undefined && current.path === bashPath) continue\n if (current !== undefined) {\n current.dispose()\n installed.delete(agent)\n }\n const record = install(agent, bashPath)\n if (record !== undefined) installed.set(agent, record)\n }\n if (probeFailure !== '') lastDeliveryFailure = probeFailure\n } else {\n for (const entry of installed.values()) entry.dispose()\n installed.clear()\n failure = ''\n }\n\n const firstFailure = [...installed.values()].find(entry => entry.failure !== undefined)?.failure\n // \u300C\u751F\u6548\u300D\u5FC5\u987B\u662F**\u771F\u7684\u4E0B\u53D1\u6210\u529F**\uFF1A\u6CE8\u518C\u5931\u8D25\u65F6 restrict \u5DF2\u7ECF\u56DE\u6EDA\uFF0C\u8BE5\u4F1A\u8BDD\u7528\u7684\u8FD8\u662F pwsh\uFF0C\n // \u72B6\u6001\u884C\u4E0D\u80FD\u518D\u8BF4\"\u5DF2\u751F\u6548\"\u3002\u8FD9\u6761\u662F\u4E0A\u9762\u90A3\u6B21\u56DE\u6EDA\u7684\u53E6\u4E00\u534A \u2014\u2014 \u56DE\u6EDA\u89E3\u51B3\"\u4E24\u4E2A\u90FD\u770B\u4E0D\u89C1\"\uFF0C\n // \u8FD9\u91CC\u89E3\u51B3\"\u754C\u9762\u8BF4\u8C0E\"\u3002\n // `usable` \u662F\u524D\u63D0\uFF0C\u4E0D\u80FD\u7701\uFF1A\u9009\u4E86 PowerShell / \u4E00\u4E2A\u5019\u9009\u90FD\u6CA1\u6709\u65F6\u6839\u672C\u6CA1\u4E0B\u53D1\u8FC7\u3002\n const delivered = usable && firstFailure === undefined && lastDeliveryFailure === ''\n const failureText = firstFailure ?? (lastDeliveryFailure === '' ? failure : lastDeliveryFailure)\n writeState(ops, {\n status: terminalStatusText({\n platform,\n mode,\n candidates,\n excludedCount: found.excluded.length,\n ...(found.explicit === undefined ? {} : { explicit: found.explicit }),\n effective: delivered ? 'bash' : 'pwsh',\n ...(delivered ? { effectivePath: bashPath } : {}),\n // \u81EA\u68C0\u6CA1\u8FC7\u65F6\u4F18\u5148\u7528\u90A3\u6761\u66F4\u51C6\u786E\u7684\u8BF4\u6CD5\uFF08\"\u9884\u68C0\u5C31\u6CA1\u8FC7\u3001\u6839\u672C\u6CA1\u8BD5\"\uFF09\uFF0C\n // \u800C\u4E0D\u662F\u6CDB\u6CDB\u7684\"\u627E\u5230\u4E86 bash \u4F46\u6CA1\u80FD\u6362\u4E0A\"\u3002\n ...(delivered ? {} : probeFailure === '' ? { deliveryFailed: true } : { probeFailed: probeFailure }),\n ...(failureText === '' ? {} : { failure: failureText }),\n }),\n effective: delivered ? 'bash' : 'pwsh',\n candidates,\n })\n await flush(ops)\n })()\n .catch((error: unknown) => {\n console.error('[composer-ux] \u7EC8\u7AEF\u7B56\u7565\u4E0B\u53D1\u5931\u8D25', error)\n })\n .finally(() => {\n busy = false\n if (again) {\n again = false\n reconcile()\n }\n })\n }\n\n /** \u53EA\u5728\u771F\u7684\u53D8\u5316\u65F6\u5199\u72B6\u6001\u5B57\u6BB5\uFF08\u907F\u514D\u81EA\u89E6\u53D1\u56DE\u73AF\uFF09\u3002 */\n const writeState = (\n ops: { op: 'set'; path: readonly string[]; value: unknown }[],\n next: { status: string; effective: string; candidates: readonly TerminalCandidate[] },\n ): void => {\n const candidatesJson = JSON.stringify(next.candidates)\n if (next.status !== lastStatus) {\n lastStatus = next.status\n ops.push({ op: 'set', path: [TERMINAL_STATUS_FIELD], value: next.status })\n }\n if (next.effective !== lastEffective) {\n lastEffective = next.effective\n ops.push({ op: 'set', path: [TERMINAL_EFFECTIVE_FIELD], value: next.effective })\n }\n if (candidatesJson !== lastCandidates) {\n lastCandidates = candidatesJson\n ops.push({ op: 'set', path: [TERMINAL_CANDIDATES_FIELD], value: next.candidates })\n }\n }\n\n /** \u843D\u76D8\uFF08values \u4E3A\u7A7A\u65F6\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\n const flush = async (ops: readonly { op: 'set'; path: readonly string[]; value: unknown }[]): Promise<void> => {\n if (ops.length === 0 || settings === undefined) return\n try {\n await settings.mutate(namespace, ops)\n } catch (error: unknown) {\n console.error('[composer-ux] \u7EC8\u7AEF\u72B6\u6001\u5199\u5165\u5931\u8D25', error)\n }\n }\n\n // \u2500\u2500 \u4E8B\u4EF6\u63A5\u7EBF \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // \u65B0\u4F1A\u8BDD\uFF08agent \u521B\u5EFA\uFF09\u7ACB\u523B\u4E0B\u53D1\uFF1Bagent \u91CA\u653E\u65F6\u6E05\u8BB0\u8D26\uFF08\u5B83 scope \u91CC\u7684\u4E1C\u897F\u968F\u4E4B\u91CA\u653E\uFF09\u3002\n // \u6CA1\u6709\u4E8B\u4EF6\u80FD\u529B\u7684\u4E0A\u4E0B\u6587\uFF08\u6D4B\u8BD5\u66FF\u8EAB\uFF09\u4E0D\u7B97\u81F4\u547D\uFF0C\u4F46**\u5FC5\u987B\u8BA9\u7528\u6237\u770B\u89C1**\uFF1A\u72B6\u6001\u884C\u4F1A\u5199\u660E\u3002\n if (typeof ctx.on !== 'function') {\n failure = '\u4E0A\u4E0B\u6587\u4E0D\u652F\u6301\u4E8B\u4EF6\uFF0C\u65E0\u6CD5\u5728\u4F1A\u8BDD\u521B\u5EFA\u65F6\u4E0B\u53D1'\n }\n ctx.on?.('agent/created', (() => { reconcile() }) as never)\n ctx.on?.('agent/disposed', ((payload: { agent?: AgentLike }) => {\n if (payload?.agent !== undefined) installed.delete(payload.agent)\n }) as never)\n if (settings !== undefined) ctx.on?.('settings/updated', (() => { reconcile() }) as never)\n\n // \u2500\u2500 \u8BBE\u7F6E\u9875\u7684\u67E5\u8BE2/\u53D1\u73B0\u63A5\u53E3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: '/composer-ux/terminal',\n handler: async (req: { method?: string }, res: {\n statusCode?: number\n writeHead: (code: number, headers: Record<string, string>) => void\n end: (body?: string) => void\n }): Promise<void> => {\n const send = (code: number, payload: unknown): void => {\n res.writeHead(code, { 'content-type': 'application/json; charset=utf-8' })\n res.end(JSON.stringify(payload))\n }\n // \u5B98\u65B9\u6BCF\u6761\u8DEF\u7531\u90FD\u5148\u8FC7\u8FD9\u4E00\u9053\uFF1A\u672C\u673A\u7684 webServer \u7ED1\u5728 0.0.0.0\uFF08\u7528\u6237\u8FD8\u4F1A\u4ECE\u4E2D\u7EE7\u8FDC\u7A0B\u8BBF\u95EE\uFF09\uFF0C\n // \u800C\u8FD9\u6761\u63A5\u53E3\u4F1A\u56DE\u4F20\u672C\u5730 bash \u8DEF\u5F84\uFF0C\u4E0D\u8BBE\u9632\u7B49\u4E8E\u628A\u672C\u673A\u76EE\u5F55\u7ED3\u6784\u900F\u51FA\u53BB\u3002\n const connection = ctx.get('connection') as\n { requestRejection?: (request: unknown) => number | undefined } | undefined\n const rejection = connection?.requestRejection?.(req)\n if (rejection !== undefined) {\n res.statusCode = rejection\n res.end()\n return\n }\n const method = (req.method ?? 'GET').toUpperCase()\n const row = settings === undefined ? undefined : objectOf(settings.get(namespace))\n const mode = terminalModeFrom(row?.[TERMINAL_MODE_FIELD])\n const explicit = textOf(row?.[TERMINAL_BASH_PATH_FIELD])\n if (method === 'POST') {\n // \u300C\u81EA\u52A8\u53D1\u73B0\u300D\uFF1A\u91CD\u65B0\u63A2\u6D4B\u4E00\u6B21\u5E76\u5373\u65F6\u56DE\u4F20\uFF08\u5199\u76D8\u7531 reconcile \u5B8C\u6210\uFF09\u3002\n reconcile()\n const found = discover(explicit)\n send(200, {\n ok: true,\n candidates: candidatesToStored(found.candidates),\n excluded: found.excluded,\n ...(found.explicit === undefined ? {} : { explicit: found.explicit }),\n })\n return\n }\n const found = discover(explicit)\n send(200, {\n ok: true,\n platform,\n supported: isWindows,\n mode,\n bashPath: explicit,\n effective: lastEffective === '' ? 'pwsh' : lastEffective,\n status: lastStatus,\n candidates: isWindows ? candidatesToStored(found.candidates) : [],\n excluded: found.excluded,\n })\n },\n }), 'composer-ux: terminal status route')\n\n // \u542F\u52A8\u5373\u5BF9\u9F50\u4E00\u6B21\uFF08\u4E0E settings \u6587\u6863\u91CC\u7684\u73B0\u72B6\u4E00\u81F4\u4E3A\u6B62\uFF09\u3002\n reconcile()\n // \u4F9B\u5916\u90E8\uFF08settings \u53D8\u5316\u7684\u515C\u5E95\u8DEF\u5F84\uFF09\u4E3B\u52A8\u89E6\u53D1\u4E00\u6B21\u3002\n return\n}\n\n/** \u8BFB\u4E00\u4EFD\u5BBF\u4E3B\u534A\u81EA\u6301\u7684\u5019\u9009\uFF08\u6D4B\u8BD5\u4E0E\u754C\u9762\u5171\u7528\u540C\u4E00\u5957\u51C0\u5316\uFF09\u3002 */\nexport function storedCandidates(row: unknown): readonly TerminalCandidate[] {\n return sanitizeTerminalCandidates(objectOf(row)?.[TERMINAL_CANDIDATES_FIELD])\n}\n\n/** \u8BFB\u6863\u4F4D\uFF08\u6D4B\u8BD5\u7528\uFF09\u3002 */\nexport function storedMode(row: unknown): TerminalMode {\n return terminalModeFrom(objectOf(row)?.[TERMINAL_MODE_FIELD])\n}\n", "/**\n * \u6C99\u7BB1\u7B56\u7565\u4E0E\u5347\u7EA7\u5BA1\u6279\uFF1A\u4E0E\u5B98\u65B9 `@deepseek-ai/dsh-sandbox`\uFF08`src/escalation.ts`\uFF09**\u540C\u8BED\u4E49**\u7684\n * \u672C\u5730\u5B9E\u73B0\u3002\n *\n * \u4E3A\u4EC0\u4E48\u672C\u5730\u5B9E\u73B0\u800C\u4E0D\u662F import\uFF1A\u672C\u63D2\u4EF6\u5BBF\u4E3B\u534A\u662F\u81EA\u5305\u542B\u4EA7\u7269\uFF08build.mjs \u53EA\u5185\u8054\n * schemastery/cosmokit\uFF09\uFF0C\u5F15\u5B98\u65B9\u8FD0\u884C\u65F6\u4F1A\u628A\u5B83\u7ED1\u6B7B\u5728\u67D0\u4E2A DSH \u7248\u672C\uFF0C\u5E76\u4E14\u5E02\u573A\u4F53\u68C0\u4F1A\u56E0\u4E3A\n * \u300C\u4F9D\u8D56\u4E86\u5171\u4EAB\u5BBF\u4E3B\u5305\u300D\u7ED9\u51FA\u8B66\u544A\u3002\u800C\u8FD9\u4E9B\u8BED\u4E49\u672C\u8EAB\u662F**\u7A33\u5B9A\u7684\u5951\u7EA6**\uFF08\u6A21\u5F0F\u8BCD\u6C47\u3001\u66F4\u5BBD\u987A\u5E8F\u3001\n * \u5BA1\u6279\u6587\u6848\u3001fail-closed \u89C4\u5219\uFF09\uFF0C\u9010\u5B57\u7167\u6284\u6BD4\"\u7528\u4E0D\u4E86\u5C31\u5D29\"\u66F4\u53EF\u9760\u3002\n *\n * \u4E09\u5904\u5FC5\u987B\u9010\u5B57\u4E00\u81F4\uFF0C\u5426\u5219\u7528\u6237\u770B\u5230\u7684\u6587\u6848\u4F1A\u4E0E\u5B98\u65B9\u5DE5\u5177\u4E0D\u540C\uFF1A\n * - `sandboxDenialMarker` / `escalationHintMarker` \u7684\u6587\u672C\uFF1B\n * - `WIDER_MODES` \u7684\u4E25\u683C\u66F4\u5BBD\u987A\u5E8F\uFF08\u300C\u4E0D\u66F4\u5BBD\u300D\u662F\u9519\u8BEF\uFF0C\u4E0D\u662F\u7A7A\u64CD\u4F5C\uFF09\uFF1B\n * - \u5BA1\u6279\u5931\u8D25\u6587\u6848\u4E0E fail-closed\uFF08\u6CA1\u6709\u5BA1\u6279\u670D\u52A1 / \u6CA1\u6709 agent \u90FD\u5FC5\u987B\u62D2\u7EDD\uFF0C\u4E0D\u80FD\u653E\u884C\uFF09\u3002\n */\n\n/** \u6587\u4EF6\u6548\u679C\u6A21\u5F0F\u3002 */\nexport type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access'\n\n/** \u53EF\u88AB confining \u7684\u6A21\u5F0F\uFF08`danger-full-access` \u4E0D\u53D7\u9650\uFF0C\u6545\u4E0D\u5728\u5176\u4E2D\uFF09\u3002 */\nexport type ConfinedSandboxMode = Exclude<SandboxMode, 'danger-full-access'>\n\n/** \u6BCF\u6761\u6A21\u5F0F\u80FD\u5347\u7EA7\u5230\u7684\u66F4\u5BBD\u6A21\u5F0F\uFF08\u987A\u5E8F\u5373\u4F18\u5148\u7EA7\uFF09\u3002 */\nexport const WIDER_MODES: Record<string, readonly SandboxMode[]> = {\n 'read-only': ['workspace-write', 'danger-full-access'],\n 'workspace-write': ['danger-full-access'],\n}\n\n/** \u5347\u7EA7\u76EE\u6807\u7684\u5C01\u95ED\u8BCD\u6C47\uFF08\u6CA1\u6709\u4EFB\u4F55\u4E1C\u897F\u4F1A\u5347\u7EA7\u5230 read-only\uFF09\u3002 */\nexport const ESCALATION_TARGETS: readonly SandboxMode[] = ['workspace-write', 'danger-full-access']\n\n/** \u4E00\u6B21\u8C03\u7528\u7684\u5B8C\u6574\u7B56\u7565\uFF08\u5B98\u65B9 `SandboxExecutionPolicy`\uFF09\u3002 */\nexport interface SandboxExecutionPolicy {\n readonly mode: SandboxMode\n /** `workspace-write` \u7684\u7EDD\u5BF9\u6839\u76EE\u5F55\u3002 */\n readonly workspaceRoot: string\n readonly sessionId?: string\n}\n\n/** `sandbox.confine` \u7684\u8FD4\u56DE\u503C\uFF08\u5B98\u65B9 `ConfinedArgv`\uFF09\u3002 */\nexport interface ConfinedArgv {\n /** \u5305\u597D\u540E\u5E94\u5F53 spawn \u7684 argv\u3002 */\n readonly argv: readonly string[]\n readonly enforcement: 'full' | 'partial'\n /** \u8BE5\u540E\u7AEF\u62D2\u7EDD\u6587\u4EF6\u6548\u679C\u65F6 stderr \u91CC\u4F1A\u51FA\u73B0\u7684\u7279\u5F81\u4E32\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\u3002 */\n readonly denialSignatures: readonly string[]\n /** runner \u81EA\u8EAB\u5931\u8D25\u7684\u5224\u5B9A\u89C4\u5219\uFF1B\u547D\u4E2D\u8BF4\u660E\"\u547D\u4EE4\u6CA1\u8DD1\"\uFF0C\u4E0E\"\u88AB\u62D2\u7EDD\"\u4E0D\u540C\u3002 */\n readonly runnerFailureRules: readonly {\n readonly allowedExitCodes?: readonly number[]\n readonly fatalSignatures: readonly string[]\n readonly informationalLines?: readonly string[]\n }[]\n}\n\n/** \u53EA\u53D6\u672C\u63D2\u4EF6\u7528\u5F97\u5230\u7684\u90A3\u4E00\u9762\uFF08\u7ED3\u6784\u6027\u7A84\u5316\uFF0C\u4E0D import \u5B98\u65B9\u7C7B\u578B\uFF09\u3002 */\nexport interface SandboxLike {\n confine(argv: readonly string[], policy: SandboxExecutionPolicy, signal?: AbortSignal): Promise<ConfinedArgv>\n}\n\n/** \u7B56\u7565\u89E3\u6790\u670D\u52A1\uFF08\u5B98\u65B9 `SandboxPolicyService.resolve`\uFF09\u3002 */\nexport interface SandboxPolicyLike {\n resolve(request?: { readonly session?: unknown; readonly mode?: SandboxMode }): SandboxExecutionPolicy\n}\n\n/** \u5BA1\u6279\u7ED3\u679C\uFF08\u5B98\u65B9 `ApprovalOutcome`\uFF09\u3002 */\nexport type EscalationOutcome = 'allowed-once' | 'rejected' | 'cancelled' | 'unavailable'\n\n/** \u5BA1\u6279\u670D\u52A1\u7684\u7ED3\u6784\u9762\uFF08\u5B98\u65B9 `EscalationApprover`\uFF09\u3002 */\nexport interface EscalationApproverLike<A = unknown, C = string> {\n request(req: {\n agent: A\n toolName: string\n callId: C\n reason: string\n signal?: AbortSignal\n }): Promise<EscalationOutcome>\n}\n\n/** \u8BF7\u6C42\u5347\u7EA7\u6240\u9700\u7684\u4E0A\u4E0B\u6587\u3002 */\nexport interface EscalationApproval<A = unknown, C = string> {\n readonly approver: EscalationApproverLike<A, C> | undefined\n readonly agent: A | undefined\n readonly callId: C\n readonly toolName: string\n readonly signal?: AbortSignal\n}\n\n/** \u5347\u7EA7\u8BF7\u6C42\u3002 */\nexport interface EscalationRequest {\n readonly requestedMode: string\n readonly justification: string\n /** \u672C\u6B21\u8C03\u7528\u7684\u5F53\u524D\u6A21\u5F0F\uFF1B\u4E0E\u5B83\u76F8\u540C\u65F6\u65E0\u9700\u5BA1\u6279\u3002 */\n readonly effectiveMode: SandboxMode\n /** \u9762\u5411\u7528\u6237\u7684\u52A8\u4F5C\u540D\u8BCD\uFF08bash \u662F `command`\uFF0C\u6587\u4EF6\u64CD\u4F5C\u662F `operation`\uFF09\u3002 */\n readonly subject: string\n}\n\n/** \u6C99\u7BB1\u62D2\u7EDD\u6807\u8BB0\uFF08\u4E0E\u5B98\u65B9\u9010\u5B57\u4E00\u81F4\uFF09\u3002 */\nexport function sandboxDenialMarker(mode: SandboxMode | string): string {\n return `[sandbox: file access denied under ${mode} mode]`\n}\n\n/** \u5347\u7EA7\u63D0\u793A\u6807\u8BB0\uFF08\u4E0E\u5B98\u65B9\u9010\u5B57\u4E00\u81F4\uFF09\u3002 */\nexport function escalationHintMarker(subject: string): string {\n return `[sandbox: escalation available \u2014 retry this exact ${subject} once with sandbox_permissions `\n + '(the narrowest wider mode that suffices) + justification; the approval prompt asks the user]'\n}\n\n/** \u5347\u7EA7\u53C2\u6570\u6821\u9A8C\uFF08\u4E0E\u5B98\u65B9\u9010\u5B57\u4E00\u81F4\u7684\u4E09\u6761\u9519\u8BEF\uFF09\u3002 */\nexport function validateEscalationArgs(\n sandboxPermissions: string | undefined,\n justification: string | undefined,\n): void {\n if (sandboxPermissions !== undefined && justification === undefined) {\n throw new Error('invalid escalation: sandbox_permissions requires a justification')\n }\n if (justification !== undefined && sandboxPermissions === undefined) {\n throw new Error('invalid escalation: justification is only valid together with sandbox_permissions')\n }\n if (justification !== undefined && justification.trim().length === 0) {\n throw new Error('invalid justification: expected a non-empty sentence')\n }\n}\n\n/**\n * \u5BA1\u6279\u4E00\u6B21\u5347\u7EA7\uFF08\u4E0E\u5B98\u65B9 `approveEscalation` \u540C\u8BED\u4E49\uFF09\u3002\n *\n * \u51E0\u4E2A\u523B\u610F\u7684\u884C\u4E3A\uFF0C\u522B\"\u987A\u624B\u4F18\u5316\"\uFF1A\n * - \u8BF7\u6C42\u7684\u6A21\u5F0F\u4E0E\u5F53\u524D\u6A21\u5F0F**\u76F8\u540C**\u65F6\u76F4\u63A5\u8FD4\u56DE\uFF0C\u4E0D\u6253\u6270\u7528\u6237\uFF1B\n * - \u4E0D\u662F**\u4E25\u683C\u66F4\u5BBD**\u5C31\u62A5\u9519\uFF08`read-only \u2192 read-only` \u4E0D\u662F\u7A7A\u64CD\u4F5C\uFF0C\u662F\u914D\u7F6E\u9519\u8BEF\uFF09\uFF1B\n * - \u6CA1\u6709\u5BA1\u6279\u670D\u52A1\u3001\u6216\u6CA1\u6709 agent \u53EF\u8DEF\u7531\u65F6**\u4E00\u5F8B\u62D2\u7EDD**\uFF08fail-closed\uFF0C\u7EDD\u4E0D\u9ED8\u8BA4\u653E\u884C\uFF09\u3002\n * @param request \u5347\u7EA7\u8BF7\u6C42\u3002\n * @param approval \u5BA1\u6279\u4E0A\u4E0B\u6587\u3002\n * @returns \u83B7\u6279\u7684\u6A21\u5F0F\u3002\n */\nexport async function approveEscalation<A, C>(\n request: EscalationRequest,\n approval: EscalationApproval<A, C>,\n): Promise<SandboxMode> {\n const { requestedMode: mode, effectiveMode, justification, subject } = request\n if (mode === effectiveMode) return effectiveMode\n if (!(WIDER_MODES[effectiveMode] ?? []).includes(mode as SandboxMode)) {\n throw new Error(`sandbox escalation to \"${mode}\" is not strictly wider than this call's current \"${effectiveMode}\" mode`)\n }\n if (approval.approver === undefined) {\n throw new Error(`sandbox escalation to \"${mode}\" requires approval, but no approval service is composed`)\n }\n if (approval.agent === undefined) {\n throw new Error(`sandbox escalation to \"${mode}\" requires approval, but the call has no agent to route it through`)\n }\n const outcome = await approval.approver.request({\n agent: approval.agent,\n toolName: approval.toolName,\n callId: approval.callId,\n reason: `escalate sandbox to ${mode}: ${justification}`,\n ...approval.signal === undefined ? {} : { signal: approval.signal },\n })\n switch (outcome) {\n case 'allowed-once': return mode as SandboxMode\n case 'rejected': throw new Error(`the user rejected escalating this ${subject} to \"${mode}\"`)\n case 'cancelled': throw new Error(`approval for escalating to \"${mode}\" was cancelled`)\n case 'unavailable': throw new Error(`sandbox escalation to \"${mode}\" requires approval, but no approval channel is available`)\n default: throw new Error(`unexpected escalation outcome ${JSON.stringify(outcome)}`)\n }\n}\n", "/**\n * bash \u5DE5\u5177\u7684\u7ED3\u679C\u6E32\u67D3\u4E0E\u9000\u51FA\u72B6\u6001\u89E3\u6790\u3002\n *\n * \u8FD9\u91CC\u7684\u6BCF\u4E00\u6839\u5B57\u7B26\u4E32\u90FD**\u9010\u5B57\u5BF9\u9F50**\u5B98\u65B9 `@deepseek-ai/dsh-tool-bash`\uFF08+ `dsh-shell` \u7684\n * render / `dsh-sandbox` \u7684\u4E24\u4E2A\u6807\u8BB0\uFF09\uFF0C\u56E0\u4E3A\u5B83\u4EEC\u662F**\u6A21\u578B\u770B\u5230\u7684\u884C\u4E3A**\uFF1A\u6807\u8BB0\u987A\u5E8F\u3001`[stderr]`\n * \u5934\u3001`(no output)` \u515C\u5E95\u3001\u4EE5\u53CA\"\u9000\u51FA\u72B6\u6001\u5FC5\u987B\u6302\u5728\u6700\u672B\u5C3E\"\uFF08\u7EC8\u7AEF\u5361\u7247\u9760\u8FD9\u4E2A\u951A\u70B9\u628A\u5B83\u62C6\u6210 pill\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u76F4\u63A5 import \u5B98\u65B9\u5305\uFF1A\u672C\u63D2\u4EF6\u7684\u5BBF\u4E3B\u534A\u662F\u81EA\u5305\u542B\u4EA7\u7269\uFF08\u89C1 build.mjs\uFF0C\u53EA\u5185\u8054\n * schemastery/cosmokit\uFF09\uFF0C\u5F15\u5165\u5B98\u65B9\u8FD0\u884C\u65F6\u4F1A\u628A\u5B83\u7ED1\u6B7B\u5728\u67D0\u4E2A DSH \u7248\u672C\u4E0A\uFF0C\u8FD8\u4F1A\u8BA9\u5E02\u573A\u4F53\u68C0\n * \u62A5\u300C\u4F9D\u8D56\u4E86\u5171\u4EAB\u5BBF\u4E3B\u5305\u300D\u3002\u5B98\u65B9\u90A3 5 \u4E2A\u8FD0\u884C\u65F6\u7B26\u53F7\uFF08\u5E38\u91CF\u4E0E\u4E24\u4E2A\u7EAF\u51FD\u6570\u5F0F\u7684\u6807\u8BB0\u6784\u9020\u5668\uFF09\n * \u5728\u8FD9\u91CC\u672C\u5730\u7B49\u4EF7\u5B9E\u73B0\uFF0C\u884C\u4E3A\u4E00\u81F4\u3002\n */\n\nimport {\n ESCALATION_TARGETS, escalationHintMarker, sandboxDenialMarker, type SandboxMode,\n} from './sandbox.ts'\n\nexport { ESCALATION_TARGETS, escalationHintMarker, sandboxDenialMarker, type SandboxMode }\n\n/** \u53D7\u7BA1\u73AF\u5883\u53D8\u91CF\u7684\u524D\u7F00\uFF08\u5B98\u65B9 `DSH_ENV_PREFIX`\uFF09\u3002 */\nexport const DSH_ENV_PREFIX = 'DSH_'\n\n/** \u4E00\u6BB5\u6D41\u5F0F\u8F93\u51FA\uFF08\u5B98\u65B9 `CollectedOutput` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface StreamOutput {\n readonly text: string\n readonly truncated: boolean\n readonly spillPath?: string\n}\n\n/** \u6C99\u7BB1\u4E8B\u5B9E\u3002 */\nexport interface SandboxFacts {\n readonly mode: SandboxMode | string\n readonly denied: boolean\n readonly enforcement?: string\n readonly runnerFailed?: boolean\n}\n\n/** \u4E00\u6B21\u524D\u53F0\u6267\u884C\u7684\u7ED3\u679C\uFF08\u5B98\u65B9 `ShellRunResult` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface BashRunResult {\n readonly exitCode: number | null\n readonly signal: string | null\n readonly timedOut: boolean\n readonly aborted: boolean\n readonly timeoutMs: number\n readonly stdout: StreamOutput\n readonly stderr: StreamOutput\n readonly sandbox?: SandboxFacts\n}\n\n/** \u540E\u53F0\u4EFB\u52A1\u589E\u91CF\u8BFB\u53D6\u7684\u4E00\u5E27\uFF08\u5B98\u65B9 `ShellProcessRead` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface ProcessRead {\n readonly delta: string\n readonly lossy: boolean\n readonly stdoutSpillPath?: string\n readonly stderrSpillPath?: string\n}\n\n/** \u9000\u51FA\u72B6\u6001\u62C6\u89E3\u7ED3\u679C\uFF1A\u6B63\u6587 + \u8981\u4E48 exitCode\u3001\u8981\u4E48 signal\u3002 */\nexport type ParsedExitStatus = { readonly body: string } & (\n | { readonly exitCode: number }\n | { readonly signal: string }\n)\n\n/**\n * \u62C6\u51FA\u672B\u5C3E\u7684\u9000\u51FA\u72B6\u6001\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u951A\u5728**\u672B\u5C3E**\uFF1A\u7EC8\u7AEF\u5361\u7247\u628A exit \u72B6\u6001\u663E\u793A\u6210\u72EC\u7ACB\u7684 pill\uFF0C\u6807\u8BB0\u5F97\u4ECE\u6B63\u6587\u91CC\u6458\u6389\uFF1B\n * \u5B98\u65B9\u56E0\u6B64\u628A\u6807\u8BB0\u653E\u5728\u6700\u540E\uFF0C\u5E76\u7528 `$` \u951A\u5B9A\u3002\u6CE8\u610F `[exit code: null]`\uFF08\u8FDB\u7A0B\u88AB\u4FE1\u53F7\u6740\u6389\u3001\n * \u9000\u51FA\u7801\u672A\u77E5\uFF09**\u4E0D\u5339\u914D** `\\d+`\uFF0C\u6240\u4EE5\u5B83\u4F1A\u7559\u5728\u6B63\u6587\u91CC\u2014\u2014\u8FD9\u662F\u5B98\u65B9\u884C\u4E3A\uFF0C\u4E0D\u8981\"\u987A\u624B\u4FEE\u597D\"\u3002\n */\nexport function parseExitStatus(text: string): ParsedExitStatus {\n const signal = /\\n\\[killed by signal: ([^\\]\\n]+)\\]$/.exec(text)\n if (signal?.[1] !== undefined) return { body: text.slice(0, signal.index), signal: signal[1] }\n const exit = /\\n\\[exit code: (\\d+)\\]$/.exec(text)\n if (exit?.[1] !== undefined) return { body: text.slice(0, exit.index), exitCode: Number(exit[1]) }\n return { body: text, exitCode: 0 }\n}\n\n/** \u8F93\u51FA\u4F53\uFF1A\u622A\u65AD\u65F6\u8865\u4E00\u884C\"\u5B8C\u6574\u8F93\u51FA\u5728\u54EA\"\u3002 */\nfunction streamText(output: StreamOutput): string {\n if (!output.truncated) return output.text\n return `${output.text}\\n[output truncated; full output: ${output.spillPath ?? '(unavailable)'}]`\n}\n\n/**\n * \u524D\u53F0\u7ED3\u679C \u2192 \u7ED9\u6A21\u578B\u770B\u7684\u6B63\u6587\uFF08\u5B98\u65B9 `renderResult`\uFF09\u3002\n *\n * \u6807\u8BB0\u987A\u5E8F\u662F\u5951\u7EA6\uFF1A\u6C99\u7BB1\u62D2\u7EDD \u2192 \u5347\u7EA7\u63D0\u793A \u2192 \u8D85\u65F6 \u2192 \u6700\u540E\u624D\u662F signal **\u6216** exit code\u3002\n * \u9000\u51FA\u7801\u4E3A 0 \u4E14\u65E0\u4FE1\u53F7\u65F6\u4E0D\u4EA7\u751F\u4EFB\u4F55\u6807\u8BB0\u3002\n */\nexport function renderBashResult(result: BashRunResult, escalationModes: readonly SandboxMode[] = []): string {\n const out = streamText(result.stdout)\n const err = streamText(result.stderr)\n let body = out\n if (err.length > 0) {\n if (body.length > 0 && !body.endsWith('\\n')) body += '\\n'\n body += `[stderr]\\n${err}`\n }\n if (body.length === 0) body = '(no output)'\n const markers: string[] = []\n if (result.sandbox?.denied === true) {\n markers.push(sandboxDenialMarker(result.sandbox.mode))\n if (escalationModes.length > 0) markers.push(escalationHintMarker('command'))\n }\n if (result.timedOut) markers.push(`[timed out after ${result.timeoutMs}ms]`)\n if (result.signal !== null) markers.push(`[killed by signal: ${result.signal}]`)\n else if (result.exitCode !== 0) markers.push(`[exit code: ${result.exitCode}]`)\n if (markers.length === 0) return body\n if (!body.endsWith('\\n')) body += '\\n'\n return body + markers.join('\\n')\n}\n\n/**\n * \u540E\u53F0\u4EFB\u52A1\u7684\u4E00\u5E27 \u2192 \u7ED9\u6A21\u578B\u770B\u7684\u589E\u91CF\uFF08\u5B98\u65B9 `renderProcessRead`\uFF09\u3002\n * \u4E22\u4E86\u5185\u5B58\u91CC\u7684\u8F93\u51FA\u3001\u4EE5\u53CA\u6C99\u7BB1\u81EA\u8EAB\u5931\u8D25\uFF0C\u90FD\u8981\u5728\u8FD9\u91CC\u5982\u5B9E\u8BF4\u51FA\u6765\uFF08\u5B83\u4EEC\u4E0E\"\u547D\u4EE4\u5931\u8D25\"\u4E0D\u540C\uFF09\u3002\n */\nexport function renderProcessRead(\n read: ProcessRead,\n sandbox: SandboxFacts | undefined,\n escalationModes: readonly SandboxMode[] = [],\n): string {\n const notices: string[] = []\n if (read.lossy) {\n const paths = [read.stdoutSpillPath, read.stderrSpillPath]\n .filter((path): path is string => path !== undefined)\n notices.push('[some output was dropped from memory; full output: '\n + `${paths.length > 0 ? paths.join(', ') : '(unavailable)'}]`)\n }\n if (sandbox?.runnerFailed === true) {\n notices.push(`[sandbox: the sandbox runner itself failed under ${sandbox.mode} mode \u2014 `\n + 'the command did not run; this is a sandbox problem, not a command failure]')\n } else if (sandbox?.denied === true) {\n notices.push(sandboxDenialMarker(sandbox.mode))\n if (escalationModes.length > 0) notices.push(escalationHintMarker('command'))\n }\n if (notices.length === 0) return read.delta\n const separator = read.delta.length > 0 && !read.delta.endsWith('\\n') ? '\\n' : ''\n return `${read.delta}${separator}${notices.join('\\n')}`\n}\n", "/**\n * \u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u7684 bash \u5DE5\u5177\uFF1A\u4E0E\u5B98\u65B9 `@deepseek-ai/dsh-tool-bash` **\u540C\u5951\u7EA6**\u7684\u81EA\u5305\u542B\u5B9E\u73B0\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u76F4\u63A5\u7528\u5B98\u65B9\u90A3\u4E2A\uFF1Awin32 \u4E0A\u5B83\u7684\u884C\u662F `disabled`\uFF08`packages/bundle/base/cordis.patch.yml`\uFF09\uFF0C\n * \u800C\u4E14\u5B83\u53EA\u6D88\u8D39 `ctx.shell` \u2014\u2014 \u800C win32 \u7684 `ctx.shell` \u6808\u662F `pwsh-sandbox`\uFF08PowerShell\uFF09\u3002\n * \u4E5F\u5C31\u662F\u8BF4\"\u542F\u7528\u5B98\u65B9 bash \u5DE5\u5177\"\u5F97\u4E0D\u5230 Git Bash\uFF0C\u5FC5\u987B\u81EA\u5DF1\u5E26\u5DE5\u5177\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u50CF\u5B98\u65B9\u90A3\u6837 `import { defineTool }`\uFF1A\u672C\u63D2\u4EF6\u5BBF\u4E3B\u534A\u662F\u81EA\u5305\u542B\u4EA7\u7269\uFF08build.mjs \u53EA\u5185\u8054\n * schemastery/cosmokit\uFF09\u3002\u6240\u4EE5\u8FD9\u91CC\u7684 `parameters` / `output.schema` \u76F4\u63A5\u5199\u6210**\u7F16\u8BD1\u540E\u7684\n * canonical JSON Schema**\uFF08\u5373 defineTool \u7F16\u8BD1\u540E\u7684\u5F62\u72B6\uFF09\uFF0C\u5B57\u6BB5\u4E0E\u5B98\u65B9**\u9010\u5B57\u4E00\u81F4**\uFF1A\n * \u6A21\u578B\u770B\u5230\u7684\u5DE5\u5177\u63CF\u8FF0\u3001\u53C2\u6570\u3001\u8F93\u51FA\u3001\u6807\u8BB0\u3001\u7EC8\u7AEF\u5361\u7247\u90FD\u5E94\u5F53\u4E0E\u5B98\u65B9\u4E0D\u53EF\u533A\u5206\u3002\n *\n * \u4E09\u5904\"\u770B\u8D77\u6765\u53EF\u4EE5\u66F4\u806A\u660E\u4F46\u6545\u610F\u7167\u6284\"\u7684\u5730\u65B9\uFF1A\n * 1. \u975E\u96F6\u9000\u51FA**\u4E0D\u662F\u9519\u8BEF**\uFF0C\u53EA\u662F\u6E32\u67D3\u6210\u672B\u5C3E\u7684 `[exit code: N]` \u6807\u8BB0\uFF1B\n * 2. `sandbox.confine` \u662F **async**\uFF08\u88C5\u5728\u4F60\u673A\u5668\u4E0A\u7684 dsh-windows-shell-policy \u5F53\u540C\u6B65\u7528\uFF0C\n * \u6240\u4EE5\u5B83\u5728\u5E26\u6C99\u7BB1\u7684\u7EC4\u5408\u91CC\u6839\u672C\u53D1\u4E0D\u8D77\u6765 \u2014\u2014 \u8FD9\u91CC\u5FC5\u987B await\uFF09\uFF1B\n * 3. \u4E2D\u6B62\u65F6\u629B\u7684\u9519\u5E26 `name='AbortError'` + `code='ABORTED'`\u3002\u5B98\u65B9\u7528 `HarnessError`\n * \uFF08`instanceof` \u624D\u80FD\u88AB registry \u8BA4\u6210 `info`\uFF09\uFF1B\u672C\u5305\u7ED3\u6784\u4E0A\u65E0\u6CD5\u63D0\u4F9B\u540C\u4E00\u4E2A\u7C7B\u8EAB\u4EFD\uFF0C\n * \u800C registry \u5BF9\"\u8C03\u7528\u65B9\u4E2D\u6B62\"\u672C\u8EAB\u5C31\u4F1A\u628A\u7ED3\u5C40\u89C4\u8303\u5316\u4E3A ABORTED\uFF0C\u6545\u8FD9\u91CC\u629B\u7ED3\u6784\u7B49\u4EF7\u7684\n * \u666E\u901A\u9519\u8BEF\uFF0C\u4EE3\u4EF7\u662F `info` \u5C11\u4E00\u6761\u6CE8\u89E3\uFF08\u5DF2\u5728\u4EA4\u63A5\u6587\u6863\u4E2D\u5982\u5B9E\u8BB0\u5F55\uFF09\u3002\n */\nimport {\n parseExitStatus, renderBashResult, renderProcessRead,\n type BashRunResult, type ProcessRead, type SandboxFacts,\n} from './render.ts'\nimport {\n ESCALATION_TARGETS, approveEscalation, validateEscalationArgs,\n type ConfinedArgv, type EscalationApproverLike, type SandboxExecutionPolicy, type SandboxLike,\n type SandboxMode, type SandboxPolicyLike,\n} from './sandbox.ts'\n\n/** \u5DE5\u5177\u540D\uFF08\u4E0E\u5B98\u65B9\u4E00\u81F4\uFF1A\u6A21\u578B\u770B\u5230\u7684\u5C31\u662F `bash`\uFF09\u3002 */\nexport const BASH_TOOL_NAME = 'bash'\n\n/** \u5DE5\u5177\u63D0\u793A\u8BCD\u6BB5\u7684\u987A\u5E8F\uFF08\u5B98\u65B9 `TOOL_BASH: 1000`\uFF09\u3002 */\nexport const TOOL_BASH_SECTION_ORDER = 1000\n\n/** pwsh \u63D0\u793A\u8BCD\u6BB5\u7684\u987A\u5E8F\uFF08\u5B98\u65B9 `TOOL_PWSH: 1010`\uFF09\u2014\u2014\u6362\u58F3\u65F6\u7528\u5B83\u538B\u6389\u9884\u8BBE\u90A3\u6BB5\u3002 */\nexport const TOOL_PWSH_SECTION_ORDER = 1010\n\n/** \u6362\u6210 bash \u540E\u5199\u8FDB\u63D0\u793A\u8BCD\u7684\u90A3\u53E5\uFF08\u5B98\u65B9\u9010\u5B57\uFF09\u3002 */\nexport const BASH_SECTION_TEXT = 'Check the [exit code: N] marker on every bash result; '\n + 'investigate failures before moving on.'\n\n/** \u8D85\u65F6\u4E0E\u8F93\u51FA\u7684\u9ED8\u8BA4\u503C\uFF08\u5B98\u65B9 bash-local \u7684\u9ED8\u8BA4\u503C\uFF09\u3002 */\nexport const DEFAULT_TIMEOUT_MS = 120_000\nexport const MAX_TIMEOUT_MS = 600_000\nexport const MAX_OUTPUT_BYTES = 64_000\nexport const MAX_SPILL_BYTES = 64 * 1024 * 1024\nexport const GRACE_MS = 3_000\n\n/** \u4E2D\u6B62\u9519\u8BEF\u7684\u7801\uFF08\u5B98\u65B9 `TOOL_ABORTED`\uFF09\u3002 */\nexport const TOOL_ABORTED = 'ABORTED'\n\n/** \u6267\u884C\u73AF\u5883\u7684\u4E09\u6761\u538B\u5236\u9879\uFF08\u5B98\u65B9 ENV_OVERRIDES\uFF1A\u8BA9\u8F93\u51FA\u7A33\u5B9A\u3001\u5C11\u5206\u9875\uFF09\u3002 */\nexport const ENV_OVERRIDES: Readonly<Record<string, string>> = {\n NO_COLOR: '1',\n TERM: 'dumb',\n PAGER: 'cat',\n GIT_PAGER: 'cat',\n}\n\n/** \u5DE5\u5177\u53C2\u6570\u3002 */\nexport interface BashToolArgs {\n readonly command: string\n readonly description: string\n readonly timeoutMs?: number\n readonly workdir?: string\n readonly run_in_background?: boolean\n readonly sandbox_permissions?: string\n readonly justification?: string\n}\n\n/** \u7ED3\u6784\u5316\u7A84\u5316\u51FA\u6765\u7684\u6267\u884C\u4E0A\u4E0B\u6587\uFF08\u53EA\u53D6\u672C\u5DE5\u5177\u7528\u5F97\u5230\u7684\u5B57\u6BB5\uFF09\u3002 */\nexport interface ToolRunContextLike {\n readonly callId: string\n readonly signal: AbortSignal\n readonly agent?: {\n readonly session: {\n readonly header: { readonly cwd?: string; readonly id?: string }\n }\n }\n}\n\n/** \u5B50\u8FDB\u7A0B\u670D\u52A1\uFF08\u5B98\u65B9 `SubprocessHandle` \u7684\u53EF\u89C2\u6D4B\u5B50\u96C6\uFF09\u3002 */\nexport interface SubprocessHandleLike {\n readonly collected: {\n readonly stdout?: { readFrom(fromByte: number): { text: string; nextOffset: number; lossy: boolean; spillPath?: string } }\n readonly stderr?: { readFrom(fromByte: number): { text: string; nextOffset: number; lossy: boolean; spillPath?: string } }\n }\n readonly done: Promise<{ exitCode: number | null; signal: string | null }>\n terminate(): void\n}\n\nexport interface SubprocessLike {\n spawn(spec: {\n argv: readonly string[]\n cwd: string\n stdio: {\n stdin: 'ignore'\n stdout: { maxBytes: number; spill: { maxBytes: number } }\n stderr: { maxBytes: number; spill: { maxBytes: number } }\n }\n graceMs: number\n signal?: AbortSignal\n env: Record<string, string>\n }): SubprocessHandleLike\n}\n\n/** \u540E\u53F0 job \u7684\u94A9\u5B50\uFF08\u5B98\u65B9 `JobHooks`\uFF09\u3002 */\nexport interface JobHooksLike {\n cancel(reason?: string): void\n done: Promise<{ status: 'completed' | 'killed' | 'failed'; detail?: string }>\n readOutput?(): string\n}\n\nexport interface JobsLike {\n start(spec: {\n kind: 'bash'\n label: string\n owner?: unknown\n run(): JobHooksLike\n }): string\n}\n\n/** \u53D7\u7BA1\u73AF\u5883\u53D8\u91CF\u6536\u96C6\uFF08\u5B98\u65B9 `ctx.shellEnv.collect`\uFF09\u3002 */\nexport interface ShellEnvLike {\n collect(exec: ToolRunContextLike): Record<string, string>\n}\n\n/** \u5185\u5BB9\u5757\u4E0E\u89C6\u56FE\uFF08\u53EA\u58F0\u660E\u672C\u6587\u4EF6\u8FD4\u56DE\u7684\u90A3\u51E0\u79CD\uFF09\u3002 */\nexport type ContentBlockLike = { readonly type: 'text'; readonly text: string }\n\nexport interface ToolDefinitionLike {\n readonly name: string\n readonly description: string\n readonly parameters: Record<string, unknown>\n readonly output: {\n readonly schema: Record<string, unknown>\n render(args: unknown, value: unknown): ContentBlockLike[]\n }\n execute(args: unknown, exec: ToolRunContextLike): Promise<unknown>\n presentCall?(args: unknown): unknown\n presentResult?(args: unknown, result: { content: ContentBlockLike[]; isError: boolean }): unknown\n}\n\n/** \u5DE5\u5177\u4F9D\u8D56\uFF08\u5168\u90E8\u7ED3\u6784\u6027\u6CE8\u5165\uFF0C\u4FBF\u4E8E\u5355\u6D4B\uFF09\u3002 */\nexport interface BashToolDeps {\n readonly subprocess: SubprocessLike\n readonly sandbox?: SandboxLike\n readonly sandboxPolicy?: SandboxPolicyLike\n readonly approval?: EscalationApproverLike\n readonly jobs?: JobsLike\n readonly shellEnv?: ShellEnvLike\n}\n\n/** \u53EF\u5347\u7EA7\u7684\u6A21\u5F0F\u8868\uFF1A\u53EA\u6709\u7EC4\u5408\u91CC\u771F\u7684\u80FD confine \u65F6\u624D\u63D0\u4F9B\u5347\u7EA7\u53C2\u6570\uFF08\u5B98\u65B9\u540C\u5224\u636E\uFF09\u3002 */\nexport function escalationModesOf(deps: BashToolDeps): readonly SandboxMode[] {\n return deps.sandbox !== undefined && deps.sandboxPolicy !== undefined ? ESCALATION_TARGETS : []\n}\n\n/**\n * \u5DE5\u5177\u63CF\u8FF0\uFF08\u5B98\u65B9\u9010\u5B57\uFF09\u3002\n * @param backgroundEnabled \u662F\u5426\u66B4\u9732 `run_in_background`\u3002\n * @param escalationModes \u53EF\u5347\u7EA7\u6A21\u5F0F\uFF08\u7A7A = \u4E0D\u66B4\u9732 `sandbox_permissions`\uFF09\u3002\n * @returns \u5B8C\u6574\u63CF\u8FF0\u4E32\u3002\n */\nexport function bashDescription(backgroundEnabled: boolean, escalationModes: readonly SandboxMode[]): string {\n const background = backgroundEnabled\n ? 'Set `run_in_background: true` for long-running commands: the call returns a job id immediately; '\n + 'read its output with `job_output` and stop it with `job_kill`.'\n : 'Background execution is not available; long-running commands must finish within the timeout.'\n const base = 'Execute a bash command (`bash -c`) and return its stdout/stderr. '\n + 'Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls \u2014 '\n + 'pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. '\n + 'Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. '\n + 'Commands may run under a file sandbox; a blocked file operation is reported as '\n + '`[sandbox: file access denied under <mode> mode]` \u2014 a policy denial, not a bug in the command; '\n + 'do not retry another way. '\n + 'Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. '\n + background\n if (escalationModes.length === 0) return base\n return base + ' Attempting a command the sandbox may deny is safe and expected: run it and read the '\n + 'marker rather than assuming the denial. When a command is denied and a wider mode would let it '\n + 'succeed, escalate immediately in the same turn \u2014 the one sanctioned exception to a denial: retry '\n + 'the exact same command once with `sandbox_permissions` (the narrowest wider mode that suffices) '\n + 'plus a one-sentence `justification`. Do not detour through chat to ask permission first \u2014 the '\n + 'approval prompt raised by that retry is how the user consents. If the session states approval '\n + 'prompts are disabled, there is no exception: a denial is final \u2014 do not set `sandbox_permissions`. '\n + 'Never escalate speculatively: ground the request in a real denial \u2014 normally the one this command '\n + 'just hit; escalating up front is fine only when this session already denied the same access. '\n + 'A rejected escalation is final for that command \u2014 stop and explain, never work around '\n + 'it \u2014 but it does not forbid attempting or escalating other commands later.'\n}\n\n/** \u53C2\u6570 JSON Schema\uFF08canonical\uFF1B\u4E0E\u5B98\u65B9\u7F16\u8BD1\u540E\u7684\u5F62\u72B6\u4E00\u81F4\uFF09\u3002 */\nexport function bashParameters(escalationModes: readonly SandboxMode[]): Record<string, unknown> {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n command: { type: 'string', description: 'The bash command to execute.' },\n description: {\n type: 'string',\n description: 'Clear, concise description of what this command does in active voice, '\n + '5-10 words (shown in the UI). Examples: \"ls\" \u2192 \"List files in current directory\"; '\n + '\"git status\" \u2192 \"Show working tree status\"; \"npm install\" \u2192 \"Install package dependencies\".',\n },\n timeoutMs: {\n type: 'number',\n description: 'Timeout in milliseconds. The executor applies its configured default and cap, '\n + 'and kills the command on expiry.',\n },\n workdir: {\n type: 'string',\n description: 'Working directory for this command. Defaults to the session workspace; '\n + 'a relative path is resolved against it.',\n },\n ...(escalationModes.length === 0 ? {} : {\n sandbox_permissions: {\n type: 'string',\n enum: [...escalationModes],\n description: 'The wider sandbox mode this command needs. Only valid as a one-shot retry of a '\n + 'command the sandbox just denied; requires justification and user approval.',\n },\n justification: {\n type: 'string',\n description: 'Required with sandbox_permissions: one sentence for the user explaining why '\n + 'this exact command needs the wider access.',\n },\n }),\n },\n required: ['command', 'description'],\n }\n}\n\n/** \u8F93\u51FA JSON Schema\uFF08canonical\uFF1A\u524D\u53F0 / \u540E\u53F0\u4E24\u652F\uFF09\u3002 */\nexport function bashOutputSchema(): Record<string, unknown> {\n const stream = {\n type: 'object',\n additionalProperties: false,\n required: ['text', 'truncated'],\n properties: {\n text: { type: 'string' },\n truncated: { type: 'boolean' },\n spillPath: { type: 'string' },\n },\n }\n return {\n oneOf: [\n {\n type: 'object',\n additionalProperties: false,\n required: ['kind', 'jobId'],\n properties: {\n kind: { type: 'string', const: 'background' },\n jobId: { type: 'string' },\n },\n },\n {\n type: 'object',\n additionalProperties: false,\n required: ['kind', 'exitCode', 'signal', 'timedOut', 'aborted', 'timeoutMs', 'stdout', 'stderr'],\n properties: {\n kind: { type: 'string', const: 'foreground' },\n exitCode: { oneOf: [{ type: 'integer' }, { type: 'null' }] },\n signal: { oneOf: [{ type: 'string' }, { type: 'null' }] },\n timedOut: { type: 'boolean' },\n aborted: { type: 'boolean' },\n timeoutMs: { type: 'number' },\n stdout: stream,\n stderr: stream,\n sandbox: {\n type: 'object',\n additionalProperties: false,\n required: ['mode', 'denied'],\n properties: {\n mode: { type: 'string' },\n denied: { type: 'boolean' },\n enforcement: { type: 'string' },\n runnerFailed: { type: 'boolean' },\n },\n },\n },\n },\n ],\n }\n}\n\n/**\n * \u8D85\u65F6\u6536\u655B\u5230 [\u4E0B\u9650, \u4E0A\u9650]\uFF08\u5B98\u65B9 executor \u7684 clamp \u8BED\u4E49\uFF1A\u8BF7\u6C42\u503C\u8FC7\u5C0F\u88AB\u62AC\u5230\u9ED8\u8BA4\u3001\u8FC7\u5927\u88AB\u538B\u5230\u4E0A\u9650\uFF09\u3002\n * @param requested \u6A21\u578B\u7ED9\u7684 timeoutMs\u3002\n * @param min \u4E0B\u9650\uFF08\u5B98\u65B9 `timeoutMs`\uFF0C\u9ED8\u8BA4 120s\uFF09\u3002\n * @param max \u4E0A\u9650\uFF08\u5B98\u65B9 `maxTimeoutMs`\uFF0C\u9ED8\u8BA4 600s\uFF09\u3002\n * @returns \u5B9E\u9645\u8D85\u65F6\u6BEB\u79D2\u6570\u3002\n */\nexport function clampTimeout(requested: number | undefined, min: number, max: number): number {\n if (requested === undefined || !Number.isFinite(requested) || requested <= 0) return min\n return Math.min(Math.max(requested, min), max)\n}\n\n/**\n * \u89E3\u6790\u5DE5\u4F5C\u76EE\u5F55\uFF08\u5B98\u65B9 `resolveWorkdir`\uFF09\u3002\n *\n * \u523B\u610F\u4E0E\u5B98\u65B9\u4E00\u81F4\uFF1A**\u7B56\u7565\u91CC\u7684 workspaceRoot \u4F18\u5148\u4E8E\u4F1A\u8BDD cwd**\uFF08\u6C99\u7BB1\u628A\u53EF\u5199\u8FB9\u754C\u5F53\u4F5C\u5DE5\u4F5C\u76EE\u5F55\uFF09\uFF0C\n * \u76F8\u5BF9\u8DEF\u5F84\u7528 `sep` \u62FC\u63A5\u800C**\u4E0D\u662F** `resolve()`\uFF08\u907F\u514D\u628A\u4E00\u4E2A\u4E0D\u5B58\u5728\u7684\u8DEF\u5F84\u89C4\u8303\u5316\u6210\u522B\u7684\u4E1C\u897F\uFF09\u3002\n * @param modelWorkdir \u6A21\u578B\u7ED9\u7684 workdir\u3002\n * @param exec \u6267\u884C\u4E0A\u4E0B\u6587\u3002\n * @param policyWorkspaceRoot \u7B56\u7565\u91CC\u7684 workspaceRoot\u3002\n * @param sep \u5E73\u53F0\u5206\u9694\u7B26\u3002\n * @param isAbsolute \u5224\u5B9A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u6CE8\u5165\u4EE5\u4FBF\u5355\u6D4B\uFF09\u3002\n * @returns \u5DE5\u4F5C\u76EE\u5F55\uFF1B\u90FD\u6CA1\u6709\u65F6 undefined\uFF08\u7531\u8C03\u7528\u65B9\u515C\u5E95\uFF09\u3002\n */\nexport function resolveWorkdir(\n modelWorkdir: string | undefined,\n exec: ToolRunContextLike,\n policyWorkspaceRoot: string | undefined,\n sep: string,\n isAbsolute: (path: string) => boolean,\n): string | undefined {\n const headerCwd = exec.agent?.session.header.cwd\n const sessionCwd = policyWorkspaceRoot ?? headerCwd\n if (modelWorkdir === undefined) return sessionCwd\n if (sessionCwd !== undefined && !isAbsolute(modelWorkdir)) return `${sessionCwd}${sep}${modelWorkdir}`\n return modelWorkdir\n}\n\n/** \u9020\u4E00\u4E2A\"\u4E2D\u6B62\"\u9519\u8BEF\uFF08\u7ED3\u6784\u7B49\u4EF7\u4E8E\u5B98\u65B9\u7684 HarnessError + name \u8986\u5199\uFF09\u3002 */\nfunction abortedError(): Error {\n const error = new Error('tool call aborted') as Error & { code?: string }\n error.name = 'AbortError'\n error.code = TOOL_ABORTED\n return error\n}\n\n/**\n * \u521B\u5EFA bash \u5DE5\u5177\u5B9A\u4E49\u3002\n *\n * @param deps \u7ED3\u6784\u6027\u6CE8\u5165\u7684\u670D\u52A1\uFF08subprocess \u5FC5\u9700\uFF0C\u5176\u4F59\u7F3A\u7701\u5373\u964D\u7EA7\uFF09\u3002\n * @param options `bashPath` \u662F Git Bash \u53EF\u6267\u884C\u6587\u4EF6\uFF1B`sep`/`isAbsolute` \u6CE8\u5165\u4EE5\u4FBF\u8DE8\u5E73\u53F0\u5355\u6D4B\u3002\n * @returns \u53EF\u76F4\u63A5\u4EA4\u7ED9 `tools.register()` \u7684\u5DE5\u5177\u5B9A\u4E49\u3002\n */\nexport function createBashTool(\n deps: BashToolDeps,\n options: {\n readonly bashPath: string\n readonly sep?: string\n readonly isAbsolute?: (path: string) => boolean\n /** \u8D85\u65F6\u4E0B\u9650\uFF08\u9ED8\u8BA4 120s\uFF09\u3002\u53EF\u6CE8\u5165\uFF1A\u5C0F\u503C\u8BA9\u8D85\u65F6\u8DEF\u5F84\u80FD\u88AB\u6D4B\u5230\u3002 */\n readonly timeoutMs?: number\n /** \u8D85\u65F6\u4E0A\u9650\uFF08\u9ED8\u8BA4 600s\uFF09\u3002 */\n readonly maxTimeoutMs?: number\n /**\n * \u662F\u5426\u6309\u300C\u6253\u5305\u5F62\u6001\u7684 Electron \u5BBF\u4E3B\u300D\u8865 `ELECTRON_RUN_AS_NODE`\u3002\n *\n * \u9ED8\u8BA4\u770B `process.versions.electron`\uFF1B\u53EF\u6CE8\u5165\uFF0C\u597D\u8BA9 node \u4E0B\u8DD1\u7684\u6D4B\u8BD5\u4E5F\u80FD\u65AD\u8A00\u8FD9\u4E00\u9879\u3002\n */\n readonly electron?: boolean\n },\n): ToolDefinitionLike {\n const escalationModes = escalationModesOf(deps)\n const sep = options.sep ?? '\\\\'\n const isAbsolute = options.isAbsolute ?? ((path: string) => /^([a-zA-Z]:[\\\\/]|[\\\\/])/.test(path))\n const electron = options.electron ?? (process.versions as { electron?: string }).electron !== undefined\n const minTimeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const maxTimeout = options.maxTimeoutMs ?? MAX_TIMEOUT_MS\n\n /** \u9020\u4E00\u4EFD spawn \u89C4\u683C\uFF08\u5B98\u65B9 bash-local \u7684 spawnSpec \u7B49\u4EF7\u7269\uFF09\u3002 */\n const spawnSpec = (argv: readonly string[], cwd: string, dshEnv: Record<string, string>, signal: AbortSignal | undefined) => ({\n argv,\n cwd,\n stdio: {\n stdin: 'ignore' as const,\n stdout: { maxBytes: MAX_OUTPUT_BYTES, spill: { maxBytes: MAX_SPILL_BYTES } },\n stderr: { maxBytes: MAX_OUTPUT_BYTES, spill: { maxBytes: MAX_SPILL_BYTES } },\n },\n graceMs: GRACE_MS,\n ...(signal === undefined ? {} : { signal }),\n // dshEnv \u5FC5\u987B\u663E\u5F0F\u5E26\u4E0A\uFF1Asubprocess \u4F1A\u5148\u6309\u51ED\u636E\u5F62\u72B6\u6E05\u6D17\u7236\u73AF\u5883\uFF08\u542B\u6E05\u6389\u6240\u6709 DSH_*\uFF09\u3002\n env: {\n ...ENV_OVERRIDES,\n ...dshEnv,\n // \u26A0\uFE0F \u6253\u5305\u5F62\u6001\uFF08Electron \u684C\u9762\u7248\uFF09\u4E0B\u5FC5\u987B\u8865\u8FD9\u4E00\u9879\u3002Windows \u4E0A\u53D7\u9650\u6A21\u5F0F\u7684\u6C99\u7BB1 runner\n // \u7684 argv[0] \u662F `process.execPath`\uFF08`dsh-sandbox-local/lib/index.js:539`\uFF09\uFF0C\u684C\u9762\u7248\u91CC\n // \u90A3\u5C31\u662F `DeepSeek Harness.exe`\uFF1B\u800C\u7528 Electron \u8DD1 JS \u811A\u672C**\u5FC5\u987B**\u5E26\n // `ELECTRON_RUN_AS_NODE=1`\uFF0C\u5426\u5219\u5B83\u6309 App \u5F62\u6001\u542F\u52A8\u3001\u539F\u751F\u521D\u59CB\u5316\u5C31\u5931\u8D25\n // \uFF082026-09-25 \u5B9E\u6D4B\uFF1A\u96F6\u8F93\u51FA / 0xC0000142\uFF09\u3002\u5B98\u65B9 `sandbox-local` \u53EA\u8FD4\u56DE argv\u3001\u4E0D\u5E26 env\uFF0C\n // \u6240\u4EE5\u8FD9\u4E00\u9879\u53EA\u80FD\u7531 **spawn \u65B9**\u8865\u9F50\u3002\u5BF9 `bash.exe` \u672C\u8EAB\u65E0\u526F\u4F5C\u7528\uFF08\u5B83\u4E0D\u8BA4\u8FD9\u4E2A\u53D8\u91CF\uFF09\u3002\n ...(electron ? { ELECTRON_RUN_AS_NODE: '1' } : {}),\n },\n })\n\n /** \u8BFB\u4E00\u5E27\u589E\u91CF\uFF08\u5B98\u65B9 executor \u7684\u6E38\u6807\u8BB0\u8D26\uFF09\u3002 */\n const readFrame = (\n handle: SubprocessHandleLike,\n offsets: { stdout: number; stderr: number },\n ): ProcessRead => {\n const outRead = handle.collected.stdout?.readFrom(offsets.stdout)\n const errRead = handle.collected.stderr?.readFrom(offsets.stderr)\n offsets.stdout = outRead?.nextOffset ?? offsets.stdout\n offsets.stderr = errRead?.nextOffset ?? offsets.stderr\n const outText = outRead?.text ?? ''\n const errText = errRead?.text ?? ''\n const separator = outText.length > 0 && !outText.endsWith('\\n') ? '\\n' : ''\n return {\n delta: outText + (errText.length > 0 ? `${separator}[stderr]\\n${errText}` : ''),\n lossy: (outRead?.lossy ?? false) || (errRead?.lossy ?? false),\n ...(outRead?.spillPath === undefined ? {} : { stdoutSpillPath: outRead.spillPath }),\n ...(errRead?.spillPath === undefined ? {} : { stderrSpillPath: errRead.spillPath }),\n }\n }\n\n /** \u4E00\u6761\u547D\u4EE4\u7684\u5B8C\u6574\u6267\u884C\u4F53\u3002 */\n const execute = async (rawArgs: unknown, exec: ToolRunContextLike): Promise<unknown> => {\n const args = rawArgs as BashToolArgs\n if (args.command.trim().length === 0) throw new Error('invalid command: expected a non-empty string')\n if (args.description.trim().length === 0) throw new Error('invalid description: expected a non-empty string')\n if (args.timeoutMs !== undefined && (!Number.isFinite(args.timeoutMs) || args.timeoutMs <= 0)) {\n throw new Error(`invalid timeoutMs: expected a positive number, got ${JSON.stringify(args.timeoutMs)}`)\n }\n validateEscalationArgs(args.sandbox_permissions, args.justification)\n\n const standingPolicy: SandboxExecutionPolicy | undefined = deps.sandboxPolicy?.resolve(\n exec.agent === undefined ? {} : { session: exec.agent.session },\n )\n const approvedMode = args.sandbox_permissions !== undefined && args.justification !== undefined\n ? await approveEscalation(\n {\n requestedMode: args.sandbox_permissions,\n justification: args.justification,\n effectiveMode: (standingPolicy as SandboxExecutionPolicy).mode,\n subject: 'command',\n },\n {\n approver: deps.approval,\n agent: exec.agent,\n callId: exec.callId,\n toolName: BASH_TOOL_NAME,\n signal: exec.signal,\n },\n )\n : undefined\n const policy: SandboxExecutionPolicy | undefined = approvedMode === undefined\n ? standingPolicy\n : { ...(standingPolicy as SandboxExecutionPolicy), mode: approvedMode }\n\n const workdir = resolveWorkdir(args.workdir, exec, standingPolicy?.workspaceRoot, sep, isAbsolute)\n const dshEnv = deps.shellEnv?.collect(exec) ?? {}\n\n // \u7EA6\u675F\uFF1A\u53EA\u6709\"\u53D7\u9650\u6A21\u5F0F + \u6709 sandbox \u670D\u52A1\"\u624D\u5305\uFF1B`danger-full-access` \u76F4\u63A5\u8DD1\uFF08\u5B98\u65B9\u540C\u5224\u636E\uFF09\u3002\n let argv: readonly string[] = [options.bashPath, '-c', args.command]\n let confined: ConfinedArgv | undefined\n if (policy !== undefined && policy.mode !== 'danger-full-access' && deps.sandbox !== undefined) {\n // \u5B98\u65B9 `bash-sandbox` \u7684\u505A\u6CD5\uFF1A\u628A shell \u5F62\u72B6\u7684\u547D\u4EE4\u4EA4\u7ED9 confine\uFF08argv \u800C\u4E0D\u662F\u547D\u4EE4\u884C\u5B57\u7B26\u4E32\uFF09\u3002\n confined = await deps.sandbox.confine(argv, { ...policy, mode: policy.mode })\n argv = confined.argv\n }\n\n const timeoutMs = clampTimeout(args.timeoutMs, minTimeout, maxTimeout)\n\n // \u2500\u2500 \u540E\u53F0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (args.run_in_background === true) {\n const jobs = deps.jobs\n if (jobs === undefined) {\n throw new Error('background jobs unavailable: load @deepseek-ai/dsh-jobs and @deepseek-ai/dsh-tool-jobs')\n }\n if (exec.signal.aborted) throw abortedError()\n const id = jobs.start({\n kind: 'bash',\n label: args.command,\n ...(exec.agent === undefined ? {} : { owner: exec.agent }),\n run: () => {\n const controller = new AbortController()\n let handle: SubprocessHandleLike | undefined\n const offsets = { stdout: 0, stderr: 0 }\n const done = (async () => {\n try {\n handle = deps.subprocess.spawn(spawnSpec(argv, workdir ?? process.cwd(), dshEnv, controller.signal))\n if (controller.signal.aborted) handle.terminate()\n const outcome = await handle.done\n if (controller.signal.aborted) {\n return {\n status: 'killed' as const,\n detail: outcome.signal !== null ? `signal: ${outcome.signal}` : 'killed before exit',\n }\n }\n return { status: 'completed' as const, detail: `exit code: ${outcome.exitCode ?? 0}` }\n } catch (error: unknown) {\n return {\n status: (controller.signal.aborted && handle === undefined ? 'killed' : 'failed') as 'killed' | 'failed',\n detail: error instanceof Error ? error.message : String(error),\n }\n }\n })()\n return {\n cancel: (): void => {\n if (controller.signal.aborted) return\n controller.abort()\n handle?.terminate()\n },\n done,\n readOutput: (): string => (handle === undefined\n ? ''\n : renderProcessRead(readFrame(handle, offsets), undefined, escalationModes)),\n }\n },\n })\n return { kind: 'background', jobId: id }\n }\n\n // \u2500\u2500 \u524D\u53F0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const controller = new AbortController()\n let timedOut = false\n const timer = setTimeout(() => {\n timedOut = true\n controller.abort()\n }, timeoutMs)\n const onAbort = (): void => { controller.abort() }\n exec.signal.addEventListener('abort', onAbort)\n let handle: SubprocessHandleLike | undefined\n try {\n handle = deps.subprocess.spawn(spawnSpec(argv, workdir ?? process.cwd(), dshEnv, controller.signal))\n } catch (error: unknown) {\n clearTimeout(timer)\n exec.signal.removeEventListener('abort', onAbort)\n throw error\n }\n const onControllerAbort = (): void => {\n try { handle?.terminate() } catch { /* \u5DF2\u7ECF\u7ED3\u675F */ }\n }\n controller.signal.addEventListener('abort', onControllerAbort)\n try {\n const outcome = await handle.done\n const read = readFrame(handle, { stdout: 0, stderr: 0 })\n const aborted = exec.signal.aborted && !timedOut\n const denied = confined !== undefined\n && outcome.exitCode !== 0\n && confined.denialSignatures.some(signature => read.delta.toLowerCase().includes(signature.toLowerCase()))\n const result: BashRunResult = {\n exitCode: outcome.exitCode,\n signal: outcome.signal,\n timedOut,\n aborted,\n timeoutMs,\n stdout: { text: read.delta, truncated: read.lossy, ...(read.stdoutSpillPath === undefined ? {} : { spillPath: read.stdoutSpillPath }) },\n stderr: { text: '', truncated: false },\n ...(denied ? { sandbox: { mode: policy?.mode ?? 'read-only', denied: true } as SandboxFacts } : {}),\n }\n if (aborted) throw abortedError()\n return { kind: 'foreground', ...result }\n } finally {\n clearTimeout(timer)\n exec.signal.removeEventListener('abort', onAbort)\n controller.signal.removeEventListener('abort', onControllerAbort)\n }\n }\n\n return {\n name: BASH_TOOL_NAME,\n description: bashDescription(true, escalationModes),\n parameters: bashParameters(escalationModes),\n output: {\n schema: bashOutputSchema(),\n render: (_args: unknown, value: unknown): ContentBlockLike[] => {\n const v = value as { kind?: string; jobId?: string } & BashRunResult\n const text = v.kind === 'background'\n ? `started background job ${v.jobId}`\n : renderBashResult(v, escalationModes)\n return [{ type: 'text', text }]\n },\n },\n execute,\n presentCall: (args: unknown): unknown => {\n const a = args as BashToolArgs\n if (a.run_in_background === true) {\n return {\n card: 'generic', title: a.command, kind: 'execute', rawInput: a.command,\n content: [{ type: 'text', text: a.description }],\n }\n }\n return {\n card: 'terminal', title: a.command, description: a.description,\n ...(a.workdir === undefined ? {} : { cwd: a.workdir }),\n }\n },\n presentResult: (args: unknown, result: { content: ContentBlockLike[]; isError: boolean }): unknown => {\n const block = result.content.length === 1 ? result.content[0] : undefined\n if (block === undefined || block.type !== 'text') return undefined\n const raw = block.text\n const isBackground = typeof args === 'object' && args !== null\n && (args as { run_in_background?: unknown }).run_in_background === true\n if (isBackground || result.isError) {\n return { card: 'generic', content: [{ type: 'text', text: `\\`\\`\\`console\\n${raw.replace(/\\n+$/, '')}\\n\\`\\`\\`` }] }\n }\n const { body, ...exit } = parseExitStatus(raw)\n return { card: 'terminal', output: body, ...exit }\n },\n }\n}\n\n// \u2500\u2500 \u81EA\u68C0\u63A2\u9488\uFF082026-09-25 \u65B0\u589E\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// \u4E3A\u4EC0\u4E48\u9700\u8981\uFF1A\u5B98\u65B9\u5B89\u88C5\u7684**\u684C\u9762\u7248**\uFF08Electron \u6253\u5305\uFF09\u5728**\u53D7\u9650\u6587\u4EF6\u7B56\u7565**\u4E0B\uFF0C\u547D\u4EE4\u4F1A\u7ECF\u8FC7\u6C99\u7BB1\n// runner\uFF0C\u800C runner \u662F\u7528 `process.execPath` \u8D77\u7684 \u2014\u2014 \u684C\u9762\u7248\u91CC\u90A3\u662F `DeepSeek Harness.exe`\n// \u800C\u4E0D\u662F node\uFF0C\u4E8E\u662F\u6BCF\u6761\u547D\u4EE4\u90FD\u4EE5 `0xC0000142`\uFF08DLL \u521D\u59CB\u5316\u5931\u8D25\uFF09\u9000\u51FA\u3001\u96F6\u8F93\u51FA\u3002\n// \u63D2\u4EF6\u7684\u300C\u9ED8\u8BA4\u7EC8\u7AEF\u300D\u82E5\u7167\u65E7\u63A5\u7BA1\uFF0C\u7ED3\u679C\u5C31\u662F\uFF1A`restrict(pwsh)` \u5DF2\u751F\u6548 + \u81EA\u5E26\u7684 bash \u53C8\u8DD1\u4E0D\u52A8\n// = \u8BE5\u4F1A\u8BDD**\u4E00\u4E2A\u80FD\u7528\u7684 shell \u90FD\u6CA1\u6709**\uFF08\u6BD4\u4E0D\u63A5\u7BA1\u66F4\u7CDF\uFF09\u3002\n// \u6240\u4EE5\uFF1A\u63A5\u7BA1\u524D\u5148\u7528**\u540C\u4E00\u6761\u6267\u884C\u8DEF\u5F84**\u63A2\u4E00\u6B21\uFF1B\u4E0D\u901A\u8FC7\u5C31\u4E0D\u63A5\u7BA1\uFF0C\u81F3\u5C11\u8FD8\u7559\u7740 PowerShell\u3002\n// \u6CE8\u610F `danger-full-access` \u4F1A\u8DF3\u8FC7 confine\uFF0C\u5B9E\u6D4B\u90A3\u6761\u8DEF\u5F84\u672C\u6765\u5C31\u662F\u597D\u7684 \u2014\u2014 \u8C03\u7528\u65B9\u53EA\u5728\u53D7\u9650\n// \u6A21\u5F0F\u4E0B\u624D\u8981\u6C42\u63A2\u9488\uFF08\u89C1 terminal/host.ts\uFF09\u3002\n\n/** \u63A2\u9488\u547D\u4EE4\uFF1A\u53EA\u6253\u5370\u4E00\u4E2A\u6807\u8BB0\uFF0C\u4E0D\u5199\u6587\u4EF6\u3001\u4E0D\u4F9D\u8D56\u5F53\u524D\u76EE\u5F55\u3002 */\nexport const PROBE_COMMAND = 'printf %s dsh-composer-ux-probe-ok'\n/** \u63A2\u9488\u901A\u8FC7\u65F6 stdout \u5FC5\u987B\u5305\u542B\u7684\u6807\u8BB0\u3002 */\nexport const PROBE_MARKER = 'dsh-composer-ux-probe-ok'\n/** \u63A2\u9488\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\uFF1A\u591F\u6162\u673A\u5668\u8D77\u4E00\u6B21 shell\uFF0C\u53C8\u4E0D\u81F3\u4E8E\u628A\u63D2\u4EF6\u542F\u52A8\u62D6\u4F4F\u3002 */\nexport const PROBE_TIMEOUT_MS = 8_000\n\n/** \u63A2\u9488\u7ED3\u8BBA\u3002 */\nexport interface ProbeOutcome {\n readonly ok: boolean\n /** \u5931\u8D25\u539F\u56E0\uFF08ok \u65F6\u4E3A\u7A7A\u4E32\uFF09\u3002 */\n readonly detail: string\n}\n\n/** \u9000\u51FA\u7801\u7684\u53EF\u8BFB\u5199\u6CD5\uFF1AWindows \u4E0A\u90A3\u4E9B `0xC0000xxx` \u8BED\u4E49\u4E0A\u662F\"\u8FDB\u7A0B\u6CA1\u8D77\u6765\"\uFF0C\u5199\u6210\u5341\u516D\u8FDB\u5236\u6700\u597D\u8BA4\u3002 */\nexport function formatProbeExit(exitCode: number | null): string {\n if (exitCode === null) return 'null\uFF08\u88AB\u4FE1\u53F7\u7ED3\u675F\uFF09'\n if (exitCode < 0 || exitCode >= 0x80000000) {\n const unsigned = exitCode < 0 ? exitCode + 0x1_0000_0000 : exitCode\n return `0x${unsigned.toString(16).toUpperCase()}\uFF08${unsigned}\uFF09`\n }\n return String(exitCode)\n}\n\n/**\n * \u7528**\u4E0E\u771F\u5B9E bash \u5DE5\u5177\u5B8C\u5168\u76F8\u540C\u7684\u8DEF\u5F84**\u8DD1\u4E00\u6761\u65E0\u526F\u4F5C\u7528\u547D\u4EE4\uFF08\u540C\u4E00\u4EFD argv \u6784\u9020\u3001\u540C\u4E00\u4E2A\n * \u6C99\u7BB1 `confine`\u3001\u540C\u4E00\u4E2A `subprocess.spawn`\uFF09\u3002\n *\n * \u523B\u610F\u501F\u9053 `createBashTool(...).execute(...)` \u800C\u4E0D\u662F\u53E6\u5199\u4E00\u5957 spawn\uFF1A\u81EA\u68C0\u5FC5\u987B\u6D4B\u5230\"\u771F\u5DE5\u5177\u4F1A\u8D70\u7684\n * \u90A3\u6761\u8DEF\"\uFF0C\u5426\u5219\u5B83\u8BC1\u660E\u4E0D\u4E86\u4EFB\u4F55\u4E8B\uFF08argv \u62FC\u9519\u3001confine \u6F0F\u5305\u3001cwd/env \u4E0D\u5BF9\u90FD\u4F1A\u6F0F\u8FC7\u53BB\uFF09\u3002\n * \u4E5F\u523B\u610F**\u4E0D\u5E26** `sandbox_permissions`\uFF1A\u81EA\u68C0\u4E0D\u8BE5\u5F39\u5BA1\u6279\u3002\n * @param deps \u5DE5\u5177\u4F9D\u8D56\uFF08\u4E0E\u771F\u5DE5\u5177\u540C\u4E00\u4EFD\uFF09\u3002\n * @param options `bashPath` \u7B49\uFF08\u4E0E\u771F\u5DE5\u5177\u540C\u4E00\u4EFD\uFF09\u3002\n * @param exec \u501F\u6765\u7684\u6267\u884C\u4E0A\u4E0B\u6587\uFF08agent/signal/callId\uFF09\u3002\n * @returns \u63A2\u9488\u7ED3\u8BBA\uFF1B\u4EFB\u4F55\u5F02\u5E38\u90FD\u6536\u655B\u6210 `{ ok: false }`\uFF08fail-closed\uFF09\u3002\n */\nexport async function probeBashExecution(\n deps: BashToolDeps,\n options: { readonly bashPath: string; readonly sep?: string; readonly isAbsolute?: (path: string) => boolean },\n exec: ToolRunContextLike,\n): Promise<ProbeOutcome> {\n // \u53D7\u7BA1\u73AF\u5883\u53D8\u91CF\u6536\u96C6\u5931\u8D25\u4E0D\u8BE5\u5426\u6389\u6574\u4E2A\u63A2\u9488\uFF1A\u90A3\u662F\u53E6\u4E00\u6761\u94FE\u8DEF\u7684\u95EE\u9898\uFF0C\u800C\u8FD9\u91CC\u8981\u9A8C\u7684\u662F\"\u547D\u4EE4\u80FD\u4E0D\u80FD\u8DD1\"\u3002\n const probeDeps: BashToolDeps = deps.shellEnv === undefined\n ? deps\n : {\n ...deps,\n shellEnv: {\n collect: (ctx): Record<string, string> => {\n try {\n return deps.shellEnv?.collect(ctx) ?? {}\n } catch {\n return {}\n }\n },\n },\n }\n try {\n const tool = createBashTool(probeDeps, { ...options, timeoutMs: PROBE_TIMEOUT_MS, maxTimeoutMs: PROBE_TIMEOUT_MS })\n const result = await tool.execute(\n { command: PROBE_COMMAND, description: 'composer-ux terminal self-check', timeoutMs: PROBE_TIMEOUT_MS },\n exec,\n ) as {\n kind?: string\n exitCode?: number | null\n timedOut?: boolean\n aborted?: boolean\n stdout?: { text?: string }\n sandbox?: { denied?: boolean }\n }\n if (result?.kind !== 'foreground') return { ok: false, detail: '\u81EA\u68C0\u6CA1\u6709\u8D70\u524D\u53F0\u6267\u884C\u8DEF\u5F84' }\n if (result.timedOut === true) return { ok: false, detail: `\u81EA\u68C0\u8D85\u65F6\uFF08${PROBE_TIMEOUT_MS}ms\uFF09` }\n const text = result.stdout?.text ?? ''\n const exit = result.exitCode ?? 0\n if (exit !== 0) {\n return {\n ok: false,\n detail: `\u81EA\u68C0\u547D\u4EE4\u9000\u51FA\u7801 ${formatProbeExit(exit)}${text.trim() === '' ? '\uFF08\u96F6\u8F93\u51FA\uFF09' : ''}`,\n }\n }\n if (!text.includes(PROBE_MARKER)) return { ok: false, detail: '\u81EA\u68C0\u6CA1\u62FF\u5230\u9884\u671F\u8F93\u51FA\uFF08\u547D\u4EE4\u6CA1\u771F\u6B63\u8DD1\u8D77\u6765\uFF09' }\n return { ok: true, detail: '' }\n } catch (error: unknown) {\n return { ok: false, detail: error instanceof Error ? error.message : String(error) }\n }\n}\n", "/**\n * \u300C\u91CD\u542F DSH\u300D\u7684\u5BBF\u4E3B\u534A\uFF1A**\u628A\u81EA\u5DF1\u91CD\u65B0\u62C9\u8D77\u6765**\u3002\n *\n * \u673A\u5236\u7167\u642C\u63D2\u4EF6\u5E02\u573A\uFF08GitHub `dsh-market/dsh-market` \u7684 `src/restart.ts` \u4E0E `src/dsh-cli.ts`\uFF0C\n * \u672C\u673A profile \u91CC\u6709\u5B83\u7684\u6E90\u7801\uFF09\u3002\u4E3A\u4EC0\u4E48\u6284\u5B83\u800C\u4E0D\u662F\u81EA\u5DF1\u53D1\u660E\uFF1A\u5B83\u662F\u5728\u771F\u5B9E\u7528\u6237\u91CC\u88AB\u6253\u78E8\u51FA\u6765\u7684 \u2014\u2014\n * \u6587\u4EF6\u9876\u90E8\u7684\u6CE8\u91CA\u91CC\u6302\u7740\u4E00\u6761\u6761 issue \u53F7\uFF0C\u6BCF\u4E00\u6761\u90FD\u662F\"\u91CD\u542F\u6309\u94AE\u6309\u4E0B\u53BB\u6CA1\u7528\"\u7684\u5177\u4F53\u6B7B\u6CD5\u3002\n *\n * \u5B83\u505A\u7684\u4E8B\uFF08\u4E5F\u662F\u8FD9\u91CC\u505A\u7684\u4E8B\uFF09\uFF1A\n * 1. \u5206\u79BB\u4E00\u4E2A **node \u52A9\u624B\u8FDB\u7A0B**\uFF08`node -e <\u6E90\u7801>`\uFF0Cdetached + unref + stdio ignore\uFF09\u2014\u2014\n * \u5BBF\u4E3B\u81EA\u5DF1\u9A6C\u4E0A\u5C31\u8981\u9000\u51FA\uFF0C\u6240\u4EE5\"\u7B49\u7AEF\u53E3\u3001\u8D77\u65B0\u8FDB\u7A0B\u3001\u9A8C\u8BC1\"\u5FC5\u987B\u7531\u4E00\u4E2A\u6D3B\u5F97\u6BD4\u5B83\u4E45\u7684\u8FDB\u7A0B\u6765\u505A\uFF1B\n * 2. \u52A9\u624B**\u7B49\u7AEF\u53E3\u771F\u7684\u7A7A\u51FA\u6765**\uFF08\u6BCF 250ms connect \u63A2\u4E00\u6B21\uFF0C\u6700\u591A 30 \u79D2\uFF09\uFF0C\u800C\u4E0D\u662F\u7761\u56FA\u5B9A\u65F6\u957F\uFF1A\n * \u65E7\u8FDB\u7A0B\u9000\u51FA \u2260 \u7AEF\u53E3\u7ACB\u523B\u91CA\u653E\uFF08Windows \u4E0A\u8FD8\u6709 TIME_WAIT\uFF09\uFF0C\u56FA\u5B9A\u7761 1500ms \u66FE\u8BA9\u65B0\u5BBF\u4E3B\n * `EADDRINUSE` \u5F53\u573A\u6B7B\u6389\u3001\u800C\u5931\u8D25\u8FD8\u88AB `catch {}` \u541E\u4E86\uFF08issue #177\uFF09\uFF1B\n * 3. \u52A9\u624B\u7528 **\u9690\u85CF\u63A7\u5236\u53F0\u7684 PowerShell** \u8D77\u65B0\u5BBF\u4E3B\uFF08Windows \u4E0A `detached` = `DETACHED_PROCESS`\n * = \u6CA1\u6709\u63A7\u5236\u53F0\uFF0C\u65B0\u5BBF\u4E3B\u4E4B\u540E\u8D77\u7684\u6BCF\u4E2A\u63A7\u5236\u53F0\u5B50\u8FDB\u7A0B\u90FD\u4F1A\u5F39\u4E00\u4E2A\u9ED1\u7A97\u53E3\uFF0Cissue #40\uFF1B\u800C\n * `-WindowStyle Hidden` \u53C8\u7BA1\u4E0D\u5230 spawn \u4EA4\u7ED9 PowerShell \u7684\u90A3\u4E2A\u63A7\u5236\u53F0\uFF0C\u6240\u4EE5\u52A9\u624B\u8FD9\u4E00\u5C42\n * \u8FD8\u5F97\u81EA\u5DF1\u5E26 `windowsHide`\uFF0Cissue #624\uFF09\uFF1B\n * 4. \u52A9\u624B\u8D77\u5B8C\u8FDB\u7A0B\u518D\u7B49\u6700\u591A 20 \u79D2\u786E\u8BA4\u7AEF\u53E3\u6709\u4EBA\u76D1\u542C\uFF0C\u6CA1\u8D77\u6765\u5C31\u628A\u8BCA\u65AD**\u5199\u8FDB\u65E5\u5FD7\u6587\u4EF6** \u2014\u2014\n * \u672C\u6765\u8BE5\u8BB0\u65E5\u5FD7\u7684\u90A3\u4E2A\u8FDB\u7A0B\uFF08\u5BBF\u4E3B\uFF09\u5DF2\u7ECF\u9000\u51FA\u4E86\uFF0C\u91CD\u542F\u5931\u8D25\u5FC5\u987B\u7559\u8BC1\u636E\uFF1B\n * 5. \u5BBF\u4E3B\u81EA\u5DF1\u9000\u51FA\uFF0C**\u5EF6\u8FDF 500ms**\uFF0C\u597D\u8BA9 HTTP \u54CD\u5E94\u5148\u53D1\u51FA\u53BB\uFF08\u5E02\u573A\u7528\n * `process.kill(pid,'SIGTERM')`\uFF1B\u672C\u63D2\u4EF6\u6539\u7528 `process.emit('SIGTERM')`\uFF0C\u7406\u7531\u89C1\n * {@link gracefulStop}\uFF09\u3002\n *\n * \u4E0E\u5E02\u573A\u7684\u4E24\u5904\u523B\u610F\u5206\u6B67\uFF08\u90FD\u5728\u4E0B\u9762\u6CE8\u91CA\u91CC\u5199\u660E\u7406\u7531\uFF09\uFF1A\u9000\u51FA\u65B9\u5F0F\uFF0C\u4EE5\u53CA\u6CA1\u6709\"\u5199\u4E00\u4E2A\u811A\u672C\u5230\u78C1\u76D8\"\u3002\n * \u5168\u90E8\u5916\u90E8\u52A8\u4F5C\uFF08spawn / \u5B9A\u65F6 / \u9000\u51FA / \u53D6\u8DEF\u5F84 / \u5224\u5B58\u5728\uFF09\u90FD\u6CE8\u5165\uFF0C\u4FBF\u4E8E\u5355\u6D4B\u3002\n */\n\n/** \u52A9\u624B\u63A2\u6D4B\u7AEF\u53E3\u662F\u5426\u88AB\u5360\u7528\u7684\u95F4\u9694\u3002 */\nexport const RESTART_POLL_MS = 250\n/** \u52A9\u624B\u7B49\u65E7\u8FDB\u7A0B\u91CA\u653E\u7AEF\u53E3\u7684\u4E0A\u9650\u3002 */\nexport const RESTART_PORT_WAIT_MS = 30_000\n/** \u7AEF\u53E3\u521A\u7A7A\u51FA\u6765\u540E\u7684\u989D\u5916\u7B49\u5F85\uFF08Windows \u7684 TIME_WAIT \u5C3E\u5DF4\uFF09\u3002 */\nexport const RESTART_PORT_SETTLE_MS = 300\n/** \u5BBF\u4E3B\u6536\u5230\u91CD\u542F\u8BF7\u6C42\u540E\u3001\u771F\u6B63\u9000\u51FA\u524D\u7684\u5EF6\u8FDF\uFF08\u8BA9 HTTP \u54CD\u5E94\u5148\u53D1\u51FA\u53BB\uFF09\u3002 */\nexport const RESTART_EXIT_DELAY_MS = 500\n/** \u52A9\u624B\u5728\u65B0\u5BBF\u4E3B\u8D77\u6765\u540E\u786E\u8BA4\u7AEF\u53E3\u7684\u4E0A\u9650\u3002 */\nexport const RESTART_REPLACEMENT_WAIT_MS = 20_000\n/** \u52A9\u624B\u5355\u6B21 connect \u63A2\u6D4B\u7684\u8D85\u65F6\u3002 */\nexport const RESTART_PROBE_TIMEOUT_MS = 500\n/** \u7AEF\u53E3\u672A\u77E5\u65F6\u52A9\u624B\u8D77\u65B0\u8FDB\u7A0B\u524D\u7761\u7684\u65F6\u957F\uFF08\u5E02\u573A\u539F\u503C\uFF09\u3002 */\nexport const RESTART_NO_PORT_DELAY_MS = 1_500\n/** \u7AEF\u53E3\u672A\u77E5\u65F6\u52A9\u624B\u8D77\u5B8C\u8FDB\u7A0B\u540E\u591A\u6D3B\u4E00\u4F1A\u513F\uFF0C\u514D\u5F97\u628A\u8FD8\u6CA1 detach \u5B8C\u7684\u66FF\u6362\u8FDB\u7A0B\u5E26\u8D70\u3002 */\nexport const RESTART_HELPER_LINGER_MS = 3_000\n/**\n * \u4F18\u96C5\u9000\u51FA\u540E\u3001\u5F3A\u5236\u9000\u51FA\u7684\u515C\u5E95\u65F6\u957F\u3002\n *\n * \u6BD4 DSH \u81EA\u5DF1\u7684\u4E0A\u9650\u957F\uFF1A`createProcessShutdown` \u5185\u90E8\u662F 5 \u79D2\uFF08`PROCESS_SHUTDOWN_TIMEOUT_MS`\uFF09\uFF0C\n * \u6211\u4EEC\u53EA\u8D1F\u8D23\"\u8FDE\u90A3\u4E2A\u90FD\u6CA1\u751F\u6548\"\u7684\u60C5\u51B5\uFF08\u6BD4\u5982\u6CA1\u6709\u6CE8\u518C SIGTERM handler \u7684\u5D4C\u5165\u5F62\u6001\uFF09\u3002\n */\nexport const RESTART_STOP_FALLBACK_MS = 10_000\n/** \u52A9\u624B\u65E5\u5FD7\u6587\u4EF6\u540D\u524D\u7F00\uFF08\u843D\u5728\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF09\u3002 */\nexport const RESTART_LOG_PREFIX = 'composer-ux-restart-'\n\n/** \u4E00\u6B21\u91CD\u542F\u8981\u91CD\u653E\u7684\u542F\u52A8\u547D\u4EE4\u3002 */\nexport interface Launch {\n readonly file: string\n readonly args: readonly string[]\n readonly cwd: string\n /** \u88F8\u547D\u4EE4\uFF08Windows \u4E0A `dsh` \u662F .cmd shim\uFF09\u5FC5\u987B\u8FC7\u4E00\u5C42 shell \u624D\u80FD\u8D77\u3002 */\n readonly viaShell: boolean\n}\n\n/** \u91CD\u5EFA\u542F\u52A8\u547D\u4EE4\u6240\u9700\u7684\u8FDB\u7A0B\u4E8B\u5B9E\u3002 */\nexport interface LaunchFacts {\n /** \u8DD1\u5F97\u8D77\u6765\u7684 node \u53EF\u6267\u884C\u6587\u4EF6\uFF08\u89C1 {@link nodeExecutableOf}\uFF09\u3002 */\n readonly node: string\n /** `process.argv[1]`\uFF1A\u5165\u53E3\u811A\u672C\u3002 */\n readonly argv1: string | undefined\n /** `process.execArgv`\uFF1A\u542F\u52A8\u53C2\u6570\u91CC\u7684 loader/import \u4E4B\u7C7B\u3002 */\n readonly execArgv: readonly string[]\n /** `process.argv.slice(2)`\uFF1A\u547D\u4EE4\u4E0E\u547D\u4EE4\u81EA\u5DF1\u7684\u53C2\u6570\uFF08\u5982 `web`\uFF09\u3002 */\n readonly rest: readonly string[]\n readonly cwd: string\n readonly platform: string\n readonly resolve: (path: string) => string\n readonly dirname: (path: string) => string\n}\n\n/**\n * \u8BE5\u7528\u54EA\u4E2A node \u6765 spawn \u5B50\u8FDB\u7A0B\u3002\n *\n * Android \u4E0A\u5185\u6838\u901A\u8FC7\u52A8\u6001\u94FE\u63A5\u5668\u8DD1 node\uFF0C`process.execPath` \u662F `/apex/.../linker64`\uFF0C\n * \u62FF\u5B83\u53BB spawn \u4F1A\u8BA9\u94FE\u63A5\u5668\u628A flag \u5F53\u6210\u7A0B\u5E8F\u8DEF\u5F84\u3002`process.argv0` \u624D\u662F\u771F\u6B63\u7684 node\u3002\n * @param input `process.argv0` / `process.execPath` / \u5224\u5B58\u5728\u7684\u6CE8\u5165\u9762\u3002\n * @returns \u4E00\u4E2A\u7EDD\u5BF9\u8DEF\u5F84\u7684 node\uFF1B\u4E24\u8005\u90FD\u4E0D\u50CF\u65F6\u9000\u56DE execPath\u3002\n */\nexport function nodeExecutableOf(input: {\n readonly argv0: string | undefined\n readonly execPath: string\n readonly exists: (path: string) => boolean\n}): string {\n const { argv0, execPath, exists } = input\n if (argv0 !== undefined && argv0 !== '' && isAbsolutePath(argv0) && exists(argv0)) return argv0\n return execPath\n}\n\n/** \u7EDD\u5BF9\u8DEF\u5F84\u5224\u5B9A\uFF08\u4E0D\u5F15 node:path\uFF0C\u4FDD\u6301\u672C\u6A21\u5757\u96F6 import\uFF09\u3002 */\nfunction isAbsolutePath(value: string): boolean {\n return value.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(value) || value.startsWith('\\\\\\\\')\n}\n\n/**\n * \u91CD\u653E\"\u5F53\u521D\u662F\u600E\u4E48\u628A DSH \u8D77\u6765\u7684\"\u3002\n *\n * `argv[1]` \u957F\u5F97\u50CF dsh \u5165\u53E3\uFF08`bin.js` / `bin.ts` / `dsh`\uFF09\u65F6\uFF0C\u76F4\u63A5 `node <\u7EDD\u5BF9\u5165\u53E3> \u2026`\uFF1A\n * \u5FC5\u987B\u6709\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u56E0\u4E3A\u6E90\u7801\u542F\u52A8\uFF08`pnpm dsh`\uFF09\u7ED9\u7684\u662F\u76F8\u5BF9\u5165\u53E3\uFF0C\u5B50\u8FDB\u7A0B\u4F1A\u62FF**\u81EA\u5DF1\u7684** cwd \u53BB\n * \u89E3\u6790\u7136\u540E `MODULE_NOT_FOUND`\uFF1Bcwd \u53D6\u5165\u53E3\u6240\u5728\u76EE\u5F55\uFF0C`--import tsx/esm` \u8FD9\u7C7B execArgv \u624D\u89E3\u6790\u5F97\u5230\u3002\n * \u5426\u5219\u9000\u56DE\u88F8 `dsh`\uFF08Windows \u4E0A\u662F .cmd\uFF0C\u53EA\u80FD\u8FC7 shell\uFF09\u3002\n */\nexport function launchCommand(facts: LaunchFacts): Launch {\n const { argv1, execArgv, rest, cwd, platform, resolve, dirname } = facts\n if (argv1 !== undefined && /[\\\\/](?:bin\\.(?:js|ts)|dsh)$/.test(argv1)) {\n const absolute = resolve(argv1)\n return { file: facts.node, args: [...execArgv, absolute, ...rest], cwd: dirname(absolute), viaShell: false }\n }\n return { file: 'dsh', args: [...rest], cwd, viaShell: platform === 'win32' }\n}\n\n/** \u52A9\u624B\u6700\u7EC8\u8981 spawn \u4EC0\u4E48\u3002 */\nexport interface Respawn {\n readonly file: string\n readonly args: readonly string[]\n readonly viaShell: boolean\n readonly detached: boolean\n}\n\n/** PowerShell \u5355\u5F15\u53F7\uFF1A\u5185\u90E8\u7684\u5355\u5F15\u53F7\u5199\u4E24\u904D\u3002 */\nexport function quotePowerShell(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`\n}\n\n/**\n * \u628A\u542F\u52A8\u547D\u4EE4\u5305\u6210\"\u5E73\u53F0\u6B63\u786E\"\u7684 spawn \u53C2\u6570\u3002\n *\n * POSIX \u5C31\u662F\u539F\u6765\u7684\u547D\u4EE4 + `detached: true`\u3002\n *\n * Windows \u4E0A\u5FC5\u987B\u6362\u6210 `powershell.exe -NoProfile -WindowStyle Hidden -Command \"& '\u2026'\"`\uFF1A\n * - \u9690\u85CF\u63A7\u5236\u53F0\uFF1A\u65B0\u5BBF\u4E3B\u5982\u679C\u76F4\u63A5 detached \u542F\u52A8\u5C31\u6CA1\u6709\u63A7\u5236\u53F0\uFF0C\u5B83\u4E4B\u540E\u8D77\u7684\u6BCF\u4E2A\u63A7\u5236\u53F0\u5B50\u8FDB\u7A0B\n * \u90FD\u4F1A**\u65B0\u5EFA\u4E00\u4E2A\u53EF\u89C1\u7A97\u53E3**\uFF1BPowerShell \u8FD9\u5C42\u7ED9\u5B83\u4E00\u4E2A\u9690\u85CF\u7684\u63A7\u5236\u53F0\uFF0C\u5B50\u8FDB\u7A0B\u7EE7\u627F\u5B83\uFF1B\n * - \u663E\u5F0F\u70B9\u540D `.cmd`\uFF1A\u88F8 `dsh` \u4F1A\u8BA9 PowerShell \u4F18\u5148\u9009 `dsh.ps1`\uFF0C\u9ED8\u8BA4 Restricted \u7B56\u7565\u4E0B\n * \u76F4\u63A5\u62D2\u7EDD\u6267\u884C\uFF08issue #397\uFF09\uFF0C\u800C `dsh.cmd` \u4E0D\u53D7\u811A\u672C\u7B56\u7565\u7BA1\u8F96\u3002\n *\n * \u6CE8\u610F `detached: false`\uFF1A\u771F\u6B63\u7684\u9690\u85CF\u9760\u52A9\u624B\u90A3\u4E00\u5C42\u7684 `windowsHide`\uFF08CREATE_NO_WINDOW\uFF09\u3002\n */\nexport function respawnCommand(launch: Launch, platform: string): Respawn {\n if (platform !== 'win32') {\n return { file: launch.file, args: launch.args, viaShell: launch.viaShell, detached: true }\n }\n const file = launch.viaShell && !/\\.(?:cmd|bat)$/iu.test(launch.file) ? `${launch.file}.cmd` : launch.file\n return {\n file: 'powershell.exe',\n args: [\n '-NoProfile', '-WindowStyle', 'Hidden', '-Command',\n [`& ${quotePowerShell(file)}`, ...launch.args.map(quotePowerShell)].join(' '),\n ],\n viaShell: false,\n detached: false,\n }\n}\n\n/**\n * \u6D4F\u89C8\u5668\u5B9E\u9645\u8BBF\u95EE\u7684\u90A3\u4E2A\u7AEF\u53E3\uFF0C\u4ECE\u8BF7\u6C42\u7684 `Host` \u5934\u91CC\u8BFB\u3002\n *\n * \u6BD4\u89E3\u6790\u542F\u52A8\u53C2\u6570\u53EF\u9760\uFF1A\u7ED1\u54EA\u4E2A\u7AEF\u53E3\u53EF\u80FD\u6765\u81EA\u914D\u7F6E\u6216\u73AF\u5883\u53D8\u91CF\uFF0C\u800C `Host` \u5C31\u662F\u6D4F\u89C8\u5668\u771F\u6B63\u5230\u8FBE\u7684\u5730\u5740\uFF0C\n * \u4E5F\u5C31\u662F\u66FF\u6362\u8FDB\u7A0B\u5FC5\u987B\u63A5\u7BA1\u7684\u90A3\u4E00\u4E2A\uFF08\u800C\u4E14\u5B83\u5DF2\u7ECF\u88AB\u4FE1\u4EFB\u5173\u5361\u6821\u9A8C\u8FC7\u4E86\uFF09\u3002\n * @returns \u7AEF\u53E3\u53F7\uFF1B\u9ED8\u8BA4\u7AEF\u53E3\uFF08\u5934\u91CC\u6CA1\u5199\uFF09\u65F6\u8FD4\u56DE null\u3002\n */\nexport function servingPort(hostHeader: string | undefined): number | null {\n if (hostHeader === undefined) return null\n const match = /:(\\d{1,5})$/u.exec(hostHeader)\n if (match === null) return null\n const port = Number(match[1])\n return Number.isInteger(port) && port > 0 && port < 65536 ? port : null\n}\n\n/** \u56DE\u73AF\u5730\u5740\u5224\u5B9A\uFF08\u542B IPv4 \u6620\u5C04\u5F62\u6001\uFF09\u3002 */\nexport function isLoopbackAddress(address: string | undefined): boolean {\n return address === '127.0.0.1' || address === '::1' || address === '::ffff:127.0.0.1'\n}\n\n/** \u8FDB\u7A0B\u63A7\u5236\u8BF7\u6C42\u7684\u4FE1\u4EFB\u4E8B\u5B9E\u3002 */\nexport interface TrustRequest {\n readonly remoteAddress: string | undefined\n readonly headers: Readonly<Record<string, string | readonly string[] | undefined>>\n}\n\n/**\n * \u8FD9\u4E2A\"\u6740\u8FDB\u7A0B\"\u7684\u8BF7\u6C42\u662F\u4E0D\u662F\u6765\u81EA\u672C\u673A\u7684\u540C\u6E90\u9875\u9762\u3002\n *\n * \u56DB\u9053\u540C\u65F6\u6210\u7ACB\uFF1A\u56DE\u73AF peer\u3001\u6CA1\u6709\u4EFB\u4F55\u8F6C\u53D1\u75D5\u8FF9\uFF08\u6709\u8F6C\u53D1\u8BF4\u660E\u4E2D\u95F4\u7AD9\u7740\u4EE3\u7406\u800C\u4E0D\u662F\u7528\u6237\uFF09\u3001\n * `Origin` \u4E0E `Host` \u540C\u6E90\u3001\u4E24\u8005\u90FD\u5728\u3002\u8DE8\u7AD9\u9875\u9762\u53D1\u8D77\u7684 POST \u4E00\u5B9A\u5E26\u81EA\u5DF1\u7684 `Origin`\uFF0C\n * \u6240\u4EE5 DNS rebinding / \u8DE8\u7AD9\u8C03\u7528\u5728\u8FD9\u91CC\u88AB\u6321\u4F4F \u2014\u2014 \u8FD9\u662F\u5B98\u65B9 `connection.requestRejection`\n * \u4E4B\u5916\u7684\u7B2C\u4E8C\u9053\uFF0C\u800C\u4E0D\u662F\u66FF\u4EE3\u5B83\u3002\n */\nexport function trustedRestartRequest(request: TrustRequest): boolean {\n if (!isLoopbackAddress(request.remoteAddress)) return false\n const headers = request.headers\n if (headers.forwarded !== undefined\n || headers['x-forwarded-for'] !== undefined\n || headers['x-real-ip'] !== undefined) return false\n const origin = firstHeader(headers.origin)\n const host = firstHeader(headers.host)\n if (origin === undefined || host === undefined) return false\n try {\n const parsed = new URL(origin)\n return (parsed.protocol === 'http:' || parsed.protocol === 'https:') && parsed.host === host\n } catch {\n return false\n }\n}\n\n/** \u5934\u503C\u53EF\u80FD\u662F\u6570\u7EC4\uFF08Node \u5BF9\u91CD\u590D\u5934\u7684\u884C\u4E3A\uFF09\uFF0C\u53EA\u53D6\u7B2C\u4E00\u4E2A\u3002 */\nfunction firstHeader(value: string | readonly string[] | undefined): string | undefined {\n if (value === undefined) return undefined\n return typeof value === 'string' ? value : value[0]\n}\n\nconst INSPECT_ARG_PREFIXES = ['--inspect', '--inspect-brk', '--inspect-port', '--inspect-wait'] as const\n\n/** \u8FD9\u4E2A argv \u91CC\u6709\u6CA1\u6709 inspector \u5BB6\u65CF\u7684 flag\uFF08\u6309\u524D\u7F00\u5339\u914D\uFF0C\u4E0D\u770B\u5B50\u4E32\uFF09\u3002 */\nfunction tokenHasInspectFlag(token: string): boolean {\n for (const prefix of INSPECT_ARG_PREFIXES) {\n if (token === prefix || token.startsWith(`${prefix}=`)) return true\n }\n if (token === '--debug-brk' || token.startsWith('--debug-brk=')) return true\n if (token === '--debug' || token.startsWith('--debug=')) return true\n return false\n}\n\n/**\n * \u5BBF\u4E3B\u662F\u4E0D\u662F\u6B63\u88AB\u8C03\u8BD5\u5668\u9644\u7740\uFF08\u80FD\u88AB\u8BC6\u522B\u51FA\u6765\u65F6\u8FD4\u56DE `'inspector'`\uFF0C\u5426\u5219 null\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8FD9\u79CD\u65F6\u5019\u4E0D\u7ED9\u91CD\u542F\uFF1A\u628A\u6B63\u5728\u88AB\u8C03\u8BD5\u7684\u5BBF\u4E3B\u4ECE\u754C\u9762\u91CC\u6740\u6389\uFF0C\u4F60\u4E0D\u4F1A\u5F97\u5230\u4EFB\u4F55\u4E1C\u897F\uFF0C\n * \u53EA\u4F1A\u4E22\u6389\u90A3\u4E2A\u8C03\u8BD5\u4F1A\u8BDD\u3002\u4E09\u4E2A\u4FE1\u53F7\uFF1A`inspector.url()`\uFF08\u8986\u76D6 `--inspect` \u542F\u52A8\u3001\n * `inspector.open()`\u3001SIGUSR1 \u9644\u7740\uFF09\u3001`process.execArgv`\u3001`NODE_OPTIONS`\u3002\n *\n * \u6309 token \u524D\u7F00\u5339\u914D\u800C\u4E0D\u662F `/inspect/` \u5B50\u4E32\uFF1A\u5426\u5219\u8DEF\u5F84\u91CC\u5E26 `inspect-tool.js` \u7684\u5BBF\u4E3B\u4F1A\u88AB\u8BEF\u5224\u3002\n */\nexport function detectedDebugger(input: {\n readonly inspectorUrl: string | undefined\n readonly execArgv: readonly string[]\n readonly nodeOptions: string | undefined\n}): 'inspector' | null {\n const { inspectorUrl, execArgv, nodeOptions } = input\n if (inspectorUrl !== undefined && inspectorUrl !== '') return 'inspector'\n if (execArgv.some(tokenHasInspectFlag)) return 'inspector'\n const options = (nodeOptions ?? '').trim()\n if (options !== '' && options.split(/\\s+/u).some(tokenHasInspectFlag)) return 'inspector'\n return null\n}\n\n/**\n * \u5BBF\u4E3B\u662F\u4E0D\u662F\u88AB\u67D0\u4E2A\u8FDB\u7A0B\u7BA1\u7406\u5668\uFF08systemd\uFF09\u5F53\u670D\u52A1\u5728\u8DD1 \u2014\u2014 \u662F\u7684\u8BDD\u91CD\u542F\u6743\u5F52\u5B83\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8FD9\u503C\u5F97\u4E00\u6BB5\u4EE3\u7801\uFF1Asystemd \u9ED8\u8BA4 `KillMode=control-group`\uFF0C\u6574\u4E2A cgroup \u4F1A\u8DDF\u7740\u4E3B\u8FDB\u7A0B\u4E00\u8D77\u6B7B\uFF0C\n * \u5305\u62EC\u90A3\u4E2A\u672C\u8BE5\u628A\u66FF\u6362\u8FDB\u7A0B\u62C9\u8D77\u6765\u7684\u5206\u79BB\u52A9\u624B\u3002\u4E8E\u662F\"\u91CD\u542F\"\u6740\u6389\u4E86\u4E00\u4E2A\u751F\u4EA7\u670D\u52A1\uFF0C\u4EC0\u4E48\u90FD\u6CA1\u56DE\u6765\n * \uFF08\u5E02\u573A issue #229\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8981**\u4E24\u4E2A**\u4FE1\u53F7\uFF1A`INVOCATION_ID` \u662F**\u7EE7\u627F**\u7684\uFF0CLinux \u4E0A\u4E00\u4E2A\u666E\u901A\u684C\u9762\u7EC8\u7AEF\u548C CI runner\n * \u90FD\u5E26\u7740\u5B83\uFF1B\u53EA\u770B\u5B83\u4F1A\u628A\u4E00\u5927\u7247\u672C\u6765\u80FD\u6B63\u5E38\u91CD\u542F\u7684\u5BBF\u4E3B\u8BEF\u5224\u6210\"\u6709 supervisor\"\uFF08\u6BD4\u539F bug \u66F4\u7CDF\uFF09\u3002\n * \u7236\u8FDB\u7A0B\u624D\u662F\u533A\u5206\"\u6211\u5C31\u662F\u8FD9\u4E2A unit \u7684\u4E3B\u8FDB\u7A0B\"\u548C\"\u6211\u53EA\u662F\u5B83\u7684\u540E\u4EE3\"\u7684\u5730\u65B9\uFF1A\u7236\u8FDB\u7A0B\u662F PID 1\n * \u6216\u8005 comm \u662F `systemd`\uFF08\u4E24\u79CD manager \u5B9E\u4F8B\u552F\u4E00\u7684\u5171\u540C\u70B9\uFF09\u624D\u7B97\u3002\n *\n * \u53EA\u8BA4 systemd\uFF1Apm2 \u7684 `pm_id` \u540C\u6837\u4F1A\u88AB\u7EE7\u627F\uFF0C\u800C launchd \u6839\u672C\u6CA1\u6709\u6807\u8BB0 \u2014\u2014 \u90A3\u4E24\u79CD\u8BF7\u7528\u6237\n * \u663E\u5F0F\u914D\u7F6E\uFF0C\u731C\u6D4B\u53EA\u4F1A\u91CD\u65B0\u5F15\u5165\u8FD9\u91CC\u8981\u907F\u514D\u7684\u8BEF\u5224\u3002\n * @returns \u8BC6\u522B\u5230\u7684 supervisor \u540D\uFF08\u76EE\u524D\u53EA\u6709 `'systemd'`\uFF09\uFF0C\u6CA1\u6709\u5219 null\u3002\n */\nexport function detectedSupervisor(input: {\n readonly env: Readonly<Record<string, string | undefined>>\n readonly ppid: number\n readonly parentComm: (pid: number) => string | null\n}): string | null {\n const set = (name: string): boolean => (input.env[name] ?? '') !== ''\n if (!set('INVOCATION_ID') && !set('JOURNAL_STREAM')) return null\n if (input.ppid === 1 || input.parentComm(input.ppid) === 'systemd') return 'systemd'\n return null\n}\n\n/** \u52A9\u624B\u6E90\u7801\u7684\u6CE8\u5165\u9762\u3002 */\nexport interface HelperInput {\n readonly spawned: Respawn\n readonly cwd: string\n readonly logs: { readonly out: string; readonly err: string }\n readonly port: number | null\n}\n\n/**\n * \u5206\u79BB\u51FA\u53BB\u7684\u52A9\u624B\u8FDB\u7A0B\u6E90\u7801\uFF08`node -e <\u5B83>`\uFF09\u3002\n *\n * \u5355\u72EC\u62BD\u51FA\u6765\u662F\u4E3A\u4E86**\u80FD\u771F\u7684\u8DD1\u5B83\u6765\u6D4B**\uFF1A\u8FD9\u7C7B bug \u53EA\u4F1A\u5728\u8FD0\u884C\u65F6\u9732\u51FA\u6765\uFF08\"\u7B49\u5F85\"\u8FD9\u79CD\u4EE3\u7801\uFF0C\n * \u6BCF\u4E00\u90E8\u5206\u5355\u770B\u90FD\u662F\u5BF9\u7684\uFF0C\u5408\u8D77\u6765\u624D\u9519\uFF09\u3002\u5B83\u7684\u804C\u8D23\u53EA\u6709\u4E09\u4EF6\uFF1A\u7B49\u7AEF\u53E3 \u2192 \u8D77\u65B0\u5BBF\u4E3B \u2192 \u9A8C\u8BC1\u5E76\u7559\u8BC1\u636E\u3002\n */\nexport function restartHelperSource(input: HelperInput): string {\n const { spawned, cwd, logs, port } = input\n return [\n \"const { spawn } = require('node:child_process')\",\n \"const fs = require('node:fs')\",\n \"const net = require('node:net')\",\n `const file = ${JSON.stringify(spawned.file)}`,\n `const args = ${JSON.stringify(spawned.args)}`,\n `const cwd = ${JSON.stringify(cwd)}`,\n `const viaShell = ${JSON.stringify(spawned.viaShell)}`,\n `const detached = ${JSON.stringify(spawned.detached)}`,\n `const logOut = ${JSON.stringify(logs.out)}`,\n `const logErr = ${JSON.stringify(logs.err)}`,\n `const port = ${JSON.stringify(port)}`,\n `const pollMs = ${String(RESTART_POLL_MS)}`,\n `const portWaitMs = ${String(RESTART_PORT_WAIT_MS)}`,\n `const settleMs = ${String(RESTART_PORT_SETTLE_MS)}`,\n `const probeMs = ${String(RESTART_PROBE_TIMEOUT_MS)}`,\n `const noPortDelayMs = ${String(RESTART_NO_PORT_DELAY_MS)}`,\n `const lingerMs = ${String(RESTART_HELPER_LINGER_MS)}`,\n `const replacementWaitMs = ${String(RESTART_REPLACEMENT_WAIT_MS)}`,\n 'const sleep = (ms) => new Promise(r => setTimeout(r, ms))',\n // \u5931\u8D25\u5FC5\u987B\u7559\u8BC1\u636E\uFF0C\u800C\u4E14\u8FD9\u4E9B\u884C\u53EA\u80FD\u5728\"\u5BBF\u4E3B\u5DF2\u7ECF\u9000\u51FA\"\u4E4B\u540E\u5199 \u2014\u2014 \u6240\u4EE5\u7531\u52A9\u624B\u5199\u3002\n \"const note = (line) => { try { fs.appendFileSync(logErr, '[dsh-composer-ux] ' + line + '\\\\n') } catch {} }\",\n // \"\u7A7A\u95F2\" = \u6CA1\u4EBA\u63A5\u53D7\u8FDE\u63A5\u3002\u7528 connect \u63A2\u800C\u4E0D\u662F bind\uFF1Abind \u4E00\u4E0B\u81EA\u5DF1\u5C31\u628A\u7AEF\u53E3\u5360\u4F4F\u4E86\uFF0C\n // \u800C\u90A3\u6B63\u662F\u66FF\u6362\u8FDB\u7A0B\u9A6C\u4E0A\u8981\u7528\u7684\u4E1C\u897F\u3002\n 'const listening = () => new Promise((resolve) => {',\n ' const probe = net.connect({ host: \"127.0.0.1\", port })',\n ' const done = (value) => { probe.destroy(); resolve(value) }',\n ' probe.on(\"connect\", () => done(true))',\n ' probe.on(\"error\", () => done(false))',\n ' setTimeout(() => done(false), probeMs)',\n '})',\n 'const main = async () => {',\n ' if (port) {',\n ' const until = Date.now() + portWaitMs',\n ' while (Date.now() < until && await listening()) await sleep(pollMs)',\n ' if (await listening()) note(\"port \" + port + \" was still in use after \" + portWaitMs + \"ms; starting anyway\")',\n ' await sleep(settleMs)',\n ' } else {',\n ' await sleep(noPortDelayMs)',\n ' }',\n ' let child',\n ' try {',\n ' const out = fs.openSync(logOut, \"a\")',\n ' const err = fs.openSync(logErr, \"a\")',\n // windowsHide\uFF1A\u52A9\u624B\u81EA\u5DF1\u662F detached \u7684\uFF0CWindows \u4E0A\u5B83\u6CA1\u6709\u63A7\u5236\u53F0\uFF0C\u800C\u4E00\u4E2A\u6CA1\u6709\u63A7\u5236\u53F0\u7684\n // \u7236\u8FDB\u7A0B spawn \u63A7\u5236\u53F0\u7A0B\u5E8F\u4F1A**\u65B0\u5EFA\u4E00\u4E2A\u53EF\u89C1\u63A7\u5236\u53F0** \u2014\u2014 \u5C31\u662F\u90A3\u4E2A\u5173\u6389\u5C31\u628A\u5BBF\u4E3B\u5E26\u8D70\u7684\u9ED1\u7A97\u53E3\u3002\n ' child = spawn(file, args, { cwd, detached, stdio: [\"ignore\", out, err], env: process.env, shell: viaShell, windowsHide: true })',\n // spawn \u62A5\"\u6587\u4EF6\u4E0D\u5B58\u5728/\u4E0D\u53EF\u6267\u884C\"\u662F**\u5F02\u6B65**\u7684\uFF0C\u4E0B\u9762\u7684 try/catch \u53EA\u63A5\u540C\u6B65\u629B\u51FA\uFF0C\n // \u6240\u4EE5\u5C11\u4E86\u8FD9\u4E2A\u76D1\u542C\uFF0C\u5931\u8D25\u4F1A\u548C\u88AB\u4FEE\u7684\u90A3\u4E2A bug \u4E00\u6837\u5B89\u9759\u3002\n ' child.on(\"error\", (error) => note(\"could not start the replacement: \" + (error && error.message ? error.message : String(error))))',\n ' child.unref()',\n ' } catch (error) {',\n ' note(\"could not start the replacement: \" + (error && error.message ? error.message : String(error)))',\n ' return',\n ' }',\n // \u591A\u6D3B\u4E00\u4F1A\u513F\u5728 Windows \u4E0A\u662F\u6709\u610F\u4E49\u7684\uFF1Aspawn \u5B8C\u7ACB\u523B\u9000\u51FA\u7684\u52A9\u624B\u53EF\u80FD\u628A\u8FD8\u6CA1 detach \u5B8C\u7684\n // \u66FF\u6362\u8FDB\u7A0B\u4E00\u8D77\u5E26\u8D70\u3002\u6709\u7AEF\u53E3\u53EF\u63A2\u7684\u90A3\u6761\u8DEF\u672C\u6765\u5C31\u8981\u591A\u5F85\uFF0C\u8FD9\u6761\u662F\u7ED9\u6CA1\u6709\u7AEF\u53E3\u7684\u60C5\u51B5\u8865\u4E0A\u540C\u6837\u7684\u4FDD\u8BC1\u3002\n ' if (!port) { await sleep(lingerMs); return }',\n ' const upBy = Date.now() + replacementWaitMs',\n ' while (Date.now() < upBy && !(await listening())) await sleep(500)',\n ' if (!(await listening())) note(\"the replacement did not bind port \" + port + \" within \" + replacementWaitMs + \"ms \u2014 see the output log beside this one\")',\n '}',\n 'main()',\n ].join('\\n')\n}\n\n/** \u88AB spawn \u51FA\u6765\u7684\u8FDB\u7A0B\uFF08\u53EA\u53D6\u672C\u6A21\u5757\u8981\u7528\u7684\u90E8\u5206\uFF09\u3002 */\nexport interface SpawnedLike {\n readonly pid?: number | undefined\n unref?: () => void\n once(event: string, listener: (arg?: unknown) => void): unknown\n}\n\n/** spawn \u9009\u9879\uFF08\u53EA\u53D6\u672C\u6A21\u5757\u7528\u5230\u7684\uFF09\u3002 */\nexport interface SpawnOptionsLike {\n readonly detached: boolean\n readonly stdio: 'ignore'\n readonly windowsHide: boolean\n readonly env: Readonly<Record<string, string | undefined>>\n}\n\n/** \u6CE8\u5165\u7684\u5916\u90E8\u52A8\u4F5C\u3002 */\nexport interface RestartIo {\n readonly platform: string\n readonly pid: number\n readonly argv0: string | undefined\n readonly execPath: string\n readonly argv1: string | undefined\n readonly execArgv: readonly string[]\n readonly rest: readonly string[]\n readonly cwd: string\n readonly env: Readonly<Record<string, string | undefined>>\n readonly tmpdir: string\n /** \u65E5\u5FD7\u6587\u4EF6\u540D\u91CC\u7684\u65F6\u95F4\u6233\uFF08\u6D4B\u8BD5\u91CC\u56FA\u5B9A\uFF09\u3002 */\n readonly stamp: string\n readonly exists: (path: string) => boolean\n readonly resolve: (path: string) => string\n readonly dirname: (path: string) => string\n readonly join: (...parts: readonly string[]) => string\n readonly spawn: (command: string, args: readonly string[], options: SpawnOptionsLike) => SpawnedLike\n /** \u8BA9\u5BBF\u4E3B\u81EA\u5DF1\u9000\u51FA\uFF08\u771F\u5B9E\u5B9E\u73B0\u89C1 {@link gracefulStop}\uFF09\u3002 */\n readonly stop: () => void\n readonly wait: (ms: number) => Promise<void>\n}\n\n/** \u8BA1\u5212\u597D\u7684\u91CD\u542F\uFF08\u7EAF\u8BA1\u7B97\u7ED3\u679C\uFF0C\u4E0D\u505A\u4EFB\u4F55\u52A8\u4F5C\uFF09\u3002 */\nexport interface RestartPlan {\n readonly node: string\n readonly launch: Launch\n readonly respawn: Respawn\n readonly helper: string\n readonly logOut: string\n readonly logErr: string\n readonly port: number | null\n}\n\n/** \u7B97\u51FA\u8FD9\u6B21\u91CD\u542F\u8981\u600E\u4E48\u505A\u3002 */\nexport function planRestart(io: RestartIo, port: number | null): RestartPlan {\n const node = nodeExecutableOf({ argv0: io.argv0, execPath: io.execPath, exists: io.exists })\n const launch = launchCommand({\n node,\n argv1: io.argv1,\n execArgv: io.execArgv,\n rest: io.rest,\n cwd: io.cwd,\n platform: io.platform,\n resolve: io.resolve,\n dirname: io.dirname,\n })\n const respawn = respawnCommand(launch, io.platform)\n const logOut = io.join(io.tmpdir, `${RESTART_LOG_PREFIX}${io.stamp}.out.log`)\n const logErr = io.join(io.tmpdir, `${RESTART_LOG_PREFIX}${io.stamp}.err.log`)\n return {\n node,\n launch,\n respawn,\n helper: restartHelperSource({ spawned: respawn, cwd: launch.cwd, logs: { out: logOut, err: logErr }, port }),\n logOut,\n logErr,\n port,\n }\n}\n\n/** \u6392\u597D\u4E00\u6B21\u91CD\u542F\u4E4B\u540E\u56DE\u7ED9\u754C\u9762\u7684\u4FE1\u606F\u3002 */\nexport interface RestartScheduled {\n readonly ok: true\n readonly pid: number\n readonly helperPid: number | undefined\n readonly logOut: string\n readonly logErr: string\n readonly port: number | null\n /** \u91CD\u653E\u7528\u7684\u542F\u52A8\u547D\u4EE4\uFF0C\u7ED9\u754C\u9762\u5C55\u793A\"\u4F1A\u600E\u4E48\u91CD\u542F\"\u3002 */\n readonly command: string\n}\n\n/**\n * \u6392\u4E00\u6B21\u91CD\u542F\uFF1A\u5206\u79BB\u8D77\u52A9\u624B \u2192 \u5EF6\u8FDF 500ms \u8BA9\u81EA\u5DF1\u9000\u51FA\u3002\n *\n * \u8FD4\u56DE\u65F6**\u5BBF\u4E3B\u8FD8\u6CA1\u9000\u51FA**\uFF1A\u9000\u51FA\u662F\u5EF6\u8FDF\u4E4B\u540E\u7684\u5F02\u6B65\u52A8\u4F5C\uFF0C\u597D\u8BA9\u8C03\u7528\u65B9\u628A HTTP \u54CD\u5E94\u53D1\u51FA\u53BB\u3002\n * @param io \u6CE8\u5165\u7684\u5916\u90E8\u52A8\u4F5C\u3002\n * @param port \u6D4F\u89C8\u5668\u5B9E\u9645\u8BBF\u95EE\u7684\u7AEF\u53E3\uFF08\u52A9\u624B\u9760\u5B83\u5224\u65AD\u65E7\u8FDB\u7A0B\u4EC0\u4E48\u65F6\u5019\u771F\u7684\u8BA9\u51FA\u4E86\u7AEF\u53E3\uFF09\u3002\n * @throws \u52A9\u624B\u8FDB\u7A0B\u8D77\u4E0D\u6765\u65F6\u629B\u51FA\uFF08\u8FDE\u52A9\u624B\u90FD\u6CA1\u8D77\u6765\u5C31\u9000\u51FA\u81EA\u5DF1 = \u670D\u52A1\u5F7B\u5E95\u6CA1\u4E86\uFF0C\u5FC5\u987B\u8BA9\u754C\u9762\u77E5\u9053\uFF09\u3002\n */\nexport function scheduleRestart(io: RestartIo, port: number | null): RestartScheduled {\n const plan = planRestart(io, port)\n const helper = io.spawn(plan.node, ['-e', plan.helper], {\n detached: true,\n stdio: 'ignore',\n windowsHide: true,\n env: io.env,\n })\n helper.unref?.()\n void io.wait(RESTART_EXIT_DELAY_MS).then(() => { io.stop() })\n return {\n ok: true,\n pid: io.pid,\n helperPid: helper.pid,\n logOut: plan.logOut,\n logErr: plan.logErr,\n port: plan.port,\n command: [plan.respawn.file, ...plan.respawn.args].join(' '),\n }\n}\n\n/** \u9000\u51FA\u52A8\u4F5C\u7684\u6CE8\u5165\u9762\u3002 */\nexport interface StopIo {\n readonly emitSignal: (signal: string) => void\n readonly exit: (code: number) => void\n readonly timer: (ms: number, run: () => void) => void\n}\n\n/**\n * \u8BA9\u5BBF\u4E3B\u4F18\u96C5\u9000\u51FA\uFF1A\u628A `SIGTERM` **\u5F53\u4E8B\u4EF6\u53D1\u7ED9\u81EA\u5DF1**\uFF0C\u800C\u4E0D\u662F\u771F\u7684\u53D1\u4FE1\u53F7\u3002\n *\n * \u8FD9\u4E00\u6761\u662F\u672C\u63D2\u4EF6\u4E0E\u5E02\u573A\u552F\u4E00\u7684\u5B9E\u8D28\u5206\u6B67\uFF0C\u503C\u5F97\u5199\u6E05\u7406\u7531\uFF1A\n * `dsh web` \u5728 `apps/cli/src/profile-boot.ts` \u91CC\u6CE8\u518C\u4E86 `process.on('SIGTERM', () => interrupt(0))`\n * \u2014\u2014 \u8FD9\u662F\"supervisor \u7684\u666E\u901A\u505C\u6B62\u8BF7\u6C42\"\uFF0C\u4F1A\u5148 `fiber.dispose()` \u628A\u6574\u68F5\u63D2\u4EF6\u6811\u62C6\u5E72\u51C0\u518D\u9000\u51FA\uFF0C\n * \u800C\u4E14\u81EA\u5E26 5 \u79D2\u4E0A\u9650\uFF08`createProcessShutdown`\uFF09\u3002\n *\n * \u4F46\u5E02\u573A\u7528\u7684 `process.kill(pid,'SIGTERM')` \u5728 **Windows** \u4E0A\u7B49\u4EF7\u4E8E `TerminateProcess`\uFF1A\n * \u672C\u673A\u5B9E\u6D4B\uFF08node \u8D77\u5B50\u8FDB\u7A0B\u3001\u6CE8\u518C handler\u3001\u81EA\u5DF1\u6740\u81EA\u5DF1\uFF09handler \u4E00\u6B21\u90FD\u6CA1\u8DD1\u5230\uFF0C\u8FDB\u7A0B\u76F4\u63A5\u6CA1\u4E86\u3002\n * \u5BF9\"\u521A\u88C5\u5B8C\u63D2\u4EF6\u968F\u624B\u91CD\u542F\u4E00\u4E0B\"\u6CA1\u5DEE\u522B\uFF0C\u5BF9**\u6B63\u5728\u8DD1\u957F\u4F1A\u8BDD**\u7684\u7528\u6237\u5C31\u662F\u786C\u5207\u3002\u6240\u4EE5\u8FD9\u91CC\u8D70 emit\uFF1A\n * \u590D\u523B supervisor \u7684\u8BED\u4E49\uFF0C\u4EFB\u4F55\u5E73\u53F0\u90FD\u771F\u7684\u6267\u884C DSH \u81EA\u5DF1\u7684\u5173\u505C\u8DEF\u5F84\u3002\n *\n * \u515C\u5E95\uFF1A10 \u79D2\u540E\u8FDB\u7A0B\u8FD8\u5728\uFF08\u6BD4\u5982\u5BBF\u4E3B\u5F62\u6001\u91CC\u6CA1\u4EBA\u6CE8\u518C handler\uFF09\u5C31 `exit(0)` \u2014\u2014 \u4E0D\u80FD\u8BA9\u7528\u6237\u9762\u5BF9\n * \u4E00\u4E2A\"\u70B9\u4E86\u91CD\u542F\u4F46\u4EC0\u4E48\u90FD\u6CA1\u53D1\u751F\"\u7684\u754C\u9762\u3002\n */\nexport function gracefulStop(io: StopIo, signal = 'SIGTERM'): void {\n try {\n io.emitSignal(signal)\n } catch {\n // \u6CA1\u6709 handler / emit \u672C\u8EAB\u51FA\u9519\u90FD\u4E0D\u5F71\u54CD\u4E0B\u9762\u7684\u515C\u5E95\u3002\n }\n io.timer(RESTART_STOP_FALLBACK_MS, () => { io.exit(0) })\n}\n\n/** \u8FD9\u6B21\u542F\u52A8\u7684\u6807\u8BC6\uFF08\u754C\u9762\u9760\"\u53F7\u53D8\u4E86\"\u5224\u65AD\u65B0\u8FDB\u7A0B\u771F\u7684\u8D77\u6765\u4E86\uFF09\u3002 */\nexport function bootId(pid: number, now: number): string {\n return `${String(pid)}-${String(now)}`\n}\n", "/**\n * \u63D0\u793A\u8BCD\u4F18\u5316\u5668\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF08\u4E09\u6863\uFF09+ \u7528\u6237\u6D88\u606F\u6784\u9020\u3002\n *\n * \u6765\u6E90\u4E0E\u6388\u6743\uFF1A\u521D\u7248\u90A3\u4E09\u6863\u6587\u672C\u9010\u5B57\u53D6\u81EA WestFox-AwA/dsh-prompt-optimizer \u7684 `lib/index.js` \u91CC\n * **`LEGACY_V011`** \u8FD9\u4E2A\u5E38\u91CF\uFF08BSD-3-Clause\uFF0C\u4F5C\u8005\u300C\u5543\u8F6E\u80CE\u7684\u897F\u72D0\u300D\uFF09\u2014\u2014 \u5B83\u81EA\u5DF1\u7684\u6CE8\u91CA\u5199\u7740\n * \"\u9010\u5B57\u8282\u53D6\u81EA 0.1.1 \u7684 system \u63D0\u793A\u8BCD\"\uFF0C\u53EA\u5728\u56DE\u9000\u7B56\u7565 `v011-ptc` \u4E0B\u4F7F\u7528\uFF0C\u5BF9\u65B9\u9ED8\u8BA4\u7B56\u7565\n * \uFF08`STRATEGY_DEFAULT = 'v6'`\uFF09\u8D70\u7684\u662F `buildSystem()` \u53E6\u4E00\u5957\u3002\n * 0.6.0 \u8D77\u6309\u5BF9\u65B9 **0.6 \u7EBF**\uFF08`po06/lib/interpreter.js` \u7684 `SYSTEM_PROMPT` +\n * `validateProvenance`\uFF09\u7684\u673A\u5236\u91CD\u5199\uFF0C\u672C\u63D2\u4EF6\u81EA\u8EAB\u4ECD\u6309 MIT \u53D1\u5E03\u3002\n *\n * \u2500\u2500 \u4E3A\u4EC0\u4E48\u6362\u6210\u8FD9\u5957\uFF08\u5BF9\u65B9\u7684\u771F\u95EE\u9898\uFF0C\u4E5F\u662F\u6211\u4EEC\u7684\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u65E7\u7248\u662F**\u81EA\u7531\u6539\u5199\u5668**\uFF1A\u6A21\u578B\u76F4\u63A5\u5410\u4E00\u6761\u6210\u54C1\u547D\u4EE4\uFF0C\u5BBF\u4E3B\u53EA\u80FD\u6574\u6BB5\u7167\u6536\u3002\u4E8E\u662F\"\u6A21\u578B\u66FF\u7528\u6237\u53D1\u660E\n * \u4E86\u4E00\u6761\u8981\u6C42\"\u8FD9\u4EF6\u4E8B\u5728\u7ED3\u6784\u4E0A\u65E0\u6CD5\u88AB\u53D1\u73B0 \u2014\u2014 \u63D0\u793A\u8BCD\u91CC\u5199\u5341\u904D\"\u4E0D\u8BB8\u65B0\u589E\u9700\u6C42\"\u4E5F\u6CA1\u7528\uFF0C\u56E0\u4E3A\n * \u6CA1\u6709\u4EFB\u4F55**\u53EF\u673A\u68B0\u6838\u5BF9**\u7684\u5224\u636E\u3002\n *\n * 0.6 \u7684\u529E\u6CD5\uFF1A\u628A\"\u4FE1\u4EFB\u95EE\u9898\"\u53D8\u6210\"\u5B57\u7B26\u4E32\u6BD4\u5BF9\u95EE\u9898\"\u3002\n * \u00B7 \u6A21\u578B\u4E0D\u518D\u81EA\u7531\u5199\uFF0C\u53EA\u4EA7\u51FA**\u6761\u76EE**\uFF1B\n * \u00B7 \u6BCF\u6761 `rewrite` / `requirement` / `quality` \u5FC5\u987B\u9644 `quote` \u2014\u2014 \u4E00\u6BB5**\u5728\u7528\u6237\u539F\u8BDD\u91CC\n * \u9010\u5B57\u5B58\u5728**\u7684\u5B50\u4E32\uFF08\u7167\u6284\uFF0C\u4E0D\u8BB8\u6539\u5199\u3001\u4E0D\u8BB8\u8865\u6807\u70B9\uFF09\uFF1B\n * \u00B7 \u5BBF\u4E3B\u5728 `optimizer-assemble.ts` \u91CC\u505A\u5B57\u9762\u5B50\u4E32\u6BD4\u5BF9\uFF0C**\u5BF9\u4E0D\u4E0A\u5C31\u4E22\u90A3\u4E00\u6761\u5E76\u8BB0\u8D26**\uFF1B\n * \u00B7 `rewrite` \u6309\u5F15\u6587\u5728\u539F\u8BDD\u91CC\u7684**\u4F4D\u7F6E**\u56DE\u586B\uFF0C\u6CA1\u88AB\u8986\u76D6\u7684\u90E8\u5206\u539F\u6837\u4FDD\u7559\u3002\n * \u8FD9\u6837\"\u51ED\u7A7A\u52A0\u9700\u6C42\"\u4E0D\u518D\u662F\u4FE1\u4EFB\u95EE\u9898\uFF1A\u5B83\u62FF\u4E0D\u51FA\u9010\u5B57\u4F9D\u636E\u3002\n *\n * \u6863\u4F4D\u8BED\u4E49\u4E5F\u7167\u642C\u5BF9\u65B9\u7684\u8BF4\u6CD5\uFF1A**\u6863\u4F4D = \u4F9D\u636E\u9884\u7B97**\uFF08\u5141\u8BB8\u8865\u5230\u4EC0\u4E48\u7A0B\u5EA6\u3001\u6210\u54C1\u5141\u8BB8\u591A\u957F\uFF09\uFF0C\n * \u800C\u4E0D\u662F\"\u6362\u4E00\u79CD\u6587\u98CE\"\u3002\u6E29\u5EA6\u4ECD\u6CBF\u7528\u521D\u7248\u5B9E\u6D4B\u503C\uFF080.2 / 0.3 / 0.3\uFF09\u3002\n *\n * \u672C\u6A21\u5757\u96F6 import\uFF0Chost \u534A\u4E0E\u6D4B\u8BD5\u5171\u7528\u3002\n */\n\n/** \u4F20\u8BDD\u8005\u4EBA\u8BBE\uFF1A\u4E3A\u4EC0\u4E48\u5FC5\u987B\u5355\u72EC\u6210\u6BB5\u2014\u2014\u88F8\u6587\u672C\u4F1A\u88AB\u6A21\u578B\u5F53\u6210\u300C\u5BF9\u5B83\u8BF4\u7684\u8BDD\u300D\u800C\u5F00\u59CB\u5BF9\u8BDD\u3002 */\nconst RELAY_ROLE = [\n '\u3010\u4F60\u662F\u8C01\u3011\u4F60\u662F\u4E00\u4E2A**\u4F20\u8BDD\u5668/\u610F\u56FE\u8865\u5168\u5668**\uFF0C\u7AD9\u5728\u7528\u6237\u4E0E\"\u5DE5\u4F5C AI\"\u4E4B\u95F4\uFF1A',\n ' \u7528\u6237 \u2192\uFF08\u4F60\uFF1A\u628A\u7528\u6237\u7684\u610F\u601D\u6574\u7406\u6210\u6761\u76EE\u5E76\u7ED9\u51FA\u9010\u5B57\u4F9D\u636E\uFF09\u2192 \u5BBF\u4E3B\uFF08\u88C5\u914D\u6210\u4E00\u6761\u547D\u4EE4\uFF09\u2192 \u5DE5\u4F5C AI\u3002',\n '\u4F60\u7684\u4EA7\u51FA**\u4E0D\u4F1A**\u88AB\u76F4\u63A5\u5C55\u793A\u7ED9\u7528\u6237\uFF0C\u4E5F\u4E0D\u4F1A\u88AB\u539F\u6837\u53D1\u51FA\uFF1A\u5BBF\u4E3B\u4F1A\u7528\u4F60\u7ED9\u7684**\u9010\u5B57\u5F15\u6587**',\n '\u5728\u539F\u8BDD\u91CC\u5B9A\u4F4D\u3001\u53EA\u91C7\u7EB3\u80FD\u6838\u5BF9\u7684\u6761\u76EE\uFF0C\u518D\u88C5\u914D\u6210\u4E00\u6761\u547D\u4EE4\u4EA4\u7ED9\u5DE5\u4F5C AI\u3002',\n '\u3010\u4F60\u4E0D\u662F\u8C01\u3011\u4F60\u4E0D\u662F\u5728\u548C\u7528\u6237\u804A\u5929\uFF0C\u4E5F\u4E0D\u662F\u5728\u56DE\u7B54\u7528\u6237\uFF1A',\n '- \u4E0D\u8981\u56DE\u5E94\u3001\u4E0D\u8981\u56DE\u7B54\u7528\u6237\u7684\u8981\u6C42\uFF0C\u4E5F\u4E0D\u8981\u66FF\u7528\u6237\u5B8C\u6210\u4EFB\u52A1\uFF08\u4E0D\u8981\u76F4\u63A5\u7ED9\u51FA\u4EE3\u7801/\u7B54\u6848/\u7ED3\u679C\uFF09\u3002',\n '- \u4E0D\u8981\u4EE5\u52A9\u624B\u53E3\u543B\u5BF9\u7528\u6237\u8BF4\u8BDD\uFF08\"\u597D\u7684\"\"\u6536\u5230\"\"\u6211\u53EF\u4EE5\u5E2E\u4F60\"\"\u5EFA\u8BAE\u4F60\u2026\"\"\u9700\u8981\u6211\u2026\u5417\"\uFF09\u3002',\n '- \u4E0D\u8981\u628A\u7528\u6237\u53D1\u6765\u7684\u6587\u5B57\u5F53\u6210\"\u5BF9\u4F60\u8BF4\u7684\u8BDD\"\u6765\u56DE\u5E94\uFF1B\u5B83\u53EA\u662F\u4F60\u8981\u8F6C\u8FBE\u7684\u5185\u5BB9\u3002',\n '- \u4E0D\u8981\u5411\u7528\u6237\u63D0\u95EE\u3002\u8981\u6F84\u6E05\u65F6\uFF0C\u5199\u6210**\u7ED9\u5DE5\u4F5C AI \u7684\u6307\u4EE4**\uFF1A',\n ' \"\u82E5 X \u4E0D\u660E\u786E\uFF0C\u5148\u8BFB Y \u6216\u5148\u5411\u6211\u786E\u8BA4\uFF0C\u4E0D\u8981\u81EA\u884C\u5047\u8BBE\"\u3002',\n].join('\\n')\n\n/**\n * \u4F9D\u636E\u7EAA\u5F8B \u2014\u2014 \u8FD9\u5957\u673A\u5236\u7684\u5168\u90E8\u4EF7\u503C\u6240\u5728\u3002\n *\n * \u6BCF\u6761\u90FD\u5BF9\u5E94\u4E00\u4E2A**\u5BBF\u4E3B\u771F\u7684\u4F1A\u6267\u884C**\u7684\u68C0\u67E5\uFF08\u89C1 optimizer-assemble.ts\uFF09\uFF1A\n * \u6CA1\u6709\u5F15\u6587 \u2192 \u4E22\u8FD9\u4E00\u6761\uFF1B\u5F15\u6587\u4E0D\u662F\u5B57\u9762\u5B50\u4E32 \u2192 \u4E22\u8FD9\u4E00\u6761\uFF1B\u6761\u6570\u8D85\u4E0A\u9650 \u2192 \u622A\u65AD\u540E\u9762\u5E76\u8BB0\u8D26\u3002\n * \u63D0\u793A\u8BCD\u91CC\u5199\"\u5FC5\u987B\"\u800C\u5BBF\u4E3B\u4E0D\u67E5\uFF0C\u5C31\u662F\u7A7A\u8BDD\uFF1B\u8FD9\u91CC\u4E24\u8FB9\u662F\u914D\u5957\u7684\u3002\n */\nconst EVIDENCE_RULES = [\n '\u3010\u4F9D\u636E\u7EAA\u5F8B\uFF08\u5BBF\u4E3B\u4F1A\u9010\u6761\u673A\u68B0\u6838\u5BF9\uFF0C\u5199\u9519\u5C31\u4E22\u8FD9\u4E00\u6761\uFF09\u3011',\n '1. `rewrite` / `requirement` / `quality` **\u5FC5\u987B**\u5E26 `quote`\uFF1A\u4E00\u6BB5\u5728\u3010\u7528\u6237\u539F\u8BDD\u3011\u91CC',\n ' **\u9010\u5B57\u5B58\u5728**\u7684\u5B50\u4E32 \u2014\u2014 \u7167\u6284\uFF0C\u4E0D\u8981\u6539\u5199\u3001\u4E0D\u8981\u8865\u6807\u70B9\u3001\u4E0D\u8981\u7FFB\u8BD1\u3002\u5BBF\u4E3B\u505A\u5B57\u9762\u5B50\u4E32\u6BD4\u5BF9\uFF0C',\n ' \u5BF9\u4E0D\u4E0A\u5C31\u4E22\u6389\u90A3\u4E00\u6761\uFF08\u4E0D\u4F1A\u62A5\u9519\u7ED9\u4F60\uFF0C\u4E5F\u4E0D\u4F1A\u6709\u4EBA\u63D0\u9192\u4F60\uFF09\u3002',\n '2. **\u4E0D\u8BB8\u51ED\u7A7A\u65B0\u589E**\uFF1A\u4EA7\u54C1\u76EE\u6807\u3001\u529F\u80FD\u3001\u786C\u7EA6\u675F\uFF08\"\u5FC5\u987B\u79BB\u7EBF\"\"\u7981\u6B62\u8054\u7F51\"\"\u53EA\u80FD\u7528\u67D0\u4E2A\u5E93\"',\n ' \"\u5FC5\u987B\u652F\u6301\u79FB\u52A8\u7AEF\"\uFF09\u4E00\u5F8B\u4E0D\u8BB8\u7531\u4F60\u51B3\u5B9A\u3002\u4F60\u53EA\u80FD\u8865**\u80FD\u4ECE\u539F\u8BDD\u67D0\u4E00\u53E5\u76F4\u63A5\u63A8\u51FA**\u7684\u6700\u4F4E\u8981\u6C42\uFF0C',\n ' \u5E76\u4E14\u5FC5\u987B\u5F15\u7528\u90A3\u4E00\u53E5\u3002',\n '3. \u4E0D\u786E\u5B9A\u3001\u4F1A\u5F71\u54CD\u7ED3\u679C\u3001\u4E14\u53EA\u6709\u7528\u6237\u80FD\u5B9A\u7684\u53D6\u820D \u2192 \u5199 `unknown`\uFF08`unknownClass` =',\n ' \"user_preference\"\uFF09\uFF0C**\u4E0D\u8981\u66FF\u7528\u6237\u731C**\uFF0C\u4E5F\u4E0D\u8981\u5199\"\u6309\u6700\u4FDD\u5B88\u7406\u89E3\u6267\u884C\"\u3002',\n ' \u5728\u8BB8\u53EF\u8303\u56F4\u5185\u8BFB\u4EE3\u7801\u5C31\u80FD\u786E\u5B9A\u7684\u4E8B\u5B9E\u5199 \"lookupable_fact\"\uFF1B\u53EF\u9006\u7684\u5B9E\u73B0\u7EC6\u8282',\n ' \uFF08\u95F4\u8DDD\u3001\u547D\u540D\u3001\u5E93\u7684\u5185\u90E8\u7528\u6CD5\uFF09\u5199 \"implementation_detail\"\u3002',\n '4. \u4E0D\u5F97\u865A\u6784\u9879\u76EE\u4E8B\u5B9E\uFF08\u6587\u4EF6\u5185\u5BB9\u3001\u76EE\u5F55\u7ED3\u6784\u3001\u4F9D\u8D56\u7248\u672C\uFF09\u3002\u4F60\u6CA1\u8BFB\u5230\u7684\u4E1C\u897F\u4E0D\u5B58\u5728\u3002',\n].join('\\n')\n\n/** \u5199\u6B63\u6587\u65F6\u7684\u6587\u98CE\u7EAA\u5F8B\uFF1A\u8FD9\u4E9B `text` \u4F1A\u88AB\u62FC\u8FDB\u6700\u7EC8\u547D\u4EE4\uFF0C\u8BFB\u8005\u53EA\u6709\u5DE5\u4F5C AI \u4E00\u4E2A\u3002 */\nconst STYLE_RULES = [\n '\u3010\u5199 text \u7684\u7EAA\u5F8B\u3011\u4F60\u7684 text \u4F1A\u88AB\u5BBF\u4E3B\u62FC\u8FDB\u6700\u7EC8\u547D\u4EE4\uFF0C\u8BFB\u8005\u53EA\u6709\"\u5DE5\u4F5C AI\"\u4E00\u4E2A\uFF1A',\n '- \u7948\u4F7F\u53E5\u3001\u76F4\u7ED9\u8981\u6C42\u3001\u53EF\u6267\u884C\uFF1B\u4E2D\u6587\u8FDB\u4E2D\u6587\u51FA\u3002',\n '- \u4E0D\u8981\u5143\u8BDD\u8BED\u4E0E\u5143\u6807\u9898\uFF08\"\u4F18\u5316\u540E\u7684\u63D0\u793A\u8BCD\"\"\u6539\u5199\u540E\"\"\u8BF4\u660E\"\"\u4EE5\u4E0B\u662F\u2026\"\uFF09\u3002',\n '- \u4E0D\u8981\u63D0\u5230\"\u7528\u6237/\u539F\u6587/\u4E0A\u9762\u7684\u8BDD\"\uFF0C\u4E5F\u4E0D\u8981\u5199\"\u6211\u6765\u5E2E\u4F60\u2026\"\u3002',\n '- \u4E0D\u8981\u5199\u6D41\u7A0B\u4EEA\u5F0F\u3001\u901A\u7528\u6559\u5B66\u3001\u9A8C\u6536\u5957\u8BDD\uFF08\"\u8BF7\u786E\u4FDD\u4EE3\u7801\u8D28\u91CF\"\u8FD9\u79CD\u6CA1\u6709\u6307\u5411\u7684\u8BDD\uFF09\u3002',\n '- `rewrite` \u7684 text \u662F**\u66FF\u6362\u6389\u90A3\u6BB5\u5F15\u6587**\u7684\u6B63\u6587\uFF0C\u6240\u4EE5\u53EA\u5199\u90A3\u6BB5\u8BDD\u672C\u8EAB\uFF0C\u4E0D\u8981\u5E26\u524D\u7F00\u540E\u7F00\u3002',\n].join('\\n')\n\n/**\n * \u8F93\u51FA\u5951\u7EA6\uFF1A**\u6C38\u8FDC\u8FFD\u52A0\u5728\u6700\u540E\u4E00\u6BB5**\uFF0C\u4E14\u4E0D\u968F\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u6539\u53D8\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u8BA9\u5B83\u88AB\u6539\uFF1A\u5BBF\u4E3B\u6309\u8FD9\u4EFD\u5951\u7EA6\u89E3\u6790\uFF1B\u5951\u7EA6\u4E00\u6539\uFF0C\"\u9010\u5B57\u4F9D\u636E\"\u5C31\u6CA1\u4EBA\u6821\u9A8C\u4E86\uFF0C\n * \u6574\u5957\u673A\u5236\u9000\u5316\u6210\"\u4FE1\u4EFB\u6A21\u578B\"\u3002\u8BBE\u7F6E\u9875\u7684\u8BF4\u660E\u91CC\u5BF9\u6B64\u6709\u660E\u793A\u3002\n * \u653E\u6700\u540E\u662F\u56E0\u4E3A\u6A21\u578B\u5BF9**\u6700\u540E\u4E00\u6761\u6307\u4EE4**\u7684\u670D\u4ECE\u5EA6\u6700\u9AD8\uFF08\u5BF9\u65B9 0.6 \u7684 `askTail` \u540C\u7406\uFF09\u3002\n */\nexport const OPTIMIZER_OUTPUT_CONTRACT = [\n '\u3010\u8F93\u51FA\u5951\u7EA6\uFF08\u56FA\u5B9A\uFF0C\u4E0D\u53EF\u66F4\u6539\uFF09\u3011',\n '\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981 Markdown \u4EE3\u7801\u5757\u3001\u4E0D\u8981\u5728 JSON \u524D\u540E\u5199\u4EFB\u4F55\u5B57\uFF1A',\n '{\"items\":[{\"kind\":\"rewrite\",\"quote\":\"\u539F\u8BDD\u91CC\u9010\u5B57\u5B58\u5728\u7684\u7247\u6BB5\",\"text\":\"\u66FF\u6362\u6389\u8BE5\u7247\u6BB5\u7684\u6B63\u6587\"}]}',\n '\u5B57\u6BB5\u4E0E\u53D6\u503C\uFF08`kind` \u53EA\u80FD\u662F\u8FD9\u516D\u79CD\uFF09\uFF1A',\n '- rewrite\uFF1A\u8BED\u8A00\u5C42\u4FEE\u590D\u3002`quote` \u5FC5\u586B\uFF1B\u540C\u4E00\u6BB5\u539F\u8BDD\u6700\u591A\u4E00\u6761 rewrite\uFF0C\u4E0D\u8981\u91CD\u53E0\u3002',\n '- requirement\uFF1A\u4ECE `quote` \u76F4\u63A5\u63A8\u51FA\u7684\u8865\u5168\u8981\u6C42\uFF08\u9A8C\u6536\u6807\u51C6/\u786C\u7EA6\u675F\uFF09\u3002`quote` \u5FC5\u586B\u3002',\n '- quality\uFF1A\u5BF9\u539F\u8BDD\u91CC\u8D28\u91CF\u8BCD\u7684\u89E3\u91CA\u3002`quote` \u5FC5\u586B\uFF08\u5C31\u586B\u90A3\u51E0\u4E2A\u8D28\u91CF\u5B57\uFF09\u3002',\n '- unknown\uFF1A\u672A\u51B3\u9879\u3002\u5FC5\u987B\u5E26 `unknownClass`\uFF08user_preference / lookupable_fact /',\n ' implementation_detail\uFF09\uFF0C\u53EF\u9009 `blocking`\uFF08true/false\uFF0C\u662F\u5426\u6321\u4F4F\u4E0B\u4E00\u6B65\uFF09\u3002',\n '- plan\uFF1A\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\uFF08\u4EC5\"\u6781\u7AEF\"\u6863\u7528\uFF09\u3002',\n '- risk\uFF1A\u591A\u60C5\u51B5\u9884\u6848\uFF08\u4EC5\"\u6781\u7AEF\"\u6863\u7528\uFF09\uFF0C\u6BCF\u6761\u6309\"\u89E6\u53D1\u4FE1\u53F7 \u2192 \u5E94\u5BF9 \u2192 \u7981\u6B62\u52A8\u4F5C\"\u5199\u3002',\n '\u9650\u5236\uFF1A`text` \u6BCF\u6761\u4E0D\u8D85\u8FC7 300 \u5B57\uFF1B`items` \u603B\u5171\u4E0D\u8D85\u8FC7 12 \u6761\uFF1Bid \u4E0D\u9700\u8981\u7ED9\u3002',\n '\u6CA1\u6709\u53EF\u8865\u7684\u5185\u5BB9\u65F6\uFF0C\u8F93\u51FA {\"items\":[]} \u2014\u2014 \u4F46**\u5148\u60F3\u6E05\u695A**\uFF1A\u7528\u6237\u8FD9\u4E00\u8F6E\u7684\u539F\u8BDD\u91CC',\n '\u771F\u7684\u6CA1\u6709\u4EFB\u4F55\u53EF\u6838\u5BF9\u7684\u8865\u5168\u5417\uFF1F',\n].join('\\n')\n\n/** \u6A21\u578B\u53EF\u4EE5\u4EA7\u51FA\u7684\u6761\u76EE\u79CD\u7C7B\uFF08\u5BBF\u4E3B\u53EA\u8BA4\u8FD9\u4E9B\uFF0C\u5176\u4F59\u6574\u6761\u4E22\u5F03\u5E76\u8BB0\u8D26\uFF09\u3002 */\nexport const OPTIMIZE_ITEM_KINDS = ['rewrite', 'requirement', 'quality', 'unknown', 'plan', 'risk'] as const\n\n/** \u6A21\u578B\u53EF\u4EE5\u4EA7\u51FA\u7684\u672A\u51B3\u9879\u5206\u7C7B\uFF08\u7F3A\u7701\u6309\"\u53EA\u6709\u7528\u6237\u80FD\u5B9A\"\u5904\u7406\uFF0C\u4E0E\u5BF9\u65B9 0.6 \u540C\u53E3\u5F84\uFF09\u3002 */\nexport const OPTIMIZE_UNKNOWN_CLASSES = ['user_preference', 'lookupable_fact', 'implementation_detail'] as const\n\n/** \u5355\u6B21\u4EA7\u51FA\u5141\u8BB8\u7684\u6700\u5927\u6761\u76EE\u6570\uFF08\u8D85\u51FA\u90E8\u5206\u622A\u65AD\u5E76\u8BB0\u8D26\uFF0C\u800C\u4E0D\u662F\u6574\u8F6E\u4F5C\u5E9F\uFF09\u3002 */\nexport const OPTIMIZE_MAX_ITEMS = 12\n\n/** \u5355\u6761 `text` \u7684\u5B57\u7B26\u4E0A\u9650\uFF08\u8D85\u51FA\u5C31\u5730\u622A\u65AD\u5E76\u8BB0\u8D26\uFF09\u3002 */\nexport const OPTIMIZE_ITEM_MAX_CHARS = 300\n\n/**\n * \u5404\u6863\u7684\u4EFB\u52A1\u6BB5\uFF08**\u53EF\u88AB\u8BBE\u7F6E\u9875\u91CC\u7684\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u6574\u4F53\u66FF\u6362**\u7684\u90A3\u90E8\u5206\uFF09\u3002\n *\n * \u4E09\u6863\u7684\u5DEE\u522B\u662F\"\u5141\u8BB8\u8865\u5230\u54EA\u4E00\u5C42\"\uFF0C\u4E0D\u662F\"\u6362\u4E00\u79CD\u8BED\u6C14\"\uFF1A\n * \u00B7 basic \u2014\u2014 \u53EA\u78B0\u8BED\u8A00\uFF1B\u4E0D\u4EA7\u51FA requirement / plan / risk\u3002\n * \u00B7 advanced \u2014\u2014 \u5141\u8BB8\u8865\"\u80FD\u6307\u56DE\u539F\u8BDD\u67D0\u53E5\"\u7684\u5FC5\u8981\u8981\u6C42\uFF0C\u5E76\u5BF9\u8D28\u91CF\u8BCD\u4F5C\u89E3\u91CA\u3002\n * \u00B7 extreme \u2014\u2014 \u518D\u52A0\u5206\u9636\u6BB5\u8BA1\u5212\u4E0E\u9884\u6848\u3002\n */\nconst TIER_TASKS: Record<string, readonly string[]> = {\n basic: [\n '\u3010\u672C\u8F6E\u4EFB\u52A1\uFF1A\u53EA\u505A\u8BED\u8A00\u5C42\u4FEE\u590D\u3011',\n '\u7528\u6237\u539F\u8BDD\u53EF\u80FD\u6709\u75C5\u53E5\u3001\u6307\u4EE3\u4E0D\u660E\u3001\u7528\u8BCD\u542B\u7CCA\u3002\u628A\u5B83\u6539\u5199\u6210\u901A\u987A\u3001\u7CBE\u786E\u3001\u65E0\u6B67\u4E49\u7684**\u540C\u4E00\u6BB5\u8BDD**\u3002',\n '\u53EA\u4EA7\u51FA `rewrite`\uFF08\u53EF\u4EE5\u6309\u53E5\u5B50\u62C6\u6210\u591A\u6761\uFF0C\u6BCF\u6761\u5F15\u7528\u539F\u8BDD\u91CC\u5BF9\u5E94\u90A3\u4E00\u53E5\uFF09\u3002',\n '\u4E25\u7981\u4EA7\u51FA requirement / plan / risk\uFF1A\u8FD9\u4E00\u6863**\u4E0D\u65B0\u589E\u4EFB\u4F55\u8981\u6C42**\uFF0C\u53EA\u628A\u8BDD\u8BF4\u660E\u767D\u3002',\n '\u539F\u8BDD\u786E\u6709\u6B67\u4E49\u3001\u4E14\u6B67\u4E49\u4F1A\u5BFC\u81F4\u505A\u9519\u65F6\uFF0C\u624D\u8865\u4E00\u6761 `unknown`\uFF08unknownClass \u53D6',\n 'user_preference \u6216 lookupable_fact\uFF09\uFF1B\u786E\u5B9E\u6CA1\u6709\u53EF\u8865\u7684\u5C31\u8F93\u51FA\u7A7A\u6570\u7EC4\u3002',\n '\u957F\u5EA6\u7EAA\u5F8B\uFF1A\u6210\u54C1\u4E0D\u8D85\u8FC7\u539F\u8BDD\u7684 1.4 \u500D\uFF1B\u539F\u8BDD 30 \u5B57\u4EE5\u5185\u65F6\u4E0D\u8D85\u8FC7 60 \u5B57\u3002',\n ],\n advanced: [\n '\u3010\u672C\u8F6E\u4EFB\u52A1\uFF1A\u5728\u4E0D\u52A8\u76EE\u6807\u7684\u524D\u63D0\u4E0B\u628A\u547D\u4EE4\u8BF4\u6E05\u695A\u3011',\n '\u7528\u6237\u539F\u8BDD\u542B\u7CCA\u3001\u7F3A\u5173\u952E\u7EA6\u675F\u3002\u4F60\u8981\u8865\u7684\u662F\"\u7528\u6237\u663E\u7136\u60F3\u8981\u3001\u4F46\u6CA1\u8BF4\u51FA\u53E3\"\u7684\u5FC5\u8981\u4FE1\u606F\uFF0C',\n '\u8BA9\u5B83\u4E00\u6B21\u505A\u5BF9 \u2014\u2014 \u4F46\u6BCF\u4E00\u6761\u90FD\u5FC5\u987B\u662F**\u4ECE\u539F\u8BDD\u67D0\u4E00\u53E5\u76F4\u63A5\u63A8\u51FA**\u7684\uFF0C\u5E76\u5F15\u7528\u90A3\u4E00\u53E5\u3002',\n '\u5141\u8BB8\u4EA7\u51FA\uFF1A',\n '- `rewrite`\uFF1A\u628A\u542B\u7CCA\u3001\u6709\u75C5\u53E5\u7684\u5730\u65B9\u8BF4\u6E05\u695A\uFF08\u540C\u4E00\u6BB5\u539F\u8BDD\u6700\u591A\u4E00\u6761\uFF09\u3002',\n '- `requirement`\uFF1A\u4ECE\u539F\u8BDD\u76F4\u63A5\u63A8\u51FA\u7684\u6700\u4F4E\u4EA4\u4ED8\u8981\u6C42\u4E0E\u9A8C\u6536\u6807\u51C6\uFF08\"\u6539\u5B8C\u80FD\u8DD1\u8D77\u6765\"\"\u9875\u9762\u80FD\u6253\u5F00\"',\n ' \u8FD9\u7C7B\u53EF\u89C2\u6D4B\u7684\u8BDD\uFF09\uFF0C\u5199\u6210\u5BF9\u5DE5\u4F5C AI \u7684\u8981\u6C42\u800C\u4E0D\u662F\u8BC4\u8BBA\u3002\u6BCF\u6761\u90FD\u8981\u80FD\u6307\u56DE\u539F\u8BDD\u91CC\u7684\u67D0\u4E00\u53E5\u3002',\n '- `quality`\uFF1A\u7528\u6237\u8BF4\u7684\u8D28\u91CF\u8BCD\uFF08\"\u597D\u770B\u70B9\"\"\u9AD8\u7EA7\u611F\"\"\u6D41\u7545\"\uFF09\u2192 \u89E3\u91CA\u6210\u53EF\u89C2\u5BDF\u7684\u8981\u6C42\u3002',\n ' \u5B83\u662F**\u89E3\u91CA**\uFF0C\u4E0D\u662F\u65B0\u589E\u76EE\u6807\uFF1A\u4E00\u6761\u8D28\u91CF\u8BCD\u6700\u591A\u4E00\u6761 quality\u3002',\n '- `unknown`\uFF1A\u53EA\u6709\u7528\u6237\u80FD\u5B9A\u7684\u53D6\u820D\uFF08user_preference\uFF09/ \u8BE5\u53BB\u67E5\u8BC1\u7684\u4E8B\u5B9E\uFF08lookupable_fact\uFF09\u3002',\n '\u7981\u6B62\uFF1A\u65B0\u589E\u529F\u80FD\u3001\u65B0\u76EE\u6807\u3001\u65B0\u4F9D\u8D56\uFF1B\u865A\u6784\u9879\u76EE\u4E8B\u5B9E\uFF1B\u5199\u7528\u6237\u6CA1\u6388\u6743\u7684\u6280\u672F\u9009\u578B\u3002',\n '\u6570\u91CF\u7EAA\u5F8B\uFF1Arequirement \u6700\u591A 3 \u6761\uFF0Cquality \u6700\u591A 2 \u6761\uFF0Cunknown \u6700\u591A 2 \u6761\u3002',\n ],\n extreme: [\n '\u3010\u672C\u8F6E\u4EFB\u52A1\uFF1A\u628A\u8BC9\u6C42\u56FA\u5316\u6210\u4E00\u6761\u53EF\u76F4\u63A5\u6267\u884C\u7684\u547D\u4EE4\u3011',\n '\u8FD9\u6B21\u662F\u591A\u6B65\u6267\u884C\u7684\u590D\u6742\u4EFB\u52A1\uFF0C\u5DE5\u4F5C AI \u4F1A\u7167\u8FD9\u6761\u547D\u4EE4\u5E72\uFF0C\u7528\u6237\u4E0D\u4F1A\u518D\u8865\u5145\u3002',\n '\u5728\"\u9AD8\u7EA7\"\u6863\u5141\u8BB8\u7684\u5168\u90E8\u6761\u76EE\u7684\u57FA\u7840\u4E0A\uFF0C\u518D\u52A0\u4E24\u7C7B\uFF08\u90FD\u8981\u4EE5\u7528\u6237\u5728\u7ED9\u5DE5\u4F5C AI \u4E0B\u547D\u4EE4\u7684\u53E3\u543B\u5199\uFF09\uFF1A',\n '- `plan`\uFF1A\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\u3002\u6BCF\u9636\u6BB5\u5199\u6E05\u52A8\u4F5C\u4E0E\u4EA7\u51FA\uFF0C\u5E76\u5199\u660E\u7EAA\u5F8B\uFF08\u5148\u9A8C\u8BC1\u518D\u6539\u3001\u5931\u8D25\u5373\u56DE\u9000\u3001',\n ' \u4E0D\u64C5\u81EA\u6269\u5927\u8303\u56F4\u3001\u6539\u5B8C\u7ED9\u51FA\u8BC1\u636E\uFF09\u3002',\n '- `risk`\uFF1A\u591A\u60C5\u51B5\u9884\u6848 2~4 \u6761\uFF0C\u6BCF\u6761\u5199\u6210\"\u5982\u679C\u51FA\u73B0 <\u89E6\u53D1\u4FE1\u53F7>\uFF0C\u5C31\u5148 <\u5E94\u5BF9\u52A8\u4F5C>\uFF0C',\n ' \u4E0D\u8981 <\u7981\u6B62\u52A8\u4F5C>\"\u3002',\n '\u8FD8\u8981\u5224\u65AD\u8FD9\u6B21\u4EFB\u52A1\u662F\u5426\u503C\u5F97\u8BA9\u5DE5\u4F5C AI \u7528 goal / todo / \u8BA1\u5212\u6A21\u5F0F\u8DDF\u8E2A\uFF0C\u5E76\u628A\u7ED3\u8BBA\u5199\u6210',\n '`requirement` \u7684\u4E00\u90E8\u5206\uFF08\u4F8B\u5982\"\u8BF7\u5148\u5EFA\u7ACB goal\uFF1A\u2026\uFF0C\u518D\u6309\u4E0B\u5217\u9636\u6BB5\u63A8\u8FDB\"\uFF09\uFF1B\u4E0D\u9700\u8981\u5C31\u5B8C\u5168\u4E0D\u63D0\u3002',\n '\u94C1\u5F8B\uFF1A\u4E0D\u5F97\u865A\u6784\u9879\u76EE\u4E8B\u5B9E\u3002\u9700\u8981\u9879\u76EE\u4E8B\u5B9E\u65F6\u5199\u6210\"\u5148\u8BFB\u53D6/\u786E\u8BA4 X\"\u7684\u67E5\u8BC1\u52A8\u4F5C\u3002',\n '\u6570\u91CF\u7EAA\u5F8B\uFF1Aplan \u6700\u591A 1 \u6761\uFF0Crisk \u6700\u591A 4 \u6761\uFF0Crequirement \u6700\u591A 3 \u6761\u3002',\n ],\n}\n\n/** \u6863\u4F4D id \u4E0E\u7CFB\u7EDF\u63D0\u793A / \u6E29\u5EA6\u7684\u5BF9\u5E94\u8868\u3002 */\nexport const OPTIMIZER_SPECS = {\n basic: {\n temperature: 0.2,\n system: [RELAY_ROLE, TIER_TASKS.basic!.join('\\n'), EVIDENCE_RULES, STYLE_RULES].join('\\n\\n'),\n },\n advanced: {\n temperature: 0.3,\n system: [RELAY_ROLE, TIER_TASKS.advanced!.join('\\n'), EVIDENCE_RULES, STYLE_RULES].join('\\n\\n'),\n },\n extreme: {\n temperature: 0.3,\n system: [RELAY_ROLE, TIER_TASKS.extreme!.join('\\n'), EVIDENCE_RULES, STYLE_RULES].join('\\n\\n'),\n },\n} as const\n\n/** \u6863\u4F4D id \u8054\u5408\uFF08\u4E0E settings-contract \u7684 OptimizerTier \u4E00\u81F4\uFF0C\u6B64\u5904\u4E0D import \u4EE5\u514D\u5FAA\u73AF\uFF09\u3002 */\nexport type OptimizerSpecTier = keyof typeof OPTIMIZER_SPECS\n\n/** \u672A\u77E5\u6863\u4F4D\u56DE\u843D\u5230\u9ED8\u8BA4\u6863\uFF08\u4E0E `DEFAULT_OPTIMIZER_TIER` \u540C\u503C\uFF1B\u6B64\u5904\u4E0D import \u4EE5\u514D\u5FAA\u73AF\uFF09\u3002 */\nconst FALLBACK_TIER = 'advanced'\n\n/** \u53D6\u4E00\u4E2A\u6863\u4F4D\u7684\u8BF4\u660E\uFF08\u672A\u77E5\u6863\u8D70\u9ED8\u8BA4\u6863\uFF09\u3002 */\nfunction specOf(tier: string): { temperature: number; system: string } {\n return OPTIMIZER_SPECS[tier as OptimizerSpecTier] ?? OPTIMIZER_SPECS[FALLBACK_TIER as OptimizerSpecTier]\n}\n\n/**\n * \u7EC4\u88C5\u4E00\u6B21\u4F18\u5316\u7684 system \u63D0\u793A\u8BCD\u3002\n *\n * \u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\uFF08\u8BBE\u7F6E\u9875\u53EF\u7F16\u8F91\uFF09**\u6574\u4F53\u66FF\u6362**\u4EFB\u52A1\u6BB5\uFF0C\u4F46\u8F93\u51FA\u5951\u7EA6\u6C38\u8FDC\u8FFD\u52A0\u5728\u672B\u5C3E \u2014\u2014\n * \u5951\u7EA6\u662F\u5BBF\u4E3B\u89E3\u6790\u7684\u4F9D\u636E\uFF0C\u88AB\u6539\u6389\u6574\u5957\u673A\u5236\u5C31\u5931\u6548\uFF08\u8BBE\u7F6E\u9875\u5BF9\u6B64\u6709\u8BF4\u660E\uFF09\u3002\n * @param tier - \u5F3A\u5EA6\u6863\u4F4D\uFF1B\u672A\u77E5\u503C\u8D70 advanced\uFF08\u9ED8\u8BA4\u6863\uFF09\u3002\n * @param custom - \u8BBE\u7F6E\u9875\u91CC\u7684\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\uFF1B\u7A7A\u4E32 = \u7528\u5185\u7F6E\u90A3\u4EFD\u3002\n * @returns \u8BE5\u6863\u4F4D\u7684\u5B8C\u6574\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002\n */\nexport function buildOptimizeSystem(tier: string, custom = ''): string {\n const body = custom.trim() === '' ? specOf(tier).system : custom.trim()\n return `${body}\\n\\n${OPTIMIZER_OUTPUT_CONTRACT}`\n}\n\n/**\n * \u7EC4\u88C5\u4E00\u6B21\u4F18\u5316\u7684 temperature\u3002\n * @param tier - \u5F3A\u5EA6\u6863\u4F4D\uFF1B\u672A\u77E5\u503C\u8D70 advanced\u3002\n * @returns \u8BE5\u6863\u4F4D\u7684\u91C7\u6837\u6E29\u5EA6\u3002\n */\nexport function buildOptimizeTemperature(tier: string): number {\n return specOf(tier).temperature\n}\n\n/**\n * \u8FD9\u6B21\u7528\u7684\u662F\u81EA\u5B9A\u4E49\u8FD8\u662F\u5185\u7F6E\u63D0\u793A\u8BCD\uFF08\u56DE\u4F20\u7ED9\u9762\u677F\uFF0C\u65B9\u4FBF\u7528\u6237\u786E\u8BA4\u81EA\u5DF1\u90A3\u4EFD\u771F\u7684\u751F\u6548\u4E86\uFF09\u3002\n * @param custom - \u8BBE\u7F6E\u9875\u91CC\u7684\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\u3002\n * @returns 'custom' = \u7528\u4E86\u7528\u6237\u90A3\u4EFD\uFF1B'builtin' = \u7528\u4E86\u5185\u7F6E\u90A3\u4EFD\u3002\n */\nexport function optimizePromptSource(custom: string): 'custom' | 'builtin' {\n return String(custom ?? '').trim() === '' ? 'builtin' : 'custom'\n}\n\n/**\n * \u4F20\u8BDD\u6846\u67B6\uFF1A\u628A\u7528\u6237\u539F\u8BDD\u5305\u6210\u300C\u5F85\u8F6C\u8FBE\u5185\u5BB9\u300D\u800C\u4E0D\u662F\u300C\u5BF9\u4F60\u8BF4\u7684\u8BDD\u300D\u3002\n *\n * \u8FD9\u662F\u539F\u4F5C\u8005\u4FEE\u300C\u4F18\u5316 AI \u4EE5\u4E3A\u81EA\u5DF1\u5728\u548C\u7528\u6237\u5BF9\u8BDD\u300D\u7684\u5173\u952E\u4E00\u62DB \u2014\u2014 \u88F8\u6587\u672C\u4F1A\u88AB\u5F53\u6210\n * \u5BF9\u8BDD\u8F93\u5165\uFF0C\u4E8E\u662F\u6A21\u578B\u5F00\u59CB\u56DE\u5E94\u4F60\u800C\u4E0D\u662F\u66FF\u4F60\u8F6C\u8FBE\u3002\n * @param original - \u8F93\u5165\u6846\u91CC\u7684\u539F\u8BDD\u3002\n * @param options - `retry`\uFF1A\u4E0A\u4E00\u6B21\u4EA7\u51FA\u4E3A\u7A7A\uFF0C\u6309\u5BF9\u65B9 0.6 \u7684 `retryEmpty` \u518D\u70B9\u4E00\u904D\u89C4\u5219\n * \uFF08\u5BF9\u65B9\u7684\u771F\u673A\u6559\u8BAD\uFF1A\u77ED\u6D88\u606F/\u8001\u4F1A\u8BDD\u4F1A\u53CD\u590D\"\u601D\u8003\u5B8C\u6210\u5374\u6CA1\u6709\u4EA7\u51FA\"\uFF09\u3002\n * @returns \u76F4\u63A5\u4F5C\u4E3A user \u6D88\u606F\u53D1\u9001\u7684\u6587\u672C\u3002\n */\nexport function buildOptimizeUser(\n original: string,\n options: { readonly retry?: boolean; readonly reason?: string } = {},\n): string {\n const parts = [\n '\u3010\u5F85\u8F6C\u8FBE\u5185\u5BB9\u3011\u4E0B\u9762\u662F\"\u7528\u6237\"\u53D1\u7ED9\u6211\u7684\u539F\u8BDD\u3002**\u5B83\u4E0D\u662F\u8BF4\u7ED9\u4F60\u542C\u7684**\uFF0C\u4F60\u4E0D\u9700\u8981\u56DE\u5E94\u5B83\u3001\u4E5F\u4E0D\u9700\u8981\u66FF\u7528\u6237\u53BB\u505A\u8FD9\u4EF6\u4E8B\u3002',\n '<\u539F\u6587>',\n String(original ?? ''),\n '</\u539F\u6587>',\n '',\n '\u3010\u4F60\u7684\u4EFB\u52A1\u3011\u6309\u7CFB\u7EDF\u63D0\u793A\u8BCD\u7684\u89C4\u5219\uFF0C\u628A\u4E0A\u9762\u7684\u539F\u8BDD\u62C6\u6210**\u6761\u76EE**\u5E76\u7ED9\u6BCF\u6761\u9644\u4E0A**\u9010\u5B57\u5F15\u6587**\u3002',\n '- \u53EA\u8F93\u51FA\u90A3\u4EFD JSON \u5951\u7EA6\u8981\u6C42\u7684\u4E1C\u897F\uFF1B\u4E0D\u8981\u56DE\u5E94\u6211\u3001\u4E0D\u8981\u56DE\u7B54\u95EE\u9898\u3001\u4E0D\u8981\u8C22\u5E55\u3001\u4E0D\u8981\u89E3\u91CA\u4F60\u505A\u4E86\u4EC0\u4E48\u3002',\n '- \u8BFB\u8005\u53EA\u6709\"\u5DE5\u4F5C AI\"\u4E00\u4E2A\uFF0C\u800C\u4F60\u7684\u4EA7\u51FA\u4F1A\u5148\u7ECF\u5BBF\u4E3B\u9010\u6761\u6838\u5BF9\u5F15\u6587\u3002',\n ]\n if (options.retry === true) {\n parts.push(\n '',\n `\u3010\u91CD\u8981\uFF1A\u4F60\u4E0A\u4E00\u6B21\u7684\u8F93\u51FA\u662F\u7A7A\u7684${options.reason ? `\uFF08${options.reason}\uFF09` : ''}\u3011`,\n '\u4E0A\u4E00\u6B21\u4F60\u6CA1\u6709\u7ED9\u51FA\u4EFB\u4F55\u6761\u76EE\uFF0C\u8FD9\u4E00\u8F6E\u56E0\u6B64**\u6CA1\u6709\u4EFB\u4F55\u8865\u5168**\u53EF\u4EE5\u4EA4\u7ED9\u5DE5\u4F5C AI\u3002',\n '\u8BF7\u6309\u7CFB\u7EDF\u63D0\u793A\u8BCD\u7684\u786C\u89C4\u5219\u91CD\u505A\uFF1A**\u54EA\u6015\u7528\u6237\u53EA\u5199\u4E86\u4E00\u4E24\u4E2A\u5B57\uFF0C\u4E5F\u8981\u5C3D\u91CF\u628A\u5B83\u62C6\u6210\u53EF\u5F15\u7528\u7684\u6761\u76EE**',\n '\uFF08\u81F3\u5C11\u4E00\u6761 `rewrite`\uFF0C\u6216\u4E00\u6761 `quality` / `unknown`\uFF09\uFF1B\u786E\u5B9E\u6CA1\u6709\u53EF\u8865\u7684\u5185\u5BB9\u65F6\u624D\u8F93\u51FA {\"items\":[]}\u3002',\n '\u53EA\u8F93\u51FA JSON\u3002',\n )\n }\n return parts.join('\\n')\n}\n", "/**\n * \u63D0\u793A\u8BCD\u4F18\u5316\u5668\u7684\u300C\u4F9D\u636E\u6821\u9A8C + \u5BBF\u4E3B\u88C5\u914D\u300D\u5C42\uFF08\u7EAF\u51FD\u6570\uFF1A\u65E0 IO\u3001\u65E0 LLM\u3001\u65E0\u5BBF\u4E3B\u4F9D\u8D56\uFF09\u3002\n *\n * \u8FD9\u4E00\u5C42\u662F 0.6.0 \u5F15\u5165\u7684**\u673A\u5236\u5185\u6838**\uFF0C\u505A\u6CD5\u53D6\u81EA WestFox-AwA/dsh-prompt-optimizer \u7684\n * 0.6 \u7EBF\uFF08BSD-3-Clause\uFF0C\u4F5C\u8005\u300C\u5543\u8F6E\u80CE\u7684\u897F\u72D0\u300D\uFF09\uFF1A\n *\n * `po06/lib/interpreter.js` \u2014\u2014 \u6A21\u578B\u53EA\u4EA7\u6761\u76EE\uFF1B`validateProvenance` \u8981\u6C42\n * user_requirement \u7684\u5F15\u6587\u5FC5\u987B\u662F**\u5B57\u9762\u5B50\u4E32**\uFF0C\n * \u5BF9\u4E0D\u4E0A\u5C31\u4E22\u90A3\u4E00\u6761\u5E76\u8BB0\u8D26\uFF08\u7EDD\u4E0D\u6574\u8F6E\u4F5C\u5E9F\uFF09\u3002\n * `po06/lib/compiler.js` \u2014\u2014 \u5BBF\u4E3B\u6309\u56FA\u5B9A\u8282\u5E8F\u6E32\u67D3\u3001**\u8D85\u9884\u7B97\u6309\u56FA\u5B9A\u987A\u5E8F\u4E22\u5F03**\n * \u5E76\u5199\u660E\u4E22\u4E86\u4EC0\u4E48\uFF08\u7EDD\u4E0D\u9759\u9ED8\u622A\u65AD\uFF09\u3002\n *\n * \u672C\u63D2\u4EF6\u5728\u6B64\u57FA\u7840\u4E0A\u628A\"\u6761\u76EE \u2192 \u6210\u54C1\"\u8FD9\u4E00\u6B65\u505A\u6210**\u7ED3\u6784\u5316\u7684\u642C\u8FD0**\u800C\u4E0D\u662F\u53C8\u4E00\u6B21\u81EA\u7531\u6539\u5199\uFF1A\n * \u00B7 `rewrite` \u6761\u76EE\u6309\u5F15\u6587\u5728\u539F\u8BDD\u91CC\u7684**\u4F4D\u7F6E**\u56DE\u586B\uFF08\u53F3\u4FA7\u5148\u52A8\uFF0C\u4E0B\u6807\u4E0D\u4F1A\u4E32\u4F4D\uFF09\uFF1B\n * \u00B7 \u6CA1\u88AB\u4EFB\u4F55 rewrite \u8986\u76D6\u7684\u539F\u8BDD**\u539F\u6837\u4FDD\u7559**\uFF1B\n * \u00B7 \u5176\u4F59\u6761\u76EE\u6309\u8282\u8FFD\u52A0\u5728\u672B\u5C3E\uFF0C\u6BCF\u6761\u5E26\u81EA\u5DF1\u7684\u9010\u5B57\u4F9D\u636E\u3002\n * \u4E8E\u662F\"\u6A21\u578B\u51ED\u7A7A\u53D1\u660E\u4E00\u6761\u8981\u6C42\"\u5728\u7ED3\u6784\u4E0A\u4E0D\u53EF\u80FD\uFF1A\u5B83\u62FF\u4E0D\u51FA\u9010\u5B57\u5F15\u6587\u3002\n *\n * \u4E09\u6761\u7EAA\u5F8B\uFF08\u4E0E\u5BF9\u65B9\u4E00\u81F4\uFF0C\u9010\u6761\u90FD\u6709\u5BF9\u5E94\u4EE3\u7801\uFF09\uFF1A\n * \u2460 \u5355\u70B9\u4E0D\u5F97\u5E9F\u6574\u8F6E \u2014\u2014 \u5F15\u6587\u5BF9\u4E0D\u4E0A/\u8D85\u4E0A\u9650/\u5B57\u6BB5\u5199\u574F\uFF0C\u53EA\u4E22\u90A3\u4E00\u6761\u5E76\u8BB0\u8D26\uFF1B\n * \u2461 \u53EA\u4E22\u4E0D\u7F16 \u2014\u2014 \u8865\u4E0D\u51FA\u7684\u4E1C\u897F\u4E0D\u4F1A\u51FA\u73B0\u5728\u6210\u54C1\u91CC\uFF1B\n * \u2462 \u964D\u7EA7\u8981\u51FA\u58F0 \u2014\u2014 \u7701\u7565\u591A\u5C11\u6761\u3001\u4E3A\u4EC0\u4E48\uFF0C\u6210\u54C1\u4E0E\u9762\u677F\u90FD\u8981\u770B\u5F97\u89C1\u3002\n */\nimport { OPTIMIZE_ITEM_MAX_CHARS, OPTIMIZE_MAX_ITEMS, OPTIMIZE_ITEM_KINDS, OPTIMIZE_UNKNOWN_CLASSES } from './optimizer-prompt.ts'\nimport { OPTIMIZE_OUTPUT_MAX } from './settings-contract.ts'\n\n/** \u6761\u76EE\u79CD\u7C7B\u3002 */\nexport type OptimizeItemKind = (typeof OPTIMIZE_ITEM_KINDS)[number]\n\n/** \u672A\u51B3\u9879\u5206\u7C7B\u3002 */\nexport type OptimizeUnknownClass = (typeof OPTIMIZE_UNKNOWN_CLASSES)[number]\n\n/** \u539F\u8BDD\u91CC\u7684\u4E00\u6BB5\u4F4D\u7F6E\uFF08\u5DE6\u95ED\u53F3\u5F00\uFF09\u3002 */\nexport interface QuoteSpan {\n readonly start: number\n readonly end: number\n}\n\n/** \u4E00\u6761\u901A\u8FC7\u6821\u9A8C\u7684\u6761\u76EE\u3002 */\nexport interface OptimizeItem {\n /** \u7A33\u5B9A\u5E8F\u53F7\uFF08\u6A21\u578B\u4E0D\u7ED9 id\uFF0C\u5BBF\u4E3B\u81EA\u5DF1\u7F16\uFF1A`item#1`\uFF09\u3002 */\n readonly id: string\n readonly kind: OptimizeItemKind\n /** \u62FC\u8FDB\u6210\u54C1\u7684\u6B63\u6587\u3002 */\n readonly text: string\n /** \u9010\u5B57\u5F15\u6587\uFF08`rewrite`/`requirement`/`quality` \u5FC5\u6709\u4E14\u5DF2\u6838\u5BF9\u901A\u8FC7\uFF09\u3002 */\n readonly quote?: string\n /** \u5F15\u6587\u5728\u539F\u8BDD\u91CC\u7684\u4F4D\u7F6E\uFF08\u6838\u5BF9\u901A\u8FC7\u65F6\u624D\u6709\uFF09\u3002 */\n readonly span?: QuoteSpan\n /** \u5F15\u6587\u6765\u81EA\u539F\u8BDD\u8FD8\u662F\u6A21\u578B\u81EA\u5DF1\u8865\u7684\uFF08`unknown`/`plan`/`risk` \u5141\u8BB8\u6CA1\u6709\u5F15\u6587\uFF09\u3002 */\n readonly quoteSource?: 'user' | 'none'\n readonly unknownClass?: OptimizeUnknownClass\n readonly blocking?: boolean\n}\n\n/** \u4E00\u6761\u88AB\u4E22\u6389\u7684\u6761\u76EE\uFF08\u8BB0\u8D26\u7528\uFF1A\u9762\u677F\u4F1A\u663E\u793A\u6761\u6570\u4E0E\u539F\u56E0\uFF09\u3002 */\nexport interface DroppedItem {\n readonly id: string\n readonly kind: string\n readonly reason: string\n}\n\n/** \u89E3\u6790\u7ED3\u679C\u3002 */\nexport type ParseResult =\n | { readonly ok: true; readonly items: readonly OptimizeItem[]; readonly dropped: readonly DroppedItem[]; readonly warnings: readonly string[] }\n | { readonly ok: false; readonly code: 'NO_JSON' | 'BAD_JSON' | 'BAD_SHAPE' | 'NOT_ENVELOPE'; readonly reason: string }\n\n/** \u88C5\u914D\u7ED3\u679C\u3002 */\nexport interface AssembleResult {\n /** \u6700\u7EC8\u5199\u56DE\u8F93\u5165\u6846\u7684\u6B63\u6587\u3002 */\n readonly text: string\n /** \u5B9E\u9645\u6E32\u67D3\u51FA\u6765\u7684\u8282\uFF08\u987A\u5E8F\u5373\u51FA\u73B0\u987A\u5E8F\uFF09\u3002 */\n readonly sections: readonly string[]\n /** \u56E0\u7BC7\u5E45\u9884\u7B97\u88AB\u4E22\u6389\u7684\u6761\u76EE\u3002 */\n readonly dropped: readonly DroppedItem[]\n readonly warnings: readonly string[]\n readonly chars: number\n readonly budget: number\n readonly overBudget: boolean\n readonly overBy: number\n /** \u88AB rewrite \u8986\u76D6\u6389\u7684\u539F\u8BDD\u5B57\u7B26\u6570\uFF08\u9762\u677F\u7528\u5B83\u8BF4\u660E\"\u6539\u4E86\u591A\u5C11\"\uFF09\u3002 */\n readonly rewrittenChars: number\n /** \u901A\u8FC7\u6821\u9A8C\u3001\u771F\u7684\u8FDB\u5165\u4E86\u6210\u54C1\u7684\u6761\u76EE\u6570\u3002 */\n readonly itemCount: number\n}\n\n/**\n * \u5404\u6863\u7684\u7BC7\u5E45\u9884\u7B97 = \u539F\u8BDD\u957F\u5EA6\u7684\u500D\u6570\uFF0C\u5E76\u6709**\u4E0B\u9650**\u4E0E\u4E0A\u9650\u3002\n *\n * \u4E0B\u9650\u4E3A\u4EC0\u4E48\u7ED9\u8FD9\u4E48\u5927\uFF08\u666E\u901A 400 / \u9AD8\u7EA7 700 / \u6781\u7AEF 1400\uFF09\uFF1A\u88C5\u914D\u5F62\u6001\u4E0B\u6210\u54C1**\u5FC5\u7136**\u6BD4\u539F\u8BDD\u957F\u2014\u2014\n * \u9664\u4E86\u56DE\u586B\u8FC7\u7684\u6B63\u6587\uFF0C\u8FD8\u8981\u5E26\u4E0A\u5404\u8282\u7684\u6807\u9898\u4E0E\u9010\u5B57\u4F9D\u636E\u3002\u62FF\"1.4 \u500D\"\u53BB\u5361\u4E00\u4E2A 23 \u5B57\u7684\u539F\u8BDD\uFF08= 32 \u5B57\u7B26\uFF09\uFF0C\n * \u8FDE\u4E00\u6761\u5E26\u4F9D\u636E\u7684\u8865\u5168\u90FD\u653E\u4E0D\u4E0B\uFF0C\u95F8\u95E8\u4F1A\u5E38\u6001\u6027\u89E6\u53D1\u3001\u6210\u54C1\u91CC\u585E\u6EE1\"\u56E0\u7BC7\u5E45\u9884\u7B97\u7701\u7565 N \u6761\"\u2014\u2014\n * \u90A3\u662F\u628A\u673A\u5236\u566A\u58F0\u5F53\u6210\u4E86\u4EA7\u51FA\u3002\u6240\u4EE5\u4E0B\u9650\u662F\"\u88C5\u5F97\u4E0B\u6B63\u5E38\u4E00\u8F6E\u8865\u5168\"\u7684\u91CF\uFF0C\u500D\u6570\u53EA\u5728\u957F\u539F\u6587\u4E0A\u8D77\u4F5C\u7528\u3002\n *\n * \u4E0A\u9650\u53D6 `OPTIMIZE_OUTPUT_MAX`\uFF0C\u4E0E\u5BBF\u4E3B\u8FD4\u56DE\u7ED9\u5BA2\u6237\u7AEF\u7684\u622A\u65AD\u53E3\u5F84\u540C\u4E00\u4E2A\u6570\u3002\n * \uFF08\u5BF9\u65B9 0.6 \u7684\u505A\u6CD5\u540C\u6E90\uFF1A`compiler.js` \u7684 `DEFAULT_BUDGET = 1200` \u662F\u4E2A\u56FA\u5B9A\u91CF\uFF0C\u4E0D\u662F\u8F93\u5165\u7684\u500D\u6570\u3002\uFF09\n */\nconst TIER_BUDGET: Record<string, { readonly factor: number; readonly floor: number }> = {\n basic: { factor: 1.4, floor: 400 },\n advanced: { factor: 2.6, floor: 700 },\n extreme: { factor: 4, floor: 1_400 },\n}\n\n/**\n * \u5404\u6863\u5141\u8BB8\u51FA\u73B0\u7684\u6761\u76EE\u79CD\u7C7B \u2014\u2014 **\u6863\u4F4D\u627F\u8BFA\u7684\u673A\u68B0\u6267\u884C**\u3002\n *\n * \u4E3A\u4EC0\u4E48\u8981\u5728\u4EE3\u7801\u91CC\u518D\u62E6\u4E00\u9053\uFF1A\u63D0\u793A\u8BCD\u91CC\u5199\u4E86\"\u666E\u901A\u6863\u4E0D\u8BB8\u4EA7\u51FA requirement\"\uFF0C\u4F46\u90A3\u662F**\u8BF7\u6C42**\uFF0C\n * \u4E0D\u662F\u4FDD\u8BC1\uFF1B\u6A21\u578B\u4E0D\u7167\u505A\u65F6\uFF0C\u7528\u6237\u770B\u5230\u7684\"\u666E\u901A\u6863\"\u5C31\u4F1A\u83AB\u540D\u5176\u5999\u591A\u51FA\u8865\u5168\u8981\u6C42\u3002\u6863\u4F4D\u65E2\u7136\u662F\u7528\u6237\n * \u4EB2\u624B\u9009\u7684\u8BED\u4E49\uFF08\u666E\u901A = \u53EA\u4FEE\u8BED\u8A00\uFF09\uFF0C\u5C31\u5FC5\u987B\u7531\u5BBF\u4E3B\u4FDD\u8BC1\uFF0C\u800C\u4E0D\u662F\u6307\u671B\u6A21\u578B\u542C\u8BDD\u3002\n */\nconst TIER_KINDS: Record<string, readonly OptimizeItemKind[]> = {\n basic: ['rewrite', 'unknown'],\n advanced: ['rewrite', 'requirement', 'quality', 'unknown'],\n extreme: ['rewrite', 'requirement', 'quality', 'unknown', 'plan', 'risk'],\n}\n\n/**\n * \u8FD9\u4E00\u6863\u5141\u8BB8\u54EA\u4E9B\u6761\u76EE\u79CD\u7C7B\u3002\n * @param tier - \u6863\u4F4D\uFF1B\u672A\u77E5\u6863\u6309 advanced\u3002\n * @returns \u5141\u8BB8\u7684\u79CD\u7C7B\uFF08\u987A\u5E8F\u4E0D\u8868\u610F\uFF09\u3002\n */\nexport function allowedKindsFor(tier: string): readonly OptimizeItemKind[] {\n return TIER_KINDS[tier] ?? TIER_KINDS.advanced!\n}\n\n/**\n * \u7B97\u8FD9\u4E00\u6863\u7684\u7BC7\u5E45\u9884\u7B97\u3002\n * @param tier - \u6863\u4F4D\uFF1B\u672A\u77E5\u6863\u6309 advanced\u3002\n * @param originalChars - \u539F\u8BDD\u5B57\u7B26\u6570\u3002\n * @returns \u5141\u8BB8\u7684\u6210\u54C1\u5B57\u7B26\u4E0A\u9650\u3002\n */\nexport function optimizeBudgetFor(tier: string, originalChars: number): number {\n const spec = TIER_BUDGET[tier] ?? TIER_BUDGET.advanced!\n const scaled = Math.ceil(Math.max(0, originalChars) * spec.factor)\n return Math.min(OPTIMIZE_OUTPUT_MAX, Math.max(spec.floor, scaled))\n}\n\n/**\n * \u5224\u65AD\u8FD9\u6BB5\u8F93\u51FA**\u50CF\u4E0D\u50CF**\u672C\u63D2\u4EF6\u8981\u7684\u90A3\u4EFD\u4FE1\u5C01\uFF08`{\"items\":\u2026}` / `{\"ops\":\u2026}`\uFF09\u3002\n *\n * \u8FD9\u4E2A\u5224\u636E\u53EA\u7528\u6765\u51B3\u5B9A\"\u89E3\u6790\u5931\u8D25\u65F6\u8BE5\u600E\u4E48\u529E\"\uFF0C\u662F\u672C\u6B21\u6539\u9020\u91CC\u6700\u8981\u7D27\u7684\u4E00\u6761\u5B89\u5168\u8FB9\u754C\uFF1A\n * \u00B7 \u50CF\u4FE1\u5C01 \u2192 **\u5931\u8D25**\uFF08\u5B81\u53EF\u4E0D\u5199\u56DE\uFF0C\u4E5F\u7EDD\u4E0D\u628A\u534A\u622A JSON \u585E\u8FDB\u8F93\u5165\u6846\uFF09\uFF1B\n * \u00B7 \u4E0D\u50CF\u4FE1\u5C01\uFF08\u65E7\u884C\u4E3A\u7684\u81EA\u7531\u6587\u672C\uFF09\u2192 \u6574\u6BB5\u7167\u6536\u515C\u5E95\u3002\n * \u6240\u4EE5\u5B83\u523B\u610F\u504F\u5411\"\u5224\u6210\u50CF\"\uFF1A\u628A\u4E00\u6BB5\u666E\u901A\u6587\u672C\u8BEF\u5224\u6210\u4FE1\u5C01\u7684\u4EE3\u4EF7\u53EA\u662F\"\u8FD9\u4E00\u6B21\u4F18\u5316\u5931\u8D25\u3001\n * \u8349\u7A3F\u539F\u5C01\u4E0D\u52A8\"\uFF1B\u53CD\u8FC7\u6765\u5224\u9519\u7684\u4EE3\u4EF7\u662F\u628A `{\"items\":[{\"kind\":\"rew` \u8FD9\u79CD\u5783\u573E\u5199\u8FDB\u8F93\u5165\u6846\u3002\n * @param raw - \u6A21\u578B\u539F\u59CB\u8F93\u51FA\u3002\n * @returns \u50CF\u4FE1\u5C01\u5219\u4E3A true\u3002\n */\nfunction looksLikeEnvelope(raw: string): boolean {\n const text = String(raw ?? '').trim()\n if (text.startsWith('{') || text.startsWith('```')) return true\n return /\"(items|ops)\"\\s*:/.test(text)\n}\n\n/**\n * \u4ECE\u6A21\u578B\u8F93\u51FA\u91CC\u62BD\u51FA JSON\uFF08\u5BB9\u5FCD ```json \u56F4\u680F\u4E0E\u524D\u540E\u5E9F\u8BDD\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5BB9\u9519\uFF1A\u5BF9\u65B9\u771F\u673A\u53F0\u8D26\u91CC\u6700\u5E38\u89C1\u7684\u5931\u8D25\u5C31\u662F\"\u6A21\u578B\u5728 JSON \u524D\u540E\u591A\u8BF4\u4E86\u4E24\u53E5\u8BDD\"\uFF0C\n * \u800C\u8FD9\u4E0D\u8BE5\u8BA9\u6574\u8F6E\u767D\u8DD1\u3002\n * @param raw - \u6A21\u578B\u539F\u59CB\u8F93\u51FA\u3002\n * @returns \u89E3\u6790\u51FA\u7684\u5BF9\u8C61\uFF1B\u62BD\u4E0D\u5230\u65F6\u7ED9\u51FA\u53EF\u8BB0\u8D26\u7684\u539F\u56E0\u3002\n */\nexport function extractJson(raw: string): { ok: true; value: unknown } | { ok: false; code: 'NO_JSON' | 'BAD_JSON'; reason: string } {\n const text = String(raw ?? '')\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)\n const candidate = fenced ? fenced[1]! : text\n const start = candidate.indexOf('{')\n const end = candidate.lastIndexOf('}')\n const envelope = looksLikeEnvelope(text)\n if (start < 0 || end <= start) {\n return envelope\n ? { ok: false, code: 'BAD_JSON', reason: '\u8F93\u51FA\u770B\u8D77\u6765\u662F\u672C\u63D2\u4EF6\u7684\u6761\u76EE JSON\uFF0C\u4F46\u62EC\u53F7\u4E0D\u5B8C\u6574\uFF08\u53EF\u80FD\u88AB\u622A\u65AD\uFF09' }\n : { ok: false, code: 'NO_JSON', reason: '\u8F93\u51FA\u91CC\u6CA1\u6709 JSON \u5BF9\u8C61' }\n }\n try {\n return { ok: true, value: JSON.parse(candidate.slice(start, end + 1)) }\n } catch (error: unknown) {\n return {\n ok: false,\n code: envelope ? 'BAD_JSON' : 'NO_JSON',\n reason: error instanceof Error ? error.message : String(error),\n }\n }\n}\n\n/**\n * \u5728\u539F\u8BDD\u91CC\u627E\u4E00\u6BB5\u5F15\u6587\uFF0C\u8FD4\u56DE\u5B83\u5728\u539F\u8BDD\u4E2D\u7684\u4F4D\u7F6E\u3002\n *\n * \u5148\u505A**\u9010\u5B57**\u6BD4\u5BF9\uFF08\u5BF9\u65B9\u7684\u53E3\u5F84\uFF09\uFF1B\u9010\u5B57\u627E\u4E0D\u5230\u65F6\u9000\u4E00\u6B65\u505A**\u7A7A\u767D\u5F52\u4E00**\u6BD4\u5BF9 \u2014\u2014\n * \u6A21\u578B\u628A\u539F\u8BDD\u91CC\u7684\u6362\u884C/\u591A\u7A7A\u683C\u590D\u8FF0\u6210\u5355\u7A7A\u683C\u662F\u5E38\u89C1\u73B0\u8C61\uFF0C\u4E0D\u8BE5\u56E0\u6B64\u4E22\u6389\u4E00\u6761\u597D\u6761\u76EE\u3002\n * \u5F52\u4E00\u8DEF\u5F84\u4F1A\u628A\u5339\u914D\u533A\u95F4\u6620\u5C04\u56DE\u539F\u8BDD\u7684\u771F\u5B9E\u4E0B\u6807\uFF0C\u6240\u4EE5\u56DE\u586B\u4ECD\u7136\u843D\u5728\u6B63\u786E\u4F4D\u7F6E\u3002\n * @param original - \u7528\u6237\u539F\u8BDD\uFF08\u9010\u5B57\uFF09\u3002\n * @param quote - \u6A21\u578B\u7ED9\u7684\u5F15\u6587\u3002\n * @returns \u4F4D\u7F6E\uFF1B\u5BF9\u4E0D\u4E0A\u65F6 undefined\u3002\n */\nexport function findQuoteSpan(original: string, quote: string): QuoteSpan | undefined {\n const q = String(quote ?? '').trim()\n if (q === '') return undefined\n const exact = original.indexOf(q)\n if (exact >= 0) return { start: exact, end: exact + q.length }\n\n // \u2500\u2500 \u7A7A\u767D\u5F52\u4E00\u6BD4\u5BF9\uFF1A\u628A\u539F\u8BDD\u538B\u6210\"\u5355\u7A7A\u683C\u5206\u9694\"\u7684\u4E32\uFF0C\u540C\u65F6\u8BB0\u4F4F\u6BCF\u4E2A\u5B57\u7B26\u7684\u539F\u4E0B\u6807\u3002\n const target = q.replace(/\\s+/g, ' ')\n let acc = ''\n const map: number[] = []\n for (let i = 0; i < original.length; i += 1) {\n const ch = original[i]!\n if (/\\s/.test(ch)) {\n if (acc === '' || acc.endsWith(' ')) continue\n acc += ' '\n map.push(i)\n continue\n }\n acc += ch\n map.push(i)\n }\n const at = acc.indexOf(target)\n if (at < 0) return undefined\n const start = map[at]!\n const last = map[at + target.length - 1] ?? start\n return { start, end: last + 1 }\n}\n\n/** \u628A\u6A21\u578B\u7684 `{items:[...]}` / \u53C2\u8003\u5B9E\u73B0\u7684 `{ops:[{op:'add_item',item}]}` \u90FD\u5F52\u4E00\u6210\u6761\u76EE\u6570\u7EC4\u3002 */\nfunction itemsOf(value: unknown, warnings: string[]): readonly unknown[] | undefined {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined\n const row = value as Record<string, unknown>\n if (Array.isArray(row.items)) return row.items\n // \u517C\u5BB9\u5BF9\u65B9 0.6 \u7684 ops \u5F62\u6001\uFF08\u6A21\u578B\u89C1\u8FC7\u90A3\u4EFD\u5951\u7EA6\u65F6\u5F88\u5BB9\u6613\u5199\u6210\u8FD9\u6837\uFF09\u2014\u2014\n // \u4E0E\u5176\u6574\u8F6E\u4F5C\u5E9F\uFF0C\u4E0D\u5982\u8BA4\u4E0B\u6765\uFF1B`set_item_status` \u8FD9\u7C7B\u8DE8\u8F6E op \u672C\u63D2\u4EF6\u6CA1\u6709\u72B6\u6001\u53EF\u9500\uFF0C\u5982\u5B9E\u8BB0\u8D26\u5FFD\u7565\u3002\n if (Array.isArray(row.ops)) {\n const out: unknown[] = []\n for (const op of row.ops) {\n if (typeof op !== 'object' || op === null) continue\n const entry = op as Record<string, unknown>\n if (entry.op === 'add_item' && typeof entry.item === 'object' && entry.item !== null) { out.push(entry.item); continue }\n warnings.push(`\u5FFD\u7565\u4E86\u4E0D\u652F\u6301\u7684 op\u300C${String(entry.op ?? '(\u7A7A)')}\u300D\uFF1A\u672C\u63D2\u4EF6\u4E0D\u505A\u8DE8\u8F6E\u72B6\u6001\uFF0C\u53EA\u8BA4 add_item`)\n }\n return out\n }\n return undefined\n}\n\n/** \u8FD9\u4EFD JSON \u91CC**\u51FA\u73B0\u4E86** items / ops \u952E\uFF08\u4E0D\u7BA1\u7C7B\u578B\u5BF9\u4E0D\u5BF9\uFF09\u2014\u2014 \u7528\u6765\u533A\u5206\"\u4FE1\u5C01\u5199\u574F\u4E86\"\u4E0E\"\u6839\u672C\u4E0D\u662F\u4FE1\u5C01\"\u3002 */\nfunction hasEnvelopeKey(value: unknown): boolean {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const row = value as Record<string, unknown>\n return 'items' in row || 'ops' in row\n}\n\n/** \u8BFB\u4E00\u4E2A\u6761\u76EE\u7684 `unknownClass`\uFF08\u7F3A\u7701\u6309\"\u53EA\u6709\u7528\u6237\u80FD\u5B9A\"\u5904\u7406\uFF0C\u4E0E\u5BF9\u65B9 0.6 \u540C\u53E3\u5F84\uFF09\u3002 */\nfunction unknownClassOf(value: unknown): OptimizeUnknownClass {\n return OPTIMIZE_UNKNOWN_CLASSES.includes(value as OptimizeUnknownClass)\n ? value as OptimizeUnknownClass\n : 'user_preference'\n}\n\n/**\n * \u89E3\u6790\u5E76**\u9010\u6761\u6838\u5BF9**\u6A21\u578B\u8F93\u51FA\u3002\n *\n * \u5224\u636E\uFF08\u5168\u90E8\u53EA\u4E22\u5355\u6761\u3001\u7EDD\u4E0D\u6574\u8F6E\u4F5C\u5E9F \u2014\u2014 \u5BF9\u65B9 2026-09-22 \u7684\u771F\u673A\u6559\u8BAD\uFF1A\n * \"\u4E00\u6761\u5F15\u6587\u5BF9\u4E0D\u4E0A \u21D2 \u6574\u8F6E\u4E00\u4E2A\u5305\u90FD\u4EA7\u4E0D\u51FA\u6765\"\uFF09\uFF1A\n * \u00B7 `kind` \u4E0D\u5728\u767D\u540D\u5355 \u2192 \u4E22\uFF1B\n * \u00B7 `text` \u7A7A \u2192 \u4E22\uFF1B\u8D85 300 \u5B57 \u2192 \u622A\u65AD\u5E76\u8BB0\u8D26\uFF1B\n * \u00B7 `rewrite`/`requirement`/`quality` \u7684 `quote` \u7F3A\u5931\u6216\u5728\u539F\u8BDD\u91CC\u627E\u4E0D\u5230 \u2192 \u4E22\uFF1B\n * \u00B7 `unknown`/`plan`/`risk` \u5141\u8BB8\u6CA1\u6709\u5F15\u6587\uFF1B\u7ED9\u4E86\u5F15\u6587\u4F46\u5BF9\u4E0D\u4E0A \u2192 \u4FDD\u7559\u6761\u76EE\u3001\u5982\u5B9E\u6807 `quoteSource:'none'`\u3002\n * @param raw - \u6A21\u578B\u539F\u59CB\u8F93\u51FA\u3002\n * @param original - \u7528\u6237\u539F\u8BDD\uFF08\u9010\u5B57\uFF0C\u7528\u4E8E\u5B57\u9762\u6BD4\u5BF9\uFF09\u3002\n * @returns \u901A\u8FC7\u6821\u9A8C\u7684\u6761\u76EE + \u88AB\u4E22\u6389\u7684\u6761\u76EE + \u8B66\u544A\u3002\n */\nexport function parseOptimizeOutput(raw: string, original: string): ParseResult {\n const extracted = extractJson(raw)\n if (!extracted.ok) return { ok: false, code: extracted.code, reason: extracted.reason }\n const warnings: string[] = []\n const raw_items = itemsOf(extracted.value, warnings)\n if (raw_items === undefined) {\n // \u6709 items/ops \u952E\u4F46\u7C7B\u578B\u4E0D\u5BF9 \u21D2 \u4FE1\u5C01\u5199\u574F\u4E86\uFF08\u5931\u8D25\uFF09\uFF1B\u538B\u6839\u6CA1\u6709\u8FD9\u4E24\u4E2A\u952E \u21D2 \u8FD9\u53EA\u662F\u4E00\u6BB5\u6070\u597D\u662F\n // JSON \u7684\u65E7\u5F0F\u81EA\u7531\u6587\u672C\uFF08\u4EA4\u56DE\u515C\u5E95\u7167\u6536\uFF0C\u4E0D\u7B97\u9519\uFF09\u3002\n return hasEnvelopeKey(extracted.value)\n ? { ok: false, code: 'BAD_SHAPE', reason: '\u671F\u671B {\"items\":[...]} \u6216 {\"ops\":[{\"op\":\"add_item\",\"item\":{...}}]}' }\n : { ok: false, code: 'NOT_ENVELOPE', reason: '\u8FD9\u662F\u4E00\u6BB5 JSON\uFF0C\u4F46\u4E0D\u662F\u672C\u63D2\u4EF6\u7684\u6761\u76EE\u4FE1\u5C01' }\n }\n\n const items: OptimizeItem[] = []\n const dropped: DroppedItem[] = []\n const seenRewrite = new Set<string>()\n\n for (let index = 0; index < raw_items.length; index += 1) {\n const id = `item#${index + 1}`\n const entry = raw_items[index]\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n dropped.push({ id, kind: '(\u975E\u5BF9\u8C61)', reason: '\u6761\u76EE\u4E0D\u662F\u5BF9\u8C61' })\n continue\n }\n const row = entry as Record<string, unknown>\n const kind = String(row.kind ?? '')\n if (!OPTIMIZE_ITEM_KINDS.includes(kind as OptimizeItemKind)) {\n dropped.push({ id, kind: kind === '' ? '(\u7A7A)' : kind, reason: `kind \u4E0D\u5728\u5141\u8BB8\u5217\u8868\u91CC\uFF08${OPTIMIZE_ITEM_KINDS.join(' / ')}\uFF09` })\n continue\n }\n let text = typeof row.text === 'string' ? row.text.trim() : ''\n if (text === '') {\n dropped.push({ id, kind, reason: 'text \u662F\u7A7A\u7684' })\n continue\n }\n if (text.length > OPTIMIZE_ITEM_MAX_CHARS) {\n warnings.push(`${id}\uFF1Atext \u8D85 ${OPTIMIZE_ITEM_MAX_CHARS} \u5B57\uFF0C\u5DF2\u622A\u65AD`)\n text = text.slice(0, OPTIMIZE_ITEM_MAX_CHARS)\n }\n if (items.length >= OPTIMIZE_MAX_ITEMS) {\n dropped.push({ id, kind, reason: `\u8D85\u8FC7\u5355\u8F6E\u4E0A\u9650 ${OPTIMIZE_MAX_ITEMS} \u6761 \u21D2 \u622A\u65AD\u4E22\u5F03\uFF08\u6574\u8F6E\u7167\u5E38\u51FA\u6210\u54C1\uFF09` })\n continue\n }\n\n const needsQuote = kind === 'rewrite' || kind === 'requirement' || kind === 'quality'\n const quote = typeof row.quote === 'string' ? row.quote.trim() : ''\n if (needsQuote) {\n if (quote === '') {\n dropped.push({ id, kind, reason: '\u7F3A\u5C11 quote\uFF08\u8FD9\u4E00\u7C7B\u6761\u76EE\u5FC5\u987B\u6709\u9010\u5B57\u5F15\u6587\uFF09' })\n continue\n }\n const span = findQuoteSpan(original, quote)\n if (span === undefined) {\n dropped.push({ id, kind, reason: `\u5F15\u6587\u4E0D\u662F\u539F\u8BDD\u91CC\u7684\u9010\u5B57\u7247\u6BB5\uFF1A\u300C${quote.slice(0, 40)}\u300D` })\n continue\n }\n if (kind === 'rewrite') {\n // \u540C\u4E00\u6BB5\u539F\u8BDD\u53EA\u5141\u8BB8\u4E00\u6761 rewrite\uFF1A\u91CD\u53E0\u7684\u4E24\u6761\u4F1A\u8BA9\u56DE\u586B\u987A\u5E8F\u53D8\u5F97\u4E0D\u53EF\u89E3\u91CA\u3002\n const key = `${String(span.start)}-${String(span.end)}`\n if (seenRewrite.has(key)) {\n dropped.push({ id, kind, reason: '\u4E0E\u53E6\u4E00\u6761 rewrite \u5F15\u7528\u4E86\u540C\u4E00\u6BB5\u539F\u8BDD\uFF08\u91CD\u590D\uFF09' })\n continue\n }\n seenRewrite.add(key)\n }\n items.push({ id, kind: kind as OptimizeItemKind, text, quote, span, quoteSource: 'user' })\n continue\n }\n\n // unknown / plan / risk\uFF1A\u5F15\u6587\u53EF\u9009\u3002\u7ED9\u4E86\u4F46\u5BF9\u4E0D\u4E0A\u5C31\u5982\u5B9E\u8BB0\u6210\"\u6A21\u578B\u81EA\u5DF1\u8865\u7684\"\uFF0C\u6761\u76EE\u7167\u5E38\u4FDD\u7559\u3002\n const span = quote === '' ? undefined : findQuoteSpan(original, quote)\n if (quote !== '' && span === undefined) {\n warnings.push(`${id}\uFF1A\u5F15\u6587\u5BF9\u4E0D\u4E0A\u539F\u8BDD\uFF0C\u5DF2\u6309\"\u6A21\u578B\u81EA\u5DF1\u8865\u7684\"\u8BB0\u8D26\uFF08\u4E0D\u5192\u5145\u4F60\u8BF4\u8FC7\u7684\u8BDD\uFF09`)\n }\n items.push({\n id, kind: kind as OptimizeItemKind, text, quoteSource: span === undefined ? 'none' : 'user',\n ...(span === undefined ? {} : { span, quote }),\n ...(kind === 'unknown' ? { unknownClass: unknownClassOf(row.unknownClass), blocking: row.blocking === true } : {}),\n })\n }\n\n if (items.length === 0 && dropped.length === 0 && raw_items.length === 0) warnings.push('\u6A21\u578B\u4EA4\u56DE\u7A7A\u6570\u7EC4\uFF1A\u8FD9\u4E00\u8F6E\u6CA1\u6709\u53EF\u6838\u5B9E\u7684\u8865\u5168')\n return { ok: true, items, dropped, warnings }\n}\n\n/** \u8282\u7684\u987A\u5E8F\u5373\u6E32\u67D3\u987A\u5E8F\uFF1B`required` \u7684\u8282**\u6C38\u4E0D**\u56E0\u7BC7\u5E45\u88AB\u4E22\uFF08\u5BF9\u65B9 compiler.js \u7684\u540C\u4E00\u6761\u7EAA\u5F8B\uFF09\u3002 */\nconst SECTIONS: readonly { readonly key: OptimizeItemKind; readonly label: string; readonly required: boolean }[] = [\n { key: 'requirement', label: '\u8865\u5168\u8981\u6C42\uFF08\u6BCF\u6761\u90FD\u6307\u56DE\u4F60\u539F\u8BDD\u91CC\u7684\u67D0\u53E5\uFF09', required: true },\n { key: 'quality', label: '\u5BF9\u8D28\u91CF\u8BCD\u7684\u7406\u89E3', required: false },\n { key: 'plan', label: '\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212', required: false },\n { key: 'risk', label: '\u591A\u60C5\u51B5\u9884\u6848', required: false },\n { key: 'unknown', label: '\u4E0D\u660E\u786E\u5904', required: false },\n]\n\n/** \u8D85\u9884\u7B97\u65F6\u7684\u4E22\u5F03\u987A\u5E8F\uFF1A\u8D8A\u9760\u524D\u8D8A\u5148\u4E22\uFF08\u4E0E\u6E32\u67D3\u987A\u5E8F\u76F8\u53CD\uFF1A\u8D8A\"\u9644\u52A0\"\u7684\u8D8A\u5148\u4E22\uFF09\u3002 */\nconst DROP_ORDER: readonly OptimizeItemKind[] = ['risk', 'plan', 'quality', 'unknown']\n\n/** \u672A\u51B3\u9879\u7684\u5206\u7C7B\u540E\u7F00\uFF1A\u628A\u5BF9\u65B9 0.6 \u7684\u4E09\u5206\u7C7B\u8BED\u4E49\u76F4\u63A5\u5199\u8FDB\u6210\u54C1\uFF0C\u5DE5\u4F5C AI \u624D\u77E5\u9053\u8BE5\u600E\u4E48\u529E\u3002 */\nconst UNKNOWN_SUFFIX: Record<OptimizeUnknownClass, string> = {\n user_preference: '\uFF08\u53EA\u6709\u6211\u80FD\u5B9A\uFF1A\u5148\u95EE\u6211\uFF0C\u4E0D\u8981\u81EA\u884C\u5047\u8BBE\uFF09',\n lookupable_fact: '\uFF08\u53EF\u67E5\u8BC1\u7684\u4E8B\u5B9E\uFF1A\u5148\u8BFB\u4EE3\u7801/\u6587\u6863\u786E\u8BA4\uFF0C\u4E0D\u8981\u731C\uFF09',\n implementation_detail: '\uFF08\u5B9E\u73B0\u7EC6\u8282\uFF1A\u4F60\u81EA\u5DF1\u5B9A\uFF09',\n}\n\n/** \u6E32\u67D3\u4E00\u6761\u6761\u76EE\u4E3A\u5217\u8868\u9879\u3002 */\nfunction lineFor(item: OptimizeItem): string {\n if (item.kind === 'unknown') {\n const cls = item.unknownClass ?? 'user_preference'\n const blocking = item.blocking === true ? '[\u6321\u4F4F\u4E0B\u4E00\u6B65] ' : ''\n return `- ${blocking}${item.text}${UNKNOWN_SUFFIX[cls]}`\n }\n const evidence = item.quote === undefined ? '' : `\uFF08\u4F9D\u636E\uFF1A\"${item.quote}\"\uFF09`\n return `- ${item.text}${evidence}`\n}\n\n/**\n * \u628A\u6821\u9A8C\u901A\u8FC7\u7684\u6761\u76EE**\u88C5\u914D**\u6210\u6700\u7EC8\u547D\u4EE4\u3002\n *\n * \u6B65\u9AA4\uFF08\u6BCF\u4E00\u6B65\u90FD\u53EF\u5355\u72EC\u89E3\u91CA\uFF09\uFF1A\n * 1. `rewrite` \u6309\u5F15\u6587\u4F4D\u7F6E\u4ECE\u53F3\u5F80\u5DE6\u56DE\u586B \u2014\u2014 \u53F3\u4FA7\u5148\u52A8\uFF0C\u5DE6\u4FA7\u7684\u4E0B\u6807\u624D\u4E0D\u4F1A\u4E32\u4F4D\uFF1B\n * \u4E0E\u539F\u8BDD\u5176\u5B83 rewrite \u91CD\u53E0\u7684\u90A3\u6761\u5DF2\u5728\u89E3\u6790\u671F\u4E22\u6389\uFF0C\u6240\u4EE5\u8FD9\u91CC\u53EA\u9700\u6309 start \u6392\u5E8F\uFF1B\n * 2. \u5176\u4F59\u6761\u76EE\u6309\u56FA\u5B9A\u8282\u5E8F\u8FFD\u52A0\u5728\u672B\u5C3E\uFF0C\u6BCF\u6761\u5E26\u81EA\u5DF1\u7684\u9010\u5B57\u4F9D\u636E\uFF1B\n * 3. \u8D85\u8FC7\u7BC7\u5E45\u9884\u7B97\u5C31\u6309 `DROP_ORDER` \u9010\u6761\u4E22**\u53EF\u9009\u7684\u8282**\uFF0C\u5E76\u628A\"\u4E22\u4E86\u51E0\u6761\"\u5199\u8FDB\u6210\u54C1\n * \uFF08\u5BF9\u65B9\u7684\u6001\u5EA6\uFF1A\u964D\u7EA7\u8981\u51FA\u58F0\uFF0C\u4E0D\u80FD\u9759\u9ED8\u622A\u65AD\uFF09\u3002\n *\n * @param original - \u7528\u6237\u539F\u8BDD\uFF08\u9010\u5B57\uFF09\u3002\n * @param items - \u5DF2\u901A\u8FC7\u6821\u9A8C\u7684\u6761\u76EE\u3002\n * @param options - `tier` \u51B3\u5B9A\u7BC7\u5E45\u9884\u7B97\u3002\n * @returns \u6210\u54C1\u4E0E\u5168\u90E8\u8BB0\u8D26\u4FE1\u606F\u3002\n */\nexport function assembleCommand(\n original: string,\n items: readonly OptimizeItem[],\n options: { readonly tier: string },\n): AssembleResult {\n const body0 = String(original ?? '')\n const warnings: string[] = []\n const dropped: DroppedItem[] = []\n\n // \u2500\u2500 0) \u6863\u4F4D\u95E8\uFF1A\u4E0D\u5C5E\u4E8E\u8FD9\u4E00\u6863\u7684\u6761\u76EE\u4E00\u5F8B\u4E0D\u6E32\u67D3\uFF08\u89C1 TIER_KINDS \u7684\u8BF4\u660E\uFF09\u3002\n const allowed = allowedKindsFor(options.tier)\n const usable: OptimizeItem[] = []\n for (const item of items) {\n if (allowed.includes(item.kind)) { usable.push(item); continue }\n dropped.push({ id: item.id, kind: item.kind, reason: `\u5F53\u524D\u6863\u4F4D\uFF08${options.tier}\uFF09\u4E0D\u4EA7\u51FA\u300C${item.kind}\u300D\u8FD9\u4E00\u7C7B\u6761\u76EE` })\n }\n\n // \u2500\u2500 1) rewrite \u56DE\u586B\n const rewrites = usable\n .filter(item => item.kind === 'rewrite' && item.span !== undefined)\n .slice()\n .sort((a, b) => (a.span!.start - b.span!.start) || (a.span!.end - b.span!.end))\n const keptRewrites: OptimizeItem[] = []\n let cursor = -1\n for (const item of rewrites) {\n if (item.span!.start < cursor) {\n dropped.push({ id: item.id, kind: item.kind, reason: '\u6539\u5199\u533A\u95F4\u4E0E\u53E6\u4E00\u6761 rewrite \u91CD\u53E0\uFF0C\u53EA\u4FDD\u7559\u9760\u524D\u7684\u90A3\u6761' })\n continue\n }\n cursor = item.span!.end\n keptRewrites.push(item)\n }\n let body = body0\n let rewrittenChars = 0\n for (let i = keptRewrites.length - 1; i >= 0; i -= 1) {\n const span = keptRewrites[i]!.span!\n body = body.slice(0, span.start) + keptRewrites[i]!.text + body.slice(span.end)\n rewrittenChars += span.end - span.start\n }\n\n // \u2500\u2500 2) \u5176\u4F59\u6761\u76EE\u6309\u8282\u88C5\u6876\n const included: Record<string, OptimizeItem[]> = {}\n for (const section of SECTIONS) included[section.key] = []\n for (const item of usable) {\n if (item.kind === 'rewrite') continue\n if (included[item.kind] === undefined) continue\n included[item.kind]!.push(item)\n }\n\n const renderBlocks = (): string[] => {\n const blocks: string[] = []\n for (const section of SECTIONS) {\n const bucket = included[section.key] ?? []\n if (bucket.length === 0) continue\n blocks.push(`\u3010${section.label}\u3011\\n${bucket.map(lineFor).join('\\n')}`)\n }\n return blocks\n }\n\n const compose = (blocks: string[], removed: DroppedItem[], overBy: number): string => {\n const tail: string[] = []\n if (removed.length > 0) {\n tail.push(`\u3010\u8BF4\u660E\u3011\u56E0\u7BC7\u5E45\u9884\u7B97\u7701\u7565 ${removed.length} \u6761\u8865\u5168\uFF08${removed.map(d => d.kind).join('\u3001')}\uFF09\uFF1B`\n + '\u5982\u679C\u5176\u4E2D\u6709\u7528\u4FE1\u606F\u5F71\u54CD\u5224\u65AD\uFF0C\u8BF7\u5148\u5411\u6211\u786E\u8BA4\u3002')\n }\n if (overBy > 0) {\n tail.push(`\u3010\u9884\u7B97\u4E0D\u8DB3\u3011\u5DF2\u7701\u7565\u5168\u90E8\u53EF\u7701\u7565\u9879\uFF0C\u4ECD\u8D85\u51FA\u7EA6 ${overBy} \u5B57\u7B26\uFF1B\u672C\u8F6E\u5148\u6309\u4E0B\u8FBE\u7684\u8FD9\u4E9B\u505A\uFF0C\u9700\u8981\u4FDD\u7559\u88AB\u7701\u7565\u7684\u5185\u5BB9\u8BF7\u7F29\u5C0F\u8303\u56F4\u3002`)\n }\n const head = blocks.length === 0 ? '' : `${body}\\n\\n${blocks.join('\\n\\n')}`\n if (tail.length === 0) return blocks.length === 0 ? body : head\n return head === '' ? tail.join('\\n\\n') : `${head}\\n\\n${tail.join('\\n\\n')}`\n }\n\n // \u2500\u2500 3) \u7BC7\u5E45\u95F8\u95E8\uFF08\u628A\"\u7701\u7565\u58F0\u660E\"\u81EA\u8EAB\u4E5F\u7B97\u8FDB\u9884\u7B97\uFF0C\u5426\u5219\u58F0\u660E\u4F1A\u628A\u9884\u7B97\u53C8\u6491\u7834\u4E00\u6B21\uFF09\n const budget = optimizeBudgetFor(options.tier, body0.length)\n const removed: DroppedItem[] = []\n let blocks = renderBlocks()\n let overBy = 0\n let text = compose(blocks, removed, 0)\n for (let guard = 0; guard < 200; guard += 1) {\n const bare = compose(blocks, [], 0)\n overBy = bare.length > budget ? bare.length - budget : 0\n text = compose(blocks, removed, overBy)\n if (bare.length <= budget) break\n const victim = DROP_ORDER.find(key => (included[key] ?? []).length > 0)\n if (victim === undefined) break\n const taken = included[victim]!.pop()!\n removed.push({ id: taken.id, kind: taken.kind, reason: 'budget\uFF08\u7BC7\u5E45\u9884\u7B97\uFF09' })\n blocks = renderBlocks()\n }\n if (removed.length > 0) {\n warnings.push(`\u7BC7\u5E45\u9884\u7B97 ${budget} \u5B57\u7B26\uFF1A\u7701\u7565\u4E86 ${removed.length} \u6761\uFF08${removed.map(d => d.id).join('\u3001')}\uFF09`)\n }\n if (overBy > 0) warnings.push(`\u88C5\u4E86\u5FC5\u4FDD\u8282\u540E\u4ECD\u8D85\u51FA\u9884\u7B97\u7EA6 ${overBy} \u5B57\u7B26\uFF0C\u5DF2\u5728\u6210\u54C1\u91CC\u5982\u5B9E\u8BF4\u660E`)\n\n const itemCount = keptRewrites.length + SECTIONS.reduce((sum, section) => sum + (included[section.key] ?? []).length, 0)\n return {\n text,\n sections: SECTIONS.filter(section => (included[section.key] ?? []).length > 0).map(section => section.label),\n dropped: [...dropped, ...removed],\n warnings,\n chars: text.length,\n budget,\n overBudget: overBy > 0,\n overBy,\n rewrittenChars,\n itemCount,\n }\n}\n\n/** \u4E00\u6B21\u5B8C\u6574\u6D41\u6C34\u7EBF\u7684\u7ED3\u679C\u3002 */\nexport type PipelineResult =\n | {\n readonly ok: true\n /** \u5199\u56DE\u8F93\u5165\u6846\u7684\u6B63\u6587\u3002 */\n readonly text: string\n /** true = \u6A21\u578B\u6CA1\u6309 JSON \u5951\u7EA6\u8F93\u51FA\uFF0C\u5DF2\u6309\"\u6574\u6BB5\u7167\u6536\"\u7684\u65E7\u884C\u4E3A\u515C\u5E95\uFF08\u6210\u54C1\u672A\u7ECF\u4F9D\u636E\u6821\u9A8C\uFF09\u3002 */\n readonly fallback: boolean\n readonly itemCount: number\n readonly dropped: readonly DroppedItem[]\n readonly warnings: readonly string[]\n readonly sections: readonly string[]\n readonly chars: number\n readonly budget: number\n readonly overBudget: boolean\n readonly rewrittenChars: number\n }\n | { readonly ok: false; readonly code: string; readonly reason: string }\n\n/**\n * \u8DD1\u5B8C\u6574\u6761\u6D41\u6C34\u7EBF\uFF1A\u89E3\u6790 \u2192 \u9010\u6761\u6838\u5BF9 \u2192 \u88C5\u914D\u3002\n *\n * **\u515C\u5E95\u53E3\u5F84\uFF08\u4E24\u6761\uFF0C\u90FD\u662F\u4E3A\u4E86\u8BA9\"\u65B0\u673A\u5236\"\u6C38\u4E0D\u6BD4\u65E7\u884C\u4E3A\u66F4\u5DEE\uFF09**\uFF1A\n * \u00B7 \u6A21\u578B\u538B\u6839\u6CA1\u6309\u4FE1\u5C01\u8F93\u51FA\uFF08`NO_JSON` / `NOT_ENVELOPE`\uFF09\u2192 \u6309\u65E7\u884C\u4E3A\u6574\u6BB5\u7167\u6536\n * \uFF08`fallback: true`\uFF09\u3002\u8FD9\u6761\u515C\u5E95\u4FDD\u8BC1\u4E86\u672C\u6B21\u6539\u9020**\u4E0D\u4F1A\u8BA9\u4EFB\u4F55\u4E00\u6B21\u539F\u672C\u80FD\u7528\u7684\u4F18\u5316\u53D8\u6210\u5931\u8D25**\u3002\n * \u00B7 \u8F93\u51FA**\u50CF\u4FE1\u5C01\u4F46\u574F\u4E86**\uFF08`BAD_JSON` / `BAD_SHAPE`\uFF09\u2192 **\u5931\u8D25**\uFF0C\u7EDD\u4E0D\u628A\u534A\u622A JSON\n * \u5199\u8FDB\u8F93\u5165\u6846\uFF08\u771F\u673A\u4E0A\u8FD9\u662F\u6700\u4F24\u4EBA\u7684\u4E00\u79CD\"\u4F18\u5316\"\uFF09\u3002\n * @param raw - \u6A21\u578B\u539F\u59CB\u8F93\u51FA\u3002\n * @param original - \u7528\u6237\u539F\u8BDD\uFF08\u9010\u5B57\uFF09\u3002\n * @param options - `tier` \u51B3\u5B9A\u7BC7\u5E45\u9884\u7B97\u3002\n * @returns \u6210\u54C1\u6216\u5931\u8D25\u539F\u56E0\u3002\n */\nexport function runOptimizePipeline(raw: string, original: string, options: { readonly tier: string }): PipelineResult {\n const parsed = parseOptimizeOutput(raw, original)\n if (!parsed.ok) {\n if (parsed.code === 'NO_JSON' || parsed.code === 'NOT_ENVELOPE') {\n return {\n ok: true,\n text: raw.trim(),\n fallback: true,\n itemCount: 0,\n dropped: [],\n warnings: ['\u6A21\u578B\u6CA1\u6709\u6309 JSON \u5951\u7EA6\u8F93\u51FA\uFF1A\u5DF2\u6309\u539F\u6837\u5199\u56DE\uFF08\u8FD9\u4E00\u8F6E\u6CA1\u6709\u505A\u4F9D\u636E\u6821\u9A8C\uFF09'],\n sections: [],\n chars: raw.trim().length,\n budget: optimizeBudgetFor(options.tier, original.length),\n overBudget: false,\n rewrittenChars: 0,\n }\n }\n return { ok: false, code: parsed.code, reason: parsed.reason }\n }\n const assembled = assembleCommand(original, parsed.items, options)\n const warnings = [...parsed.warnings, ...assembled.warnings]\n if (parsed.items.length === 0 && parsed.dropped.length === 0) warnings.push('\u8FD9\u4E00\u8F6E\u6CA1\u6709\u53EF\u6838\u5B9E\u7684\u8865\u5168\uFF0C\u539F\u8BDD\u539F\u6837\u5199\u56DE')\n return {\n ok: true,\n text: assembled.text,\n fallback: false,\n itemCount: assembled.itemCount,\n dropped: [...parsed.dropped, ...assembled.dropped],\n warnings,\n sections: assembled.sections,\n chars: assembled.chars,\n budget: assembled.budget,\n overBudget: assembled.overBudget,\n rewrittenChars: assembled.rewrittenChars,\n }\n}\n", "/**\n * \u5FEB\u6377\u6307\u4EE4\u7684\u5168\u5C40\u5B58\u50A8\uFF1A`$DSH_HOME/quick-prompts.json`\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u8981\u653E\u5728 settings \u6587\u6863\u91CC\uFF080.2.x \u7684\u505A\u6CD5\uFF09\uFF1A\n * 1. \u8BBE\u7F6E\u6587\u6863\u5BF9**\u6570\u7EC4**\u662F\u6574\u4EFD\u66FF\u6362\uFF0C\u4E14\u53D7 schema \u957F\u5EA6\u4E0A\u9650\u7EA6\u675F\u2014\u2014\u65E7\u4E0A\u9650 4000 \u5B57\u4F1A\u628A\n * \u957F\u63D0\u793A\u8BCD**\u9759\u9ED8\u622A\u65AD**\uFF1B\n * 2. \u5FEB\u6377\u6307\u4EE4\u662F\u300C\u7528\u6237\u5185\u5BB9\u300D\u800C\u4E0D\u662F\u300C\u63D2\u4EF6\u914D\u7F6E\u300D\uFF0C\u5355\u72EC\u4E00\u4E2A\u6587\u4EF6\u4FBF\u4E8E\u5907\u4EFD\u3001\u642C\u8FC1\u3001\n * \u624B\u5DE5\u7F16\u8F91\uFF0C\u63D2\u4EF6\u88AB\u7981\u7528/\u5378\u8F7D\u4E5F\u4E0D\u7275\u8FDE\u5B83\uFF1B\n * 3. \u4E0E\u4F1A\u8BDD\u3001\u9879\u76EE\u65E0\u5173\uFF08DSH_HOME \u7EA7\u522B\uFF09\uFF0C\u6362\u4E2A\u4ED3\u5E93\u3001\u6362\u4E2A\u4F1A\u8BDD\u90FD\u8FD8\u5728\u3002\n *\n * \u4E0E lnyuqian/dsh-quick-prompts \u7684\u4E24\u5904\u5DEE\u522B\uFF08\u90FD\u5F80\u4E25\u683C\u7684\u65B9\u5411\u8D70\uFF09\uFF1A\n * \u00B7 \u5B83\u662F `writeFile(...)` \u76F4\u63A5\u8986\u76D6 \u2014\u2014 \u4E2D\u9014\u5931\u8D25\u4F1A\u7559\u4E0B**\u622A\u65AD\u7684 JSON**\uFF1B\u8FD9\u91CC\u7528\n * \u300C\u4E34\u65F6\u6587\u4EF6 \u2192 fsync \u2192 rename\u300D\u539F\u5B50\u66FF\u6362\uFF0C\u8BFB\u8005\u53EA\u4F1A\u770B\u5230\u65E7\u6587\u4EF6\u6216\u65B0\u6587\u4EF6\u3002\n * \u00B7 \u5B83\u8BFB\u76D8\u5931\u8D25\u65F6 `catch { return [] }` \u2014\u2014 \u4E8E\u662F UI \u663E\u793A\u7A7A\u5217\u8868\uFF0C\u7528\u6237\u4E00\u4FDD\u5B58\u5C31\u628A\n * \u7A7A\u5217\u8868\u5199\u56DE\u53BB\uFF0C**\u771F\u6570\u636E\u88AB\u8986\u76D6**\uFF1B\u8FD9\u91CC\u89E3\u6790\u5931\u8D25\u5148**\u9694\u79BB**\u574F\u6587\u4EF6\n * \uFF08\u6539\u540D\u6210 `.bad-<\u65F6\u95F4\u6233>`\uFF09\u518D\u5982\u5B9E\u62A5\u9519\uFF0C\u7EDD\u4E0D\u8FD4\u56DE\u7A7A\u672C\u3001\u7EDD\u4E0D\u5199\u5165\u3002\n */\nimport { mkdir, open, readFile, rename, unlink } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport {\n QUICK_BOOK_VERSION, bookToFile, defaultQuickBook, sanitizeBook,\n type QuickPromptBook,\n} from './settings-contract.ts'\n\n/** \u6587\u4EF6\u540D\u3002\u4E0E\u53C2\u8003\u5B9E\u73B0\u540C\u8DEF\u5F84\uFF0C\u6240\u4EE5\u4E24\u8FB9\u80FD\u8BFB\u540C\u4E00\u4EFD\u6570\u636E\u3002 */\nexport const QUICK_STORE_FILE = 'quick-prompts.json'\n\n/** \u62FF\u9501\u7684\u91CD\u8BD5\u8282\u594F\u4E0E\u603B\u65F6\u957F\u3002 */\nconst LOCK_RETRY_MS = 50\nconst LOCK_RETRY_MAX = 40\n\n/** \u8D85\u8FC7\u8FD9\u4E2A\u5E74\u9F84\u7684\u9501\u89C6\u4E3A\u300C\u4E0A\u6B21\u5199\u5165\u5D29\u6E83\u7559\u4E0B\u7684\u300D\uFF0C\u53EA\u63D0\u793A\u64CD\u4F5C\u8005\u624B\u5DE5\u5904\u7406\uFF0C\u4E0D\u81EA\u52A8\u62A2\u5360\u3002 */\nconst LOCK_STALE_MS = 30_000\n\n/** \u8BFB\u76D8\u7ED3\u679C\u3002`missing` = \u8FD8\u6CA1\u6709\u6587\u4EF6\uFF0C\u53EF\u4EE5\u8FC1\u79FB\uFF1B`broken` = \u6587\u4EF6\u5728\u4F46\u8BFB\u4E0D\u4E86\uFF08\u5DF2\u9694\u79BB\uFF09\u3002 */\nexport type ReadOutcome =\n | { readonly kind: 'missing' }\n | { readonly kind: 'ok'; readonly book: QuickPromptBook }\n | { readonly kind: 'broken'; readonly error: string; readonly quarantined?: string }\n\n/** `$DSH_HOME`\uFF1B\u73AF\u5883\u53D8\u91CF\u7F3A\u5931\u65F6\u56DE\u9000 `~/.dsh`\u3002 */\nexport function dshHome(): string {\n const fromEnv = process.env.DSH_HOME?.trim()\n return fromEnv !== undefined && fromEnv !== '' ? fromEnv : join(homedir(), '.dsh')\n}\n\n/** \u5FEB\u6377\u6307\u4EE4\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002 */\nexport function quickStorePath(): string {\n return join(dshHome(), QUICK_STORE_FILE)\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction hasCode(error: unknown, code: string): boolean {\n return typeof error === 'object' && error !== null && (error as { code?: unknown }).code === code\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => { setTimeout(resolve, ms) })\n}\n\n/** \u628A\u574F\u6587\u4EF6\u6539\u540D\u9694\u79BB\uFF0C\u8FD4\u56DE\u65B0\u8DEF\u5F84\uFF08\u6539\u540D\u5931\u8D25\u5219\u8FD4\u56DE undefined\uFF0C\u4F46\u7EDD\u4E0D\u5220\u9664\uFF09\u3002 */\nasync function quarantine(file: string): Promise<string | undefined> {\n const stamp = new Date().toISOString().replace(/[:.]/g, '-')\n const target = `${file}.bad-${stamp}`\n try {\n await rename(file, target)\n return target\n } catch {\n return undefined\n }\n}\n\n/**\n * \u8BFB\u76D8\u3002\n * @param file \u6587\u4EF6\u8DEF\u5F84\u3002\n * @returns \u4E09\u79CD\u7ED3\u5C40\u4E4B\u4E00\uFF1B**\u89E3\u6790\u5931\u8D25\u7EDD\u4E0D\u5F53\u6210\u7A7A\u672C**\u3002\n */\nexport async function readQuickBook(file: string = quickStorePath()): Promise<ReadOutcome> {\n let raw: string\n try {\n raw = await readFile(file, 'utf8')\n } catch (error) {\n if (hasCode(error, 'ENOENT')) return { kind: 'missing' }\n return { kind: 'broken', error: `\u8BFB\u53D6\u5931\u8D25\uFF1A${errorText(error)}` }\n }\n if (raw.trim() === '') return { kind: 'broken', error: '\u6587\u4EF6\u662F\u7A7A\u7684', quarantined: await quarantine(file) }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n return { kind: 'broken', error: `\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${errorText(error)}`, quarantined: await quarantine(file) }\n }\n const book = sanitizeBook(parsed)\n if (book === undefined) {\n return {\n kind: 'broken',\n error: '\u7ED3\u6784\u8BA4\u4E0D\u51FA\uFF08\u65E2\u4E0D\u662F categories \u4E5F\u4E0D\u662F\u5E73\u94FA prompts\uFF09',\n quarantined: await quarantine(file),\n }\n }\n return { kind: 'ok', book }\n}\n\n/** \u62FF\u5199\u9501\uFF1A`<file>.lock` \u7528 `wx` \u72EC\u5360\u521B\u5EFA\uFF0C\u62FF\u5230\u624D\u7B97\u8FDB\u5165\u4E34\u754C\u533A\u3002 */\nasync function acquireLock(file: string): Promise<() => Promise<void>> {\n const lock = `${file}.lock`\n for (let attempt = 0; attempt < LOCK_RETRY_MAX; attempt += 1) {\n try {\n const handle = await open(lock, 'wx', 0o600)\n await handle.close()\n return async () => { try { await unlink(lock) } catch { /* \u5DF2\u88AB\u91CA\u653E */ } }\n } catch (error) {\n if (!hasCode(error, 'EEXIST')) throw error\n // \u9057\u7559\u9501\u4E0D\u81EA\u52A8\u62A2\u5360\uFF1A\u9501\u7684\u65B0\u65E7\u65E0\u6CD5\u533A\u5206\u300C\u5D29\u6E83\u7684\u6240\u6709\u8005\u300D\u4E0E\u300C\u53EA\u662F\u88AB\u6682\u505C\u7684\u5199\u8005\u300D\uFF0C\n // \u6240\u4EE5\u53EA\u628A\u5904\u7F6E\u529E\u6CD5\u8BF4\u6E05\u695A\uFF0C\u4EA4\u7ED9\u64CD\u4F5C\u8005\u3002\n let ageMs: number | undefined\n try {\n const info = await open(lock, 'r')\n try {\n const stat = await info.stat()\n ageMs = Date.now() - stat.mtimeMs\n } finally {\n await info.close()\n }\n } catch { /* \u9501\u521A\u597D\u88AB\u91CA\u653E\uFF0C\u4E0B\u4E00\u8F6E\u91CD\u8BD5 */ }\n if (ageMs !== undefined && ageMs > LOCK_STALE_MS) {\n throw new Error(\n `\u5199\u5165\u9501 ${lock} \u5DF2\u5B58\u5728 ${Math.round(ageMs / 1000)} \u79D2\uFF0C\u50CF\u662F\u4E0A\u6B21\u5199\u5165\u5D29\u6E83\u7559\u4E0B\u7684\uFF1B`\n + '\u786E\u8BA4\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684 DSH \u540E\u5220\u9664\u5B83\u518D\u91CD\u8BD5',\n )\n }\n await delay(LOCK_RETRY_MS)\n }\n }\n throw new Error(`\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u6B63\u5728\u5199\u5165 ${file}\uFF08\u7B49\u5F85 ${String((LOCK_RETRY_MS * LOCK_RETRY_MAX) / 1000)} \u79D2\u4ECD\u672A\u62FF\u5230\u9501\uFF09`)\n}\n\n/**\n * \u539F\u5B50\u5199\uFF1A\u4E34\u65F6\u6587\u4EF6 \u2192 fsync \u2192 rename\u3002\n * @param book \u5F85\u5199\u5165\u7684\u672C\uFF08\u5199\u524D\u4ECD\u4F1A\u6536\u7A84\u4E00\u6B21\uFF09\u3002\n * @param file \u76EE\u6807\u8DEF\u5F84\u3002\n */\nexport async function writeQuickBook(book: QuickPromptBook, file: string = quickStorePath()): Promise<void> {\n await mkdir(dirname(file), { recursive: true })\n const release = await acquireLock(file)\n try {\n await writeLocked(book, file)\n } finally {\n await release()\n }\n}\n\n/** \u771F\u6B63\u7684\u5199\u5165\u52A8\u4F5C\uFF1B\u8C03\u7528\u65B9\u5FC5\u987B\u5DF2\u7ECF\u6301\u9501\u3002 */\nasync function writeLocked(book: QuickPromptBook, file: string): Promise<void> {\n const safe = sanitizeBook(book) ?? { version: QUICK_BOOK_VERSION, categories: [] }\n const tmp = `${file}.${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.tmp`\n const handle = await open(tmp, 'w', 0o600)\n try {\n await handle.writeFile(`${JSON.stringify(bookToFile(safe), null, 2)}\\n`, 'utf8')\n await handle.sync()\n } finally {\n await handle.close()\n }\n // \u540C\u76EE\u5F55 rename \u662F\u539F\u5B50\u7684\uFF1A\u5E76\u53D1\u8BFB\u8005\u8981\u4E48\u770B\u5230\u65E7\u6587\u4EF6\u3001\u8981\u4E48\u770B\u5230\u65B0\u6587\u4EF6\uFF0C\u4E0D\u4F1A\u770B\u5230\u534A\u622A\u3002\n await rename(tmp, file)\n}\n\n/**\n * \u53D6\u5F53\u524D\u8FD9\u672C\uFF1B\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u505A\u4E00\u6B21\u8FC1\u79FB\u3002\n *\n * @param seed settings \u91CC\u65E7\u7684\u5E73\u94FA\u5217\u8868\uFF080.2.x \u7684 `quickPrompts`\uFF09\uFF1B\u7F3A\u5931\u6216\u4E3A\u7A7A\u5219\u7528\u5185\u7F6E 9 \u6761\u3002\n * @param file \u6587\u4EF6\u8DEF\u5F84\u3002\n * @returns \u8BFB\u76D8\u7ED3\u679C\uFF08\u8FC1\u79FB\u6210\u529F\u540E\u4E3A `ok`\uFF09\u3002\n */\nexport async function ensureQuickBook(\n seed: readonly unknown[] | undefined,\n file: string = quickStorePath(),\n): Promise<ReadOutcome> {\n const current = await readQuickBook(file)\n if (current.kind !== 'missing') return current\n\n // \u300C\u6587\u4EF6\u4E0D\u5B58\u5728\u300D\u662F\u4E00\u4E2A\u9700\u8981**\u590D\u6838**\u7684\u5224\u65AD\uFF1A\u5E76\u53D1\u8BF7\u6C42\u53EF\u80FD\u540C\u65F6\u770B\u5230\u7F3A\u5931\uFF0C\u5982\u679C\u5404\u81EA\n // \u5C31\u5730\u521D\u59CB\u5316\uFF0C\u540E\u5230\u7684\u90A3\u4E2A\u4F1A\u628A\u5148\u5230\u7684\u7528\u6237\u6570\u636E\u8986\u76D6\u6210\u9ED8\u8BA4\u672C\u3002\u6240\u4EE5\u5728\u5199\u9501\u91CC\u518D\u8BFB\u4E00\u6B21\uFF0C\n // \u53EA\u6709\u4ECD\u7136\u7F3A\u5931\u624D\u521D\u59CB\u5316\u3002\n await mkdir(dirname(file), { recursive: true })\n const release = await acquireLock(file)\n try {\n const again = await readQuickBook(file)\n if (again.kind !== 'missing') return again\n const migrated = seed === undefined ? undefined : sanitizeBook({ prompts: seed })\n const book = migrated !== undefined && migrated.categories.length > 0 ? migrated : defaultQuickBook()\n await writeLocked(book, file)\n return { kind: 'ok', book }\n } finally {\n await release()\n }\n}\n", "/**\n * \u5B64\u513F\u5199\u5165\u9501\u7684\u56DE\u6536\u3002\n *\n * \u80CC\u666F\uFF082026-09-23 \u771F\u673A\u4E8B\u6545\uFF0C\u4E24\u4E2A\u8FDB\u7A0B\u5404\u7559\u4E00\u628A\uFF09\uFF1A\n * DSH \u7684 `atomic-write` \u7528 `<file>.lock`\uFF08`wx` \u72EC\u5360\u521B\u5EFA + \u5185\u542B\u6301\u6709\u8005 PID\uFF09\u4E32\u884C\u5316\n * **\u8DE8\u8FDB\u7A0B**\u5199\u5165\uFF0C\u5BF9\u4E89\u8BAE\u65B9\u7684\u89C4\u5B9A\u662F\u300C**\u7EDD\u4E0D\u5220\u9664\u5DF2\u5B58\u5728\u7684\u9501**\uFF0C\u9501\u7684\u5E74\u9F84\u8BC1\u660E\u4E0D\u4E86\u6301\u6709\u8005\n * \u5DF2\u7ECF\u505C\u4E0B\uFF1B\u5B64\u513F\u9501\u5C5E\u4E8E\u64CD\u4F5C\u8005\u52A8\u4F5C\u300D\u3002\u800C\u8BBE\u7F6E\u9875\u5199\u5165\u7528\u7684\u90A3\u628A\u9501\u662F\n * `<profile>/package.json.lock`\uFF08`configEditor.edit` \u5BF9 profile \u7684 `package.json` \u52A0\u9501\uFF09\u3002\n *\n * \u4E8E\u662F\u53EA\u8981\u6709\u4E00\u6B21\u786C\u6740\uFF08\u4F8B\u5982 `restart-webui.bat` \u7684 `taskkill /T /F`\uFF09\u6B63\u597D\u843D\u5728\u4E00\u6B21\n * \u8BBE\u7F6E\u5199\u5165\u4E2D\u95F4\uFF0C\u9501\u5C31\u6C38\u8FDC\u7559\u5728\u78C1\u76D8\u4E0A \u2014\u2014 \u540E\u679C\u4E0D\u662F\"\u67D0\u6B21\u5199\u5165\u5931\u8D25\"\uFF0C\u800C\u662F\uFF1A\n * **\u8BE5 profile \u6B64\u540E\u6BCF\u4E00\u6B21\u8BBE\u7F6E\u5199\u5165\u90FD\u5728 2 \u79D2\u540E\u8D85\u65F6**\uFF0C\u754C\u9762\u4E0A\u53EA\u8868\u73B0\u4E3A\"\u70B9\u4E86\u6CA1\u53CD\u5E94\"\uFF0C\n * \u8FDE\u4E00\u53E5\u62A5\u9519\u90FD\u6CA1\u6709\uFF08\u8BFB\u8DEF\u5F84\u4E0D\u53D7\u5F71\u54CD\uFF0C\u56E0\u4E3A\u8BFB\u662F\u4E0D\u52A0\u9501\u7684\uFF09\u3002\n *\n * \u8FD9\u91CC\u505A\u7684\u6B63\u662F\u6587\u6863\u4EA4\u7ED9\u64CD\u4F5C\u8005\u7684\u90A3\u4E00\u6B65\uFF0C\u4F46\u628A\u5224\u636E\u6536\u7D27\u5230**\u80FD\u8BC1\u660E\u6301\u6709\u8005\u5DF2\u7ECF\u4E0D\u5B58\u5728**\uFF1A\n * \u00B7 \u9501\u5185\u5BB9\u5FC5\u987B\u662F\u4E00\u4E2A\u6B63\u6574\u6570 PID\uFF08\u8BA4\u4E0D\u51FA\u6765\u5C31\u7EDD\u4E0D\u52A8\u624B\uFF09\uFF1B\n * \u00B7 \u8BE5 PID \u5FC5\u987B\u786E\u8BA4\u4E0D\u5B58\u5728\uFF08\u6D3B\u7740\u3001\u6216\u6743\u9650\u4E0D\u8DB3\u65E0\u6CD5\u5224\u5B9A \u2192 \u4FDD\u6301\u4E0D\u52A8\uFF09\u3002\n * \u53D6\"\u6D3B\u7740/\u4E0D\u53EF\u5224\u5B9A\u5C31\u4FDD\u7559\"\u8FD9\u4E2A\u65B9\u5411\uFF1A\u5B81\u53EF\u4E0D\u56DE\u6536\uFF08\u7528\u6237\u6309\u6587\u6863\u624B\u5DE5\u5220\uFF09\uFF0C\u4E5F\u4E0D\u8BEF\u5220\u4E00\u628A\n * \u6B63\u88AB\u6301\u6709\u7684\u9501\u2014\u2014\u8BEF\u5220\u4F1A\u8BA9\u4E24\u4E2A\u5199\u5165\u8005\u4EA4\u9519\u63D0\u4EA4\u3002\n */\n\nimport { readFile, rm } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\n/** \u8BBE\u7F6E\u5199\u5165\u7528\u7684\u9501\u6587\u4EF6\u540D\uFF08`configEditor` \u52A0\u9501\u7684\u5BF9\u8C61\u662F profile \u7684 `package.json`\uFF09\u3002 */\nexport const SETTINGS_LOCK_FILENAME = 'package.json.lock'\n\n/** \u5BF9\u4E00\u628A\u9501\u7684\u5904\u7F6E\u7ED3\u8BBA\u3002 */\nexport type StaleLockDecision =\n | { readonly action: 'remove'; readonly pid: number }\n | { readonly action: 'keep'; readonly pid: number }\n | { readonly action: 'ignore'; readonly reason: 'unreadable-holder' }\n\n/** \u56DE\u6536\u7ED3\u679C\uFF08\u4E5F\u662F\u6D4B\u8BD5\u7684\u65AD\u8A00\u70B9\uFF09\u3002 */\nexport type LockRecovery = 'removed' | 'kept' | 'absent' | 'ignored'\n\n/**\n * \u7EAF\u51B3\u7B56\uFF1A\u7ED9\u9501\u6587\u4EF6\u5185\u5BB9\u4E0E\"PID \u662F\u5426\u5B58\u6D3B\"\u7684\u5224\u636E\uFF0C\u5F97\u51FA\u8BE5\u4E0D\u8BE5\u56DE\u6536\u3002\n *\n * \u62BD\u6210\u7EAF\u51FD\u6570\u662F\u4E3A\u4E86\u80FD\u5728 node \u91CC\u9010\u6761\u9489\u6B7B\u2014\u2014**\u8BEF\u5220\u4E00\u628A\u6D3B\u9501**\u7684\u4EE3\u4EF7\uFF08\u4E24\u4E2A\u5199\u5165\u8005\u4EA4\u9519\n * \u63D0\u4EA4\u540C\u4E00\u4E2A profile patch\uFF09\u6BD4\"\u6CA1\u5220\u6389\"\u5927\u5F97\u591A\uFF0C\u6240\u4EE5\u8FD9\u4E2A\u5224\u636E\u5FC5\u987B\u6709\u62A4\u680F\u3002\n * @param content \u9501\u6587\u4EF6\u539F\u6587\uFF08\u6B63\u5E38\u662F `<pid>\\n`\uFF09\u3002\n * @param alive PID \u5B58\u6D3B\u5224\u636E\uFF08\u6CE8\u5165\u4EE5\u4FBF\u6D4B\u8BD5\uFF1B\u771F\u673A\u4F20 {@link isProcessAlive}\uFF09\u3002\n * @returns \u8BE5\u9501\u7684\u5904\u7F6E\u7ED3\u8BBA\u3002\n */\nexport function staleLockDecision(content: string, alive: (pid: number) => boolean): StaleLockDecision {\n const text = content.trim()\n // \u53EA\u8BA4\u7EAF\u5341\u8FDB\u5236\u6B63\u6574\u6570\uFF1A\u591A\u4E00\u884C\u3001\u5E26\u6CE8\u91CA\u3001\u7A7A\u6587\u4EF6\u4E00\u5F8B\u5F53\u4F5C\"\u8BA4\u4E0D\u51FA\u6765\"\uFF0C\u4FDD\u6301\u4E0D\u52A8\u3002\n if (!/^[1-9][0-9]{0,9}$/.test(text)) return { action: 'ignore', reason: 'unreadable-holder' }\n const pid = Number(text)\n return alive(pid) ? { action: 'keep', pid } : { action: 'remove', pid }\n}\n\n/**\n * PID \u662F\u5426\u4ECD\u5B58\u5728\u3002\n *\n * `process.kill(pid, 0)` \u53EA\u505A\u5B58\u5728\u6027\u63A2\u6D4B\uFF08Windows \u4E0A\u7531 libuv \u8D70 OpenProcess\uFF09\uFF1A\n * `ESRCH` = \u4E0D\u5B58\u5728\uFF1B`EPERM` = \u5B58\u5728\u4F46\u65E0\u6743\u64CD\u4F5C\u2014\u2014**\u540E\u8005\u6309\"\u6D3B\u7740\"\u5904\u7406**\uFF0C\u56E0\u4E3A\n * \"\u65E0\u6743\u5224\u5B9A\"\u7EDD\u4E0D\u80FD\u9000\u5316\u6210\"\u53EF\u4EE5\u5220\"\u3002\n * @param pid \u5F85\u63A2\u6D4B\u7684\u8FDB\u7A0B\u53F7\u3002\n * @returns \u662F\u5426\u4ECD\u5B58\u5728\uFF08\u6216\u65E0\u6CD5\u6392\u9664\u5B58\u5728\uFF09\u3002\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return (error as NodeJS.ErrnoException | null)?.code === 'EPERM'\n }\n}\n\n/**\n * profile patch \u8DEF\u5F84 \u2192 profile \u76EE\u5F55\uFF08`configEditor.documentPath` \u7684\u7236\u76EE\u5F55\uFF09\u3002\n * @param patchPath profile \u7684 `cordis.patch.yml` \u7EDD\u5BF9\u8DEF\u5F84\u3002\n * @returns \u8BE5 profile \u7684\u76EE\u5F55\u3002\n */\nexport function profileDirOfPatchPath(patchPath: string): string {\n return dirname(patchPath)\n}\n\n/**\n * \u68C0\u67E5\u5E76\u56DE\u6536\u5B64\u513F\u9501\uFF1B\u4EFB\u4F55\u5931\u8D25\u90FD\u53EA\u8BB0\u5F55\u3001\u7EDD\u4E0D\u629B\u51FA\uFF08\u5B83\u662F\u542F\u52A8\u8DEF\u5F84\u4E0A\u7684\u65C1\u8DEF\u52A8\u4F5C\uFF09\u3002\n * @param profileDir profile \u76EE\u5F55\uFF08`package.json` \u4E0E\u9501\u90FD\u5728\u8FD9\u91CC\uFF09\u3002\n * @param log \u8BB0\u5F55\u4E00\u884C\u7ED3\u679C\uFF08\u8C03\u7528\u65B9\u63A5 console\uFF09\u3002\n * @returns \u5904\u7F6E\u7ED3\u679C\u3002\n */\nexport async function recoverStaleSettingsLock(\n profileDir: string,\n log: (message: string) => void,\n): Promise<LockRecovery> {\n const path = join(profileDir, SETTINGS_LOCK_FILENAME)\n let content: string\n try {\n content = await readFile(path, 'utf8')\n } catch (error) {\n // \u6CA1\u6709\u9501\u662F\u5E38\u6001\uFF08\u9501\u53EA\u5728\u5199\u5165\u7684\u90A3\u51E0\u6BEB\u79D2\u91CC\u5B58\u5728\uFF09\u3002\n if ((error as NodeJS.ErrnoException | null)?.code === 'ENOENT') return 'absent'\n log(`\u8BFB\u53D6\u5199\u5165\u9501\u5931\u8D25\uFF08${path}\uFF09\uFF1A${String(error)}`)\n return 'ignored'\n }\n const decision = staleLockDecision(content, isProcessAlive)\n if (decision.action === 'keep') {\n log(`\u5199\u5165\u9501\u7531 PID ${decision.pid} \u6301\u6709\u4E14\u8BE5\u8FDB\u7A0B\u4ECD\u5728\uFF0C\u4FDD\u6301\u4E0D\u52A8\uFF08${path}\uFF09\u3002`)\n return 'kept'\n }\n if (decision.action === 'ignore') {\n log(`\u5199\u5165\u9501\u5185\u5BB9\u4E0D\u662F PID\uFF0C\u4FDD\u6301\u4E0D\u52A8\uFF08${path}\uFF09\u3002`)\n return 'ignored'\n }\n try {\n await rm(path, { force: true })\n } catch (error) {\n log(`\u56DE\u6536\u5B64\u513F\u5199\u5165\u9501\u5931\u8D25\uFF08${path}\uFF09\uFF1A${String(error)}`)\n return 'ignored'\n }\n log(\n `\u5DF2\u56DE\u6536\u5B64\u513F\u5199\u5165\u9501\uFF08\u6301\u6709\u8005 PID ${decision.pid} \u4E0D\u5B58\u5728\uFF09\uFF1A${path}\u3002`\n + '\u5728\u6B64\u4E4B\u524D\u8BE5 profile \u7684\u6BCF\u4E00\u6B21\u8BBE\u7F6E\u5199\u5165\u90FD\u4F1A\u8D85\u65F6\u5931\u8D25\uFF08\u754C\u9762\u8868\u73B0\u4E3A\"\u70B9\u4E86\u6CA1\u53CD\u5E94\"\uFF09\u3002',\n )\n return 'removed'\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["value", "value", "Binary", "result", "a", "b", "Time", "date", "template", "options", "pattern", "value", "extra", "resolve", "toJSON", "date", "toString", "name", "key", "existsSync", "dirname", "join", "resolve", "name", "name", "sep", "isAbsolute", "controller", "handle", "name", "current", "found", "resolve", "dirname", "set", "name", "span", "blocks", "removed", "overBy", "errorText", "resolve", "readFile", "dirname", "join", "objectOf", "textOf", "name", "errorText", "existsSync", "resolve", "dirname", "join"]
7
7
  }