@linxin666/dsh-remote-web-ui 0.2.3 → 0.2.4
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/client.js +8 -7
- package/lib/client.js.map +1 -1
- package/lib/index.js +9 -3
- package/lib/mobile.js +7 -6
- package/lib/mobile.js.map +1 -1
- package/lib/types/client/locales.js +4 -4
- package/lib/types/client/settings-form.d.ts.map +1 -1
- package/lib/types/client/settings-form.js +9 -6
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +10 -2
- package/package.json +12 -12
- package/src/client/locales.ts +4 -4
- package/src/client/settings-form.ts +8 -6
- package/src/update.ts +14 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["React","css","IconCloseOutline16","IconStopFill16","IconRefreshOutline16","IconCopyOutline16","IconLinkOutline16","css","IconCloseOutline16","IconRefreshOutline16","css","IconDownloadOutline16","css","css","css"],"sources":["../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../node_modules/.pnpm/qrcode.react@4.2.0_react@18.3.1/node_modules/qrcode.react/lib/esm/index.js","../../../packages/dsh-remote-web-ui/src/client/pair-api.ts","../../../packages/dsh-remote-web-ui/src/client/RemotePanel.tsx","../../../packages/dsh-remote-web-ui/src/client/PhoneIcon.tsx","../../../packages/dsh-remote-web-ui/src/client/update-api.ts","../../../packages/dsh-remote-web-ui/src/client/UpdatePanel.tsx","../../../packages/dsh-remote-web-ui/src/client/UpdateEntry.tsx","../../../packages/dsh-remote-web-ui/src/client/RemoteEntry.tsx","../../../packages/dsh-remote-web-ui/src/client/FooterRemoteEntry.tsx","../../../packages/dsh-remote-web-ui/src/client/PairFailedNotice.tsx","../../../packages/dsh-remote-web-ui/src/client/PluginSettingsCard.tsx","../../../packages/dsh-remote-web-ui/src/client/settings-form.ts","../../../packages/dsh-remote-web-ui/src/client/RemoteSettingsCard.tsx","../../../packages/dsh-remote-web-ui/src/client/locales.ts","../../../packages/dsh-remote-web-ui/src/client/deep-link.ts","../../../packages/dsh-remote-web-ui/src/client/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n","/**\n * Browser-side wire helpers for the /api/pair surface. Plain fetch over\n * same-origin /api (like the connection client); JSON bodies, string\n * responses for the error codes.\n */\n\n/** issue() response. */\nexport interface IssueResult {\n ok: true\n url: string\n token: string\n expiresAt: number\n /** Every constructible LAN base address (interface order). */\n lanAddresses: string[]\n /** The configured public (tunneled) base URL, when present. */\n publicBaseUrl?: string\n}\n\n/** issue() refusal: the server is not LAN-reachable. */\nexport interface IssueLanRequired {\n ok: false\n code: 'lan-required'\n}\n\n/** issue() refusal: the requested LAN address is not constructible. */\nexport interface IssueUnknownAddress {\n ok: false\n code: 'unknown-address'\n}\n\n/** issue() refusal: the loopback-only fence rejected this origin. */\nexport interface IssueLoopbackRequired {\n ok: false\n code: 'forbidden'\n}\n\nexport type IssueResponse = IssueResult | IssueLanRequired | IssueUnknownAddress | IssueLoopbackRequired\n\n/** accept() refusal codes. */\nexport type AcceptFailure = { ok: false; code: 'invalid' | 'used' | 'forbidden' }\n\n/** One auto-tunnel status frame (absent while the feature is off). */\nexport interface TunnelStatusFrame {\n state: 'starting' | 'running' | 'failed'\n url?: string\n error?: string\n}\n\n/** One /api/pair/events frame. */\nexport interface PairStateFrame {\n type: 'state'\n phase: 'lan-required' | 'stopped' | 'waiting' | 'connected' | 'disconnected'\n lanAvailable: boolean\n tokenId?: string\n tokenExpiresAt?: number\n deviceCount: number\n onlineCount: number\n /** Auto-tunnel status, while the auto-tunnel feature is active. */\n tunnel?: TunnelStatusFrame\n}\n\n/**\n * Mint a fresh pairing token (one active token at a time — this invalidates\n * any previous link).\n * @param workspaceId - optional current workspace to deep-link the phone into.\n * @param address - optional LAN IP literal the QR must be built from (the\n * default is the first interface); unknown literals refuse with\n * 'unknown-address'.\n * @returns the issued link, the lan-required refusal (server never bound\n * 0.0.0.0), or the forbidden refusal (the loopback-only fence rejected this\n * origin — the panel is a desktop control endpoint).\n */\nexport async function issuePair(workspaceId?: string, address?: string): Promise<IssueResponse> {\n const response = await fetch('/api/pair/issue', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n ...(workspaceId !== undefined ? { workspaceId } : {}),\n ...(address !== undefined ? { address } : {}),\n }),\n })\n if (!response.ok) {\n if (response.status === 409) return { ok: false, code: 'lan-required' }\n if (response.status === 403) return { ok: false, code: 'forbidden' }\n if (response.status === 400) return { ok: false, code: 'unknown-address' }\n throw new Error(`remote-web-ui: issue failed with ${String(response.status)}`)\n }\n return await response.json() as IssueResult\n}\n\n/**\n * Accept a pairing token (the phone's first open of the QR link). Success\n * sets the device cookie; the page then reloads to boot with it.\n * @param token - the token from the URL.\n * @returns the wire result.\n */\nexport async function acceptPair(token: string): Promise<{ ok: true } | AcceptFailure> {\n const response = await fetch('/api/pair/accept', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ token }),\n })\n if (response.ok) return { ok: true }\n if (response.status === 404) return { ok: false, code: 'invalid' }\n if (response.status === 409) return { ok: false, code: 'used' }\n return { ok: false, code: 'forbidden' }\n}\n\n/** Revoke mobile access (paired devices + the current token). */\nexport async function stopPair(): Promise<void> {\n const response = await fetch('/api/pair/stop', { method: 'POST' })\n if (!response.ok) throw new Error(`remote-web-ui: stop failed with ${String(response.status)}`)\n}\n\n/** Presence heartbeat from a paired phone (unpaired heartbeats 401 harmlessly). */\nexport async function sendHeartbeat(): Promise<void> {\n await fetch('/api/pair/heartbeat', { method: 'POST' })\n}\n\n/** Whether the current page URL carries a pairing token / workspace target. */\nexport function readPairParams(search: string): { pair?: string; workspace?: string } {\n const params = new URLSearchParams(search)\n const pair = params.get('pair')\n const workspace = params.get('workspace')\n return {\n ...(pair !== null && pair !== '' ? { pair } : {}),\n ...(workspace !== null && workspace !== '' ? { workspace } : {}),\n }\n}\n\n/** Human-readable expiry clock, e.g. \"10:35\". */\nexport function formatClock(epochMs: number): string {\n const date = new Date(epochMs)\n const hours = String(date.getHours()).padStart(2, '0')\n const minutes = String(date.getMinutes()).padStart(2, '0')\n return `${hours}:${minutes}`\n}\n\n/**\n * Copy text to the clipboard with a fallback for insecure contexts\n * (plain-HTTP LAN origins lack navigator.clipboard).\n * @param text - the text to copy.\n * @returns whether the copy succeeded.\n */\nexport async function copyText(text: string): Promise<boolean> {\n if (typeof navigator !== 'undefined' && navigator.clipboard !== undefined) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n // fall through to the execCommand path\n }\n }\n try {\n const area = document.createElement('textarea')\n area.value = text\n area.style.position = 'fixed'\n area.style.opacity = '0'\n document.body.appendChild(area)\n area.select()\n const ok = document.execCommand('copy')\n area.remove()\n return ok\n } catch {\n return false\n }\n}\n","/**\n * The mobile remote-control panel body: status card (state text + badge),\n * the QR code, the open-on-phone hint with the link text, and the three\n * actions (stop / refresh / copy). Pure presentation — all state and\n * actions arrive through props from the entry's behavior component.\n */\nimport clsx from 'clsx'\nimport { QRCodeSVG } from 'qrcode.react'\nimport {\n IconCloseOutline16, IconCopyOutline16, IconLinkOutline16, IconRefreshOutline16, IconStopFill16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { PairingPhase } from '../pairing.ts'\nimport { formatClock, type TunnelStatusFrame } from './pair-api.ts'\nimport css from './remote.module.css'\n\n/** The panel's view state, owned by the entry component. */\nexport type PanelState =\n | { kind: 'lan-required'; tunnel?: TunnelStatusFrame }\n | { kind: 'loopback-required' }\n | { kind: 'unreachable' }\n | {\n kind: 'ready'\n url: string\n expiresAt: number\n expired: boolean\n phase: PairingPhase\n deviceCount: number\n onlineCount: number\n /** The LAN literal the current QR was built from. */\n address: string\n /** Every constructible LAN literal (interface order). */\n lanAddresses: string[]\n /** Whether this QR is built on the configured public (tunneled) base. */\n public: boolean\n /** The configured public (tunneled) base URL, when present. */\n publicBaseUrl?: string\n /** Auto-tunnel status, while the auto-tunnel feature is active. */\n tunnel?: TunnelStatusFrame\n }\n\n/** Full panel props: copy + view state + actions. */\nexport interface RemotePanelProps {\n t: TranslateNS<'remote'>\n state: PanelState\n copied: boolean\n onClose(): void\n onStop(): void\n onRefresh(): void\n onCopy(): void\n /** Re-mint the QR against a different LAN address. */\n onPickAddress(address: string): void\n /** Re-mint the QR against the configured public (tunneled) base. */\n onPickPublic(): void\n}\n\n/** Badge text + tone per phase (ready states only). */\nfunction statusOf(\n t: TranslateNS<'remote'>,\n state: Extract<PanelState, { kind: 'ready' }>,\n): { text: string; tone: 'waiting' | 'connected' | 'disconnected' | 'stopped' } {\n switch (state.phase) {\n case 'connected': return { text: t('status.connected', { n: state.onlineCount }), tone: 'connected' }\n case 'disconnected': return { text: t('status.disconnected'), tone: 'disconnected' }\n case 'stopped': return { text: t('status.stopped'), tone: 'stopped' }\n case 'lan-required': return { text: t('status.lanRequired'), tone: 'stopped' }\n case 'waiting': return { text: t('status.waiting'), tone: 'waiting' }\n }\n}\n\n/**\n * Render the pairing panel.\n * @param props - copy, state, and actions.\n * @returns the panel element tree.\n */\nexport function RemotePanel({ t, state, copied, onClose, onStop, onRefresh, onCopy, onPickAddress, onPickPublic }: RemotePanelProps) {\n return (\n <div className={css.panel} role=\"dialog\" aria-modal=\"true\" aria-label={t('title')}>\n <div className={css.header}>\n <div className={css.heading}>\n <h2 className={css.title}>{t('title')}</h2>\n <p className={css.subtitle}>{t('subtitle')}</p>\n </div>\n <button type=\"button\" className={css.close} aria-label={t('close.label')} onClick={onClose}>\n <IconCloseOutline16 size={14} />\n </button>\n </div>\n\n {state.kind === 'lan-required' ? (\n <div className={css.banner} role=\"alert\">\n <p className={css.bannerTitle}>{t('status.lanRequired')}</p>\n <p className={css.bannerHint}>{t('status.lanRequiredHint')}</p>\n </div>\n ) : state.kind === 'loopback-required' ? (\n <div className={css.banner} role=\"alert\">\n <p className={css.bannerTitle}>{t('status.loopbackRequired')}</p>\n <p className={css.bannerHint}>{t('status.loopbackRequiredHint')}</p>\n </div>\n ) : state.kind === 'unreachable' ? (\n <div className={css.banner} role=\"alert\">\n <p className={css.bannerTitle}>{t('status.unreachable')}</p>\n <p className={css.bannerHint}>{t('status.unreachableHint')}</p>\n </div>\n ) : (\n <>\n <div className={css.card}>\n <div className={css.cardHeader}>\n <span className={css.cardTitle}>{t('card.title')}</span>\n <span className={css.badges}>\n {state.public && <span className={clsx(css.badge, css.badgePublic)}>{t('public.badge')}</span>}\n <span className={clsx(css.badge, css[`badge-${statusOf(t, state).tone}`])}>\n {statusOf(t, state).text}\n </span>\n </span>\n </div>\n <div className={css.qrWrap} data-testid=\"remote-qr\">\n <QRCodeSVG value={state.url} size={184} level=\"M\" marginSize={1} className={css.qr} />\n </div>\n {state.expired\n ? <p className={css.expired}>{t('pair.expired')}</p>\n : <p className={css.expiry}>{t('pair.expires', { time: formatClock(state.expiresAt) })}</p>}\n </div>\n\n <p className={css.hint}>{state.public ? t('pair.publicHint') : t('pair.hint')}</p>\n <p className={css.link} title={state.url}>{state.url}</p>\n {state.phase === 'stopped' && <p className={css.stoppedHint}>{t('stopped.hint')}</p>}\n {state.tunnel !== undefined && state.tunnel.state !== 'running' && (\n <p className={state.tunnel.state === 'failed' ? css.tunnelFailed : css.tunnelNote} role=\"status\">\n {state.tunnel.state === 'failed'\n ? t('tunnel.failed', { error: state.tunnel.error ?? t('tunnel.unknownError') })\n : t('tunnel.starting')}\n </p>\n )}\n\n {(state.publicBaseUrl !== undefined || state.lanAddresses.length > 1) && (\n <fieldset className={css.addresses}>\n <legend>{t('address.label')}</legend>\n {state.publicBaseUrl !== undefined && (\n <label key=\"public\" className={css.address}>\n <input\n type=\"radio\"\n name=\"lan-address\"\n aria-label={t('address.public')}\n checked={state.public}\n onChange={onPickPublic}\n />\n <span>{t('address.public')}</span>\n <code className={css.addressValue}>{state.publicBaseUrl}</code>\n </label>\n )}\n {state.lanAddresses.map(address => (\n <label key={address} className={css.address}>\n <input\n type=\"radio\"\n name=\"lan-address\"\n aria-label={address}\n checked={!state.public && address === state.address}\n onChange={() => onPickAddress(address)}\n />\n <span>{t('address.lan')}</span>\n <code className={css.addressValue}>{address}</code>\n </label>\n ))}\n <p className={css.addressHint}>{t('address.hint')}</p>\n </fieldset>\n )}\n\n <div className={css.actions}>\n <button type=\"button\" className={css.action} onClick={onStop}>\n <IconStopFill16 size={14} />\n {t('action.stop')}\n </button>\n <button type=\"button\" className={css.action} onClick={onRefresh}>\n <IconRefreshOutline16 size={14} />\n {t('action.refresh')}\n </button>\n <button type=\"button\" className={css.action} onClick={onCopy}>\n {copied ? <IconCopyOutline16 size={14} /> : <IconLinkOutline16 size={14} />}\n {copied ? t('action.copied') : t('action.copy')}\n </button>\n </div>\n </>\n )}\n </div>\n )\n}\n","/**\n * Phone glyph for the sidebar remote-control trigger. Not part of the\n * shared icon set (ui-primitives has no phone icon); matches the outline\n * style with currentColor strokes.\n */\n\n/** Icon props mirroring ui-primitives' IconProps. */\nexport interface PhoneIconProps {\n /** Glyph size in px (default 16). */\n size?: number\n /** Extra class for layout placement. */\n className?: string\n}\n\n/**\n * Render the phone icon.\n * @param props - size and optional class.\n * @returns the svg element.\n */\nexport function PhoneIcon({ size = 16, className }: PhoneIconProps) {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.2 1.8h2.4l.9 2.4-1.5 1.1a7.4 7.4 0 0 0 4.7 4.7l1.1-1.5 2.4.9v2.4a.9.9 0 0 1-1 .9A11.4 11.4 0 0 1 3.3 2.8a.9.9 0 0 1 .9-1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","/**\n * Browser-side wire helpers for the /api/update surface. Plain fetch over\n * same-origin /api like the pairing client; the host half enforces the\n * loopback-only fence and owns the pnpm run.\n */\n\nimport type { UpdateRunResult, UpdateStatus } from '../update.ts'\n\n/**\n * Error thrown when the update status probe fails: carries the HTTP status\n * so the panel can tell \"the update route is not mounted\" (404 — the host\n * process runs an older plugin build) apart from real network failures.\n */\nexport class UpdateStatusError extends Error {\n /** HTTP status of the failed response (0 when the fetch never returned). */\n readonly status: number\n constructor(status: number) {\n super('update status unavailable (HTTP ' + String(status) + ')')\n this.status = status\n }\n}\n\n/**\n * Probe the update status: install mode, owning profile, and the\n * current-vs-latest comparison for every family package.\n * @returns the status snapshot.\n */\nexport async function fetchUpdateStatus(): Promise<UpdateStatus> {\n let response: Response\n try {\n response = await fetch('/api/update/status')\n } catch {\n // Network-level failure: nothing came back at all.\n throw new UpdateStatusError(0)\n }\n if (!response.ok) throw new UpdateStatusError(response.status)\n return await response.json() as UpdateStatus\n}\n\n/**\n * Run the update (pnpm update in the owning profile). Blocks until pnpm\n * exits — the panel shows an in-flight state meanwhile.\n * @returns the run outcome.\n */\nexport async function runUpdate(): Promise<UpdateRunResult> {\n const response = await fetch('/api/update/run', { method: 'POST' })\n if (!response.ok) throw new Error('update run unavailable')\n return await response.json() as UpdateRunResult\n}\n","/**\n * The update panel body: check progress, version comparison, the\n * auto-update in-flight state, and the outcome (restart hint on success,\n * translated failure on error). Pure presentation — all state arrives\n * through props from the entry behavior component.\n */\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport { IconCloseOutline16, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { UpdateRunResult, UpdateStatus } from '../update.ts'\nimport css from \"./remote.module.css\"\n\n/** The panel view state, owned by the entry component. */\nexport type UpdateView =\n | { kind: 'checking' }\n | { kind: 'result'; status: UpdateStatus }\n | { kind: 'updating'; status: UpdateStatus }\n | { kind: 'done'; result: UpdateRunResult }\n | { kind: 'error'; message: string; detail?: string }\n\n/** Full panel props: copy + view state + actions. */\nexport interface UpdatePanelProps {\n t: TranslateNS<'remote'>\n view: UpdateView\n onClose(): void\n /** Re-run the check from a terminal state. */\n onRecheck(): void\n /** Start the update from the result view (the confirmation step, #507). */\n onStartUpdate(status: UpdateStatus): void\n}\n\n/** The anchor package name (aggregate first) for copy purposes. */\nfunction anchorName(status: UpdateStatus | undefined): string | undefined {\n return status?.anchor ?? status?.packages[0]?.name\n}\n\n/** The latest npm release of the anchor, for reference copy. */\nfunction anchorLatest(status: UpdateStatus | undefined): string | undefined {\n return status?.packages[0]?.latest\n}\n\n/**\n * Render the update panel.\n * @param props - copy, view state, and actions.\n * @returns the panel element tree.\n */\nexport function UpdatePanel({ t, view, onClose, onRecheck, onStartUpdate }: UpdatePanelProps) {\n const status = view.kind === \"result\" || view.kind === \"updating\" ? view.status : undefined\n const title = view.kind === \"done\" && view.result.ok ? t(\"update.done\") : t(\"update.title\")\n const subtitle = subtitleOf(t, view)\n return (\n <div className={css.panel} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <div className={css.header}>\n <div className={css.heading}>\n <h2 className={css.title}>{title}</h2>\n {subtitle !== undefined && <p className={css.subtitle}>{subtitle}</p>}\n </div>\n <button type=\"button\" className={css.close} aria-label={t(\"update.close\")} onClick={onClose}>\n <IconCloseOutline16 />\n </button>\n </div>\n {view.kind === \"checking\" && <p className={css.updateStatus}>{t(\"update.checking\")}</p>}\n {view.kind === \"result\" && status !== undefined && <ResultBody t={t} status={status} />}\n {view.kind === \"result\" && status !== undefined && status.mode === \"npm\" && status.outdated && status.error === undefined && (\n <div className={css.updateActions}>\n <button type=\"button\" className={css.updateRetry} onClick={() => onStartUpdate(status)}>\n {t(\"update.start\")}\n </button>\n </div>\n )}\n {view.kind === \"updating\" && status !== undefined && (\n <div>\n <p className={css.updateStatus}>\n {t(\"update.updating\", { name: anchorName(status) ?? \"\", version: anchorLatest(status) ?? \"\" })}\n </p>\n <p className={css.updateDetail}>{t(\"update.cooldownNotice\")}</p>\n <PackageList status={status} />\n </div>\n )}\n {view.kind === \"done\" && <DoneBody t={t} result={view.result} />}\n {view.kind === \"error\" && (\n <div>\n <p className={css.updateError}>{view.message}</p>\n {view.detail !== undefined && <pre className={css.updateOutput}>{view.detail}</pre>}\n </div>\n )}\n {(view.kind === \"done\" || view.kind === \"error\") && (\n <div className={css.updateActions}>\n <button type=\"button\" className={css.updateRetry} onClick={onRecheck}>\n <IconRefreshOutline16 /> {t(\"update.retry\")}\n </button>\n </div>\n )}\n </div>\n )\n}\n\n/** The subtitle copy per view state (absent on plain results). */\nfunction subtitleOf(t: TranslateNS<\"remote\">, view: UpdateView): string | undefined {\n switch (view.kind) {\n case \"checking\":\n return t(\"update.checking\")\n case \"updating\":\n return t(\"update.updatingTitle\")\n case \"result\":\n return undefined\n case \"done\":\n return view.result.ok ? t(\"update.doneDetail\") : t(\"update.error\")\n case \"error\":\n // The error body below carries the message; no subtitle duplication.\n return undefined\n }\n}\n\n/** The checked result body: mode banner + version list. */\nfunction ResultBody({ t, status }: { t: TranslateNS<\"remote\">; status: UpdateStatus }) {\n const anchor = anchorName(status)\n const latest = anchorLatest(status)\n if (status.mode === \"link\") {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.linkMode\")}</p>\n <p className={css.updateDetail}>{t(\"update.linkModeDetail\", { version: latest ?? \"-\" })}</p>\n </div>\n )\n }\n if (status.mode === \"missing\") {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.missing\")}</p>\n <p className={css.updateDetail}>{t(\"update.missingDetail\")}</p>\n </div>\n )\n }\n if (status.error === \"registry-unreachable\") {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.offline\")}</p>\n <p className={css.updateDetail}>{t(\"update.offlineDetail\")}</p>\n </div>\n )\n }\n if (status.outdated) {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.found\")}</p>\n <p className={css.updateDetail}>\n {anchor !== undefined ? t(\"update.foundDetail\", { name: anchor, version: latest ?? \"\" }) : \"\"}\n </p>\n <p className={css.updateDetail}>{t(\"update.cooldownNotice\")}</p>\n </div>\n )\n }\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.upToDate\")}</p>\n {anchor !== undefined && latest !== undefined && (\n <p className={css.updateDetail}>{t(\"update.upToDateDetail\", { name: anchor, version: latest })}</p>\n )}\n <PackageList status={status} />\n </div>\n )\n}\n\n/** The per-package current → latest comparison list. */\nfunction PackageList({ status }: { status: UpdateStatus }) {\n if (status.packages.length === 0) return null\n return (\n <ul className={css.updateList}>\n {status.packages.map(packageStatus => (\n <li key={packageStatus.name} className={css.updateListItem}>\n <span className={css.updateListName}>{packageStatus.name}</span>\n <span className={css.updateListVersions}>\n {packageStatus.current}\n {packageStatus.latest !== undefined && packageStatus.latest !== packageStatus.current && (\n <> → {packageStatus.latest}</>\n )}\n </span>\n </li>\n ))}\n </ul>\n )\n}\n\n/** The outcome body: success + restart hint, or the translated failure. */\nfunction DoneBody({ t, result }: { t: TranslateNS<\"remote\">; result: UpdateRunResult }) {\n if (result.ok) {\n // The title already reads \"Update complete\"; the body carries the details.\n return (\n <div>\n <p className={css.updateDetail}>{t(\"update.doneDetail\")}</p>\n <p className={css.updateDetail}>{t(\"update.restartHint\")}</p>\n </div>\n )\n }\n const message = errorMessageOf(t, result)\n return (\n <div>\n <p className={css.updateError}>{message}</p>\n {result.output.trim() !== \"\" && <pre className={css.updateOutput}>{result.output.trim()}</pre>}\n </div>\n )\n}\n\n/** Translate a structured failure code; fall back to the raw message. */\nfunction errorMessageOf(t: TranslateNS<\"remote\">, result: UpdateRunResult): string {\n switch (result.errorCode) {\n case \"pnpm-missing\": return t(\"update.error.pnpmMissing\")\n case \"timeout\": return t(\"update.error.timeout\")\n case \"not-found\": return t(\"update.error.notFound\")\n case \"link\": return t(\"update.error.link\")\n case \"pnpm-failed\": return t(\"update.error.pnpmFailed\", { code: String(result.exitCode ?? \"?\") })\n case \"stale\": return t(\"update.error.stale\")\n case \"verify-failed\": return t(\"update.error.verifyFailed\")\n default: return result.error ?? t(\"update.error.unknown\")\n }\n}\n","/**\n * The sidebar update seat: the download trigger beside the remote-control\n * trigger plus the update panel modal. Owns the flow — probe the registry\n * on open, show the result, and let the user start the update from the\n * result view (#507), then report the outcome (restart hint on success,\n * translated failure on error).\n * Component-local state per the client stack rules.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport { IconDownloadOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { UpdateStatus } from '../update.ts'\nimport { fetchUpdateStatus, runUpdate, UpdateStatusError } from \"./update-api.ts\"\nimport { UpdatePanel, type UpdateView } from \"./UpdatePanel.tsx\"\nimport css from \"./remote.module.css\"\n\n/** Entry props: the sidebar column state + the standard locale seat. */\nexport interface UpdateEntryProps {\n /** Whether the sidebar renders wide content (false = 56px rail). */\n wide: boolean\n t: TranslateNS<'remote'>\n}\n\n/**\n * Render the update trigger and panel.\n * @param props - column state and locale seat.\n * @returns the entry element tree.\n */\nexport function UpdateEntry({ wide, t }: UpdateEntryProps) {\n const [open, setOpen] = useState(false)\n const [view, setView] = useState<UpdateView>({ kind: \"checking\" })\n const [updateAvailable, setUpdateAvailable] = useState(false)\n const runToken = useRef(0)\n const availabilityToken = useRef(0)\n const mounted = useRef(false)\n\n const probeAvailability = useCallback(async (): Promise<void> => {\n const token = ++availabilityToken.current\n try {\n const status = await fetchUpdateStatus()\n if (token === availabilityToken.current) {\n setUpdateAvailable(status.mode === \"npm\" && status.outdated)\n }\n } catch {\n if (token === availabilityToken.current) setUpdateAvailable(false)\n }\n }, [])\n\n const check = useCallback(async (): Promise<void> => {\n const availabilityCheck = ++availabilityToken.current\n setView({ kind: \"checking\" })\n let status: UpdateStatus\n try {\n status = await fetchUpdateStatus()\n } catch (error) {\n if (availabilityCheck === availabilityToken.current) setUpdateAvailable(false)\n // HTTP 404: the update route is not mounted — the host process runs an\n // older plugin build (client refreshed, host did not). Restarting dsh\n // web loads the new plugin; a plain network failure gets the generic\n // offline copy instead of a misleading \"cannot reach update source\".\n if (error instanceof UpdateStatusError && error.status === 404) {\n setView({ kind: \"error\", message: t(\"update.unmounted\"), detail: t(\"update.unmountedDetail\") })\n return\n }\n setView({ kind: \"error\", message: t(\"update.offline\"), detail: t(\"update.offlineDetail\") })\n return\n }\n if (availabilityCheck === availabilityToken.current) {\n setUpdateAvailable(status.mode === \"npm\" && status.outdated)\n }\n if (status.error === \"registry-unreachable\") {\n setView({ kind: \"result\", status })\n return\n }\n // Checking never starts an update by itself (#507): the result view\n // carries the confirmation button that calls startUpdate.\n setView({ kind: \"result\", status })\n }, [t])\n\n const startUpdate = useCallback(async (status: UpdateStatus): Promise<void> => {\n if (status.mode !== \"npm\" || !status.outdated) return\n setView({ kind: \"updating\", status })\n const token = ++runToken.current\n try {\n const result = await runUpdate()\n if (result.ok && mounted.current) setUpdateAvailable(false)\n if (token !== runToken.current) return\n setView({ kind: \"done\", result })\n } catch {\n if (token !== runToken.current) return\n setView({ kind: \"error\", message: t(\"update.error\"), detail: t(\"update.offlineDetail\") })\n }\n }, [t])\n\n const openPanel = useCallback((): void => {\n setOpen(true)\n void check()\n }, [check])\n\n const closePanel = useCallback((): void => {\n runToken.current++\n setOpen(false)\n }, [])\n\n // Check once after mount without opening the panel or starting an update.\n useEffect(() => {\n mounted.current = true\n void probeAvailability()\n return () => {\n mounted.current = false\n runToken.current++\n availabilityToken.current++\n }\n }, [probeAvailability])\n\n const updateLabel = updateAvailable ? t(\"update.availableLabel\") : t(\"update.label\")\n\n return (\n <>\n <button\n type=\"button\"\n className={css.trigger}\n data-wide={wide ? undefined : \"rail\"}\n data-update-available={updateAvailable ? \"true\" : undefined}\n aria-label={updateLabel}\n title={updateLabel}\n onClick={openPanel}\n >\n <IconDownloadOutline16 size={wide ? 16 : 18} />\n </button>\n {open && createPortal((\n <div className={css.overlay} role=\"presentation\">\n <div className={css.mask} aria-hidden=\"true\" onClick={closePanel} />\n <UpdatePanel t={t} view={view} onClose={closePanel} onRecheck={() => { void check() }} onStartUpdate={(status) => { void startUpdate(status) }} />\n </div>\n ), document.body)}\n </>\n )\n}\n","/**\n * The sidebar remote-control seat: the update trigger plus the phone-icon\n * trigger beside the settings button, and the pairing panel modal. Owns the\n * panel behavior — token minting on open, the status SSE subscription,\n * stop/refresh/copy — and renders the pure {@link RemotePanel} body. The\n * update seat (the dsh-web-ui self-update flow) rides the same footer row,\n * rendered by {@link UpdateEntry}. Component-local state per the client\n * stack rules: nothing here survives remounts or crosses entries.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { PairingPhase } from '../pairing.ts'\nimport { RemotePanel, type PanelState } from './RemotePanel.tsx'\nimport { copyText, issuePair, stopPair, type IssueResponse, type PairStateFrame, type TunnelStatusFrame } from './pair-api.ts'\nimport { PhoneIcon } from './PhoneIcon.tsx'\nimport { UpdateEntry } from './UpdateEntry.tsx'\nimport css from './remote.module.css'\n\n/** Entry props: the sidebar column state + the standard locale seat. */\nexport type RemoteEntryProps = PropsRuntime<'sidebar.remote'> & PropsLocale<'remote'>\n\n/**\n * Apply one status frame onto the current state: the ready state mirrors\n * the full phase/device picture, while the lan-required banner only keeps\n * the auto-tunnel frame (the signal for the running re-issue).\n */\nfunction mergeFrame(state: PanelState, frame: PairStateFrame): PanelState {\n if (state.kind === 'lan-required') {\n return {\n ...state,\n ...(frame.tunnel !== undefined ? { tunnel: frame.tunnel } : {}),\n }\n }\n if (state.kind !== 'ready') return state\n return {\n ...state,\n phase: frame.phase,\n deviceCount: frame.deviceCount,\n onlineCount: frame.onlineCount,\n ...(frame.tunnel !== undefined ? { tunnel: frame.tunnel as TunnelStatusFrame } : {}),\n }\n}\n\n/**\n * Render the remote-control trigger and panel.\n * @param props - composed slot props (contract in this package).\n * @returns the entry element tree.\n */\nexport function RemoteEntry({ wide, useWorkspaces, t }: RemoteEntryProps) {\n const [open, setOpen] = useState(false)\n const [state, setState] = useState<PanelState>({ kind: 'lan-required' })\n // Latest-state mirror for the EventSource callback: transition detection\n // must live outside setState updaters (updaters may run twice and must be\n // pure), so mint decisions read this ref instead.\n const stateRef = useRef(state)\n useEffect(() => { stateRef.current = state }, [state])\n const [copied, setCopied] = useState(false)\n const eventSource = useRef<EventSource | undefined>(undefined)\n // Generation counter for the open flow: closing (or re-opening) the panel\n // bumps it, so an in-flight issue() that resolves after a close does not\n // spawn a stray EventSource.\n const openSeq = useRef(0)\n\n // The current workspace (the recent-workspace projection the shell's New\n // Session flow targets) — the deep-link target for the phone.\n const workspaceId = useWorkspaces(s => s.recentWorkspaceId)\n\n const closeEventSource = useCallback(() => {\n eventSource.current?.close()\n eventSource.current = undefined\n }, [])\n\n const mint = useCallback(async (address?: string): Promise<PanelState> => {\n let result: IssueResponse\n try {\n result = await issuePair(workspaceId, address)\n } catch {\n // Fetch/network failure: show an explicit state instead of silently\n // leaving the panel on its initial banner.\n return { kind: 'unreachable' }\n }\n if (!result.ok) {\n // 403 is the loopback-only fence refusing a LAN origin (the panel is a\n // desktop control endpoint); 409 means the server never bound 0.0.0.0;\n // 400 means the requested LAN literal is no longer constructible.\n if (result.code === 'forbidden') return { kind: 'loopback-required' }\n if (result.code === 'unknown-address') return { kind: 'unreachable' }\n return { kind: 'lan-required' }\n }\n const publicBaseUrl = result.publicBaseUrl\n return {\n kind: 'ready',\n url: result.url,\n expiresAt: result.expiresAt,\n expired: Date.now() > result.expiresAt,\n phase: 'waiting',\n deviceCount: 0,\n onlineCount: 0,\n // Whether this QR is built on the configured public (tunneled) base.\n public: publicBaseUrl !== undefined && result.url.startsWith(publicBaseUrl),\n ...(publicBaseUrl !== undefined ? { publicBaseUrl } : {}),\n // The issued URL names the requested (or default first) literal; the\n // public link has no LAN literal, so no radio row is selected then.\n address: address ?? result.lanAddresses[0] ?? '',\n lanAddresses: result.lanAddresses,\n }\n }, [workspaceId])\n\n const openPanel = useCallback(async (): Promise<void> => {\n const seq = ++openSeq.current\n setOpen(true)\n const next = await mint()\n // A close (or re-open) during the await invalidates this issue: skip the\n // state write and the stream so a panel closed mid-mint neither leaks an\n // EventSource nor resurrects a stale QR.\n if (seq !== openSeq.current) return\n setState(next)\n // Live status: the desktop panel mirrors the pairing service state. The\n // stream makes sense in the ready state and on the lan-required banner —\n // there the auto-tunnel may still be starting, and following its frames\n // lets the panel re-issue once it runs. The loopback-required and\n // unreachable origins are fenced out of the events endpoint, so opening\n // it there would just start a doomed reconnect loop.\n if (next.kind !== 'ready' && next.kind !== 'lan-required') return\n const source = new EventSource('/api/pair/events')\n eventSource.current = source\n source.onmessage = (event) => {\n try {\n const frame = JSON.parse(event.data as string) as PairStateFrame\n if (frame.type !== 'state') return\n // The auto-tunnel crossed into running while the panel sat on the\n // lan-required banner: re-issue so the server hands back a ready QR\n // built on the public base (only on the transition into running, to\n // avoid mint storms). Detected on the ref, outside the updater: an\n // updater may be invoked twice and must stay pure, so mint() cannot\n // run inside it.\n const previous = stateRef.current\n if (\n previous.kind === 'lan-required'\n && frame.tunnel?.state === 'running'\n && previous.tunnel?.state !== 'running'\n ) {\n void mint().then(setState)\n return\n }\n setState(current => mergeFrame(current, frame))\n } catch {\n // Malformed frames are dropped; the snapshot on open is authoritative.\n }\n }\n }, [mint])\n\n const closePanel = useCallback(() => {\n openSeq.current += 1\n closeEventSource()\n setOpen(false)\n }, [closeEventSource])\n\n // Expiry flip: one timeout per token lifetime (reset by refresh).\n useEffect(() => {\n if (state.kind !== 'ready') return\n if (state.expired) return\n const delay = state.expiresAt - Date.now()\n if (delay <= 0) {\n setState(previous => previous.kind === 'ready' ? { ...previous, expired: true } : previous)\n return\n }\n const timer = window.setTimeout(() => {\n setState(previous => previous.kind === 'ready' ? { ...previous, expired: true } : previous)\n }, delay)\n return () => { window.clearTimeout(timer) }\n }, [state])\n\n // Unmount safety: never leave the stream open.\n useEffect(() => closeEventSource, [closeEventSource])\n\n const handleStop = useCallback(() => {\n // A failed stop request is harmless: the optimistic phase flip below\n // keeps the UI honest, and the status stream confirms the stopped phase.\n void stopPair().catch(() => {})\n // Optimistic fallback; the status stream confirms with the stopped phase.\n setState(previous => previous.kind === 'ready' ? { ...previous, phase: 'stopped' as PairingPhase } : previous)\n }, [])\n\n const handleRefresh = useCallback(() => {\n void mint().then(setState)\n }, [mint])\n\n /** Re-mint against another LAN literal (multi-homed machines). */\n const handlePickAddress = useCallback((address: string) => {\n void mint(address).then(setState)\n }, [mint])\n\n /** Re-mint against the configured public (tunneled) base. */\n const handlePickPublic = useCallback(() => {\n void mint().then(setState)\n }, [mint])\n\n const handleCopy = useCallback(() => {\n if (state.kind !== 'ready') return\n void copyText(state.url).then((ok) => {\n if (!ok) return\n setCopied(true)\n window.setTimeout(() => { setCopied(false) }, 1500)\n })\n }, [state])\n\n return (\n <>\n <div className={css.entryRow} data-rail={wide ? undefined : 'rail'}>\n <UpdateEntry wide={wide} t={t} />\n <TooltipAnchor wide={wide} label={t('entry.label')} onClick={openPanel} />\n </div>\n {open && createPortal((\n <div className={css.overlay} role=\"presentation\">\n <div className={css.mask} aria-hidden=\"true\" onClick={closePanel} />\n <RemotePanel\n t={t}\n state={state}\n copied={copied}\n onClose={closePanel}\n onStop={handleStop}\n onRefresh={handleRefresh}\n onCopy={handleCopy}\n onPickAddress={handlePickAddress}\n onPickPublic={handlePickPublic}\n />\n </div>\n ), document.body)}\n </>\n )\n}\n\n/** The trigger: an icon-only control with a persistent accessible label. */\nfunction TooltipAnchor({ wide, label, onClick }: { wide: boolean; label: string; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n className={css.trigger}\n data-wide={wide ? 'wide' : 'rail'}\n aria-label={label}\n title={label}\n onClick={onClick}\n >\n <PhoneIcon size={wide ? 16 : 18} />\n </button>\n )\n}\n","/**\n * Sidebar footer-seat wrapper for the remote-control entry.\n *\n * Current dsh web shells declare `sidebar.footer.action` (the seat beside the\n * settings trigger) instead of the legacy `sidebar.remote` seat this plugin\n * was written against. The footer seat supplies `{ wide }` but not the\n * `useWorkspaces` projection hook, so this wrapper substitutes a\n * workspace-agnostic selector: pairing without a deep-linked workspace is\n * fully supported by the host `/api/pair` routes.\n */\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport { RemoteEntry } from './RemoteEntry.tsx'\n\n/** Entry props: the footer seat's column state + the standard locale seat. */\nexport type FooterRemoteEntryProps = PropsLocale<'remote'> & { wide: boolean }\n\n/**\n * Render the remote-control trigger + pairing panel from the footer seat.\n * @param props - composed slot props (footer seat subset).\n * @returns the entry element tree.\n */\nexport function FooterRemoteEntry(props: FooterRemoteEntryProps) {\n return (\n <RemoteEntry\n wide={props.wide}\n useWorkspaces={() => undefined as never}\n useSessions={() => undefined as never}\n t={props.t}\n />\n )\n}\n","/**\n * One-time failed-pairing notice: a fixed toast rendered on the phone after\n * a QR accept failed (invalid/used token or a network error). Mounted by\n * the client apply with a plain React root — no slot machinery for a\n * transient diagnostic.\n */\nimport { useEffect, useState } from 'react'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport css from './remote.module.css'\n\n/** Notice props: localized copy. */\nexport interface PairFailedNoticeProps {\n t: TranslateNS<'remote'>\n}\n\n/**\n * Render the failed-pair toast (auto-dismisses).\n * @param props - localized copy.\n * @returns the toast element.\n */\nexport function PairFailedNotice({ t }: PairFailedNoticeProps) { const [visible, setVisible] = useState(true)\n useEffect(() => {\n const timer = window.setTimeout(() => { setVisible(false) }, 8000)\n return () => { window.clearTimeout(timer) }\n }, [])\n if (!visible) return null\n return (\n <div className={css.notice} role=\"alert\">\n <p className={css.noticeTitle}>{t('pair.failed.title')}</p>\n <p className={css.noticeDetail}>{t('pair.failed.detail')}</p>\n </div>\n )\n}\n","// Generated by scripts/sync-shared.mjs from shared/client/settings/PluginSettingsCard.tsx. Do not edit this copy; edit the shared source and run \"node scripts/sync-shared.mjs\".\n/**\n * Family-shared chrome for plugin settings cards: a disclosure header naming\n * the plugin and what its settings govern, the controls inside, and the save\n * that writes them. Renders nothing while the namespace is unavailable — a\n * deployment that does not compose the owning plugin should show no trace of\n * it. Inlined into each consumer's client bundle; mirrors the official\n * ui-plugin-config PluginCard in a self-contained slice.\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode } from 'react'\nimport type { CardShell } from './settings-form.ts'\nimport css from './settings-card.module.css'\n\n/** Copy keys the card chrome itself reads; every consumer locale carries this shared vocabulary. */\nexport const CARD_COPY_KEYS = [\n 'settings.collapse',\n 'settings.expand',\n 'settings.notExposed',\n 'settings.unsaved',\n 'settings.readOnly',\n 'settings.saveFailed',\n 'settings.discard',\n 'settings.save',\n 'settings.saving',\n] as const\n\n/** Copy key the card chrome itself reads. */\nexport type CardCopyKey = (typeof CARD_COPY_KEYS)[number]\n\n/** Key domain for the plugin's own copy (inferred per consumer). */\nexport type SettingsCardKey<TKey extends string = string> = TKey | CardCopyKey\n\n/** Card chrome shared by every plugin settings card. */\nexport interface PluginSettingsCardProps<TKey extends string = string> {\n /** Locale reader for this card's copy. */\n t: (key: SettingsCardKey<TKey>, params?: Record<string, string | number>) => string\n /** Locale key of the plugin's name. */\n titleKey: TKey\n /** Locale key of the line describing what this plugin's settings govern. */\n descriptionKey: TKey\n /** The card's form state: availability, writability, and what a save would do. */\n state: CardShell\n /** Write every staged edit. */\n onSave: () => void\n /** Drop every staged edit. */\n onDiscard: () => void\n /**\n * Render the controls expanded on arrival (still collapsible). Defaults to\n * true: promoted first-level sections show their settings immediately.\n */\n defaultOpen?: boolean\n /**\n * Render without the collapse affordance: a static header and an always\n * visible body. Used by first-level settings sections whose nav entry\n * already provides the selection.\n */\n alwaysOpen?: boolean\n /**\n * Hide the save/discard footer: cards whose body applies its own changes\n * immediately (an embedded external settings section) have no staged\n * edits, so the footer would sit there permanently disabled.\n */\n hideFooter?: boolean\n /** The plugin's controls. */\n children: ReactNode\n}\n\n/**\n * Render one plugin settings card.\n * @param props - the plugin's copy keys, its form state, and its controls.\n * @returns the card, or nothing while the namespace is still loading.\n */\nexport function PluginSettingsCard<TKey extends string = string>(props: PluginSettingsCardProps<TKey>) {\n const [open, setOpen] = useState(props.defaultOpen ?? true)\n const { state, alwaysOpen } = props\n if (!state.available) return null\n const title = props.t(props.titleKey)\n const description = props.t(props.descriptionKey)\n const blocked = !state.dirty || state.invalid || state.saving\n const expanded = alwaysOpen === true || open\n const cardClass = expanded ? `${css.cardOpen} ${css.card}` : css.card\n // With alwaysOpen the nav entry already provides the selection, so the\n // header is a static title row instead of a disclosure button.\n const header = alwaysOpen === true\n ? (\n <div className={css.headerStatic}>\n <span className={css.headText}>\n <span className={css.name} title={title}>{title}</span>\n <span className={css.description} title={description}>{description}</span>\n </span>\n {state.dirty ? <span className={css.pending} title={props.t('settings.unsaved')}>{props.t('settings.unsaved')}</span> : null}\n </div>\n )\n : (\n <button\n type=\"button\"\n className={css.header}\n aria-expanded={open}\n aria-label={`${props.t(open ? 'settings.collapse' : 'settings.expand')}: ${title}`}\n onClick={() => { setOpen(!open) }}\n >\n <span className={css.headText}>\n <span className={css.name} title={title}>{title}</span>\n <span className={css.description} title={description}>{description}</span>\n </span>\n {state.dirty ? <span className={css.pending} title={props.t('settings.unsaved')}>{props.t('settings.unsaved')}</span> : null}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={open ? `${css.chevron} ${css.chevronOpen}` : css.chevron}\n >\n <path\n d=\"M11.8486 5.5L11.4238 5.92383L8.69727 8.65137C8.44157 8.90706 8.21562 9.13382 8.01172 9.29785C7.79912 9.46883 7.55595 9.61756 7.25 9.66602C7.08435 9.69222 6.91565 9.69222 6.75 9.66602C6.44405 9.61756 6.20088 9.46883 5.98828 9.29785C5.78438 9.13382 5.55843 8.90706 5.30273 8.65137L2.57617 5.92383L2.15137 5.5L3 4.65137L3.42383 5.07617L6.15137 7.80273C6.42595 8.07732 6.59876 8.24849 6.74023 8.3623C6.87291 8.46904 6.92272 8.47813 6.9375 8.48047C6.97895 8.48703 7.02105 8.48703 7.0625 8.48047C7.07728 8.47813 7.12709 8.46904 7.25977 8.3623C7.40124 8.24849 7.57405 8.07732 7.84863 7.80273L10.5762 5.07617L11 4.65137L11.8486 5.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n )\n // The namespace exists but the Host does not serve it to this client (the\n // official settings allowlist omits third-party namespaces): show a card\n // that explains the gap instead of vanishing, so a missing card never\n // reads as a missing plugin.\n if (!state.exposed) {\n return (\n <li className={cardClass}>\n {header}\n {expanded\n ? (\n <div className={css.body}>\n <p className={css.notExposed} role=\"status\">{props.t('settings.notExposed')}</p>\n </div>\n )\n : null}\n </li>\n )\n }\n return (\n <li className={cardClass}>\n {header}\n {expanded\n ? (\n <div className={css.body}>\n {!state.writable ? <p className={css.readOnly} role=\"status\">{props.t('settings.readOnly')}</p> : null}\n {props.children}\n {props.hideFooter === true\n ? null\n : (\n <div className={css.footer}>\n {state.failed\n ? (\n <p className={css.failed} role=\"status\">\n {props.t('settings.saveFailed')}{state.failedReason ? ' - ' + state.failedReason : ''}\n </p>\n )\n : null}\n <button\n type=\"button\"\n className={css.discard}\n disabled={!state.dirty || state.saving}\n onClick={props.onDiscard}\n >\n {props.t('settings.discard')}\n </button>\n <button\n type=\"button\"\n className={css.save}\n disabled={blocked}\n onClick={props.onSave}\n >\n {props.t(!state.saving ? 'settings.save' : 'settings.saving')}\n </button>\n </div>\n )}\n </div>\n )\n : null}\n </li>\n )\n}\n\n/** Props every field control needs regardless of its value type. */\nexport interface FieldProps {\n /** Stable id associating the label with its control. */\n id: string\n /** Visible label. */\n label: string\n /** One-line explanation rendered under the control. */\n hint: string\n /** Draft text this control renders. */\n text: string\n /** True when saving would leave a user-layer entry for this field. */\n overridden: boolean\n /** True when the draft is not a value this field accepts. */\n invalid: boolean\n /** Copy for the overridden badge. */\n overriddenLabel: string\n /** Copy for the reset control. */\n resetLabel: string\n /** Copy shown in place of the hint while the draft is invalid. */\n invalidLabel: string\n /** Disables every control (read-only document, or an unavailable namespace). */\n disabled: boolean\n /** Stage draft text. */\n onEdit: (text: string) => void\n /** Stage a clear so the field re-inherits the composition layer. */\n onReset: () => void\n}\n\n/** A staged value field. `numeric` only hints the keypad: which drafts a field accepts is decided by its spec. */\nexport function ValueField(props: FieldProps & {\n /** Hints a numeric keypad without narrowing what the control accepts. */\n numeric?: boolean\n /** Placeholder shown while the draft is empty. */\n placeholder?: string\n}) {\n return (\n <div className={css.field}>\n <div className={css.head}>\n <label className={css.label} htmlFor={props.id}>{props.label}</label>\n {props.overridden\n ? (\n <span className={css.badges}>\n <span className={css.badge}>{props.overriddenLabel}</span>\n <button\n type=\"button\"\n className={css.reset}\n disabled={props.disabled}\n onClick={props.onReset}\n >\n {props.resetLabel}\n </button>\n </span>\n )\n : null}\n </div>\n <input\n id={props.id}\n className={props.invalid ? css.inputInvalid : css.input}\n type=\"text\"\n {...props.numeric === true ? { inputMode: 'numeric' as const } : {}}\n {...props.invalid ? { 'aria-invalid': true } : {}}\n value={props.text}\n placeholder={props.placeholder ?? ''}\n disabled={props.disabled}\n onChange={(event) => { props.onEdit(event.target.value) }}\n />\n <p className={props.invalid ? css.invalid : css.hint}>\n {props.invalid ? props.invalidLabel : props.hint}\n </p>\n </div>\n )\n}\n\nconst NON_SKIN_BODY_MARKERS = new Set(['dshSkinCenter', 'dshSidebarCollapsed'])\n// 检测使用使用皮肤,用了皮肤退回原生select样式,防止样式冲突。默认外观下使用优化后的select样式。\nfunction isSkinActive(): boolean {\n const datasetList = Object.keys(document.body.dataset)\n const isActive = datasetList.some(key => key.startsWith('dsh') && !NON_SKIN_BODY_MARKERS.has(key))\n return isActive\n}\n\ninterface SelectOption {\n value: string\n label: string\n}\n\nconst SELECT_CLOSE_MS = 100\n\n/**\n * The shared dual-mode select control. While an appearance skin is active it\n * renders the legacy native `<select>` untouched, so element-level skin\n * selectors keep working; under the default appearance it renders a\n * self-drawn `role=\"listbox\"` popup whose open/close is transition-animated.\n * Staged cards reach it through BooleanField/ChoiceField; immediate-apply\n * editors (the side-card prefs) bind it directly through onEdit.\n * 双模式下拉框:皮肤激活时用原生 select,默认外观用自绘动画弹层。\n */\nexport function SelectField(props: {\n id: string\n options: ReadonlyArray<SelectOption>\n value: string\n disabled: boolean\n invalid: boolean\n onEdit: (text: string) => void\n}) {\n const { id, options, value } = props\n const [open, setOpen] = useState(false)\n const [closing, setClosing] = useState(false)\n const [phase, setPhase] = useState<'initial' | 'open'>('initial')\n const [activeIndex, setActiveIndex] = useState(0)\n const closeTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const wrapRef = useRef<HTMLDivElement | null>(null)\n const popupRef = useRef<HTMLDivElement | null>(null)\n\n const currentIndex = () => {\n const index = options.findIndex(option => option.value === value)\n return index >= 0 ? index : 0\n }\n\n const close = useCallback(() => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n setClosing(true)\n closeTimer.current = setTimeout(() => {\n setClosing(false)\n setOpen(false)\n }, SELECT_CLOSE_MS)\n }, [])\n\n const openPopup = () => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n setActiveIndex(currentIndex())\n setPhase('initial')\n setClosing(false)\n setOpen(true)\n }\n\n const commit = (index: number) => {\n const option = options[index]\n if (option) props.onEdit(option.value)\n close()\n }\n\n const onTriggerClick = () => {\n if (props.disabled) return\n if (open && !closing) close()\n else openPopup()\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (props.disabled) return\n const count = options.length\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!open) {\n openPopup()\n } else if (!closing) {\n if (event.key === 'ArrowDown') setActiveIndex(index => (index + 1) % count)\n else if (event.key === 'ArrowUp') setActiveIndex(index => (index - 1 + count) % count)\n else commit(activeIndex)\n }\n break\n case 'Escape':\n if (open) {\n event.preventDefault()\n event.stopPropagation()\n close()\n }\n break\n case 'Tab':\n if (open) close()\n break\n }\n }\n\n useEffect(() => () => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n }, [])\n useLayoutEffect(() => {\n if (open && !closing && phase === 'initial') {\n void popupRef.current?.offsetHeight\n setPhase('open')\n }\n }, [open, closing, phase])\n\n useEffect(() => {\n if (!open) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target\n if (target instanceof Node && !wrapRef.current?.contains(target)) close()\n }\n document.addEventListener('pointerdown', onPointerDown)\n return () => document.removeEventListener('pointerdown', onPointerDown)\n }, [open, close])\n\n useEffect(() => {\n if (props.disabled && open) close()\n }, [props.disabled, open, close])\n\n // 使用了皮肤则退回原生select样式防止样式冲突。\n if (isSkinActive()) {\n return (\n <select\n id={id}\n className={css.select}\n value={value}\n disabled={props.disabled}\n onChange={(event) => { props.onEdit(event.target.value) }}\n >\n {options.map(option => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n )\n }\n\n const label = options.find(option => option.value === value)?.label ?? ''\n const popupClass = closing\n ? `${css.selectPopup} ${css.selectPopupClose}`\n : phase === 'open'\n ? `${css.selectPopup} ${css.selectPopupOpen}`\n : css.selectPopup\n return (\n <div className={css.selectWrap} ref={wrapRef}>\n <button\n type=\"button\"\n id={id}\n className={`${css.select} ${css.selectButton}`}\n disabled={props.disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-activedescendant={open ? `${id}-o${activeIndex}` : undefined}\n aria-invalid={props.invalid || undefined}\n onClick={onTriggerClick}\n onKeyDown={onKeyDown}\n >\n <span className={css.selectLabel}>{label}</span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={open ? `${css.selectChevron} ${css.selectChevronOpen}` : css.selectChevron}\n aria-hidden=\"true\"\n >\n <path\n d=\"M11.8486 5.5L11.4238 5.92383L8.69727 8.65137C8.44157 8.90706 8.21562 9.13382 8.01172 9.29785C7.79912 9.46883 7.55595 9.61756 7.25 9.66602C7.08435 9.69222 6.91565 9.69222 6.75 9.66602C6.44405 9.61756 6.20088 9.46883 5.98828 9.29785C5.78438 9.13382 5.55843 8.90706 5.30273 8.65137L2.57617 5.92383L2.15137 5.5L3 4.65137L3.42383 5.07617L6.15137 7.80273C6.42595 8.07732 6.59876 8.24849 6.74023 8.3623C6.87291 8.46904 6.92272 8.47813 6.9375 8.48047C6.97895 8.48703 7.02105 8.48703 7.0625 8.48047C7.07728 8.47813 7.12709 8.46904 7.25977 8.3623C7.40124 8.24849 7.57405 8.07732 7.84863 7.80273L10.5762 5.07617L11 4.65137L11.8486 5.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n {open\n ? (\n <div className={popupClass} role=\"listbox\" ref={popupRef}>\n {options.map((option, index) => (\n <div\n key={option.value}\n id={`${id}-o${index}`}\n role=\"option\"\n aria-selected={option.value === value}\n className={`${css.selectOption}${option.value === value ? ` ${css.selectOptionSelected}` : ''}${index === activeIndex && !closing ? ` ${css.selectOptionActive}` : ''}`}\n onClick={() => { commit(index) }}\n >\n {option.label}\n </div>\n ))}\n </div>\n )\n : null}\n </div>\n )\n}\n\n/** A staged boolean field: 继承 / 开 / 关. */\nexport function BooleanField(props: FieldProps & {\n /** Copy for the inherit option. */\n inheritLabel: string\n /** Copy for the on option. */\n onLabel: string\n /** Copy for the off option. */\n offLabel: string\n}) {\n return (\n <div className={css.field}>\n <div className={css.head}>\n <label className={css.label} htmlFor={props.id}>{props.label}</label>\n {props.overridden\n ? (\n <span className={css.badges}>\n <span className={css.badge}>{props.overriddenLabel}</span>\n <button\n type=\"button\"\n className={css.reset}\n disabled={props.disabled}\n onClick={props.onReset}\n >\n {props.resetLabel}\n </button>\n </span>\n )\n : null}\n </div>\n <SelectField\n id={props.id}\n options={[\n { value: '', label: props.inheritLabel },\n { value: 'true', label: props.onLabel },\n { value: 'false', label: props.offLabel },\n ]}\n value={props.text}\n disabled={props.disabled}\n invalid={props.invalid}\n onEdit={props.onEdit}\n />\n <p className={css.hint}>{props.hint}</p>\n </div>\n )\n}\n\n/** A staged enumerated field rendered as a select. */\nexport function ChoiceField(props: FieldProps & {\n /** Copy for the inherit option (draft text is the empty string). */\n inheritLabel: string\n /** Choices rendered in order; `value` is the draft/stored text. */\n choices: ReadonlyArray<{ value: string; label: string }>\n}) {\n return (\n <div className={css.field}>\n <div className={css.head}>\n <label className={css.label} htmlFor={props.id}>{props.label}</label>\n {props.overridden\n ? (\n <span className={css.badges}>\n <span className={css.badge}>{props.overriddenLabel}</span>\n <button\n type=\"button\"\n className={css.reset}\n disabled={props.disabled}\n onClick={props.onReset}\n >\n {props.resetLabel}\n </button>\n </span>\n )\n : null}\n </div>\n <SelectField\n id={props.id}\n options={[{ value: '', label: props.inheritLabel }, ...props.choices]}\n value={props.text}\n disabled={props.disabled}\n invalid={props.invalid}\n onEdit={props.onEdit}\n />\n <p className={props.invalid ? css.invalid : css.hint}>\n {props.invalid ? props.invalidLabel : props.hint}\n </p>\n </div>\n )\n}\n","// Generated by scripts/sync-shared.mjs from shared/client/settings/settings-form.ts. Do not edit this copy; edit the shared source and run \"node scripts/sync-shared.mjs\".\n/**\n * Staged form model behind the plugin settings card. A card stages what the\n * user types and writes it only when they save — the settings write is a\n * durable, revision-fenced document mutation, so staging keeps what is on\n * screen exactly what a save would store. Family-shared slice inlined into\n * each plugin's client bundle; mirrors the official ui-plugin-config\n * card-store pattern.\n */\n\nimport type { SettingsScope, SettingsScopeSnapshot, SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport { createSnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\n\n/** The write one field's staged text performs when the card is saved. */\nexport type FieldWrite =\n | { kind: 'set'; value: unknown }\n | { kind: 'clear' }\n\n/** How one field converts between its stored value and its draft text. */\nexport interface FieldSpec {\n /** Field name inside the namespace section. */\n field: string\n /**\n * Whether the Host treats this field as a secret and redacts its value from\n * the read-back (role('secret') in the section schema). Redacted secrets are\n * never compared against the draft on save; the field lands when the scope\n * reports the write succeeded (its secret-set marker under the bridge), so\n * a successful secret save is not misreported as failed.\n */\n secret?: boolean\n /** Render a stored value as draft text; the empty string when the section carries none. */\n format: (value: unknown) => string\n /**\n * The write this draft text stages, or undefined when the text is not a\n * value this field accepts — which blocks the save rather than discarding it.\n */\n parse: (text: string) => FieldWrite | undefined\n}\n\n/** One field as the card renders it. */\nexport interface FieldState {\n /** Draft text the control renders. */\n text: string\n /** Whether saving would leave a user-layer entry for this field. */\n overridden: boolean\n /** Whether the draft is not a value this field accepts, which blocks saving. */\n invalid: boolean\n}\n\n/** Form state every plugin settings card shares. */\nexport interface CardShell {\n /** False while the namespace is still loading; the card renders nothing. */\n available: boolean\n /**\n * Whether the namespace is actually served to this client. False when the\n * Host deployment does not expose it (e.g. the official apiproxy settings\n * allowlist omits third-party namespaces): the card renders an explanation\n * instead of its form, so a missing namespace never looks like a missing\n * plugin.\n */\n exposed: boolean\n /** Whether the Host document accepts writes. */\n writable: boolean\n /** Whether the form holds edits that a save would write. */\n dirty: boolean\n /** Whether any staged draft is invalid, which blocks the save. */\n invalid: boolean\n /** Whether a save is crossing the wire. */\n saving: boolean\n /** Whether the last save did not land as staged; cleared by the next edit or save. */\n failed: boolean\n /**\n * The rejection code/message the Host returned for the last failed save,\n * surfaced next to the generic failure text. Undefined while no save has\n * failed (or the failure carried no server reason).\n */\n failedReason?: string\n}\n\n/** The write actions the card's slot entry injects. */\nexport interface CardActions {\n /** Stage draft text for one field. */\n edit: (field: string, text: string) => void\n /** Stage a clear, so saving lets the field re-inherit the composition layer. */\n resetField: (field: string) => void\n /** Write every staged edit, then re-seed from what the Host accepted. */\n save: () => void\n /** Drop every staged edit. */\n discard: () => void\n}\n\n/** One field's staged edit. */\ninterface StagedEdit {\n /** Draft text the control renders. */\n text: string\n /** True when this edit clears the field whatever text it shows. */\n clear: boolean\n}\n\n/** One staged edit resolved into the write a save performs. */\ninterface PlannedWrite {\n /** Field this entry writes. */\n field: string\n /** The durable write this entry performs, described for a batched scope. */\n op: BatchedWrite\n /** Perform the write and report whether the Host holds the staged value afterwards. */\n run: (() => Promise<boolean>) | undefined\n}\n\n/** One durable write a batched settings scope performs. */\nexport interface BatchedWrite {\n /** Field this entry writes. */\n field: string\n /** set stores a value; unset drops the leaf. */\n op: 'set' | 'unset'\n /** Value for op set (absent for unset). */\n value?: unknown\n}\n\n/** Per-field outcome of one batched scope write. */\nexport interface BatchedFieldResult {\n /** Field this entry writes. */\n field: string\n /** Whether the Host accepted this field's write (per the read-back view). */\n landed: boolean\n}\n\n/**\n * Result of a batched scope write. The bridge scope posts every planned write\n * in one /mutate so the Host validate hook judges baseURL+model together; a\n * batched refusal fails the whole save rather than per-field.\n */\nexport interface BatchResult {\n /** Whether the whole mutate was accepted. */\n ok: boolean\n /** Per-field success, in the request order (always present when ok). */\n fields: BatchedFieldResult[]\n /** Host rejection code (mutate refused). */\n code?: string\n /** Host rejection message (mutate refused). */\n message?: string\n}\n\n/** The optional batch surface the bridge scope adds over the SettingsScope contract. */\ninterface BatchedSettingsScope {\n /** Write every operation in one scope mutation, reporting per-field success. */\n mutate: (writes: BatchedWrite[]) => Promise<BatchResult>\n}\n\n/** Constraints a numeric field's accepted drafts must satisfy, mirroring the host schema. */\nexport interface NumberConstraints {\n /** The accepted value must be a whole number. */\n integer?: boolean\n /** The accepted value must be at least this. */\n min?: number\n}\n\n/** A whole- or decimal-number field. An empty draft clears the field; any other draft that is not a finite number within the constraints blocks the save. */\nexport function numberField(field: string, constraints: NumberConstraints = {}): FieldSpec {\n const { integer = false, min } = constraints\n return {\n field,\n format: value => typeof value === 'number' ? String(value) : '',\n parse: (text) => {\n const trimmed = text.trim()\n if (trimmed === '') return { kind: 'clear' }\n const parsed = Number(trimmed)\n if (!Number.isFinite(parsed)) return undefined\n if (integer && !Number.isInteger(parsed)) return undefined\n if (min !== undefined && parsed < min) return undefined\n return { kind: 'set', value: parsed }\n },\n }\n}\n\n/** A free-text field. An empty draft clears the field. */\nexport function textField(field: string): FieldSpec {\n return {\n field,\n format: value => typeof value === 'string' ? value : '',\n parse: (text) => {\n const trimmed = text.trim()\n return trimmed === '' ? { kind: 'clear' } : { kind: 'set', value: trimmed }\n },\n }\n}\n\n/**\n * A free-text field the Host treats as a secret and redacts from the read-back\n * (role('secret') in the section schema). The card still edits it like text,\n * but a save never compares the redacted value back and relies on the scope\n * reporting the write landed.\n */\nexport function secretField(field: string): FieldSpec {\n return { ...textField(field), secret: true }\n}\n\n/** A boolean field, edited through true/false draft text. */\nexport function booleanField(field: string): FieldSpec {\n return {\n field,\n format: value => typeof value === 'boolean' ? String(value) : '',\n parse: (text) => {\n const trimmed = text.trim()\n if (trimmed === '') return { kind: 'clear' }\n if (trimmed === 'true') return { kind: 'set', value: true }\n if (trimmed === 'false') return { kind: 'set', value: false }\n return undefined\n },\n }\n}\n\n/** An enumerated string field; only the listed choices are accepted. An empty draft clears the field. */\nexport function choiceField(field: string, choices: readonly string[]): FieldSpec {\n return {\n field,\n format: value => typeof value === 'string' && choices.includes(value) ? value : '',\n parse: (text) => {\n if (text === '') return { kind: 'clear' }\n return choices.includes(text) ? { kind: 'set', value: text } : undefined\n },\n }\n}\n\n/**\n * Stages one card's edits over one settings namespace and writes them on save.\n *\n * The Host is the only authority on whether a value was accepted — its\n * validators own the constraints no schema can express — so the outcome is\n * read back from the section rather than predicted here. A save that did not\n * land keeps its drafts, so the user can correct them instead of retyping.\n */\nexport class CardForm<T> {\n private readonly specs: Map<string, FieldSpec>\n private readonly staged = new Map<string, StagedEdit>()\n private readonly listeners = new Set<() => void>()\n /** The scope subscription installed in the constructor; released by dispose(). */\n private readonly disposeScope: () => void\n private disposed = false\n private saving = false\n private failed = false\n private failedReason: string | undefined\n\n /** @param scope - the bound settings scope for this card's namespace. */\n constructor(\n private readonly scope: SettingsScope<T>,\n specs: FieldSpec[],\n ) {\n this.specs = new Map(specs.map(spec => [spec.field, spec]))\n this.disposeScope = scope.subscribe(() => { this.publish() })\n }\n\n /**\n * Release the scope subscription and every bound store listener. The card\n * must call this on teardown; later calls are no-ops.\n */\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.disposeScope()\n this.listeners.clear()\n }\n\n /** Publish a projection of this form, rebuilt whenever the scope or a draft changes. */\n bind<S>(project: () => S): SnapshotStore<S> {\n const store = createSnapshotStore(project())\n this.listeners.add(() => { store.set(project()) })\n return store\n }\n\n /** Read the card-level state: what the Host serves, and what a save would do. */\n shell(): CardShell {\n const snapshot = this.scope.getSnapshot()\n const plan = this.plan()\n return {\n available: snapshot.status !== 'loading',\n exposed: snapshot.status === 'ready',\n writable: snapshot.writable,\n dirty: plan.length > 0,\n invalid: plan.some(item => item.run === undefined),\n saving: this.saving,\n failed: this.failed,\n ...this.failedReason === undefined ? {} : { failedReason: this.failedReason },\n }\n }\n\n /** Read one field's state from the effective section and its staged draft. */\n field(field: string): FieldState {\n const spec = this.specOf(field)\n const staged = this.staged.get(field)\n if (staged === undefined) {\n return { text: spec.format(this.sectionValue(field)), overridden: this.stored(field), invalid: false }\n }\n const write = staged.clear ? { kind: 'clear' as const } : spec.parse(staged.text)\n return {\n text: staged.text,\n overridden: write?.kind === 'set',\n invalid: write === undefined,\n }\n }\n\n /** The actions the card's slot registration injects. */\n actions(): CardActions {\n return {\n edit: (field, text) => { this.stage(field, { text, clear: false }) },\n resetField: (field) => {\n this.stage(field, { text: this.specOf(field).format(this.baseValue(field)), clear: true })\n },\n save: () => { void this.save() },\n discard: () => {\n if (this.staged.size === 0 && !this.failed) return\n this.staged.clear()\n this.failed = false\n this.failedReason = undefined\n this.publish()\n },\n }\n }\n\n /**\n * Write every staged edit, then re-seed from what the Host accepted.\n *\n * When the scope carries the optional batch surface (the dsh-web-ui\n * bridge scope), every planned write rides one mutation so cross-field\n * validate hooks (baseURL+model) judge the batch as a unit instead of\n * deadlocking on per-field writes. Otherwise the per-field loop runs.\n * A field lands only when the Host reports it held the staged value; a\n * landed field's draft is dropped, a failed one stays staged for the user.\n * @returns settlement after every write and the read-back.\n */\n async save(): Promise<void> {\n const plan = this.plan()\n const valid = plan.filter(item => item.run !== undefined)\n if (plan.length === 0 || this.saving || valid.length !== plan.length) return\n const plannedWrites = valid.map(item => item.op)\n // Snapshot the fields this save writes, so edits staged while it is in\n // flight survive: only the staged keys this save actually wrote are cleared.\n const fields = new Set(plan.map(item => item.field))\n this.saving = true\n this.failed = false\n this.failedReason = undefined\n this.publish()\n const landed = new Set<string>()\n const batch = this.batchedScope()\n if (batch !== undefined) {\n const result = await batch.mutate(plannedWrites)\n if (result.ok) {\n for (const field of result.fields) {\n if (field.landed) landed.add(field.field)\n }\n } else {\n this.failedReason = result.message\n }\n } else {\n for (const item of valid) {\n if (await item.run!()) landed.add(item.field)\n }\n }\n for (const field of fields) {\n if (landed.has(field)) this.staged.delete(field)\n }\n this.saving = false\n this.failed = landed.size !== fields.size\n this.publish()\n }\n\n /** The scope's batch surface when it supports one; undefined conservatively otherwise. */\n private batchedScope(): BatchedSettingsScope | undefined {\n const candidate = this.scope as unknown as BatchedSettingsScope | undefined\n return typeof candidate?.mutate === 'function' ? candidate : undefined\n }\n\n /**\n * Every staged edit a save would write. An entry whose draft is not a value\n * its field accepts carries no write: the form is still dirty, and the save\n * refuses rather than dropping the edit. A staged edit that matches the\n * effective section is not a write at all.\n * @returns the planned writes, in the order the fields were staged.\n */\n private plan(): PlannedWrite[] {\n const plan: PlannedWrite[] = []\n for (const [field, staged] of this.staged) {\n const spec = this.specOf(field)\n if (staged.clear) {\n if (this.stored(field)) plan.push({ field, op: { field, op: 'unset' }, run: () => this.clear(field) })\n continue\n }\n if (staged.text === spec.format(this.sectionValue(field))) continue\n const write = spec.parse(staged.text)\n if (write === undefined) plan.push({ field, op: { field, op: 'unset' }, run: undefined })\n else if (write.kind === 'clear') plan.push({ field, op: { field, op: 'unset' }, run: () => this.clear(field) })\n else plan.push({ field, op: { field, op: 'set', value: write.value }, run: () => this.store(field, write.value) })\n }\n return plan\n }\n\n private async clear(field: string): Promise<boolean> {\n await this.scope.unset(field)\n return !this.stored(field)\n }\n\n private async store(field: string, value: unknown): Promise<boolean> {\n await this.scope.set(field, value)\n // A redacted secret never appears in the user layer read-back; judging it\n // by value would misreport a successful secret save as failed. The bridge\n // reports secret writes through its secret-set markers (batch path); on\n // the per-field path the scope resolved, so the write is landed.\n if (this.specOf(field).secret) return true\n return this.userLayer()?.[field] === value\n }\n\n private stage(field: string, edit: StagedEdit): void {\n this.staged.set(field, edit)\n this.failed = false\n this.failedReason = undefined\n this.publish()\n }\n\n private specOf(field: string): FieldSpec {\n const spec = this.specs.get(field)\n // Every call site names a field this card declared; a missing one is a\n // wiring mistake that must not degrade into a silently inert control.\n if (spec === undefined) throw new Error(`settings card has no field ${field}`)\n return spec\n }\n\n private snapshotOf(): SettingsScopeSnapshot<T> {\n return this.scope.getSnapshot()\n }\n\n private sectionValue(field: string): unknown {\n return (this.snapshotOf().value as Record<string, unknown> | undefined)?.[field]\n }\n\n private baseValue(field: string): unknown {\n return (this.snapshotOf().base as Record<string, unknown> | undefined)?.[field]\n }\n\n private userLayer(): Record<string, unknown> | undefined {\n return this.snapshotOf().user as Record<string, unknown> | undefined\n }\n\n private stored(field: string): boolean {\n const user = this.userLayer()\n return user !== undefined && Object.hasOwn(user, field)\n }\n\n private publish(): void {\n for (const listener of this.listeners) listener()\n }\n}\n","/**\n * The remote-control settings card: pairing security and device limits.\n * Registers into the `web-ui.plugin.item` child slot the Web UI plugin group\n * renders, bound to the `remote-web-ui` settings namespace.\n */\n\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SettingsScope, SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport { PluginSettingsCard, ValueField, BooleanField } from './PluginSettingsCard.tsx'\nimport { CardForm, booleanField, numberField, textField, type CardActions, type CardShell, type FieldState as CardFieldState } from './settings-form.ts'\n\n/** The remote-control fields this card edits (the namespace's full schema). */\nexport interface RemoteSettings {\n /** Master switch for the plugin. */\n enabled?: boolean\n /** Token lifetime in ms; the QR link dies after this. */\n tokenTtlMs?: number\n /** A device is \"online\" while its lastSeenAt is newer than this (ms). */\n offlineAfterMs?: number\n /** Hard cap on paired device sessions (oldest evicted when full). */\n maxDevices?: number\n /** Cookie name carrying the paired device id. */\n cookieName?: string\n /** Fence flag: whether non-loopback /api requests must carry a live paired-device cookie. */\n requirePairingForLan?: boolean\n /** Public (tunneled) base URL the QR link is built from when set. */\n publicBaseUrl?: string\n /** When on, the plugin runs its own Cloudflare quick tunnel automatically. */\n autoTunnel?: boolean\n /** Mobile composer: plain Enter sends; off means Enter inserts a newline. */\n mobileEnterToSend?: boolean\n}\n\n/** What the remote-control card renders. */\nexport interface RemoteSettingsCardState extends CardShell {\n /** Master switch. */\n enabled: CardFieldState\n /** Token lifetime. */\n tokenTtlMs: CardFieldState\n /** Device offline threshold. */\n offlineAfterMs: CardFieldState\n /** Paired-device cap. */\n maxDevices: CardFieldState\n /** Device cookie name. */\n cookieName: CardFieldState\n /** LAN fence flag. */\n requirePairingForLan: CardFieldState\n /** Public (tunneled) base URL. */\n publicBaseUrl: CardFieldState\n /** Auto public tunnel switch. */\n autoTunnel: CardFieldState\n /** Mobile composer Enter-to-send switch. */\n mobileEnterToSend: CardFieldState\n}\n\n/** The registration-side face the card's slot entry injects. */\nexport interface RemoteSettingsCardFace extends CardActions {\n hooks: {\n /** Card snapshot bound by the renderer as useRemoteSettingsCard. */\n remoteSettingsCard: SnapshotStore<RemoteSettingsCardState>\n }\n}\n\n/** Bridges the `remote-web-ui` scope onto the card's staged form. */\nexport class RemoteSettingsCardController {\n private readonly form: CardForm<RemoteSettings>\n private readonly store: SnapshotStore<RemoteSettingsCardState>\n\n /** @param scope - the bound settings scope for the `remote-web-ui` namespace. */\n constructor(scope: SettingsScope<RemoteSettings>) {\n this.form = new CardForm(scope, [\n booleanField('enabled'),\n numberField('tokenTtlMs'),\n numberField('offlineAfterMs'),\n numberField('maxDevices'),\n textField('cookieName'),\n booleanField('requirePairingForLan'),\n textField('publicBaseUrl'),\n booleanField('autoTunnel'),\n booleanField('mobileEnterToSend'),\n ])\n this.store = this.form.bind(() => this.projection())\n }\n\n private projection(): RemoteSettingsCardState {\n return {\n ...this.form.shell(),\n enabled: this.form.field('enabled'),\n tokenTtlMs: this.form.field('tokenTtlMs'),\n offlineAfterMs: this.form.field('offlineAfterMs'),\n maxDevices: this.form.field('maxDevices'),\n cookieName: this.form.field('cookieName'),\n requirePairingForLan: this.form.field('requirePairingForLan'),\n publicBaseUrl: this.form.field('publicBaseUrl'),\n autoTunnel: this.form.field('autoTunnel'),\n mobileEnterToSend: this.form.field('mobileEnterToSend'),\n }\n }\n\n /**\n * Build the face the card's slot registration injects.\n * @returns the card's snapshot and its form actions.\n */\n inject(): RemoteSettingsCardFace {\n return { hooks: { remoteSettingsCard: this.store }, ...this.form.actions() }\n }\n\n /**\n * Release the card's scope subscription and bound stores; the slot\n * disposer calls this on teardown.\n */\n dispose(): void {\n this.form.dispose()\n }\n}\n\n/** Props the renderer binds for the remote-control card. */\nexport type RemoteSettingsCardProps =\n PropsRuntime<'web-ui.plugin.item'>\n & PropsLocale<'remote'>\n & InjectFace<RemoteSettingsCardFace>\n\n/**\n * Render the remote-control card.\n * @param props - locale copy, the card snapshot, and its form actions.\n * @returns the card.\n */\nexport function RemoteSettingsCard(props: RemoteSettingsCardProps) {\n const { t } = props\n const state = props.useRemoteSettingsCard(snapshot => snapshot)\n const disabled = !state.writable\n const fieldProps = {\n overriddenLabel: t('settings.overridden'),\n resetLabel: t('settings.reset'),\n invalidLabel: t('settings.invalidNumber'),\n disabled,\n }\n return (\n <PluginSettingsCard\n t={t}\n titleKey=\"settings.title\"\n descriptionKey=\"settings.description\"\n defaultOpen={false}\n state={state}\n onSave={props.save}\n onDiscard={props.discard}\n >\n <BooleanField\n id=\"settings-remote-enabled\"\n label={t('settings.enabled')}\n hint={t('settings.enabledHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.enabled}\n onEdit={(text) => { props.edit('enabled', text) }}\n onReset={() => { props.resetField('enabled') }}\n />\n <ValueField\n id=\"settings-remote-token-ttl\"\n label={t('settings.tokenTtlMs')}\n hint={t('settings.tokenTtlMsHint')}\n numeric\n {...fieldProps}\n {...state.tokenTtlMs}\n onEdit={(text) => { props.edit('tokenTtlMs', text) }}\n onReset={() => { props.resetField('tokenTtlMs') }}\n />\n <ValueField\n id=\"settings-remote-offline\"\n label={t('settings.offlineAfterMs')}\n hint={t('settings.offlineAfterMsHint')}\n numeric\n {...fieldProps}\n {...state.offlineAfterMs}\n onEdit={(text) => { props.edit('offlineAfterMs', text) }}\n onReset={() => { props.resetField('offlineAfterMs') }}\n />\n <ValueField\n id=\"settings-remote-max-devices\"\n label={t('settings.maxDevices')}\n hint={t('settings.maxDevicesHint')}\n numeric\n {...fieldProps}\n {...state.maxDevices}\n onEdit={(text) => { props.edit('maxDevices', text) }}\n onReset={() => { props.resetField('maxDevices') }}\n />\n <ValueField\n id=\"settings-remote-cookie\"\n label={t('settings.cookieName')}\n hint={t('settings.cookieNameHint')}\n {...fieldProps}\n {...state.cookieName}\n onEdit={(text) => { props.edit('cookieName', text) }}\n onReset={() => { props.resetField('cookieName') }}\n />\n <BooleanField\n id=\"settings-remote-fence\"\n label={t('settings.requirePairingForLan')}\n hint={t('settings.requirePairingForLanHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.requirePairingForLan}\n onEdit={(text) => { props.edit('requirePairingForLan', text) }}\n onReset={() => { props.resetField('requirePairingForLan') }}\n />\n <ValueField\n id=\"settings-remote-public-base\"\n label={t('settings.publicBaseUrl')}\n hint={t('settings.publicBaseUrlHint')}\n placeholder=\"https://example.trycloudflare.com\"\n {...fieldProps}\n {...state.publicBaseUrl}\n onEdit={(text) => { props.edit('publicBaseUrl', text) }}\n onReset={() => { props.resetField('publicBaseUrl') }}\n />\n <BooleanField\n id=\"settings-remote-auto-tunnel\"\n label={t('settings.autoTunnel')}\n hint={t('settings.autoTunnelHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.autoTunnel}\n onEdit={(text) => { props.edit('autoTunnel', text) }}\n onReset={() => { props.resetField('autoTunnel') }}\n />\n <BooleanField\n id=\"settings-remote-mobile-enter\"\n label={t('settings.mobileEnterToSend')}\n hint={t('settings.mobileEnterToSendHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.mobileEnterToSend}\n onEdit={(text) => { props.edit('mobileEnterToSend', text) }}\n onReset={() => { props.resetField('mobileEnterToSend') }}\n />\n </PluginSettingsCard>\n )\n}\n","/** `remote` namespace dictionaries: the mobile remote-control surface copy. */\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'entry.label': '移动端远程控制',\n 'title': '移动端远程控制',\n 'subtitle': '扫码或在手机上打开链接,即可远程控制当前工作区',\n 'card.title': '手机扫码连接',\n 'public.badge': '公网',\n 'status.waiting': '等待手机连接',\n 'status.connected': '已连接 {n} 台设备',\n 'status.disconnected': '已配对设备离线',\n 'status.stopped': '已停止移动端访问',\n 'status.lanRequired': '此功能需要以 --host 0.0.0.0 启动 dsh web,或配置公网地址才能使用',\n 'status.lanRequiredHint': '当前服务仅绑定在 127.0.0.1 且未配置公网地址,手机无法访问。请用 dsh web --host 0.0.0.0 重新启动,或在设置中填写内网穿透的公网地址。',\n 'status.loopbackRequired': '配对面板仅限本机使用',\n 'status.loopbackRequiredHint': '请通过 http://127.0.0.1 打开此页面后重试;手机请使用配对链接访问。',\n 'status.unreachable': '无法连接配对服务',\n 'status.unreachableHint': '请刷新页面后重试。',\n 'pair.hint': '无法扫码?可以在手机上打开链接',\n 'pair.publicHint': '公网链接:手机无需与电脑在同一网络',\n 'address.label': '选择二维码指向的网络',\n 'address.public': '公网地址',\n 'address.lan': '局域网',\n 'address.hint': '公网地址适合手机不在同一网络时使用;局域网地址仅在手机与电脑同一网络时可用。',\n 'pair.expires': '二维码有效至 {time}',\n 'pair.expired': '二维码已过期,请刷新',\n 'pair.failed.title': '配对失败',\n 'pair.failed.detail': '链接无效或已使用,请回到电脑端刷新二维码后重新扫码。',\n 'action.stop': '停止',\n 'action.refresh': '刷新二维码',\n 'action.copy': '复制链接',\n 'action.copied': '已复制',\n 'stopped.hint': '已停止移动端访问。点击\"刷新二维码\"重新开启。',\n 'tunnel.starting': '公网隧道启动中,二维码将自动变为公网链接…',\n 'tunnel.failed': '公网隧道启动失败:{error}',\n 'tunnel.unknownError': '未知错误',\n 'close.label': '关闭移动端远程控制面板',\n // 插件设置卡片(settings.plugin.item 席位)。\n 'settings.title': '移动端远程控制',\n 'settings.description': '配对安全与设备限额。',\n 'settings.enabled': '启用移动端远程控制',\n 'settings.enabledHint': '关闭后移除侧边栏入口并停用配对路由与局域网栅栏。',\n 'settings.tokenTtlMs': '配对令牌有效期(毫秒)',\n 'settings.tokenTtlMsHint': '新生成的二维码链接在此时间后失效。',\n 'settings.offlineAfterMs': '设备离线判定(毫秒)',\n 'settings.offlineAfterMsHint': '配对设备超过该时长未上报心跳即视为离线。',\n 'settings.maxDevices': '已配对设备上限',\n 'settings.maxDevicesHint': '超过上限时淘汰最旧的设备会话。',\n 'settings.cookieName': '设备 Cookie 名',\n 'settings.cookieNameHint': '携带已配对设备标识的 Cookie 名称。',\n 'settings.requirePairingForLan': '局域网访问要求配对',\n 'settings.requirePairingForLanHint': '开启:所有非本机回环的 /api 请求必须携带有效配对 Cookie;关闭:局域网栅栏放开,配对仅用于令牌与状态管理。',\n 'settings.publicBaseUrl': '公网地址(可选)',\n 'settings.publicBaseUrlHint': '内网穿透的公网地址,如 Cloudflare Tunnel:https://xxx.trycloudflare.com。填写后二维码将生成公网链接,手机不在同一网络也能配对;留空则仅局域网可用。',\n 'settings.autoTunnel': '自动公网隧道',\n 'settings.autoTunnelHint': '开启后插件自动启动 Cloudflare quick tunnel(无需安装任何工具),并自动更新公网地址与信任配置,手机随时可用公网配对;关闭时使用上方手动填写的公网地址。',\n 'settings.mobileEnterToSend': '移动端回车发送',\n 'settings.mobileEnterToSendHint': '开启:移动端输入框按 Enter 直接发送,Shift+Enter 换行;关闭:Enter 换行,仅点发送按钮发送。',\n 'settings.inherit': '继承',\n 'settings.on': '开',\n 'settings.off': '关',\n 'settings.overridden': '已覆盖',\n 'settings.reset': '恢复默认',\n 'settings.notExposed': '当前 DSH 版本未向设置页暴露本插件的配置命名空间,表单不可用。可编辑 ~/.dsh/settings.yaml 直接配置,或为 dsh-host-apiproxy 的 WEB_SETTINGS_NAMESPACES 白名单补充本命名空间后重启。',\n 'settings.readOnly': '当前部署的设置只读。',\n 'settings.expand': '展开设置',\n 'settings.collapse': '收起设置',\n 'settings.save': '保存',\n 'settings.saving': '保存中…',\n 'settings.discard': '放弃',\n 'settings.unsaved': '未保存',\n 'settings.saveFailed': '部署未接受这些值,已保留供你修改。',\n 'settings.invalidNumber': '请输入数字,留空则使用默认值。',\n // 更新面板(侧边栏更新按钮)。\n 'update.label': '检查更新',\n 'update.availableLabel': '发现新版本,检查更新',\n 'update.title': '检查更新',\n 'update.checking': '正在检查远程仓库中的新版本…',\n 'update.upToDate': '当前已是最新版本',\n 'update.upToDateDetail': '{name} 已是最新版本 v{version}。',\n 'update.found': '发现新版本',\n 'update.foundDetail': '{name} 有新版本 v{version}。确认后开始更新。',\n 'update.start': '开始更新',\n 'update.updating': '正在更新 {name} 至 v{version},可能需要 1-2 分钟…',\n 'update.cooldownNotice': '本次更新由你主动触发,将跳过 pnpm 的 24 小时发布冷却期(供应链保护)直接安装所选版本。',\n 'update.updatingTitle': '正在更新…',\n 'update.done': '更新完成',\n 'update.doneDetail': '所有组件已更新到最新版本。',\n 'update.restartHint': '请重启 dsh web 使新版本生效:在终端按 Ctrl+C 停止后重新运行 dsh web。',\n 'update.linkMode': '当前为本地开发模式',\n 'update.linkModeDetail': 'dsh-web-ui 通过本地链接安装(开发模式),无法自动更新。npm 上最新版本:{version}。请在仓库中执行 git pull 更新。',\n 'update.missing': '未找到 dsh-web-ui 安装',\n 'update.missingDetail': '无法定位已安装的 dsh-web-ui 聚合包。请先运行 dsh plugin --profile <profile> add @linxin666/dsh-web-ui-all。',\n 'update.offline': '无法连接更新源',\n 'update.offlineDetail': '网络不可用或更新服务异常,请稍后重试。',\n 'update.unmounted': '更新服务未加载',\n 'update.unmountedDetail': '当前 dsh web 进程运行的插件版本不含更新服务,请重启 dsh web(Ctrl+C 后重新运行)后再试。',\n 'update.error': '更新失败',\n 'update.packages': '组件版本',\n 'update.retry': '重新检查',\n 'update.close': '关闭更新面板',\n 'update.error.pnpmMissing': '未找到 pnpm,已尝试 pnpm / corepack / npx 仍不可用。请安装 pnpm 后重启应用(Windows: npm install -g pnpm 或 corepack enable;macOS: brew install pnpm 或 corepack enable)。',\n 'update.error.timeout': '更新超时,已终止安装进程,请重试。',\n 'update.error.notFound': '未找到 dsh-web-ui 聚合包安装,无法更新。',\n 'update.error.link': '当前为本地开发模式(链接安装),无法自动更新。',\n 'update.error.pnpmFailed': '更新执行失败(pnpm 退出码 {code}),详见下方输出。',\n 'update.error.stale': '更新命令已执行,但安装版本未变化。常见原因:pnpm 11 的 minimumReleaseAge 门禁会静默跳过发布不足 24 小时的新版本。请在 profile 目录(~/.dsh/profiles/<profile>)的 pnpm-workspace.yaml 中配置 minimumReleaseAgeExclude(例如 \"@linxin666/*\")或 minimumReleaseAge: 0 后重新点击更新。',\n 'update.error.verifyFailed': '更新命令已执行,但无法核对安装后的版本(可能是 registry 探测失败或安装路径变化)。请查看下方输出,或稍后重试。',\n 'update.error.unknown': '更新失败,请重试。',\n} satisfies Record<string, string>\n\n/** The remote namespace key union. */\nexport type RemoteKey = keyof typeof zh\n\n/** The settings-card slice of the remote dictionary. */\nexport type SettingsCardKey = RemoteKey\n\n/** English dictionary, checked complete against the zh key set. */\nexport const en = {\n 'entry.label': 'Mobile remote control',\n 'title': 'Mobile remote control',\n 'subtitle': 'Scan the QR code or open the link on your phone to control this workspace remotely',\n 'card.title': 'Scan to connect',\n 'public.badge': 'Public',\n 'status.waiting': 'Waiting for a phone',\n 'status.connected': '{n} device(s) connected',\n 'status.disconnected': 'Paired devices offline',\n 'status.stopped': 'Mobile access stopped',\n 'status.lanRequired': 'This feature needs dsh web started with --host 0.0.0.0, or a configured public address',\n 'status.lanRequiredHint': 'The server is bound to 127.0.0.1 and no public address is configured, so a phone cannot reach it. Restart with dsh web --host 0.0.0.0, or set the tunneled public address in settings.',\n 'status.loopbackRequired': 'The pairing panel works on this machine only',\n 'status.loopbackRequiredHint': 'Open this page at http://127.0.0.1 to mint a QR code; phones use the paired link.',\n 'status.unreachable': 'Cannot reach the pairing service',\n 'status.unreachableHint': 'Refresh the page and try again.',\n 'pair.hint': 'Cannot scan? Open the link on your phone',\n 'pair.publicHint': 'Public link: the phone does not need to be on the same network',\n 'address.label': 'Network the QR code points to',\n 'address.public': 'Public',\n 'address.lan': 'LAN',\n 'address.hint': 'Use the public address when the phone is not on the same network; LAN addresses only work on the same network.',\n 'pair.expires': 'QR code valid until {time}',\n 'pair.expired': 'QR code expired — refresh it',\n 'pair.failed.title': 'Pairing failed',\n 'pair.failed.detail': 'The link is invalid or was already used. Refresh the QR code on your computer and scan again.',\n 'action.stop': 'Stop',\n 'action.refresh': 'Refresh QR',\n 'action.copy': 'Copy link',\n 'action.copied': 'Copied',\n 'stopped.hint': 'Mobile access is stopped. Click \"Refresh QR\" to re-enable it.',\n 'tunnel.starting': 'The public tunnel is starting; the QR code will switch to a public link shortly…',\n 'tunnel.failed': 'The public tunnel failed to start: {error}',\n 'tunnel.unknownError': 'unknown error',\n 'close.label': 'Close mobile remote control panel',\n // Plugin settings card (the `settings.plugin.item` seat).\n 'settings.title': 'Mobile remote control',\n 'settings.description': 'Pairing security and device limits.',\n 'settings.enabled': 'Enable mobile remote control',\n 'settings.enabledHint': 'When off, the sidebar entry is removed and pairing routes plus the LAN fence stop.',\n 'settings.tokenTtlMs': 'Pairing token lifetime (ms)',\n 'settings.tokenTtlMsHint': 'How long a minted QR link stays valid before it dies.',\n 'settings.offlineAfterMs': 'Device offline threshold (ms)',\n 'settings.offlineAfterMsHint': 'A paired device flips to offline when it has not been seen for this long.',\n 'settings.maxDevices': 'Paired device cap',\n 'settings.maxDevicesHint': 'Hard cap on paired device sessions; the oldest is evicted when full.',\n 'settings.cookieName': 'Device cookie name',\n 'settings.cookieNameHint': 'Cookie that carries the paired device id.',\n 'settings.requirePairingForLan': 'Require pairing for LAN access',\n 'settings.requirePairingForLanHint': 'On: every non-loopback /api request must carry a live paired-device cookie. Off: the LAN fence is open and pairing only manages tokens/status.',\n 'settings.publicBaseUrl': 'Public address (optional)',\n 'settings.publicBaseUrlHint': 'The public URL of a tunnel in front of this server, e.g. a Cloudflare Tunnel: https://xxx.trycloudflare.com. When set, the QR link is built from it so a phone anywhere can pair; leave blank for LAN-only usage.',\n 'settings.autoTunnel': 'Auto public tunnel',\n 'settings.autoTunnelHint': 'When on, the plugin runs its own Cloudflare quick tunnel (no tool installation needed) and keeps the public address and trust config in sync automatically, so a phone anywhere can pair at any time; when off, the manually entered public address above applies.',\n 'settings.mobileEnterToSend': 'Enter to send on mobile',\n 'settings.mobileEnterToSendHint': 'On: Enter in the mobile composer sends immediately and Shift+Enter inserts a newline. Off: Enter inserts a newline and only the send button sends.',\n 'settings.inherit': 'Inherit',\n 'settings.on': 'On',\n 'settings.off': 'Off',\n 'settings.overridden': 'Overridden',\n 'settings.reset': 'Reset to default',\n 'settings.notExposed': 'This DSH version does not expose this plugin\\'s settings namespace to the configuration page, so the form is unavailable. Edit ~/.dsh/settings.yaml directly, or add the namespace to dsh-host-apiproxy\\'s WEB_SETTINGS_NAMESPACES allowlist and restart.',\n 'settings.readOnly': 'This deployment stores settings read-only.',\n 'settings.expand': 'Show settings',\n 'settings.collapse': 'Hide settings',\n 'settings.save': 'Save',\n 'settings.saving': 'Saving…',\n 'settings.discard': 'Discard',\n 'settings.unsaved': 'Unsaved',\n 'settings.saveFailed': 'The deployment did not accept these values; they were left for you to correct.',\n 'settings.invalidNumber': 'Enter a number, or leave blank to use the default.',\n // Update panel (the sidebar update trigger).\n 'update.label': 'Check for updates',\n 'update.availableLabel': 'New version available. Check for updates',\n 'update.title': 'Check for updates',\n 'update.checking': 'Checking the remote repository for newer releases…',\n 'update.upToDate': 'Everything is up to date',\n 'update.upToDateDetail': '{name} is at the latest version v{version}.',\n 'update.found': 'A new version is available',\n 'update.foundDetail': '{name} has a newer release v{version}. Confirm to start the update.',\n 'update.start': 'Update now',\n 'update.updating': 'Updating {name} to v{version}; this may take 1-2 minutes…',\n 'update.cooldownNotice': 'This user-initiated update bypasses pnpm\\'s 24-hour release cooldown (supply-chain protection) and installs the selected version immediately.',\n 'update.updatingTitle': 'Updating…',\n 'update.done': 'Update complete',\n 'update.doneDetail': 'All components are up to date.',\n 'update.restartHint': 'Restart dsh web for the new version to take effect: stop it with Ctrl+C in the terminal, then run dsh web again.',\n 'update.linkMode': 'Local development mode',\n 'update.linkModeDetail': 'dsh-web-ui is installed via a local link (development mode) and cannot be updated remotely. Latest npm release: {version}. Run git pull in the repository to update.',\n 'update.missing': 'dsh-web-ui not found',\n 'update.missingDetail': 'Could not locate the installed dsh-web-ui aggregate package. Install it with: dsh plugin --profile <profile> add @linxin666/dsh-web-ui-all',\n 'update.offline': 'Cannot reach the update source',\n 'update.offlineDetail': 'The network is unavailable or the update service is failing; try again later.',\n 'update.unmounted': 'The update service is not loaded',\n 'update.unmountedDetail': 'The running dsh web process loads a plugin build without the update service; restart dsh web (Ctrl+C, then run dsh web again) and retry.',\n 'update.error': 'Update failed',\n 'update.packages': 'Component versions',\n 'update.retry': 'Check again',\n 'update.close': 'Close update panel',\n 'update.error.pnpmMissing': 'pnpm was not found (tried pnpm / corepack / npx). Install pnpm and restart the app (Windows: npm install -g pnpm or corepack enable; macOS: brew install pnpm or corepack enable).',\n 'update.error.timeout': 'The update timed out and the install process was killed; try again.',\n 'update.error.notFound': 'The dsh-web-ui aggregate package is not installed; nothing to update.',\n 'update.error.link': 'Local development mode (link install) — automatic update is unavailable.',\n 'update.error.pnpmFailed': 'The update failed (pnpm exited with code {code}); see the output below.',\n 'update.error.stale': 'The update command ran but the installed versions did not change. Likely cause: the pnpm 11 minimumReleaseAge gate silently skips releases published less than 24 hours ago. Add minimumReleaseAgeExclude (e.g. \"@linxin666/*\") or set minimumReleaseAge: 0 in pnpm-workspace.yaml under the profile directory (~/.dsh/profiles/<profile>), then run the update again.',\n 'update.error.verifyFailed': 'The update command ran but the installed versions could not be verified afterwards (registry probe failed or the install path changed). Inspect the output below, or retry later.',\n 'update.error.unknown': 'Update failed; try again.',\n} satisfies Record<RemoteKey, string>\n","/**\n * Phone-side boot flow: the QR link's `pair` + `workspace` parameters.\n * Runs from the client apply on every page load, on any device:\n * - `pair` present → accept the token, then reload so the whole SPA boots\n * with the device cookie (the accept endpoint is exempt from the pairing\n * gate; every other /api request needs the cookie).\n * - `workspace` present (and paired) → deep-link: connect that workspace's\n * session and open it, then strip the parameter.\n * Failure of accept leaves a sessionStorage marker the entry renders as a\n * one-time notice.\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { WorkspaceId } from '@deepseek-ai/dsh-client-runtime/client'\nimport { acceptPair, readPairParams } from './pair-api.ts'\n\n/** sessionStorage key for the failed-pair notice. */\nexport const PAIR_FAILED_MARKER = 'dsh-remote-pair-failed'\n\n/** Poll budget for the runtime services (activation order is unconstrained). */\nconst SERVICE_WAIT_MS = 10_000\n\n/**\n * The page-navigation surface the boot flow drives. Browser pages use the\n * default (window.location/history); tests inject a fake.\n */\nexport interface PageSurface {\n /** The current page URL (read fresh on each access). */\n href: string\n /** Replace the URL without reloading. */\n replaceState(url: string): void\n /** Navigate to a URL (a fresh page load). */\n navigate(url: string): void\n /** Reload the page. */\n reload(): void\n}\n\n/** The browser implementation of {@link PageSurface}. */\nexport const browserPage: PageSurface = {\n get href(): string {\n return window.location.href\n },\n replaceState(url: string): void {\n window.history.replaceState(null, '', url)\n },\n navigate(url: string): void {\n window.location.assign(url)\n },\n reload(): void {\n window.location.reload()\n },\n}\n\n/** Whether this browser looks like a phone/tablet (the simplified mobile surface). */\nexport function isMobileSurface(): boolean {\n if (typeof navigator === 'undefined') return false\n return /Android|iPhone|iPad|iPod|Mobile|mobile/i.test(navigator.userAgent)\n}\n\n/**\n * Run the pair/workspace boot flow for this page load.\n * @param ctx - client root context (workspaces/sessions read at need time).\n * @param search - the current location.search.\n * @param page - the page surface (defaults to the browser).\n */\nexport function runPairBootFlow(ctx: Context, search: string, page: PageSurface = browserPage): void {\n const params = readPairParams(search)\n if (params.pair !== undefined) {\n void runAccept(params.pair, page)\n return\n }\n if (params.workspace !== undefined) {\n void runDeepLink(ctx, params.workspace, page)\n }\n}\n\n/** Accept the token, then enter the matching desktop/mobile surface. */\nasync function runAccept(token: string, page: PageSurface): Promise<void> {\n let ok = false\n try {\n const result = await acceptPair(token)\n ok = result.ok\n if (!ok) sessionStorage.setItem(PAIR_FAILED_MARKER, 'failed')\n } catch {\n sessionStorage.setItem(PAIR_FAILED_MARKER, 'failed')\n }\n // Drop the token from the URL either way: an accepted token is consumed\n // (a re-scan would 409), and a failed one must not loop.\n const url = new URL(page.href)\n url.searchParams.delete('pair')\n page.replaceState(`${url.pathname}${url.search}${url.hash}`)\n if (ok) {\n // Phones land on the standalone simplified surface (the full desktop UI\n // is not built for small screens). Keep the workspace target so the\n // mobile surface can open the intended workspace instead of losing the\n // QR context at this navigation boundary.\n if (isMobileSurface()) {\n url.pathname = '/m/'\n page.navigate(`${url.pathname}${url.search}${url.hash}`)\n } else {\n page.reload()\n }\n }\n}\n\n/**\n * Connect the deep-linked workspace and open its session. Waits for the\n * runtime services AND for the target workspace to appear in the workspace\n * list (both are asynchronous after boot), then connects and opens; gives\n * up silently within the budget — the workspace param is stripped either\n * way, so a late failure cannot loop.\n * @param ctx - client root context.\n * @param workspaceId - the target workspace.\n * @param page - the page surface.\n */\nasync function runDeepLink(ctx: Context, workspaceId: string, page: PageSurface): Promise<void> {\n const target = workspaceId as WorkspaceId\n const deadline = Date.now() + SERVICE_WAIT_MS\n while (Date.now() < deadline) {\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions') as { open(id: string): void } | undefined\n if (workspaces !== undefined && sessions !== undefined) {\n const items = workspaces.list.getSnapshot().items\n if (items.some(item => item.workspaceId === target)) {\n try {\n // Open unconditionally: a host-side \"current\" session may already\n // exist (multi-client mirroring), but the QR's workspace target is\n // explicit user intent and must win.\n const sessionId = await workspaces.connectWorkspace(target)\n sessions.open(sessionId)\n } catch {\n // Unknown workspace or a failed connect: fall through to the\n // runtime's own default initial selection.\n }\n break\n }\n }\n await new Promise(resolve => setTimeout(resolve, 200))\n }\n const url = new URL(page.href)\n url.searchParams.delete('workspace')\n page.replaceState(`${url.pathname}${url.search}${url.hash}`)\n}\n","/**\n * Mobile remote control — browser half. Registers the `remote` dictionaries,\n * the sidebar-foot entry (phone trigger + pairing panel) into the\n * ui-sidebar-declared `sidebar.remote` seat, and runs the phone-side boot\n * flow (pair accept + workspace deep-link + presence heartbeats) plus the\n * one-time failed-pair notice. Export discipline: packages/client/AGENTS.md\n * — the /client surface carries only what cordis loading needs plus types.\n */\nimport { createElement } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport type { ClientContext, SettingsScope, SettingsScopeSpec } from '@deepseek-ai/dsh-client-runtime/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale) and the\n// ui-sidebar SlotMap merge (the 'sidebar.remote' hole).\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the settings-surface SlotMap merge (the 'settings.section'\n// entry) and the ctx.settingsScope Context merge.\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'\nimport { FooterRemoteEntry } from './FooterRemoteEntry.tsx'\nimport { RemoteEntry } from './RemoteEntry.tsx'\nimport { PairFailedNotice } from './PairFailedNotice.tsx'\nimport { RemoteSettingsCard, RemoteSettingsCardController, type RemoteSettings } from './RemoteSettingsCard.tsx'\nimport { en, zh, type RemoteKey } from './locales.ts'\nimport { PAIR_FAILED_MARKER, runPairBootFlow } from './deep-link.ts'\nimport { sendHeartbeat } from './pair-api.ts'\n\nexport type { RemoteEntryProps } from './RemoteEntry.tsx'\nexport type { PanelState, RemotePanelProps } from './RemotePanel.tsx'\nexport type { PairFailedNoticeProps } from './PairFailedNotice.tsx'\nexport type { RemoteKey } from './locales.ts'\nexport type { RemoteSettingsCardFace, RemoteSettingsCardState } from './RemoteSettingsCard.tsx'\nexport type { UpdateEntryProps } from './UpdateEntry.tsx'\nexport type { UpdatePanelProps, UpdateView } from './UpdatePanel.tsx'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Mobile remote-control surface copy. */\n remote: RemoteKey\n }\n\n interface SlotMap {\n /**\n * The sidebar foot seat beside the settings trigger, declared by the\n * sidebar shell on deployments that carry the feature seat; the shell\n * passes only its column display state.\n */\n 'sidebar.remote': { kind: 'single'; scope: 'root'; owner: SidebarRemoteOwnerProps }\n /**\n * The child slot the Web UI plugin group declares; this card registers\n * into the group instead of the top-level `settings.plugin.item` list.\n * Spelled here with the same shape so this package can register without\n * depending on the sibling UI package.\n */\n 'web-ui.plugin.item': { kind: 'list'; scope: 'root'; owner: SettingsPluginItemOwnerProps }\n }\n}\n\n/** Owner share of the sidebar remote-control seat: the column display state the trigger renders against. */\nexport interface SidebarRemoteOwnerProps {\n /** Whether the sidebar renders wide content (false = 56px rail). */\n wide: boolean\n}\n\n/** Owner share of a plugin card (the section supplies nothing). */\nexport interface SettingsPluginItemOwnerProps {\n /** Marker field: card owner props are intentionally empty. */\n children?: never\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n /**\n * Optional rc.6 compatibility binder provided by dsh-web-ui-settings;\n * absent when that group plugin is not installed, so callers fall back to\n * the official settings scope.\n */\n webUiSettings?: { bind<S>(spec: SettingsScopeSpec<S>): SettingsScope<S> }\n }\n}\n\n\n/** Dictionary namespace owned by this plugin. */\nconst NS = 'remote'\n\n/** Settings namespace the remote-control card edits (the Host plugin registers it). */\nconst REMOTE_WEB_UI_NS = 'remote-web-ui'\n\n/** Heartbeat cadence from a paired phone (presence + revocation liveness). */\nconst HEARTBEAT_INTERVAL_MS = 10_000\n\n/** Services required by this plugin. */\nexport const inject = ['slots', 'locale', 'connection', 'settingsScope', 'remote']\n\n/**\n * Register the remote-control surface.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'remote-web-ui: dictionaries')\n\n const t = ctx.locale.bind(NS)\n const binder = ctx.get('webUiSettings') ?? ctx.settingsScope\n const settingsScope = binder.bind<RemoteSettings>({ namespace: REMOTE_WEB_UI_NS })\n const enabled = (): boolean => {\n const snapshot = settingsScope.getSnapshot()\n return snapshot.status === 'ready'\n ? snapshot.value?.enabled ?? true\n : snapshot.status === 'unavailable'\n }\n\n // Sidebar foot entry: the shell declares 'sidebar.remote' in unconstrained\n // order, so registration is declaration-aware — slots.inject waits on the\n // declaration, removes the contribution when it collapses, and re-runs\n // after a redeclaration. The entry follows the plugin's enabled setting:\n // toggling it off removes the trigger, toggling it back on re-registers it.\n ctx.slots.inject('sidebar.remote', () => {\n let disposeEntry: (() => void) | undefined\n const syncEntry = (): void => {\n if (enabled() && disposeEntry === undefined) {\n disposeEntry = ctx.slots.register({ name: 'sidebar.remote', locale: NS }, RemoteEntry)\n } else if (!enabled() && disposeEntry !== undefined) {\n disposeEntry()\n disposeEntry = undefined\n }\n }\n const unsubscribe = settingsScope.subscribe(syncEntry)\n syncEntry()\n return () => {\n unsubscribe()\n disposeEntry?.()\n }\n })\n\n // Current shells declare `sidebar.footer.action` instead of the legacy\n // `sidebar.remote` seat; this fallback registers the same entry there when\n // the legacy seat never arrives (declaration-aware: only one of the two\n // injects ever fires, so the trigger can never render twice).\n ctx.slots.inject('sidebar.footer.action', () => {\n let disposeEntry: (() => void) | undefined\n const syncEntry = (): void => {\n if (enabled() && disposeEntry === undefined) {\n disposeEntry = ctx.slots.register({ name: 'sidebar.footer.action', id: 'remote-web-ui', locale: NS }, FooterRemoteEntry)\n } else if (!enabled() && disposeEntry !== undefined) {\n disposeEntry()\n disposeEntry = undefined\n }\n }\n const unsubscribe = settingsScope.subscribe(syncEntry)\n syncEntry()\n return () => {\n unsubscribe()\n disposeEntry?.()\n }\n })\n\n // Plugin configuration card: one staged form over the `remote-web-ui`\n // settings namespace, contributed to the Web UI plugin group.\n const remoteSettings = new RemoteSettingsCardController(settingsScope)\n ctx.slots.inject('web-ui.plugin.item', () => {\n const unregister = ctx.slots.register({\n name: 'web-ui.plugin.item',\n id: 'remote-web-ui',\n order: 90,\n locale: NS,\n inject: () => remoteSettings.inject(),\n }, RemoteSettingsCard)\n return () => {\n remoteSettings.dispose()\n unregister()\n }\n })\n\n // Phone-side boot flow + heartbeats. Loopback pages (the desktop) never\n // heartbeat; the server ignores unpaired heartbeats anyway. Both run only\n // while the plugin is enabled.\n let disposeRuntime: (() => void) | undefined\n const syncRuntime = (): void => {\n if (enabled() && disposeRuntime === undefined) {\n disposeRuntime = ctx.effect(() => {\n const connection = ctx.get('connection') as ConnectionHandle | undefined\n const loopback = connection?.isLoopback ?? true\n runPairBootFlow(ctx, window.location.search)\n if (loopback) return () => {}\n const timer = window.setInterval(() => { void sendHeartbeat().catch(() => {}) }, HEARTBEAT_INTERVAL_MS)\n return () => { window.clearInterval(timer) }\n }, 'remote-web-ui: pair flow + heartbeats')\n } else if (!enabled() && disposeRuntime !== undefined) {\n disposeRuntime()\n disposeRuntime = undefined\n }\n }\n settingsScope.subscribe(syncRuntime)\n syncRuntime()\n\n // One-time failed-pair toast. The accept result lands asynchronously, so\n // the marker check is deferred past the accept round trip.\n ctx.effect(() => {\n const timer = window.setTimeout(() => {\n if (sessionStorage.getItem(PAIR_FAILED_MARKER) === null) return\n sessionStorage.removeItem(PAIR_FAILED_MARKER)\n const mount = document.createElement('div')\n document.body.appendChild(mount)\n const root = createRoot(mount)\n root.render(createElement(PairFailedNotice, { t }))\n // The toast owns its dismissal; the root lives for the page lifetime.\n void root\n }, 1500)\n return () => { window.clearTimeout(timer) }\n }, 'remote-web-ui: failed-pair notice')\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["React","css","IconCloseOutline16","IconStopFill16","IconRefreshOutline16","IconCopyOutline16","IconLinkOutline16","css","IconCloseOutline16","IconRefreshOutline16","css","IconDownloadOutline16","css","css","css"],"sources":["../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../node_modules/.pnpm/qrcode.react@4.2.0_react@18.3.1/node_modules/qrcode.react/lib/esm/index.js","../../../packages/dsh-remote-web-ui/src/client/pair-api.ts","../../../packages/dsh-remote-web-ui/src/client/RemotePanel.tsx","../../../packages/dsh-remote-web-ui/src/client/PhoneIcon.tsx","../../../packages/dsh-remote-web-ui/src/client/update-api.ts","../../../packages/dsh-remote-web-ui/src/client/UpdatePanel.tsx","../../../packages/dsh-remote-web-ui/src/client/UpdateEntry.tsx","../../../packages/dsh-remote-web-ui/src/client/RemoteEntry.tsx","../../../packages/dsh-remote-web-ui/src/client/FooterRemoteEntry.tsx","../../../packages/dsh-remote-web-ui/src/client/PairFailedNotice.tsx","../../../packages/dsh-remote-web-ui/src/client/PluginSettingsCard.tsx","../../../packages/dsh-remote-web-ui/src/client/settings-form.ts","../../../packages/dsh-remote-web-ui/src/client/RemoteSettingsCard.tsx","../../../packages/dsh-remote-web-ui/src/client/locales.ts","../../../packages/dsh-remote-web-ui/src/client/deep-link.ts","../../../packages/dsh-remote-web-ui/src/client/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n","/**\n * Browser-side wire helpers for the /api/pair surface. Plain fetch over\n * same-origin /api (like the connection client); JSON bodies, string\n * responses for the error codes.\n */\n\n/** issue() response. */\nexport interface IssueResult {\n ok: true\n url: string\n token: string\n expiresAt: number\n /** Every constructible LAN base address (interface order). */\n lanAddresses: string[]\n /** The configured public (tunneled) base URL, when present. */\n publicBaseUrl?: string\n}\n\n/** issue() refusal: the server is not LAN-reachable. */\nexport interface IssueLanRequired {\n ok: false\n code: 'lan-required'\n}\n\n/** issue() refusal: the requested LAN address is not constructible. */\nexport interface IssueUnknownAddress {\n ok: false\n code: 'unknown-address'\n}\n\n/** issue() refusal: the loopback-only fence rejected this origin. */\nexport interface IssueLoopbackRequired {\n ok: false\n code: 'forbidden'\n}\n\nexport type IssueResponse = IssueResult | IssueLanRequired | IssueUnknownAddress | IssueLoopbackRequired\n\n/** accept() refusal codes. */\nexport type AcceptFailure = { ok: false; code: 'invalid' | 'used' | 'forbidden' }\n\n/** One auto-tunnel status frame (absent while the feature is off). */\nexport interface TunnelStatusFrame {\n state: 'starting' | 'running' | 'failed'\n url?: string\n error?: string\n}\n\n/** One /api/pair/events frame. */\nexport interface PairStateFrame {\n type: 'state'\n phase: 'lan-required' | 'stopped' | 'waiting' | 'connected' | 'disconnected'\n lanAvailable: boolean\n tokenId?: string\n tokenExpiresAt?: number\n deviceCount: number\n onlineCount: number\n /** Auto-tunnel status, while the auto-tunnel feature is active. */\n tunnel?: TunnelStatusFrame\n}\n\n/**\n * Mint a fresh pairing token (one active token at a time — this invalidates\n * any previous link).\n * @param workspaceId - optional current workspace to deep-link the phone into.\n * @param address - optional LAN IP literal the QR must be built from (the\n * default is the first interface); unknown literals refuse with\n * 'unknown-address'.\n * @returns the issued link, the lan-required refusal (server never bound\n * 0.0.0.0), or the forbidden refusal (the loopback-only fence rejected this\n * origin — the panel is a desktop control endpoint).\n */\nexport async function issuePair(workspaceId?: string, address?: string): Promise<IssueResponse> {\n const response = await fetch('/api/pair/issue', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n ...(workspaceId !== undefined ? { workspaceId } : {}),\n ...(address !== undefined ? { address } : {}),\n }),\n })\n if (!response.ok) {\n if (response.status === 409) return { ok: false, code: 'lan-required' }\n if (response.status === 403) return { ok: false, code: 'forbidden' }\n if (response.status === 400) return { ok: false, code: 'unknown-address' }\n throw new Error(`remote-web-ui: issue failed with ${String(response.status)}`)\n }\n return await response.json() as IssueResult\n}\n\n/**\n * Accept a pairing token (the phone's first open of the QR link). Success\n * sets the device cookie; the page then reloads to boot with it.\n * @param token - the token from the URL.\n * @returns the wire result.\n */\nexport async function acceptPair(token: string): Promise<{ ok: true } | AcceptFailure> {\n const response = await fetch('/api/pair/accept', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ token }),\n })\n if (response.ok) return { ok: true }\n if (response.status === 404) return { ok: false, code: 'invalid' }\n if (response.status === 409) return { ok: false, code: 'used' }\n return { ok: false, code: 'forbidden' }\n}\n\n/** Revoke mobile access (paired devices + the current token). */\nexport async function stopPair(): Promise<void> {\n const response = await fetch('/api/pair/stop', { method: 'POST' })\n if (!response.ok) throw new Error(`remote-web-ui: stop failed with ${String(response.status)}`)\n}\n\n/** Presence heartbeat from a paired phone (unpaired heartbeats 401 harmlessly). */\nexport async function sendHeartbeat(): Promise<void> {\n await fetch('/api/pair/heartbeat', { method: 'POST' })\n}\n\n/** Whether the current page URL carries a pairing token / workspace target. */\nexport function readPairParams(search: string): { pair?: string; workspace?: string } {\n const params = new URLSearchParams(search)\n const pair = params.get('pair')\n const workspace = params.get('workspace')\n return {\n ...(pair !== null && pair !== '' ? { pair } : {}),\n ...(workspace !== null && workspace !== '' ? { workspace } : {}),\n }\n}\n\n/** Human-readable expiry clock, e.g. \"10:35\". */\nexport function formatClock(epochMs: number): string {\n const date = new Date(epochMs)\n const hours = String(date.getHours()).padStart(2, '0')\n const minutes = String(date.getMinutes()).padStart(2, '0')\n return `${hours}:${minutes}`\n}\n\n/**\n * Copy text to the clipboard with a fallback for insecure contexts\n * (plain-HTTP LAN origins lack navigator.clipboard).\n * @param text - the text to copy.\n * @returns whether the copy succeeded.\n */\nexport async function copyText(text: string): Promise<boolean> {\n if (typeof navigator !== 'undefined' && navigator.clipboard !== undefined) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n // fall through to the execCommand path\n }\n }\n try {\n const area = document.createElement('textarea')\n area.value = text\n area.style.position = 'fixed'\n area.style.opacity = '0'\n document.body.appendChild(area)\n area.select()\n const ok = document.execCommand('copy')\n area.remove()\n return ok\n } catch {\n return false\n }\n}\n","/**\n * The mobile remote-control panel body: status card (state text + badge),\n * the QR code, the open-on-phone hint with the link text, and the three\n * actions (stop / refresh / copy). Pure presentation — all state and\n * actions arrive through props from the entry's behavior component.\n */\nimport clsx from 'clsx'\nimport { QRCodeSVG } from 'qrcode.react'\nimport {\n IconCloseOutline16, IconCopyOutline16, IconLinkOutline16, IconRefreshOutline16, IconStopFill16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { PairingPhase } from '../pairing.ts'\nimport { formatClock, type TunnelStatusFrame } from './pair-api.ts'\nimport css from './remote.module.css'\n\n/** The panel's view state, owned by the entry component. */\nexport type PanelState =\n | { kind: 'lan-required'; tunnel?: TunnelStatusFrame }\n | { kind: 'loopback-required' }\n | { kind: 'unreachable' }\n | {\n kind: 'ready'\n url: string\n expiresAt: number\n expired: boolean\n phase: PairingPhase\n deviceCount: number\n onlineCount: number\n /** The LAN literal the current QR was built from. */\n address: string\n /** Every constructible LAN literal (interface order). */\n lanAddresses: string[]\n /** Whether this QR is built on the configured public (tunneled) base. */\n public: boolean\n /** The configured public (tunneled) base URL, when present. */\n publicBaseUrl?: string\n /** Auto-tunnel status, while the auto-tunnel feature is active. */\n tunnel?: TunnelStatusFrame\n }\n\n/** Full panel props: copy + view state + actions. */\nexport interface RemotePanelProps {\n t: TranslateNS<'remote'>\n state: PanelState\n copied: boolean\n onClose(): void\n onStop(): void\n onRefresh(): void\n onCopy(): void\n /** Re-mint the QR against a different LAN address. */\n onPickAddress(address: string): void\n /** Re-mint the QR against the configured public (tunneled) base. */\n onPickPublic(): void\n}\n\n/** Badge text + tone per phase (ready states only). */\nfunction statusOf(\n t: TranslateNS<'remote'>,\n state: Extract<PanelState, { kind: 'ready' }>,\n): { text: string; tone: 'waiting' | 'connected' | 'disconnected' | 'stopped' } {\n switch (state.phase) {\n case 'connected': return { text: t('status.connected', { n: state.onlineCount }), tone: 'connected' }\n case 'disconnected': return { text: t('status.disconnected'), tone: 'disconnected' }\n case 'stopped': return { text: t('status.stopped'), tone: 'stopped' }\n case 'lan-required': return { text: t('status.lanRequired'), tone: 'stopped' }\n case 'waiting': return { text: t('status.waiting'), tone: 'waiting' }\n }\n}\n\n/**\n * Render the pairing panel.\n * @param props - copy, state, and actions.\n * @returns the panel element tree.\n */\nexport function RemotePanel({ t, state, copied, onClose, onStop, onRefresh, onCopy, onPickAddress, onPickPublic }: RemotePanelProps) {\n return (\n <div className={css.panel} role=\"dialog\" aria-modal=\"true\" aria-label={t('title')}>\n <div className={css.header}>\n <div className={css.heading}>\n <h2 className={css.title}>{t('title')}</h2>\n <p className={css.subtitle}>{t('subtitle')}</p>\n </div>\n <button type=\"button\" className={css.close} aria-label={t('close.label')} onClick={onClose}>\n <IconCloseOutline16 size={14} />\n </button>\n </div>\n\n {state.kind === 'lan-required' ? (\n <div className={css.banner} role=\"alert\">\n <p className={css.bannerTitle}>{t('status.lanRequired')}</p>\n <p className={css.bannerHint}>{t('status.lanRequiredHint')}</p>\n </div>\n ) : state.kind === 'loopback-required' ? (\n <div className={css.banner} role=\"alert\">\n <p className={css.bannerTitle}>{t('status.loopbackRequired')}</p>\n <p className={css.bannerHint}>{t('status.loopbackRequiredHint')}</p>\n </div>\n ) : state.kind === 'unreachable' ? (\n <div className={css.banner} role=\"alert\">\n <p className={css.bannerTitle}>{t('status.unreachable')}</p>\n <p className={css.bannerHint}>{t('status.unreachableHint')}</p>\n </div>\n ) : (\n <>\n <div className={css.card}>\n <div className={css.cardHeader}>\n <span className={css.cardTitle}>{t('card.title')}</span>\n <span className={css.badges}>\n {state.public && <span className={clsx(css.badge, css.badgePublic)}>{t('public.badge')}</span>}\n <span className={clsx(css.badge, css[`badge-${statusOf(t, state).tone}`])}>\n {statusOf(t, state).text}\n </span>\n </span>\n </div>\n <div className={css.qrWrap} data-testid=\"remote-qr\">\n <QRCodeSVG value={state.url} size={184} level=\"M\" marginSize={1} className={css.qr} />\n </div>\n {state.expired\n ? <p className={css.expired}>{t('pair.expired')}</p>\n : <p className={css.expiry}>{t('pair.expires', { time: formatClock(state.expiresAt) })}</p>}\n </div>\n\n <p className={css.hint}>{state.public ? t('pair.publicHint') : t('pair.hint')}</p>\n <p className={css.link} title={state.url}>{state.url}</p>\n {state.phase === 'stopped' && <p className={css.stoppedHint}>{t('stopped.hint')}</p>}\n {state.tunnel !== undefined && state.tunnel.state !== 'running' && (\n <p className={state.tunnel.state === 'failed' ? css.tunnelFailed : css.tunnelNote} role=\"status\">\n {state.tunnel.state === 'failed'\n ? t('tunnel.failed', { error: state.tunnel.error ?? t('tunnel.unknownError') })\n : t('tunnel.starting')}\n </p>\n )}\n\n {(state.publicBaseUrl !== undefined || state.lanAddresses.length > 1) && (\n <fieldset className={css.addresses}>\n <legend>{t('address.label')}</legend>\n {state.publicBaseUrl !== undefined && (\n <label key=\"public\" className={css.address}>\n <input\n type=\"radio\"\n name=\"lan-address\"\n aria-label={t('address.public')}\n checked={state.public}\n onChange={onPickPublic}\n />\n <span>{t('address.public')}</span>\n <code className={css.addressValue}>{state.publicBaseUrl}</code>\n </label>\n )}\n {state.lanAddresses.map(address => (\n <label key={address} className={css.address}>\n <input\n type=\"radio\"\n name=\"lan-address\"\n aria-label={address}\n checked={!state.public && address === state.address}\n onChange={() => onPickAddress(address)}\n />\n <span>{t('address.lan')}</span>\n <code className={css.addressValue}>{address}</code>\n </label>\n ))}\n <p className={css.addressHint}>{t('address.hint')}</p>\n </fieldset>\n )}\n\n <div className={css.actions}>\n <button type=\"button\" className={css.action} onClick={onStop}>\n <IconStopFill16 size={14} />\n {t('action.stop')}\n </button>\n <button type=\"button\" className={css.action} onClick={onRefresh}>\n <IconRefreshOutline16 size={14} />\n {t('action.refresh')}\n </button>\n <button type=\"button\" className={css.action} onClick={onCopy}>\n {copied ? <IconCopyOutline16 size={14} /> : <IconLinkOutline16 size={14} />}\n {copied ? t('action.copied') : t('action.copy')}\n </button>\n </div>\n </>\n )}\n </div>\n )\n}\n","/**\n * Phone glyph for the sidebar remote-control trigger. Not part of the\n * shared icon set (ui-primitives has no phone icon); matches the outline\n * style with currentColor strokes.\n */\n\n/** Icon props mirroring ui-primitives' IconProps. */\nexport interface PhoneIconProps {\n /** Glyph size in px (default 16). */\n size?: number\n /** Extra class for layout placement. */\n className?: string\n}\n\n/**\n * Render the phone icon.\n * @param props - size and optional class.\n * @returns the svg element.\n */\nexport function PhoneIcon({ size = 16, className }: PhoneIconProps) {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.2 1.8h2.4l.9 2.4-1.5 1.1a7.4 7.4 0 0 0 4.7 4.7l1.1-1.5 2.4.9v2.4a.9.9 0 0 1-1 .9A11.4 11.4 0 0 1 3.3 2.8a.9.9 0 0 1 .9-1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","/**\n * Browser-side wire helpers for the /api/update surface. Plain fetch over\n * same-origin /api like the pairing client; the host half enforces the\n * loopback-only fence and owns the pnpm run.\n */\n\nimport type { UpdateRunResult, UpdateStatus } from '../update.ts'\n\n/**\n * Error thrown when the update status probe fails: carries the HTTP status\n * so the panel can tell \"the update route is not mounted\" (404 — the host\n * process runs an older plugin build) apart from real network failures.\n */\nexport class UpdateStatusError extends Error {\n /** HTTP status of the failed response (0 when the fetch never returned). */\n readonly status: number\n constructor(status: number) {\n super('update status unavailable (HTTP ' + String(status) + ')')\n this.status = status\n }\n}\n\n/**\n * Probe the update status: install mode, owning profile, and the\n * current-vs-latest comparison for every family package.\n * @returns the status snapshot.\n */\nexport async function fetchUpdateStatus(): Promise<UpdateStatus> {\n let response: Response\n try {\n response = await fetch('/api/update/status')\n } catch {\n // Network-level failure: nothing came back at all.\n throw new UpdateStatusError(0)\n }\n if (!response.ok) throw new UpdateStatusError(response.status)\n return await response.json() as UpdateStatus\n}\n\n/**\n * Run the update (pnpm update in the owning profile). Blocks until pnpm\n * exits — the panel shows an in-flight state meanwhile.\n * @returns the run outcome.\n */\nexport async function runUpdate(): Promise<UpdateRunResult> {\n const response = await fetch('/api/update/run', { method: 'POST' })\n if (!response.ok) throw new Error('update run unavailable')\n return await response.json() as UpdateRunResult\n}\n","/**\n * The update panel body: check progress, version comparison, the\n * auto-update in-flight state, and the outcome (restart hint on success,\n * translated failure on error). Pure presentation — all state arrives\n * through props from the entry behavior component.\n */\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport { IconCloseOutline16, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { UpdateRunResult, UpdateStatus } from '../update.ts'\nimport css from \"./remote.module.css\"\n\n/** The panel view state, owned by the entry component. */\nexport type UpdateView =\n | { kind: 'checking' }\n | { kind: 'result'; status: UpdateStatus }\n | { kind: 'updating'; status: UpdateStatus }\n | { kind: 'done'; result: UpdateRunResult }\n | { kind: 'error'; message: string; detail?: string }\n\n/** Full panel props: copy + view state + actions. */\nexport interface UpdatePanelProps {\n t: TranslateNS<'remote'>\n view: UpdateView\n onClose(): void\n /** Re-run the check from a terminal state. */\n onRecheck(): void\n /** Start the update from the result view (the confirmation step, #507). */\n onStartUpdate(status: UpdateStatus): void\n}\n\n/** The anchor package name (aggregate first) for copy purposes. */\nfunction anchorName(status: UpdateStatus | undefined): string | undefined {\n return status?.anchor ?? status?.packages[0]?.name\n}\n\n/** The latest npm release of the anchor, for reference copy. */\nfunction anchorLatest(status: UpdateStatus | undefined): string | undefined {\n return status?.packages[0]?.latest\n}\n\n/**\n * Render the update panel.\n * @param props - copy, view state, and actions.\n * @returns the panel element tree.\n */\nexport function UpdatePanel({ t, view, onClose, onRecheck, onStartUpdate }: UpdatePanelProps) {\n const status = view.kind === \"result\" || view.kind === \"updating\" ? view.status : undefined\n const title = view.kind === \"done\" && view.result.ok ? t(\"update.done\") : t(\"update.title\")\n const subtitle = subtitleOf(t, view)\n return (\n <div className={css.panel} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <div className={css.header}>\n <div className={css.heading}>\n <h2 className={css.title}>{title}</h2>\n {subtitle !== undefined && <p className={css.subtitle}>{subtitle}</p>}\n </div>\n <button type=\"button\" className={css.close} aria-label={t(\"update.close\")} onClick={onClose}>\n <IconCloseOutline16 />\n </button>\n </div>\n {view.kind === \"checking\" && <p className={css.updateStatus}>{t(\"update.checking\")}</p>}\n {view.kind === \"result\" && status !== undefined && <ResultBody t={t} status={status} />}\n {view.kind === \"result\" && status !== undefined && status.mode === \"npm\" && status.outdated && status.error === undefined && (\n <div className={css.updateActions}>\n <button type=\"button\" className={css.updateRetry} onClick={() => onStartUpdate(status)}>\n {t(\"update.start\")}\n </button>\n </div>\n )}\n {view.kind === \"updating\" && status !== undefined && (\n <div>\n <p className={css.updateStatus}>\n {t(\"update.updating\", { name: anchorName(status) ?? \"\", version: anchorLatest(status) ?? \"\" })}\n </p>\n <p className={css.updateDetail}>{t(\"update.cooldownNotice\")}</p>\n <PackageList status={status} />\n </div>\n )}\n {view.kind === \"done\" && <DoneBody t={t} result={view.result} />}\n {view.kind === \"error\" && (\n <div>\n <p className={css.updateError}>{view.message}</p>\n {view.detail !== undefined && <pre className={css.updateOutput}>{view.detail}</pre>}\n </div>\n )}\n {(view.kind === \"done\" || view.kind === \"error\") && (\n <div className={css.updateActions}>\n <button type=\"button\" className={css.updateRetry} onClick={onRecheck}>\n <IconRefreshOutline16 /> {t(\"update.retry\")}\n </button>\n </div>\n )}\n </div>\n )\n}\n\n/** The subtitle copy per view state (absent on plain results). */\nfunction subtitleOf(t: TranslateNS<\"remote\">, view: UpdateView): string | undefined {\n switch (view.kind) {\n case \"checking\":\n return t(\"update.checking\")\n case \"updating\":\n return t(\"update.updatingTitle\")\n case \"result\":\n return undefined\n case \"done\":\n return view.result.ok ? t(\"update.doneDetail\") : t(\"update.error\")\n case \"error\":\n // The error body below carries the message; no subtitle duplication.\n return undefined\n }\n}\n\n/** The checked result body: mode banner + version list. */\nfunction ResultBody({ t, status }: { t: TranslateNS<\"remote\">; status: UpdateStatus }) {\n const anchor = anchorName(status)\n const latest = anchorLatest(status)\n if (status.mode === \"link\") {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.linkMode\")}</p>\n <p className={css.updateDetail}>{t(\"update.linkModeDetail\", { version: latest ?? \"-\" })}</p>\n </div>\n )\n }\n if (status.mode === \"missing\") {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.missing\")}</p>\n <p className={css.updateDetail}>{t(\"update.missingDetail\")}</p>\n </div>\n )\n }\n if (status.error === \"registry-unreachable\") {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.offline\")}</p>\n <p className={css.updateDetail}>{t(\"update.offlineDetail\")}</p>\n </div>\n )\n }\n if (status.outdated) {\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.found\")}</p>\n <p className={css.updateDetail}>\n {anchor !== undefined ? t(\"update.foundDetail\", { name: anchor, version: latest ?? \"\" }) : \"\"}\n </p>\n <p className={css.updateDetail}>{t(\"update.cooldownNotice\")}</p>\n </div>\n )\n }\n return (\n <div>\n <p className={css.updateStatus}>{t(\"update.upToDate\")}</p>\n {anchor !== undefined && latest !== undefined && (\n <p className={css.updateDetail}>{t(\"update.upToDateDetail\", { name: anchor, version: latest })}</p>\n )}\n <PackageList status={status} />\n </div>\n )\n}\n\n/** The per-package current → latest comparison list. */\nfunction PackageList({ status }: { status: UpdateStatus }) {\n if (status.packages.length === 0) return null\n return (\n <ul className={css.updateList}>\n {status.packages.map(packageStatus => (\n <li key={packageStatus.name} className={css.updateListItem}>\n <span className={css.updateListName}>{packageStatus.name}</span>\n <span className={css.updateListVersions}>\n {packageStatus.current}\n {packageStatus.latest !== undefined && packageStatus.latest !== packageStatus.current && (\n <> → {packageStatus.latest}</>\n )}\n </span>\n </li>\n ))}\n </ul>\n )\n}\n\n/** The outcome body: success + restart hint, or the translated failure. */\nfunction DoneBody({ t, result }: { t: TranslateNS<\"remote\">; result: UpdateRunResult }) {\n if (result.ok) {\n // The title already reads \"Update complete\"; the body carries the details.\n return (\n <div>\n <p className={css.updateDetail}>{t(\"update.doneDetail\")}</p>\n <p className={css.updateDetail}>{t(\"update.restartHint\")}</p>\n </div>\n )\n }\n const message = errorMessageOf(t, result)\n return (\n <div>\n <p className={css.updateError}>{message}</p>\n {result.output.trim() !== \"\" && <pre className={css.updateOutput}>{result.output.trim()}</pre>}\n </div>\n )\n}\n\n/** Translate a structured failure code; fall back to the raw message. */\nfunction errorMessageOf(t: TranslateNS<\"remote\">, result: UpdateRunResult): string {\n switch (result.errorCode) {\n case \"pnpm-missing\": return t(\"update.error.pnpmMissing\")\n case \"timeout\": return t(\"update.error.timeout\")\n case \"not-found\": return t(\"update.error.notFound\")\n case \"link\": return t(\"update.error.link\")\n case \"pnpm-failed\": return t(\"update.error.pnpmFailed\", { code: String(result.exitCode ?? \"?\") })\n case \"stale\": return t(\"update.error.stale\")\n case \"verify-failed\": return t(\"update.error.verifyFailed\")\n default: return result.error ?? t(\"update.error.unknown\")\n }\n}\n","/**\n * The sidebar update seat: the download trigger beside the remote-control\n * trigger plus the update panel modal. Owns the flow — probe the registry\n * on open, show the result, and let the user start the update from the\n * result view (#507), then report the outcome (restart hint on success,\n * translated failure on error).\n * Component-local state per the client stack rules.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport { IconDownloadOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { UpdateStatus } from '../update.ts'\nimport { fetchUpdateStatus, runUpdate, UpdateStatusError } from \"./update-api.ts\"\nimport { UpdatePanel, type UpdateView } from \"./UpdatePanel.tsx\"\nimport css from \"./remote.module.css\"\n\n/** Entry props: the sidebar column state + the standard locale seat. */\nexport interface UpdateEntryProps {\n /** Whether the sidebar renders wide content (false = 56px rail). */\n wide: boolean\n t: TranslateNS<'remote'>\n}\n\n/**\n * Render the update trigger and panel.\n * @param props - column state and locale seat.\n * @returns the entry element tree.\n */\nexport function UpdateEntry({ wide, t }: UpdateEntryProps) {\n const [open, setOpen] = useState(false)\n const [view, setView] = useState<UpdateView>({ kind: \"checking\" })\n const [updateAvailable, setUpdateAvailable] = useState(false)\n const runToken = useRef(0)\n const availabilityToken = useRef(0)\n const mounted = useRef(false)\n\n const probeAvailability = useCallback(async (): Promise<void> => {\n const token = ++availabilityToken.current\n try {\n const status = await fetchUpdateStatus()\n if (token === availabilityToken.current) {\n setUpdateAvailable(status.mode === \"npm\" && status.outdated)\n }\n } catch {\n if (token === availabilityToken.current) setUpdateAvailable(false)\n }\n }, [])\n\n const check = useCallback(async (): Promise<void> => {\n const availabilityCheck = ++availabilityToken.current\n setView({ kind: \"checking\" })\n let status: UpdateStatus\n try {\n status = await fetchUpdateStatus()\n } catch (error) {\n if (availabilityCheck === availabilityToken.current) setUpdateAvailable(false)\n // HTTP 404: the update route is not mounted — the host process runs an\n // older plugin build (client refreshed, host did not). Restarting dsh\n // web loads the new plugin; a plain network failure gets the generic\n // offline copy instead of a misleading \"cannot reach update source\".\n if (error instanceof UpdateStatusError && error.status === 404) {\n setView({ kind: \"error\", message: t(\"update.unmounted\"), detail: t(\"update.unmountedDetail\") })\n return\n }\n setView({ kind: \"error\", message: t(\"update.offline\"), detail: t(\"update.offlineDetail\") })\n return\n }\n if (availabilityCheck === availabilityToken.current) {\n setUpdateAvailable(status.mode === \"npm\" && status.outdated)\n }\n if (status.error === \"registry-unreachable\") {\n setView({ kind: \"result\", status })\n return\n }\n // Checking never starts an update by itself (#507): the result view\n // carries the confirmation button that calls startUpdate.\n setView({ kind: \"result\", status })\n }, [t])\n\n const startUpdate = useCallback(async (status: UpdateStatus): Promise<void> => {\n if (status.mode !== \"npm\" || !status.outdated) return\n setView({ kind: \"updating\", status })\n const token = ++runToken.current\n try {\n const result = await runUpdate()\n if (result.ok && mounted.current) setUpdateAvailable(false)\n if (token !== runToken.current) return\n setView({ kind: \"done\", result })\n } catch {\n if (token !== runToken.current) return\n setView({ kind: \"error\", message: t(\"update.error\"), detail: t(\"update.offlineDetail\") })\n }\n }, [t])\n\n const openPanel = useCallback((): void => {\n setOpen(true)\n void check()\n }, [check])\n\n const closePanel = useCallback((): void => {\n runToken.current++\n setOpen(false)\n }, [])\n\n // Check once after mount without opening the panel or starting an update.\n useEffect(() => {\n mounted.current = true\n void probeAvailability()\n return () => {\n mounted.current = false\n runToken.current++\n availabilityToken.current++\n }\n }, [probeAvailability])\n\n const updateLabel = updateAvailable ? t(\"update.availableLabel\") : t(\"update.label\")\n\n return (\n <>\n <button\n type=\"button\"\n className={css.trigger}\n data-wide={wide ? undefined : \"rail\"}\n data-update-available={updateAvailable ? \"true\" : undefined}\n aria-label={updateLabel}\n title={updateLabel}\n onClick={openPanel}\n >\n <IconDownloadOutline16 size={wide ? 16 : 18} />\n </button>\n {open && createPortal((\n <div className={css.overlay} role=\"presentation\">\n <div className={css.mask} aria-hidden=\"true\" onClick={closePanel} />\n <UpdatePanel t={t} view={view} onClose={closePanel} onRecheck={() => { void check() }} onStartUpdate={(status) => { void startUpdate(status) }} />\n </div>\n ), document.body)}\n </>\n )\n}\n","/**\n * The sidebar remote-control seat: the update trigger plus the phone-icon\n * trigger beside the settings button, and the pairing panel modal. Owns the\n * panel behavior — token minting on open, the status SSE subscription,\n * stop/refresh/copy — and renders the pure {@link RemotePanel} body. The\n * update seat (the dsh-web-ui self-update flow) rides the same footer row,\n * rendered by {@link UpdateEntry}. Component-local state per the client\n * stack rules: nothing here survives remounts or crosses entries.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { PairingPhase } from '../pairing.ts'\nimport { RemotePanel, type PanelState } from './RemotePanel.tsx'\nimport { copyText, issuePair, stopPair, type IssueResponse, type PairStateFrame, type TunnelStatusFrame } from './pair-api.ts'\nimport { PhoneIcon } from './PhoneIcon.tsx'\nimport { UpdateEntry } from './UpdateEntry.tsx'\nimport css from './remote.module.css'\n\n/** Entry props: the sidebar column state + the standard locale seat. */\nexport type RemoteEntryProps = PropsRuntime<'sidebar.remote'> & PropsLocale<'remote'>\n\n/**\n * Apply one status frame onto the current state: the ready state mirrors\n * the full phase/device picture, while the lan-required banner only keeps\n * the auto-tunnel frame (the signal for the running re-issue).\n */\nfunction mergeFrame(state: PanelState, frame: PairStateFrame): PanelState {\n if (state.kind === 'lan-required') {\n return {\n ...state,\n ...(frame.tunnel !== undefined ? { tunnel: frame.tunnel } : {}),\n }\n }\n if (state.kind !== 'ready') return state\n return {\n ...state,\n phase: frame.phase,\n deviceCount: frame.deviceCount,\n onlineCount: frame.onlineCount,\n ...(frame.tunnel !== undefined ? { tunnel: frame.tunnel as TunnelStatusFrame } : {}),\n }\n}\n\n/**\n * Render the remote-control trigger and panel.\n * @param props - composed slot props (contract in this package).\n * @returns the entry element tree.\n */\nexport function RemoteEntry({ wide, useWorkspaces, t }: RemoteEntryProps) {\n const [open, setOpen] = useState(false)\n const [state, setState] = useState<PanelState>({ kind: 'lan-required' })\n // Latest-state mirror for the EventSource callback: transition detection\n // must live outside setState updaters (updaters may run twice and must be\n // pure), so mint decisions read this ref instead.\n const stateRef = useRef(state)\n useEffect(() => { stateRef.current = state }, [state])\n const [copied, setCopied] = useState(false)\n const eventSource = useRef<EventSource | undefined>(undefined)\n // Generation counter for the open flow: closing (or re-opening) the panel\n // bumps it, so an in-flight issue() that resolves after a close does not\n // spawn a stray EventSource.\n const openSeq = useRef(0)\n\n // The current workspace (the recent-workspace projection the shell's New\n // Session flow targets) — the deep-link target for the phone.\n const workspaceId = useWorkspaces(s => s.recentWorkspaceId)\n\n const closeEventSource = useCallback(() => {\n eventSource.current?.close()\n eventSource.current = undefined\n }, [])\n\n const mint = useCallback(async (address?: string): Promise<PanelState> => {\n let result: IssueResponse\n try {\n result = await issuePair(workspaceId, address)\n } catch {\n // Fetch/network failure: show an explicit state instead of silently\n // leaving the panel on its initial banner.\n return { kind: 'unreachable' }\n }\n if (!result.ok) {\n // 403 is the loopback-only fence refusing a LAN origin (the panel is a\n // desktop control endpoint); 409 means the server never bound 0.0.0.0;\n // 400 means the requested LAN literal is no longer constructible.\n if (result.code === 'forbidden') return { kind: 'loopback-required' }\n if (result.code === 'unknown-address') return { kind: 'unreachable' }\n return { kind: 'lan-required' }\n }\n const publicBaseUrl = result.publicBaseUrl\n return {\n kind: 'ready',\n url: result.url,\n expiresAt: result.expiresAt,\n expired: Date.now() > result.expiresAt,\n phase: 'waiting',\n deviceCount: 0,\n onlineCount: 0,\n // Whether this QR is built on the configured public (tunneled) base.\n public: publicBaseUrl !== undefined && result.url.startsWith(publicBaseUrl),\n ...(publicBaseUrl !== undefined ? { publicBaseUrl } : {}),\n // The issued URL names the requested (or default first) literal; the\n // public link has no LAN literal, so no radio row is selected then.\n address: address ?? result.lanAddresses[0] ?? '',\n lanAddresses: result.lanAddresses,\n }\n }, [workspaceId])\n\n const openPanel = useCallback(async (): Promise<void> => {\n const seq = ++openSeq.current\n setOpen(true)\n const next = await mint()\n // A close (or re-open) during the await invalidates this issue: skip the\n // state write and the stream so a panel closed mid-mint neither leaks an\n // EventSource nor resurrects a stale QR.\n if (seq !== openSeq.current) return\n setState(next)\n // Live status: the desktop panel mirrors the pairing service state. The\n // stream makes sense in the ready state and on the lan-required banner —\n // there the auto-tunnel may still be starting, and following its frames\n // lets the panel re-issue once it runs. The loopback-required and\n // unreachable origins are fenced out of the events endpoint, so opening\n // it there would just start a doomed reconnect loop.\n if (next.kind !== 'ready' && next.kind !== 'lan-required') return\n const source = new EventSource('/api/pair/events')\n eventSource.current = source\n source.onmessage = (event) => {\n try {\n const frame = JSON.parse(event.data as string) as PairStateFrame\n if (frame.type !== 'state') return\n // The auto-tunnel crossed into running while the panel sat on the\n // lan-required banner: re-issue so the server hands back a ready QR\n // built on the public base (only on the transition into running, to\n // avoid mint storms). Detected on the ref, outside the updater: an\n // updater may be invoked twice and must stay pure, so mint() cannot\n // run inside it.\n const previous = stateRef.current\n if (\n previous.kind === 'lan-required'\n && frame.tunnel?.state === 'running'\n && previous.tunnel?.state !== 'running'\n ) {\n void mint().then(setState)\n return\n }\n setState(current => mergeFrame(current, frame))\n } catch {\n // Malformed frames are dropped; the snapshot on open is authoritative.\n }\n }\n }, [mint])\n\n const closePanel = useCallback(() => {\n openSeq.current += 1\n closeEventSource()\n setOpen(false)\n }, [closeEventSource])\n\n // Expiry flip: one timeout per token lifetime (reset by refresh).\n useEffect(() => {\n if (state.kind !== 'ready') return\n if (state.expired) return\n const delay = state.expiresAt - Date.now()\n if (delay <= 0) {\n setState(previous => previous.kind === 'ready' ? { ...previous, expired: true } : previous)\n return\n }\n const timer = window.setTimeout(() => {\n setState(previous => previous.kind === 'ready' ? { ...previous, expired: true } : previous)\n }, delay)\n return () => { window.clearTimeout(timer) }\n }, [state])\n\n // Unmount safety: never leave the stream open.\n useEffect(() => closeEventSource, [closeEventSource])\n\n const handleStop = useCallback(() => {\n // A failed stop request is harmless: the optimistic phase flip below\n // keeps the UI honest, and the status stream confirms the stopped phase.\n void stopPair().catch(() => {})\n // Optimistic fallback; the status stream confirms with the stopped phase.\n setState(previous => previous.kind === 'ready' ? { ...previous, phase: 'stopped' as PairingPhase } : previous)\n }, [])\n\n const handleRefresh = useCallback(() => {\n void mint().then(setState)\n }, [mint])\n\n /** Re-mint against another LAN literal (multi-homed machines). */\n const handlePickAddress = useCallback((address: string) => {\n void mint(address).then(setState)\n }, [mint])\n\n /** Re-mint against the configured public (tunneled) base. */\n const handlePickPublic = useCallback(() => {\n void mint().then(setState)\n }, [mint])\n\n const handleCopy = useCallback(() => {\n if (state.kind !== 'ready') return\n void copyText(state.url).then((ok) => {\n if (!ok) return\n setCopied(true)\n window.setTimeout(() => { setCopied(false) }, 1500)\n })\n }, [state])\n\n return (\n <>\n <div className={css.entryRow} data-rail={wide ? undefined : 'rail'}>\n <UpdateEntry wide={wide} t={t} />\n <TooltipAnchor wide={wide} label={t('entry.label')} onClick={openPanel} />\n </div>\n {open && createPortal((\n <div className={css.overlay} role=\"presentation\">\n <div className={css.mask} aria-hidden=\"true\" onClick={closePanel} />\n <RemotePanel\n t={t}\n state={state}\n copied={copied}\n onClose={closePanel}\n onStop={handleStop}\n onRefresh={handleRefresh}\n onCopy={handleCopy}\n onPickAddress={handlePickAddress}\n onPickPublic={handlePickPublic}\n />\n </div>\n ), document.body)}\n </>\n )\n}\n\n/** The trigger: an icon-only control with a persistent accessible label. */\nfunction TooltipAnchor({ wide, label, onClick }: { wide: boolean; label: string; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n className={css.trigger}\n data-wide={wide ? 'wide' : 'rail'}\n aria-label={label}\n title={label}\n onClick={onClick}\n >\n <PhoneIcon size={wide ? 16 : 18} />\n </button>\n )\n}\n","/**\n * Sidebar footer-seat wrapper for the remote-control entry.\n *\n * Current dsh web shells declare `sidebar.footer.action` (the seat beside the\n * settings trigger) instead of the legacy `sidebar.remote` seat this plugin\n * was written against. The footer seat supplies `{ wide }` but not the\n * `useWorkspaces` projection hook, so this wrapper substitutes a\n * workspace-agnostic selector: pairing without a deep-linked workspace is\n * fully supported by the host `/api/pair` routes.\n */\nimport type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport { RemoteEntry } from './RemoteEntry.tsx'\n\n/** Entry props: the footer seat's column state + the standard locale seat. */\nexport type FooterRemoteEntryProps = PropsLocale<'remote'> & { wide: boolean }\n\n/**\n * Render the remote-control trigger + pairing panel from the footer seat.\n * @param props - composed slot props (footer seat subset).\n * @returns the entry element tree.\n */\nexport function FooterRemoteEntry(props: FooterRemoteEntryProps) {\n return (\n <RemoteEntry\n wide={props.wide}\n useWorkspaces={() => undefined as never}\n useSessions={() => undefined as never}\n t={props.t}\n />\n )\n}\n","/**\n * One-time failed-pairing notice: a fixed toast rendered on the phone after\n * a QR accept failed (invalid/used token or a network error). Mounted by\n * the client apply with a plain React root — no slot machinery for a\n * transient diagnostic.\n */\nimport { useEffect, useState } from 'react'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'\nimport css from './remote.module.css'\n\n/** Notice props: localized copy. */\nexport interface PairFailedNoticeProps {\n t: TranslateNS<'remote'>\n}\n\n/**\n * Render the failed-pair toast (auto-dismisses).\n * @param props - localized copy.\n * @returns the toast element.\n */\nexport function PairFailedNotice({ t }: PairFailedNoticeProps) { const [visible, setVisible] = useState(true)\n useEffect(() => {\n const timer = window.setTimeout(() => { setVisible(false) }, 8000)\n return () => { window.clearTimeout(timer) }\n }, [])\n if (!visible) return null\n return (\n <div className={css.notice} role=\"alert\">\n <p className={css.noticeTitle}>{t('pair.failed.title')}</p>\n <p className={css.noticeDetail}>{t('pair.failed.detail')}</p>\n </div>\n )\n}\n","// Generated by scripts/sync-shared.mjs from shared/client/settings/PluginSettingsCard.tsx. Do not edit this copy; edit the shared source and run \"node scripts/sync-shared.mjs\".\n/**\n * Family-shared chrome for plugin settings cards: a disclosure header naming\n * the plugin and what its settings govern, the controls inside, and the save\n * that writes them. Renders nothing while the namespace is unavailable — a\n * deployment that does not compose the owning plugin should show no trace of\n * it. Inlined into each consumer's client bundle; mirrors the official\n * ui-plugin-config PluginCard in a self-contained slice.\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode } from 'react'\nimport type { CardShell } from './settings-form.ts'\nimport css from './settings-card.module.css'\n\n/** Copy keys the card chrome itself reads; every consumer locale carries this shared vocabulary. */\nexport const CARD_COPY_KEYS = [\n 'settings.collapse',\n 'settings.expand',\n 'settings.notExposed',\n 'settings.unsaved',\n 'settings.readOnly',\n 'settings.saveFailed',\n 'settings.discard',\n 'settings.save',\n 'settings.saving',\n] as const\n\n/** Copy key the card chrome itself reads. */\nexport type CardCopyKey = (typeof CARD_COPY_KEYS)[number]\n\n/** Key domain for the plugin's own copy (inferred per consumer). */\nexport type SettingsCardKey<TKey extends string = string> = TKey | CardCopyKey\n\n/** Card chrome shared by every plugin settings card. */\nexport interface PluginSettingsCardProps<TKey extends string = string> {\n /** Locale reader for this card's copy. */\n t: (key: SettingsCardKey<TKey>, params?: Record<string, string | number>) => string\n /** Locale key of the plugin's name. */\n titleKey: TKey\n /** Locale key of the line describing what this plugin's settings govern. */\n descriptionKey: TKey\n /** The card's form state: availability, writability, and what a save would do. */\n state: CardShell\n /** Write every staged edit. */\n onSave: () => void\n /** Drop every staged edit. */\n onDiscard: () => void\n /**\n * Render the controls expanded on arrival (still collapsible). Defaults to\n * true: promoted first-level sections show their settings immediately.\n */\n defaultOpen?: boolean\n /**\n * Render without the collapse affordance: a static header and an always\n * visible body. Used by first-level settings sections whose nav entry\n * already provides the selection.\n */\n alwaysOpen?: boolean\n /**\n * Hide the save/discard footer: cards whose body applies its own changes\n * immediately (an embedded external settings section) have no staged\n * edits, so the footer would sit there permanently disabled.\n */\n hideFooter?: boolean\n /** The plugin's controls. */\n children: ReactNode\n}\n\n/**\n * Render one plugin settings card.\n * @param props - the plugin's copy keys, its form state, and its controls.\n * @returns the card, or nothing while the namespace is still loading.\n */\nexport function PluginSettingsCard<TKey extends string = string>(props: PluginSettingsCardProps<TKey>) {\n const [open, setOpen] = useState(props.defaultOpen ?? true)\n const { state, alwaysOpen } = props\n if (!state.available) return null\n const title = props.t(props.titleKey)\n const description = props.t(props.descriptionKey)\n const blocked = !state.dirty || state.invalid || state.saving\n const expanded = alwaysOpen === true || open\n const cardClass = expanded ? `${css.cardOpen} ${css.card}` : css.card\n // With alwaysOpen the nav entry already provides the selection, so the\n // header is a static title row instead of a disclosure button.\n const header = alwaysOpen === true\n ? (\n <div className={css.headerStatic}>\n <span className={css.headText}>\n <span className={css.name} title={title}>{title}</span>\n <span className={css.description} title={description}>{description}</span>\n </span>\n {state.dirty ? <span className={css.pending} title={props.t('settings.unsaved')}>{props.t('settings.unsaved')}</span> : null}\n </div>\n )\n : (\n <button\n type=\"button\"\n className={css.header}\n aria-expanded={open}\n aria-label={`${props.t(open ? 'settings.collapse' : 'settings.expand')}: ${title}`}\n onClick={() => { setOpen(!open) }}\n >\n <span className={css.headText}>\n <span className={css.name} title={title}>{title}</span>\n <span className={css.description} title={description}>{description}</span>\n </span>\n {state.dirty ? <span className={css.pending} title={props.t('settings.unsaved')}>{props.t('settings.unsaved')}</span> : null}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={open ? `${css.chevron} ${css.chevronOpen}` : css.chevron}\n >\n <path\n d=\"M11.8486 5.5L11.4238 5.92383L8.69727 8.65137C8.44157 8.90706 8.21562 9.13382 8.01172 9.29785C7.79912 9.46883 7.55595 9.61756 7.25 9.66602C7.08435 9.69222 6.91565 9.69222 6.75 9.66602C6.44405 9.61756 6.20088 9.46883 5.98828 9.29785C5.78438 9.13382 5.55843 8.90706 5.30273 8.65137L2.57617 5.92383L2.15137 5.5L3 4.65137L3.42383 5.07617L6.15137 7.80273C6.42595 8.07732 6.59876 8.24849 6.74023 8.3623C6.87291 8.46904 6.92272 8.47813 6.9375 8.48047C6.97895 8.48703 7.02105 8.48703 7.0625 8.48047C7.07728 8.47813 7.12709 8.46904 7.25977 8.3623C7.40124 8.24849 7.57405 8.07732 7.84863 7.80273L10.5762 5.07617L11 4.65137L11.8486 5.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n )\n // The namespace exists but the Host does not serve it to this client (the\n // official settings allowlist omits third-party namespaces): show a card\n // that explains the gap instead of vanishing, so a missing card never\n // reads as a missing plugin.\n if (!state.exposed) {\n return (\n <li className={cardClass}>\n {header}\n {expanded\n ? (\n <div className={css.body}>\n <p className={css.notExposed} role=\"status\">{props.t('settings.notExposed')}</p>\n </div>\n )\n : null}\n </li>\n )\n }\n return (\n <li className={cardClass}>\n {header}\n {expanded\n ? (\n <div className={css.body}>\n {!state.writable ? <p className={css.readOnly} role=\"status\">{props.t('settings.readOnly')}</p> : null}\n {props.children}\n {props.hideFooter === true\n ? null\n : (\n <div className={css.footer}>\n {state.failed\n ? (\n <p className={css.failed} role=\"status\">\n {props.t('settings.saveFailed')}{state.failedReason ? ' - ' + state.failedReason : ''}\n </p>\n )\n : null}\n <button\n type=\"button\"\n className={css.discard}\n disabled={!state.dirty || state.saving}\n onClick={props.onDiscard}\n >\n {props.t('settings.discard')}\n </button>\n <button\n type=\"button\"\n className={css.save}\n disabled={blocked}\n onClick={props.onSave}\n >\n {props.t(!state.saving ? 'settings.save' : 'settings.saving')}\n </button>\n </div>\n )}\n </div>\n )\n : null}\n </li>\n )\n}\n\n/** Props every field control needs regardless of its value type. */\nexport interface FieldProps {\n /** Stable id associating the label with its control. */\n id: string\n /** Visible label. */\n label: string\n /** One-line explanation rendered under the control. */\n hint: string\n /** Draft text this control renders. */\n text: string\n /** True when saving would leave a user-layer entry for this field. */\n overridden: boolean\n /** True when the draft is not a value this field accepts. */\n invalid: boolean\n /** Copy for the overridden badge. */\n overriddenLabel: string\n /** Copy for the reset control. */\n resetLabel: string\n /** Copy shown in place of the hint while the draft is invalid. */\n invalidLabel: string\n /** Disables every control (read-only document, or an unavailable namespace). */\n disabled: boolean\n /** Stage draft text. */\n onEdit: (text: string) => void\n /** Stage a clear so the field re-inherits the composition layer. */\n onReset: () => void\n}\n\n/** A staged value field. `numeric` only hints the keypad: which drafts a field accepts is decided by its spec. */\nexport function ValueField(props: FieldProps & {\n /** Hints a numeric keypad without narrowing what the control accepts. */\n numeric?: boolean\n /** Placeholder shown while the draft is empty. */\n placeholder?: string\n}) {\n return (\n <div className={css.field}>\n <div className={css.head}>\n <label className={css.label} htmlFor={props.id}>{props.label}</label>\n {props.overridden\n ? (\n <span className={css.badges}>\n <span className={css.badge}>{props.overriddenLabel}</span>\n <button\n type=\"button\"\n className={css.reset}\n disabled={props.disabled}\n onClick={props.onReset}\n >\n {props.resetLabel}\n </button>\n </span>\n )\n : null}\n </div>\n <input\n id={props.id}\n className={props.invalid ? css.inputInvalid : css.input}\n type=\"text\"\n {...props.numeric === true ? { inputMode: 'numeric' as const } : {}}\n {...props.invalid ? { 'aria-invalid': true } : {}}\n value={props.text}\n placeholder={props.placeholder ?? ''}\n disabled={props.disabled}\n onChange={(event) => { props.onEdit(event.target.value) }}\n />\n <p className={props.invalid ? css.invalid : css.hint}>\n {props.invalid ? props.invalidLabel : props.hint}\n </p>\n </div>\n )\n}\n\nconst NON_SKIN_BODY_MARKERS = new Set(['dshSkinCenter', 'dshSidebarCollapsed'])\n// 检测使用使用皮肤,用了皮肤退回原生select样式,防止样式冲突。默认外观下使用优化后的select样式。\nfunction isSkinActive(): boolean {\n const datasetList = Object.keys(document.body.dataset)\n const isActive = datasetList.some(key => key.startsWith('dsh') && !NON_SKIN_BODY_MARKERS.has(key))\n return isActive\n}\n\ninterface SelectOption {\n value: string\n label: string\n}\n\nconst SELECT_CLOSE_MS = 100\n\n/**\n * The shared dual-mode select control. While an appearance skin is active it\n * renders the legacy native `<select>` untouched, so element-level skin\n * selectors keep working; under the default appearance it renders a\n * self-drawn `role=\"listbox\"` popup whose open/close is transition-animated.\n * Staged cards reach it through BooleanField/ChoiceField; immediate-apply\n * editors (the side-card prefs) bind it directly through onEdit.\n * 双模式下拉框:皮肤激活时用原生 select,默认外观用自绘动画弹层。\n */\nexport function SelectField(props: {\n id: string\n options: ReadonlyArray<SelectOption>\n value: string\n disabled: boolean\n invalid: boolean\n onEdit: (text: string) => void\n}) {\n const { id, options, value } = props\n const [open, setOpen] = useState(false)\n const [closing, setClosing] = useState(false)\n const [phase, setPhase] = useState<'initial' | 'open'>('initial')\n const [activeIndex, setActiveIndex] = useState(0)\n const closeTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const wrapRef = useRef<HTMLDivElement | null>(null)\n const popupRef = useRef<HTMLDivElement | null>(null)\n\n const currentIndex = () => {\n const index = options.findIndex(option => option.value === value)\n return index >= 0 ? index : 0\n }\n\n const close = useCallback(() => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n setClosing(true)\n closeTimer.current = setTimeout(() => {\n setClosing(false)\n setOpen(false)\n }, SELECT_CLOSE_MS)\n }, [])\n\n const openPopup = () => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n setActiveIndex(currentIndex())\n setPhase('initial')\n setClosing(false)\n setOpen(true)\n }\n\n const commit = (index: number) => {\n const option = options[index]\n if (option) props.onEdit(option.value)\n close()\n }\n\n const onTriggerClick = () => {\n if (props.disabled) return\n if (open && !closing) close()\n else openPopup()\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (props.disabled) return\n const count = options.length\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!open) {\n openPopup()\n } else if (!closing) {\n if (event.key === 'ArrowDown') setActiveIndex(index => (index + 1) % count)\n else if (event.key === 'ArrowUp') setActiveIndex(index => (index - 1 + count) % count)\n else commit(activeIndex)\n }\n break\n case 'Escape':\n if (open) {\n event.preventDefault()\n event.stopPropagation()\n close()\n }\n break\n case 'Tab':\n if (open) close()\n break\n }\n }\n\n useEffect(() => () => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n }, [])\n useLayoutEffect(() => {\n if (open && !closing && phase === 'initial') {\n void popupRef.current?.offsetHeight\n setPhase('open')\n }\n }, [open, closing, phase])\n\n useEffect(() => {\n if (!open) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target\n if (target instanceof Node && !wrapRef.current?.contains(target)) close()\n }\n document.addEventListener('pointerdown', onPointerDown)\n return () => document.removeEventListener('pointerdown', onPointerDown)\n }, [open, close])\n\n useEffect(() => {\n if (props.disabled && open) close()\n }, [props.disabled, open, close])\n\n // 使用了皮肤则退回原生select样式防止样式冲突。\n if (isSkinActive()) {\n return (\n <select\n id={id}\n className={css.select}\n value={value}\n disabled={props.disabled}\n onChange={(event) => { props.onEdit(event.target.value) }}\n >\n {options.map(option => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n )\n }\n\n const label = options.find(option => option.value === value)?.label ?? ''\n const popupClass = closing\n ? `${css.selectPopup} ${css.selectPopupClose}`\n : phase === 'open'\n ? `${css.selectPopup} ${css.selectPopupOpen}`\n : css.selectPopup\n return (\n <div className={css.selectWrap} ref={wrapRef}>\n <button\n type=\"button\"\n id={id}\n className={`${css.select} ${css.selectButton}`}\n disabled={props.disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-activedescendant={open ? `${id}-o${activeIndex}` : undefined}\n aria-invalid={props.invalid || undefined}\n onClick={onTriggerClick}\n onKeyDown={onKeyDown}\n >\n <span className={css.selectLabel}>{label}</span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={open ? `${css.selectChevron} ${css.selectChevronOpen}` : css.selectChevron}\n aria-hidden=\"true\"\n >\n <path\n d=\"M11.8486 5.5L11.4238 5.92383L8.69727 8.65137C8.44157 8.90706 8.21562 9.13382 8.01172 9.29785C7.79912 9.46883 7.55595 9.61756 7.25 9.66602C7.08435 9.69222 6.91565 9.69222 6.75 9.66602C6.44405 9.61756 6.20088 9.46883 5.98828 9.29785C5.78438 9.13382 5.55843 8.90706 5.30273 8.65137L2.57617 5.92383L2.15137 5.5L3 4.65137L3.42383 5.07617L6.15137 7.80273C6.42595 8.07732 6.59876 8.24849 6.74023 8.3623C6.87291 8.46904 6.92272 8.47813 6.9375 8.48047C6.97895 8.48703 7.02105 8.48703 7.0625 8.48047C7.07728 8.47813 7.12709 8.46904 7.25977 8.3623C7.40124 8.24849 7.57405 8.07732 7.84863 7.80273L10.5762 5.07617L11 4.65137L11.8486 5.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n {open\n ? (\n <div className={popupClass} role=\"listbox\" ref={popupRef}>\n {options.map((option, index) => (\n <div\n key={option.value}\n id={`${id}-o${index}`}\n role=\"option\"\n aria-selected={option.value === value}\n className={`${css.selectOption}${option.value === value ? ` ${css.selectOptionSelected}` : ''}${index === activeIndex && !closing ? ` ${css.selectOptionActive}` : ''}`}\n onClick={() => { commit(index) }}\n >\n {option.label}\n </div>\n ))}\n </div>\n )\n : null}\n </div>\n )\n}\n\n/** A staged boolean field: 继承 / 开 / 关. */\nexport function BooleanField(props: FieldProps & {\n /** Copy for the inherit option. */\n inheritLabel: string\n /** Copy for the on option. */\n onLabel: string\n /** Copy for the off option. */\n offLabel: string\n}) {\n return (\n <div className={css.field}>\n <div className={css.head}>\n <label className={css.label} htmlFor={props.id}>{props.label}</label>\n {props.overridden\n ? (\n <span className={css.badges}>\n <span className={css.badge}>{props.overriddenLabel}</span>\n <button\n type=\"button\"\n className={css.reset}\n disabled={props.disabled}\n onClick={props.onReset}\n >\n {props.resetLabel}\n </button>\n </span>\n )\n : null}\n </div>\n <SelectField\n id={props.id}\n options={[\n { value: '', label: props.inheritLabel },\n { value: 'true', label: props.onLabel },\n { value: 'false', label: props.offLabel },\n ]}\n value={props.text}\n disabled={props.disabled}\n invalid={props.invalid}\n onEdit={props.onEdit}\n />\n <p className={css.hint}>{props.hint}</p>\n </div>\n )\n}\n\n/** A staged enumerated field rendered as a select. */\nexport function ChoiceField(props: FieldProps & {\n /** Copy for the inherit option (draft text is the empty string). */\n inheritLabel: string\n /** Choices rendered in order; `value` is the draft/stored text. */\n choices: ReadonlyArray<{ value: string; label: string }>\n}) {\n return (\n <div className={css.field}>\n <div className={css.head}>\n <label className={css.label} htmlFor={props.id}>{props.label}</label>\n {props.overridden\n ? (\n <span className={css.badges}>\n <span className={css.badge}>{props.overriddenLabel}</span>\n <button\n type=\"button\"\n className={css.reset}\n disabled={props.disabled}\n onClick={props.onReset}\n >\n {props.resetLabel}\n </button>\n </span>\n )\n : null}\n </div>\n <SelectField\n id={props.id}\n options={[{ value: '', label: props.inheritLabel }, ...props.choices]}\n value={props.text}\n disabled={props.disabled}\n invalid={props.invalid}\n onEdit={props.onEdit}\n />\n <p className={props.invalid ? css.invalid : css.hint}>\n {props.invalid ? props.invalidLabel : props.hint}\n </p>\n </div>\n )\n}\n","// Generated by scripts/sync-shared.mjs from shared/client/settings/settings-form.ts. Do not edit this copy; edit the shared source and run \"node scripts/sync-shared.mjs\".\n/**\n * Staged form model behind the plugin settings card. A card stages what the\n * user types and writes it only when they save — the settings write is a\n * durable, revision-fenced document mutation, so staging keeps what is on\n * screen exactly what a save would store. Family-shared slice inlined into\n * each plugin's client bundle; mirrors the official ui-plugin-config\n * card-store pattern.\n */\n\nimport type { SettingsScope, SettingsScopeSnapshot, SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport { createSnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\n\n/** The write one field's staged text performs when the card is saved. */\nexport type FieldWrite =\n | { kind: 'set'; value: unknown }\n | { kind: 'clear' }\n\n/** How one field converts between its stored value and its draft text. */\nexport interface FieldSpec {\n /** Field name inside the namespace section. */\n field: string\n /**\n * Whether the Host treats this field as a secret and redacts its value from\n * the read-back (role('secret') in the section schema). Redacted secrets are\n * never compared against the draft on save; the field lands when the scope\n * reports the write succeeded (its secret-set marker under the bridge), so\n * a successful secret save is not misreported as failed.\n */\n secret?: boolean\n /** Render a stored value as draft text; the empty string when the section carries none. */\n format: (value: unknown) => string\n /**\n * The write this draft text stages, or undefined when the text is not a\n * value this field accepts — which blocks the save rather than discarding it.\n */\n parse: (text: string) => FieldWrite | undefined\n}\n\n/** One field as the card renders it. */\nexport interface FieldState {\n /** Draft text the control renders. */\n text: string\n /** Whether saving would leave a user-layer entry for this field. */\n overridden: boolean\n /** Whether the draft is not a value this field accepts, which blocks saving. */\n invalid: boolean\n}\n\n/** Form state every plugin settings card shares. */\nexport interface CardShell {\n /** False while the namespace is still loading; the card renders nothing. */\n available: boolean\n /**\n * Whether the namespace is actually served to this client. False when the\n * Host deployment does not expose it (e.g. the official apiproxy settings\n * allowlist omits third-party namespaces): the card renders an explanation\n * instead of its form, so a missing namespace never looks like a missing\n * plugin.\n */\n exposed: boolean\n /** Whether the Host document accepts writes. */\n writable: boolean\n /** Whether the form holds edits that a save would write. */\n dirty: boolean\n /** Whether any staged draft is invalid, which blocks the save. */\n invalid: boolean\n /** Whether a save is crossing the wire. */\n saving: boolean\n /** Whether the last save did not land as staged; cleared by the next edit or save. */\n failed: boolean\n /**\n * The rejection code/message the Host returned for the last failed save,\n * surfaced next to the generic failure text. Undefined while no save has\n * failed (or the failure carried no server reason).\n */\n failedReason?: string\n}\n\n/** The write actions the card's slot entry injects. */\nexport interface CardActions {\n /** Stage draft text for one field. */\n edit: (field: string, text: string) => void\n /** Stage a clear, so saving lets the field re-inherit the composition layer. */\n resetField: (field: string) => void\n /** Write every staged edit, then re-seed from what the Host accepted. */\n save: () => void\n /** Drop every staged edit. */\n discard: () => void\n}\n\n/** One field's staged edit. */\ninterface StagedEdit {\n /** Draft text the control renders. */\n text: string\n /** True when this edit clears the field whatever text it shows. */\n clear: boolean\n}\n\n/** One staged edit resolved into the write a save performs. */\ninterface PlannedWrite {\n /** Field this entry writes. */\n field: string\n /** The durable write this entry performs, described for a batched scope. */\n op: BatchedWrite\n /** Perform the write and report whether the Host holds the staged value afterwards. */\n run: (() => Promise<boolean>) | undefined\n}\n\n/** One durable write a batched settings scope performs. */\nexport interface BatchedWrite {\n /** Field this entry writes. */\n field: string\n /** set stores a value; unset drops the leaf. */\n op: 'set' | 'unset'\n /** Value for op set (absent for unset). */\n value?: unknown\n}\n\n/** Per-field outcome of one batched scope write. */\nexport interface BatchedFieldResult {\n /** Field this entry writes. */\n field: string\n /** Whether the Host accepted this field's write (per the read-back view). */\n landed: boolean\n}\n\n/**\n * Result of a batched scope write. The bridge scope posts every planned write\n * in one /mutate so the Host validate hook judges baseURL+model together; a\n * batched refusal fails the whole save rather than per-field.\n */\nexport interface BatchResult {\n /** Whether the whole mutate was accepted. */\n ok: boolean\n /** Per-field success, in the request order (always present when ok). */\n fields: BatchedFieldResult[]\n /** Host rejection code (mutate refused). */\n code?: string\n /** Host rejection message (mutate refused). */\n message?: string\n}\n\n/** The optional batch surface the bridge scope adds over the SettingsScope contract. */\ninterface BatchedSettingsScope {\n /** Write every operation in one scope mutation, reporting per-field success. */\n mutate: (writes: BatchedWrite[]) => Promise<BatchResult>\n}\n\n/** Constraints a numeric field's accepted drafts must satisfy, mirroring the host schema. */\nexport interface NumberConstraints {\n /** The accepted value must be a whole number. */\n integer?: boolean\n /** The accepted value must be at least this. */\n min?: number\n}\n\n/** A whole- or decimal-number field. An empty draft clears the field; any other draft that is not a finite number within the constraints blocks the save. */\nexport function numberField(field: string, constraints: NumberConstraints = {}): FieldSpec {\n const { integer = false, min } = constraints\n return {\n field,\n format: value => typeof value === 'number' ? String(value) : '',\n parse: (text) => {\n const trimmed = text.trim()\n if (trimmed === '') return { kind: 'clear' }\n const parsed = Number(trimmed)\n if (!Number.isFinite(parsed)) return undefined\n if (integer && !Number.isInteger(parsed)) return undefined\n if (min !== undefined && parsed < min) return undefined\n return { kind: 'set', value: parsed }\n },\n }\n}\n\n/** A free-text field. An empty draft clears the field. */\nexport function textField(field: string): FieldSpec {\n return {\n field,\n format: value => typeof value === 'string' ? value : '',\n parse: (text) => {\n const trimmed = text.trim()\n return trimmed === '' ? { kind: 'clear' } : { kind: 'set', value: trimmed }\n },\n }\n}\n\n/**\n * A free-text field the Host treats as a secret and redacts from the read-back\n * (role('secret') in the section schema). The card still edits it like text,\n * but a save never compares the redacted value back and relies on the scope\n * reporting the write landed.\n */\nexport function secretField(field: string): FieldSpec {\n return { ...textField(field), secret: true }\n}\n\n/** A boolean field, edited through true/false draft text. */\nexport function booleanField(field: string): FieldSpec {\n return {\n field,\n format: value => typeof value === 'boolean' ? String(value) : '',\n parse: (text) => {\n const trimmed = text.trim()\n if (trimmed === '') return { kind: 'clear' }\n if (trimmed === 'true') return { kind: 'set', value: true }\n if (trimmed === 'false') return { kind: 'set', value: false }\n return undefined\n },\n }\n}\n\n/** An enumerated string field; only the listed choices are accepted. An empty draft clears the field. */\nexport function choiceField(field: string, choices: readonly string[]): FieldSpec {\n return {\n field,\n format: value => typeof value === 'string' && choices.includes(value) ? value : '',\n parse: (text) => {\n if (text === '') return { kind: 'clear' }\n return choices.includes(text) ? { kind: 'set', value: text } : undefined\n },\n }\n}\n\n/**\n * Stages one card's edits over one settings namespace and writes them on save.\n *\n * The Host is the only authority on whether a value was accepted — its\n * validators own the constraints no schema can express — so the outcome is\n * read back from the section rather than predicted here. A save that did not\n * land keeps its drafts, so the user can correct them instead of retyping.\n */\nexport class CardForm<T> {\n private readonly specs: Map<string, FieldSpec>\n private readonly staged = new Map<string, StagedEdit>()\n private readonly listeners = new Set<() => void>()\n /** The scope subscription installed in the constructor; released by dispose(). */\n private readonly disposeScope: () => void\n private disposed = false\n private saving = false\n private failed = false\n private failedReason: string | undefined\n\n /** @param scope - the bound settings scope for this card's namespace. */\n constructor(\n private readonly scope: SettingsScope<T>,\n specs: FieldSpec[],\n ) {\n this.specs = new Map(specs.map(spec => [spec.field, spec]))\n this.disposeScope = scope.subscribe(() => { this.publish() })\n }\n\n /**\n * Release the scope subscription and every bound store listener. The card\n * must call this on teardown; later calls are no-ops.\n */\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.disposeScope()\n this.listeners.clear()\n }\n\n /** Publish a projection of this form, rebuilt whenever the scope or a draft changes. */\n bind<S>(project: () => S): SnapshotStore<S> {\n const store = createSnapshotStore(project())\n this.listeners.add(() => { store.set(project()) })\n return store\n }\n\n /** Read the card-level state: what the Host serves, and what a save would do. */\n shell(): CardShell {\n const snapshot = this.scope.getSnapshot()\n const plan = this.plan()\n return {\n available: snapshot.status !== 'loading',\n exposed: snapshot.status === 'ready',\n writable: snapshot.writable,\n dirty: plan.length > 0,\n invalid: plan.some(item => item.run === undefined),\n saving: this.saving,\n failed: this.failed,\n ...this.failedReason === undefined ? {} : { failedReason: this.failedReason },\n }\n }\n\n /** Read one field's state from the effective section and its staged draft. */\n field(field: string): FieldState {\n const spec = this.specOf(field)\n const staged = this.staged.get(field)\n if (staged === undefined) {\n return { text: spec.format(this.sectionValue(field)), overridden: this.stored(field), invalid: false }\n }\n const write = staged.clear ? { kind: 'clear' as const } : spec.parse(staged.text)\n return {\n text: staged.text,\n overridden: write?.kind === 'set',\n invalid: write === undefined,\n }\n }\n\n /** The actions the card's slot registration injects. */\n actions(): CardActions {\n return {\n edit: (field, text) => { this.stage(field, { text, clear: false }) },\n resetField: (field) => {\n this.stage(field, { text: this.specOf(field).format(this.baseValue(field)), clear: true })\n },\n save: () => { void this.save() },\n discard: () => {\n if (this.staged.size === 0 && !this.failed) return\n this.staged.clear()\n this.failed = false\n this.failedReason = undefined\n this.publish()\n },\n }\n }\n\n /**\n * Write every staged edit, then re-seed from what the Host accepted.\n *\n * When the scope carries the optional batch surface (the dsh-web-ui\n * bridge scope), every planned write rides one mutation so cross-field\n * validate hooks (baseURL+model) judge the batch as a unit instead of\n * deadlocking on per-field writes. Otherwise the per-field loop runs.\n * A field lands only when the Host reports it held the staged value; a\n * landed field's draft is dropped, a failed one stays staged for the user.\n * @returns settlement after every write and the read-back.\n */\n async save(): Promise<void> {\n const plan = this.plan()\n const valid = plan.filter(item => item.run !== undefined)\n if (plan.length === 0 || this.saving || valid.length !== plan.length) return\n const plannedWrites = valid.map(item => item.op)\n // Snapshot the staged entries this save writes, so an edit staged while it\n // is in flight (which replaces the same key) survives: only delete the key\n // when the entry is still the one this save started from.\n const pending = new Map<string, StagedEdit | undefined>()\n for (const item of plan) pending.set(item.field, this.staged.get(item.field))\n this.saving = true\n this.failed = false\n this.failedReason = undefined\n this.publish()\n const landed = new Set<string>()\n const batch = this.batchedScope()\n if (batch !== undefined) {\n const result = await batch.mutate(plannedWrites)\n if (result.ok) {\n for (const field of result.fields) {\n if (field.landed) landed.add(field.field)\n }\n } else {\n this.failedReason = result.message\n }\n } else {\n for (const item of valid) {\n if (await item.run!()) landed.add(item.field)\n }\n }\n for (const [field, before] of pending) {\n if (landed.has(field) && this.staged.get(field) === before) this.staged.delete(field)\n }\n this.saving = false\n this.failed = landed.size !== pending.size\n this.publish()\n }\n\n /** The scope's batch surface when it supports one; undefined conservatively otherwise. */\n private batchedScope(): BatchedSettingsScope | undefined {\n const candidate = this.scope as unknown as BatchedSettingsScope | undefined\n return typeof candidate?.mutate === 'function' ? candidate : undefined\n }\n\n /**\n * Every staged edit a save would write. An entry whose draft is not a value\n * its field accepts carries no write: the form is still dirty, and the save\n * refuses rather than dropping the edit. A staged edit that matches the\n * effective section is not a write at all.\n * @returns the planned writes, in the order the fields were staged.\n */\n private plan(): PlannedWrite[] {\n const plan: PlannedWrite[] = []\n for (const [field, staged] of this.staged) {\n const spec = this.specOf(field)\n if (staged.clear) {\n if (this.stored(field)) plan.push({ field, op: { field, op: 'unset' }, run: () => this.clear(field) })\n continue\n }\n if (staged.text === spec.format(this.sectionValue(field))) continue\n const write = spec.parse(staged.text)\n if (write === undefined) plan.push({ field, op: { field, op: 'unset' }, run: undefined })\n else if (write.kind === 'clear') plan.push({ field, op: { field, op: 'unset' }, run: () => this.clear(field) })\n else plan.push({ field, op: { field, op: 'set', value: write.value }, run: () => this.store(field, write.value) })\n }\n return plan\n }\n\n private async clear(field: string): Promise<boolean> {\n await this.scope.unset(field)\n return !this.stored(field)\n }\n\n private async store(field: string, value: unknown): Promise<boolean> {\n await this.scope.set(field, value)\n // A redacted secret never appears in the user layer read-back; judging it\n // by value would misreport a successful secret save as failed. The bridge\n // reports secret writes through its secret-set markers (batch path); on\n // the per-field path the scope resolved, so the write is landed.\n if (this.specOf(field).secret) return true\n return this.userLayer()?.[field] === value\n }\n\n private stage(field: string, edit: StagedEdit): void {\n this.staged.set(field, edit)\n this.failed = false\n this.failedReason = undefined\n this.publish()\n }\n\n private specOf(field: string): FieldSpec {\n const spec = this.specs.get(field)\n // Every call site names a field this card declared; a missing one is a\n // wiring mistake that must not degrade into a silently inert control.\n if (spec === undefined) throw new Error(`settings card has no field ${field}`)\n return spec\n }\n\n private snapshotOf(): SettingsScopeSnapshot<T> {\n return this.scope.getSnapshot()\n }\n\n private sectionValue(field: string): unknown {\n return (this.snapshotOf().value as Record<string, unknown> | undefined)?.[field]\n }\n\n private baseValue(field: string): unknown {\n return (this.snapshotOf().base as Record<string, unknown> | undefined)?.[field]\n }\n\n private userLayer(): Record<string, unknown> | undefined {\n return this.snapshotOf().user as Record<string, unknown> | undefined\n }\n\n private stored(field: string): boolean {\n const user = this.userLayer()\n return user !== undefined && Object.hasOwn(user, field)\n }\n\n private publish(): void {\n for (const listener of this.listeners) listener()\n }\n}\n","/**\n * The remote-control settings card: pairing security and device limits.\n * Registers into the `web-ui.plugin.item` child slot the Web UI plugin group\n * renders, bound to the `remote-web-ui` settings namespace.\n */\n\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SettingsScope, SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport { PluginSettingsCard, ValueField, BooleanField } from './PluginSettingsCard.tsx'\nimport { CardForm, booleanField, numberField, textField, type CardActions, type CardShell, type FieldState as CardFieldState } from './settings-form.ts'\n\n/** The remote-control fields this card edits (the namespace's full schema). */\nexport interface RemoteSettings {\n /** Master switch for the plugin. */\n enabled?: boolean\n /** Token lifetime in ms; the QR link dies after this. */\n tokenTtlMs?: number\n /** A device is \"online\" while its lastSeenAt is newer than this (ms). */\n offlineAfterMs?: number\n /** Hard cap on paired device sessions (oldest evicted when full). */\n maxDevices?: number\n /** Cookie name carrying the paired device id. */\n cookieName?: string\n /** Fence flag: whether non-loopback /api requests must carry a live paired-device cookie. */\n requirePairingForLan?: boolean\n /** Public (tunneled) base URL the QR link is built from when set. */\n publicBaseUrl?: string\n /** When on, the plugin runs its own Cloudflare quick tunnel automatically. */\n autoTunnel?: boolean\n /** Mobile composer: plain Enter sends; off means Enter inserts a newline. */\n mobileEnterToSend?: boolean\n}\n\n/** What the remote-control card renders. */\nexport interface RemoteSettingsCardState extends CardShell {\n /** Master switch. */\n enabled: CardFieldState\n /** Token lifetime. */\n tokenTtlMs: CardFieldState\n /** Device offline threshold. */\n offlineAfterMs: CardFieldState\n /** Paired-device cap. */\n maxDevices: CardFieldState\n /** Device cookie name. */\n cookieName: CardFieldState\n /** LAN fence flag. */\n requirePairingForLan: CardFieldState\n /** Public (tunneled) base URL. */\n publicBaseUrl: CardFieldState\n /** Auto public tunnel switch. */\n autoTunnel: CardFieldState\n /** Mobile composer Enter-to-send switch. */\n mobileEnterToSend: CardFieldState\n}\n\n/** The registration-side face the card's slot entry injects. */\nexport interface RemoteSettingsCardFace extends CardActions {\n hooks: {\n /** Card snapshot bound by the renderer as useRemoteSettingsCard. */\n remoteSettingsCard: SnapshotStore<RemoteSettingsCardState>\n }\n}\n\n/** Bridges the `remote-web-ui` scope onto the card's staged form. */\nexport class RemoteSettingsCardController {\n private readonly form: CardForm<RemoteSettings>\n private readonly store: SnapshotStore<RemoteSettingsCardState>\n\n /** @param scope - the bound settings scope for the `remote-web-ui` namespace. */\n constructor(scope: SettingsScope<RemoteSettings>) {\n this.form = new CardForm(scope, [\n booleanField('enabled'),\n numberField('tokenTtlMs'),\n numberField('offlineAfterMs'),\n numberField('maxDevices'),\n textField('cookieName'),\n booleanField('requirePairingForLan'),\n textField('publicBaseUrl'),\n booleanField('autoTunnel'),\n booleanField('mobileEnterToSend'),\n ])\n this.store = this.form.bind(() => this.projection())\n }\n\n private projection(): RemoteSettingsCardState {\n return {\n ...this.form.shell(),\n enabled: this.form.field('enabled'),\n tokenTtlMs: this.form.field('tokenTtlMs'),\n offlineAfterMs: this.form.field('offlineAfterMs'),\n maxDevices: this.form.field('maxDevices'),\n cookieName: this.form.field('cookieName'),\n requirePairingForLan: this.form.field('requirePairingForLan'),\n publicBaseUrl: this.form.field('publicBaseUrl'),\n autoTunnel: this.form.field('autoTunnel'),\n mobileEnterToSend: this.form.field('mobileEnterToSend'),\n }\n }\n\n /**\n * Build the face the card's slot registration injects.\n * @returns the card's snapshot and its form actions.\n */\n inject(): RemoteSettingsCardFace {\n return { hooks: { remoteSettingsCard: this.store }, ...this.form.actions() }\n }\n\n /**\n * Release the card's scope subscription and bound stores; the slot\n * disposer calls this on teardown.\n */\n dispose(): void {\n this.form.dispose()\n }\n}\n\n/** Props the renderer binds for the remote-control card. */\nexport type RemoteSettingsCardProps =\n PropsRuntime<'web-ui.plugin.item'>\n & PropsLocale<'remote'>\n & InjectFace<RemoteSettingsCardFace>\n\n/**\n * Render the remote-control card.\n * @param props - locale copy, the card snapshot, and its form actions.\n * @returns the card.\n */\nexport function RemoteSettingsCard(props: RemoteSettingsCardProps) {\n const { t } = props\n const state = props.useRemoteSettingsCard(snapshot => snapshot)\n const disabled = !state.writable\n const fieldProps = {\n overriddenLabel: t('settings.overridden'),\n resetLabel: t('settings.reset'),\n invalidLabel: t('settings.invalidNumber'),\n disabled,\n }\n return (\n <PluginSettingsCard\n t={t}\n titleKey=\"settings.title\"\n descriptionKey=\"settings.description\"\n defaultOpen={false}\n state={state}\n onSave={props.save}\n onDiscard={props.discard}\n >\n <BooleanField\n id=\"settings-remote-enabled\"\n label={t('settings.enabled')}\n hint={t('settings.enabledHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.enabled}\n onEdit={(text) => { props.edit('enabled', text) }}\n onReset={() => { props.resetField('enabled') }}\n />\n <ValueField\n id=\"settings-remote-token-ttl\"\n label={t('settings.tokenTtlMs')}\n hint={t('settings.tokenTtlMsHint')}\n numeric\n {...fieldProps}\n {...state.tokenTtlMs}\n onEdit={(text) => { props.edit('tokenTtlMs', text) }}\n onReset={() => { props.resetField('tokenTtlMs') }}\n />\n <ValueField\n id=\"settings-remote-offline\"\n label={t('settings.offlineAfterMs')}\n hint={t('settings.offlineAfterMsHint')}\n numeric\n {...fieldProps}\n {...state.offlineAfterMs}\n onEdit={(text) => { props.edit('offlineAfterMs', text) }}\n onReset={() => { props.resetField('offlineAfterMs') }}\n />\n <ValueField\n id=\"settings-remote-max-devices\"\n label={t('settings.maxDevices')}\n hint={t('settings.maxDevicesHint')}\n numeric\n {...fieldProps}\n {...state.maxDevices}\n onEdit={(text) => { props.edit('maxDevices', text) }}\n onReset={() => { props.resetField('maxDevices') }}\n />\n <ValueField\n id=\"settings-remote-cookie\"\n label={t('settings.cookieName')}\n hint={t('settings.cookieNameHint')}\n {...fieldProps}\n {...state.cookieName}\n onEdit={(text) => { props.edit('cookieName', text) }}\n onReset={() => { props.resetField('cookieName') }}\n />\n <BooleanField\n id=\"settings-remote-fence\"\n label={t('settings.requirePairingForLan')}\n hint={t('settings.requirePairingForLanHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.requirePairingForLan}\n onEdit={(text) => { props.edit('requirePairingForLan', text) }}\n onReset={() => { props.resetField('requirePairingForLan') }}\n />\n <ValueField\n id=\"settings-remote-public-base\"\n label={t('settings.publicBaseUrl')}\n hint={t('settings.publicBaseUrlHint')}\n placeholder=\"https://example.trycloudflare.com\"\n {...fieldProps}\n {...state.publicBaseUrl}\n onEdit={(text) => { props.edit('publicBaseUrl', text) }}\n onReset={() => { props.resetField('publicBaseUrl') }}\n />\n <BooleanField\n id=\"settings-remote-auto-tunnel\"\n label={t('settings.autoTunnel')}\n hint={t('settings.autoTunnelHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.autoTunnel}\n onEdit={(text) => { props.edit('autoTunnel', text) }}\n onReset={() => { props.resetField('autoTunnel') }}\n />\n <BooleanField\n id=\"settings-remote-mobile-enter\"\n label={t('settings.mobileEnterToSend')}\n hint={t('settings.mobileEnterToSendHint')}\n inheritLabel={t('settings.inherit')}\n onLabel={t('settings.on')}\n offLabel={t('settings.off')}\n {...fieldProps}\n {...state.mobileEnterToSend}\n onEdit={(text) => { props.edit('mobileEnterToSend', text) }}\n onReset={() => { props.resetField('mobileEnterToSend') }}\n />\n </PluginSettingsCard>\n )\n}\n","/** `remote` namespace dictionaries: the mobile remote-control surface copy. */\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh = {\n 'entry.label': '移动端远程控制',\n 'title': '移动端远程控制',\n 'subtitle': '扫码或在手机上打开链接,即可远程控制当前工作区',\n 'card.title': '手机扫码连接',\n 'public.badge': '公网',\n 'status.waiting': '等待手机连接',\n 'status.connected': '已连接 {n} 台设备',\n 'status.disconnected': '已配对设备离线',\n 'status.stopped': '已停止移动端访问',\n 'status.lanRequired': '此功能需要以 --host 0.0.0.0 启动 dsh web,或配置公网地址才能使用',\n 'status.lanRequiredHint': '当前服务仅绑定在 127.0.0.1 且未配置公网地址,手机无法访问。请用 dsh web --host 0.0.0.0 重新启动,或在设置中填写内网穿透的公网地址。',\n 'status.loopbackRequired': '配对面板仅限本机使用',\n 'status.loopbackRequiredHint': '请通过 http://127.0.0.1 打开此页面后重试;手机请使用配对链接访问。',\n 'status.unreachable': '无法连接配对服务',\n 'status.unreachableHint': '请刷新页面后重试。',\n 'pair.hint': '无法扫码?可以在手机上打开链接',\n 'pair.publicHint': '公网链接:手机无需与电脑在同一网络',\n 'address.label': '选择二维码指向的网络',\n 'address.public': '公网地址',\n 'address.lan': '局域网',\n 'address.hint': '公网地址适合手机不在同一网络时使用;局域网地址仅在手机与电脑同一网络时可用。',\n 'pair.expires': '二维码有效至 {time}',\n 'pair.expired': '二维码已过期,请刷新',\n 'pair.failed.title': '配对失败',\n 'pair.failed.detail': '链接无效或已使用,请回到电脑端刷新二维码后重新扫码。',\n 'action.stop': '停止',\n 'action.refresh': '刷新二维码',\n 'action.copy': '复制链接',\n 'action.copied': '已复制',\n 'stopped.hint': '已停止移动端访问。点击\"刷新二维码\"重新开启。',\n 'tunnel.starting': '公网隧道启动中,二维码将自动变为公网链接…',\n 'tunnel.failed': '公网隧道启动失败:{error}',\n 'tunnel.unknownError': '未知错误',\n 'close.label': '关闭移动端远程控制面板',\n // 插件设置卡片(settings.plugin.item 席位)。\n 'settings.title': '移动端远程控制',\n 'settings.description': '配对安全与设备限额。',\n 'settings.enabled': '启用移动端远程控制',\n 'settings.enabledHint': '关闭后移除侧边栏入口并停用配对路由与局域网栅栏。',\n 'settings.tokenTtlMs': '配对令牌有效期(毫秒)',\n 'settings.tokenTtlMsHint': '新生成的二维码链接在此时间后失效。',\n 'settings.offlineAfterMs': '设备离线判定(毫秒)',\n 'settings.offlineAfterMsHint': '配对设备超过该时长未上报心跳即视为离线。',\n 'settings.maxDevices': '已配对设备上限',\n 'settings.maxDevicesHint': '超过上限时淘汰最旧的设备会话。',\n 'settings.cookieName': '设备 Cookie 名',\n 'settings.cookieNameHint': '携带已配对设备标识的 Cookie 名称。',\n 'settings.requirePairingForLan': '局域网访问要求配对',\n 'settings.requirePairingForLanHint': '开启:所有非本机回环的 /api 请求必须携带有效配对 Cookie;关闭:局域网栅栏放开,配对仅用于令牌与状态管理。',\n 'settings.publicBaseUrl': '公网地址(可选)',\n 'settings.publicBaseUrlHint': '内网穿透的公网地址,如 Cloudflare Tunnel:https://xxx.trycloudflare.com。填写后二维码将生成公网链接,手机不在同一网络也能配对;留空则仅局域网可用。',\n 'settings.autoTunnel': '自动公网隧道',\n 'settings.autoTunnelHint': '开启后插件自动启动 Cloudflare quick tunnel(无需安装任何工具),并自动更新公网地址与信任配置,手机随时可用公网配对;关闭时使用上方手动填写的公网地址。',\n 'settings.mobileEnterToSend': '移动端回车发送',\n 'settings.mobileEnterToSendHint': '开启:移动端输入框按 Enter 直接发送,Shift+Enter 换行;关闭:Enter 换行,仅点发送按钮发送。',\n 'settings.inherit': '继承',\n 'settings.on': '开',\n 'settings.off': '关',\n 'settings.overridden': '已覆盖',\n 'settings.reset': '恢复默认',\n 'settings.notExposed': '当前 DSH 版本未向设置页暴露本插件的配置命名空间,表单不可用。可编辑 ~/.dsh/settings.yaml 直接配置,或为 dsh-host-apiproxy 的 WEB_SETTINGS_NAMESPACES 白名单补充本命名空间后重启。',\n 'settings.readOnly': '当前部署的设置只读。',\n 'settings.expand': '展开设置',\n 'settings.collapse': '收起设置',\n 'settings.save': '保存',\n 'settings.saving': '保存中…',\n 'settings.discard': '放弃',\n 'settings.unsaved': '未保存',\n 'settings.saveFailed': '部署未接受这些值,已保留供你修改。',\n 'settings.invalidNumber': '请输入数字,留空则使用默认值。',\n // 更新面板(侧边栏更新按钮)。\n 'update.label': '检查更新',\n 'update.availableLabel': '发现新版本,检查更新',\n 'update.title': '检查更新',\n 'update.checking': '正在检查远程仓库中的新版本…',\n 'update.upToDate': '当前已是最新版本',\n 'update.upToDateDetail': '{name} 已是最新版本 v{version}。',\n 'update.found': '发现新版本',\n 'update.foundDetail': '{name} 有新版本 v{version}。确认后开始更新。',\n 'update.start': '开始更新',\n 'update.updating': '正在更新 {name} 至 v{version},可能需要 1-2 分钟…',\n 'update.cooldownNotice': '本次更新由你主动触发,将跳过 pnpm 的 24 小时发布冷却期(供应链保护)直接安装所选版本。',\n 'update.updatingTitle': '正在更新…',\n 'update.done': '更新完成',\n 'update.doneDetail': '所有组件已更新到最新版本。',\n 'update.restartHint': '请重启 dsh web 使新版本生效:在终端按 Ctrl+C 停止后重新运行 dsh web。',\n 'update.linkMode': '当前为本地开发模式',\n 'update.linkModeDetail': 'dsh-web-ui 或其组件通过本地链接安装(开发模式),无法自动更新。npm 上最新版本:{version}。请同步本地仓库,或移除与全家桶重复的独立链接。',\n 'update.missing': '未找到 dsh-web-ui 安装',\n 'update.missingDetail': '无法定位已安装的 dsh-web-ui 聚合包。请先运行 dsh plugin --profile <profile> add @linxin666/dsh-web-ui-all。',\n 'update.offline': '无法连接更新源',\n 'update.offlineDetail': '网络不可用或更新服务异常,请稍后重试。',\n 'update.unmounted': '更新服务未加载',\n 'update.unmountedDetail': '当前 dsh web 进程运行的插件版本不含更新服务,请重启 dsh web(Ctrl+C 后重新运行)后再试。',\n 'update.error': '更新失败',\n 'update.packages': '组件版本',\n 'update.retry': '重新检查',\n 'update.close': '关闭更新面板',\n 'update.error.pnpmMissing': '未找到 pnpm,已尝试 pnpm / corepack / npx 仍不可用。请安装 pnpm 后重启应用(Windows: npm install -g pnpm 或 corepack enable;macOS: brew install pnpm 或 corepack enable)。',\n 'update.error.timeout': '更新超时,已终止安装进程,请重试。',\n 'update.error.notFound': '未找到 dsh-web-ui 聚合包安装,无法更新。',\n 'update.error.link': 'dsh-web-ui 或其组件使用本地链接,无法自动更新;请同步本地仓库,或移除与全家桶重复的独立链接。',\n 'update.error.pnpmFailed': '更新执行失败(pnpm 退出码 {code}),详见下方输出。',\n 'update.error.stale': '更新命令已执行,但安装版本未变化。常见原因:pnpm 11 的 minimumReleaseAge 门禁会静默跳过发布不足 24 小时的新版本。请在 profile 目录(~/.dsh/profiles/<profile>)的 pnpm-workspace.yaml 中配置 minimumReleaseAgeExclude(例如 \"@linxin666/*\")或 minimumReleaseAge: 0 后重新点击更新。',\n 'update.error.verifyFailed': '更新命令已执行,但无法核对安装后的版本(可能是 registry 探测失败或安装路径变化)。请查看下方输出,或稍后重试。',\n 'update.error.unknown': '更新失败,请重试。',\n} satisfies Record<string, string>\n\n/** The remote namespace key union. */\nexport type RemoteKey = keyof typeof zh\n\n/** The settings-card slice of the remote dictionary. */\nexport type SettingsCardKey = RemoteKey\n\n/** English dictionary, checked complete against the zh key set. */\nexport const en = {\n 'entry.label': 'Mobile remote control',\n 'title': 'Mobile remote control',\n 'subtitle': 'Scan the QR code or open the link on your phone to control this workspace remotely',\n 'card.title': 'Scan to connect',\n 'public.badge': 'Public',\n 'status.waiting': 'Waiting for a phone',\n 'status.connected': '{n} device(s) connected',\n 'status.disconnected': 'Paired devices offline',\n 'status.stopped': 'Mobile access stopped',\n 'status.lanRequired': 'This feature needs dsh web started with --host 0.0.0.0, or a configured public address',\n 'status.lanRequiredHint': 'The server is bound to 127.0.0.1 and no public address is configured, so a phone cannot reach it. Restart with dsh web --host 0.0.0.0, or set the tunneled public address in settings.',\n 'status.loopbackRequired': 'The pairing panel works on this machine only',\n 'status.loopbackRequiredHint': 'Open this page at http://127.0.0.1 to mint a QR code; phones use the paired link.',\n 'status.unreachable': 'Cannot reach the pairing service',\n 'status.unreachableHint': 'Refresh the page and try again.',\n 'pair.hint': 'Cannot scan? Open the link on your phone',\n 'pair.publicHint': 'Public link: the phone does not need to be on the same network',\n 'address.label': 'Network the QR code points to',\n 'address.public': 'Public',\n 'address.lan': 'LAN',\n 'address.hint': 'Use the public address when the phone is not on the same network; LAN addresses only work on the same network.',\n 'pair.expires': 'QR code valid until {time}',\n 'pair.expired': 'QR code expired — refresh it',\n 'pair.failed.title': 'Pairing failed',\n 'pair.failed.detail': 'The link is invalid or was already used. Refresh the QR code on your computer and scan again.',\n 'action.stop': 'Stop',\n 'action.refresh': 'Refresh QR',\n 'action.copy': 'Copy link',\n 'action.copied': 'Copied',\n 'stopped.hint': 'Mobile access is stopped. Click \"Refresh QR\" to re-enable it.',\n 'tunnel.starting': 'The public tunnel is starting; the QR code will switch to a public link shortly…',\n 'tunnel.failed': 'The public tunnel failed to start: {error}',\n 'tunnel.unknownError': 'unknown error',\n 'close.label': 'Close mobile remote control panel',\n // Plugin settings card (the `settings.plugin.item` seat).\n 'settings.title': 'Mobile remote control',\n 'settings.description': 'Pairing security and device limits.',\n 'settings.enabled': 'Enable mobile remote control',\n 'settings.enabledHint': 'When off, the sidebar entry is removed and pairing routes plus the LAN fence stop.',\n 'settings.tokenTtlMs': 'Pairing token lifetime (ms)',\n 'settings.tokenTtlMsHint': 'How long a minted QR link stays valid before it dies.',\n 'settings.offlineAfterMs': 'Device offline threshold (ms)',\n 'settings.offlineAfterMsHint': 'A paired device flips to offline when it has not been seen for this long.',\n 'settings.maxDevices': 'Paired device cap',\n 'settings.maxDevicesHint': 'Hard cap on paired device sessions; the oldest is evicted when full.',\n 'settings.cookieName': 'Device cookie name',\n 'settings.cookieNameHint': 'Cookie that carries the paired device id.',\n 'settings.requirePairingForLan': 'Require pairing for LAN access',\n 'settings.requirePairingForLanHint': 'On: every non-loopback /api request must carry a live paired-device cookie. Off: the LAN fence is open and pairing only manages tokens/status.',\n 'settings.publicBaseUrl': 'Public address (optional)',\n 'settings.publicBaseUrlHint': 'The public URL of a tunnel in front of this server, e.g. a Cloudflare Tunnel: https://xxx.trycloudflare.com. When set, the QR link is built from it so a phone anywhere can pair; leave blank for LAN-only usage.',\n 'settings.autoTunnel': 'Auto public tunnel',\n 'settings.autoTunnelHint': 'When on, the plugin runs its own Cloudflare quick tunnel (no tool installation needed) and keeps the public address and trust config in sync automatically, so a phone anywhere can pair at any time; when off, the manually entered public address above applies.',\n 'settings.mobileEnterToSend': 'Enter to send on mobile',\n 'settings.mobileEnterToSendHint': 'On: Enter in the mobile composer sends immediately and Shift+Enter inserts a newline. Off: Enter inserts a newline and only the send button sends.',\n 'settings.inherit': 'Inherit',\n 'settings.on': 'On',\n 'settings.off': 'Off',\n 'settings.overridden': 'Overridden',\n 'settings.reset': 'Reset to default',\n 'settings.notExposed': 'This DSH version does not expose this plugin\\'s settings namespace to the configuration page, so the form is unavailable. Edit ~/.dsh/settings.yaml directly, or add the namespace to dsh-host-apiproxy\\'s WEB_SETTINGS_NAMESPACES allowlist and restart.',\n 'settings.readOnly': 'This deployment stores settings read-only.',\n 'settings.expand': 'Show settings',\n 'settings.collapse': 'Hide settings',\n 'settings.save': 'Save',\n 'settings.saving': 'Saving…',\n 'settings.discard': 'Discard',\n 'settings.unsaved': 'Unsaved',\n 'settings.saveFailed': 'The deployment did not accept these values; they were left for you to correct.',\n 'settings.invalidNumber': 'Enter a number, or leave blank to use the default.',\n // Update panel (the sidebar update trigger).\n 'update.label': 'Check for updates',\n 'update.availableLabel': 'New version available. Check for updates',\n 'update.title': 'Check for updates',\n 'update.checking': 'Checking the remote repository for newer releases…',\n 'update.upToDate': 'Everything is up to date',\n 'update.upToDateDetail': '{name} is at the latest version v{version}.',\n 'update.found': 'A new version is available',\n 'update.foundDetail': '{name} has a newer release v{version}. Confirm to start the update.',\n 'update.start': 'Update now',\n 'update.updating': 'Updating {name} to v{version}; this may take 1-2 minutes…',\n 'update.cooldownNotice': 'This user-initiated update bypasses pnpm\\'s 24-hour release cooldown (supply-chain protection) and installs the selected version immediately.',\n 'update.updatingTitle': 'Updating…',\n 'update.done': 'Update complete',\n 'update.doneDetail': 'All components are up to date.',\n 'update.restartHint': 'Restart dsh web for the new version to take effect: stop it with Ctrl+C in the terminal, then run dsh web again.',\n 'update.linkMode': 'Local development mode',\n 'update.linkModeDetail': 'dsh-web-ui or one of its components is installed via a local link and cannot be updated remotely. Latest npm release: {version}. Sync the local checkout, or remove a standalone link duplicated by the aggregate.',\n 'update.missing': 'dsh-web-ui not found',\n 'update.missingDetail': 'Could not locate the installed dsh-web-ui aggregate package. Install it with: dsh plugin --profile <profile> add @linxin666/dsh-web-ui-all',\n 'update.offline': 'Cannot reach the update source',\n 'update.offlineDetail': 'The network is unavailable or the update service is failing; try again later.',\n 'update.unmounted': 'The update service is not loaded',\n 'update.unmountedDetail': 'The running dsh web process loads a plugin build without the update service; restart dsh web (Ctrl+C, then run dsh web again) and retry.',\n 'update.error': 'Update failed',\n 'update.packages': 'Component versions',\n 'update.retry': 'Check again',\n 'update.close': 'Close update panel',\n 'update.error.pnpmMissing': 'pnpm was not found (tried pnpm / corepack / npx). Install pnpm and restart the app (Windows: npm install -g pnpm or corepack enable; macOS: brew install pnpm or corepack enable).',\n 'update.error.timeout': 'The update timed out and the install process was killed; try again.',\n 'update.error.notFound': 'The dsh-web-ui aggregate package is not installed; nothing to update.',\n 'update.error.link': 'dsh-web-ui or one of its components uses a local link. Sync the checkout, or remove a standalone link duplicated by the aggregate.',\n 'update.error.pnpmFailed': 'The update failed (pnpm exited with code {code}); see the output below.',\n 'update.error.stale': 'The update command ran but the installed versions did not change. Likely cause: the pnpm 11 minimumReleaseAge gate silently skips releases published less than 24 hours ago. Add minimumReleaseAgeExclude (e.g. \"@linxin666/*\") or set minimumReleaseAge: 0 in pnpm-workspace.yaml under the profile directory (~/.dsh/profiles/<profile>), then run the update again.',\n 'update.error.verifyFailed': 'The update command ran but the installed versions could not be verified afterwards (registry probe failed or the install path changed). Inspect the output below, or retry later.',\n 'update.error.unknown': 'Update failed; try again.',\n} satisfies Record<RemoteKey, string>\n","/**\n * Phone-side boot flow: the QR link's `pair` + `workspace` parameters.\n * Runs from the client apply on every page load, on any device:\n * - `pair` present → accept the token, then reload so the whole SPA boots\n * with the device cookie (the accept endpoint is exempt from the pairing\n * gate; every other /api request needs the cookie).\n * - `workspace` present (and paired) → deep-link: connect that workspace's\n * session and open it, then strip the parameter.\n * Failure of accept leaves a sessionStorage marker the entry renders as a\n * one-time notice.\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { WorkspaceId } from '@deepseek-ai/dsh-client-runtime/client'\nimport { acceptPair, readPairParams } from './pair-api.ts'\n\n/** sessionStorage key for the failed-pair notice. */\nexport const PAIR_FAILED_MARKER = 'dsh-remote-pair-failed'\n\n/** Poll budget for the runtime services (activation order is unconstrained). */\nconst SERVICE_WAIT_MS = 10_000\n\n/**\n * The page-navigation surface the boot flow drives. Browser pages use the\n * default (window.location/history); tests inject a fake.\n */\nexport interface PageSurface {\n /** The current page URL (read fresh on each access). */\n href: string\n /** Replace the URL without reloading. */\n replaceState(url: string): void\n /** Navigate to a URL (a fresh page load). */\n navigate(url: string): void\n /** Reload the page. */\n reload(): void\n}\n\n/** The browser implementation of {@link PageSurface}. */\nexport const browserPage: PageSurface = {\n get href(): string {\n return window.location.href\n },\n replaceState(url: string): void {\n window.history.replaceState(null, '', url)\n },\n navigate(url: string): void {\n window.location.assign(url)\n },\n reload(): void {\n window.location.reload()\n },\n}\n\n/** Whether this browser looks like a phone/tablet (the simplified mobile surface). */\nexport function isMobileSurface(): boolean {\n if (typeof navigator === 'undefined') return false\n return /Android|iPhone|iPad|iPod|Mobile|mobile/i.test(navigator.userAgent)\n}\n\n/**\n * Run the pair/workspace boot flow for this page load.\n * @param ctx - client root context (workspaces/sessions read at need time).\n * @param search - the current location.search.\n * @param page - the page surface (defaults to the browser).\n */\nexport function runPairBootFlow(ctx: Context, search: string, page: PageSurface = browserPage): void {\n const params = readPairParams(search)\n if (params.pair !== undefined) {\n void runAccept(params.pair, page)\n return\n }\n if (params.workspace !== undefined) {\n void runDeepLink(ctx, params.workspace, page)\n }\n}\n\n/** Accept the token, then enter the matching desktop/mobile surface. */\nasync function runAccept(token: string, page: PageSurface): Promise<void> {\n let ok = false\n try {\n const result = await acceptPair(token)\n ok = result.ok\n if (!ok) sessionStorage.setItem(PAIR_FAILED_MARKER, 'failed')\n } catch {\n sessionStorage.setItem(PAIR_FAILED_MARKER, 'failed')\n }\n // Drop the token from the URL either way: an accepted token is consumed\n // (a re-scan would 409), and a failed one must not loop.\n const url = new URL(page.href)\n url.searchParams.delete('pair')\n page.replaceState(`${url.pathname}${url.search}${url.hash}`)\n if (ok) {\n // Phones land on the standalone simplified surface (the full desktop UI\n // is not built for small screens). Keep the workspace target so the\n // mobile surface can open the intended workspace instead of losing the\n // QR context at this navigation boundary.\n if (isMobileSurface()) {\n url.pathname = '/m/'\n page.navigate(`${url.pathname}${url.search}${url.hash}`)\n } else {\n page.reload()\n }\n }\n}\n\n/**\n * Connect the deep-linked workspace and open its session. Waits for the\n * runtime services AND for the target workspace to appear in the workspace\n * list (both are asynchronous after boot), then connects and opens; gives\n * up silently within the budget — the workspace param is stripped either\n * way, so a late failure cannot loop.\n * @param ctx - client root context.\n * @param workspaceId - the target workspace.\n * @param page - the page surface.\n */\nasync function runDeepLink(ctx: Context, workspaceId: string, page: PageSurface): Promise<void> {\n const target = workspaceId as WorkspaceId\n const deadline = Date.now() + SERVICE_WAIT_MS\n while (Date.now() < deadline) {\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions') as { open(id: string): void } | undefined\n if (workspaces !== undefined && sessions !== undefined) {\n const items = workspaces.list.getSnapshot().items\n if (items.some(item => item.workspaceId === target)) {\n try {\n // Open unconditionally: a host-side \"current\" session may already\n // exist (multi-client mirroring), but the QR's workspace target is\n // explicit user intent and must win.\n const sessionId = await workspaces.connectWorkspace(target)\n sessions.open(sessionId)\n } catch {\n // Unknown workspace or a failed connect: fall through to the\n // runtime's own default initial selection.\n }\n break\n }\n }\n await new Promise(resolve => setTimeout(resolve, 200))\n }\n const url = new URL(page.href)\n url.searchParams.delete('workspace')\n page.replaceState(`${url.pathname}${url.search}${url.hash}`)\n}\n","/**\n * Mobile remote control — browser half. Registers the `remote` dictionaries,\n * the sidebar-foot entry (phone trigger + pairing panel) into the\n * ui-sidebar-declared `sidebar.remote` seat, and runs the phone-side boot\n * flow (pair accept + workspace deep-link + presence heartbeats) plus the\n * one-time failed-pair notice. Export discipline: packages/client/AGENTS.md\n * — the /client surface carries only what cordis loading needs plus types.\n */\nimport { createElement } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport type { ClientContext, SettingsScope, SettingsScopeSpec } from '@deepseek-ai/dsh-client-runtime/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale) and the\n// ui-sidebar SlotMap merge (the 'sidebar.remote' hole).\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the settings-surface SlotMap merge (the 'settings.section'\n// entry) and the ctx.settingsScope Context merge.\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'\nimport { FooterRemoteEntry } from './FooterRemoteEntry.tsx'\nimport { RemoteEntry } from './RemoteEntry.tsx'\nimport { PairFailedNotice } from './PairFailedNotice.tsx'\nimport { RemoteSettingsCard, RemoteSettingsCardController, type RemoteSettings } from './RemoteSettingsCard.tsx'\nimport { en, zh, type RemoteKey } from './locales.ts'\nimport { PAIR_FAILED_MARKER, runPairBootFlow } from './deep-link.ts'\nimport { sendHeartbeat } from './pair-api.ts'\n\nexport type { RemoteEntryProps } from './RemoteEntry.tsx'\nexport type { PanelState, RemotePanelProps } from './RemotePanel.tsx'\nexport type { PairFailedNoticeProps } from './PairFailedNotice.tsx'\nexport type { RemoteKey } from './locales.ts'\nexport type { RemoteSettingsCardFace, RemoteSettingsCardState } from './RemoteSettingsCard.tsx'\nexport type { UpdateEntryProps } from './UpdateEntry.tsx'\nexport type { UpdatePanelProps, UpdateView } from './UpdatePanel.tsx'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Mobile remote-control surface copy. */\n remote: RemoteKey\n }\n\n interface SlotMap {\n /**\n * The sidebar foot seat beside the settings trigger, declared by the\n * sidebar shell on deployments that carry the feature seat; the shell\n * passes only its column display state.\n */\n 'sidebar.remote': { kind: 'single'; scope: 'root'; owner: SidebarRemoteOwnerProps }\n /**\n * The child slot the Web UI plugin group declares; this card registers\n * into the group instead of the top-level `settings.plugin.item` list.\n * Spelled here with the same shape so this package can register without\n * depending on the sibling UI package.\n */\n 'web-ui.plugin.item': { kind: 'list'; scope: 'root'; owner: SettingsPluginItemOwnerProps }\n }\n}\n\n/** Owner share of the sidebar remote-control seat: the column display state the trigger renders against. */\nexport interface SidebarRemoteOwnerProps {\n /** Whether the sidebar renders wide content (false = 56px rail). */\n wide: boolean\n}\n\n/** Owner share of a plugin card (the section supplies nothing). */\nexport interface SettingsPluginItemOwnerProps {\n /** Marker field: card owner props are intentionally empty. */\n children?: never\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n /**\n * Optional rc.6 compatibility binder provided by dsh-web-ui-settings;\n * absent when that group plugin is not installed, so callers fall back to\n * the official settings scope.\n */\n webUiSettings?: { bind<S>(spec: SettingsScopeSpec<S>): SettingsScope<S> }\n }\n}\n\n\n/** Dictionary namespace owned by this plugin. */\nconst NS = 'remote'\n\n/** Settings namespace the remote-control card edits (the Host plugin registers it). */\nconst REMOTE_WEB_UI_NS = 'remote-web-ui'\n\n/** Heartbeat cadence from a paired phone (presence + revocation liveness). */\nconst HEARTBEAT_INTERVAL_MS = 10_000\n\n/** Services required by this plugin. */\nexport const inject = ['slots', 'locale', 'connection', 'settingsScope', 'remote']\n\n/**\n * Register the remote-control surface.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'remote-web-ui: dictionaries')\n\n const t = ctx.locale.bind(NS)\n const binder = ctx.get('webUiSettings') ?? ctx.settingsScope\n const settingsScope = binder.bind<RemoteSettings>({ namespace: REMOTE_WEB_UI_NS })\n const enabled = (): boolean => {\n const snapshot = settingsScope.getSnapshot()\n return snapshot.status === 'ready'\n ? snapshot.value?.enabled ?? true\n : snapshot.status === 'unavailable'\n }\n\n // Sidebar foot entry: the shell declares 'sidebar.remote' in unconstrained\n // order, so registration is declaration-aware — slots.inject waits on the\n // declaration, removes the contribution when it collapses, and re-runs\n // after a redeclaration. The entry follows the plugin's enabled setting:\n // toggling it off removes the trigger, toggling it back on re-registers it.\n ctx.slots.inject('sidebar.remote', () => {\n let disposeEntry: (() => void) | undefined\n const syncEntry = (): void => {\n if (enabled() && disposeEntry === undefined) {\n disposeEntry = ctx.slots.register({ name: 'sidebar.remote', locale: NS }, RemoteEntry)\n } else if (!enabled() && disposeEntry !== undefined) {\n disposeEntry()\n disposeEntry = undefined\n }\n }\n const unsubscribe = settingsScope.subscribe(syncEntry)\n syncEntry()\n return () => {\n unsubscribe()\n disposeEntry?.()\n }\n })\n\n // Current shells declare `sidebar.footer.action` instead of the legacy\n // `sidebar.remote` seat; this fallback registers the same entry there when\n // the legacy seat never arrives (declaration-aware: only one of the two\n // injects ever fires, so the trigger can never render twice).\n ctx.slots.inject('sidebar.footer.action', () => {\n let disposeEntry: (() => void) | undefined\n const syncEntry = (): void => {\n if (enabled() && disposeEntry === undefined) {\n disposeEntry = ctx.slots.register({ name: 'sidebar.footer.action', id: 'remote-web-ui', locale: NS }, FooterRemoteEntry)\n } else if (!enabled() && disposeEntry !== undefined) {\n disposeEntry()\n disposeEntry = undefined\n }\n }\n const unsubscribe = settingsScope.subscribe(syncEntry)\n syncEntry()\n return () => {\n unsubscribe()\n disposeEntry?.()\n }\n })\n\n // Plugin configuration card: one staged form over the `remote-web-ui`\n // settings namespace, contributed to the Web UI plugin group.\n const remoteSettings = new RemoteSettingsCardController(settingsScope)\n ctx.slots.inject('web-ui.plugin.item', () => {\n const unregister = ctx.slots.register({\n name: 'web-ui.plugin.item',\n id: 'remote-web-ui',\n order: 90,\n locale: NS,\n inject: () => remoteSettings.inject(),\n }, RemoteSettingsCard)\n return () => {\n remoteSettings.dispose()\n unregister()\n }\n })\n\n // Phone-side boot flow + heartbeats. Loopback pages (the desktop) never\n // heartbeat; the server ignores unpaired heartbeats anyway. Both run only\n // while the plugin is enabled.\n let disposeRuntime: (() => void) | undefined\n const syncRuntime = (): void => {\n if (enabled() && disposeRuntime === undefined) {\n disposeRuntime = ctx.effect(() => {\n const connection = ctx.get('connection') as ConnectionHandle | undefined\n const loopback = connection?.isLoopback ?? true\n runPairBootFlow(ctx, window.location.search)\n if (loopback) return () => {}\n const timer = window.setInterval(() => { void sendHeartbeat().catch(() => {}) }, HEARTBEAT_INTERVAL_MS)\n return () => { window.clearInterval(timer) }\n }, 'remote-web-ui: pair flow + heartbeats')\n } else if (!enabled() && disposeRuntime !== undefined) {\n disposeRuntime()\n disposeRuntime = undefined\n }\n }\n settingsScope.subscribe(syncRuntime)\n syncRuntime()\n\n // One-time failed-pair toast. The accept result lands asynchronously, so\n // the marker check is deferred past the accept round trip.\n ctx.effect(() => {\n const timer = window.setTimeout(() => {\n if (sessionStorage.getItem(PAIR_FAILED_MARKER) === null) return\n sessionStorage.removeItem(PAIR_FAILED_MARKER)\n const mount = document.createElement('div')\n document.body.appendChild(mount)\n const root = createRoot(mount)\n root.render(createElement(PairFailedNotice, { t }))\n // The toast owns its dismissal; the root lives for the page lifetime.\n void root\n }, 1500)\n return () => { window.clearTimeout(timer) }\n }, 'remote-web-ui: failed-pair notice')\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|