@krischoichoi/dsh-channels 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -0
- package/cordis.patch.yml +81 -0
- package/lib/client.js +5005 -0
- package/lib/client.js.map +7 -0
- package/lib/control.d.ts +2 -0
- package/lib/control.d.ts.map +1 -0
- package/lib/control.js +2 -0
- package/lib/control.js.map +1 -0
- package/lib/dingtalk.d.ts +18 -0
- package/lib/dingtalk.d.ts.map +1 -0
- package/lib/dingtalk.js +18 -0
- package/lib/dingtalk.js.map +1 -0
- package/lib/files.d.ts +2 -0
- package/lib/files.d.ts.map +1 -0
- package/lib/files.js +2 -0
- package/lib/files.js.map +1 -0
- package/lib/harness.d.ts +2 -0
- package/lib/harness.d.ts.map +1 -0
- package/lib/harness.js +2 -0
- package/lib/harness.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/lark.d.ts +18 -0
- package/lib/lark.d.ts.map +1 -0
- package/lib/lark.js +18 -0
- package/lib/lark.js.map +1 -0
- package/lib/qq.d.ts +18 -0
- package/lib/qq.d.ts.map +1 -0
- package/lib/qq.js +18 -0
- package/lib/qq.js.map +1 -0
- package/lib/service.d.ts +2 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +2 -0
- package/lib/service.js.map +1 -0
- package/lib/telegram.d.ts +18 -0
- package/lib/telegram.d.ts.map +1 -0
- package/lib/telegram.js +18 -0
- package/lib/telegram.js.map +1 -0
- package/lib/weixin.d.ts +18 -0
- package/lib/weixin.d.ts.map +1 -0
- package/lib/weixin.js +18 -0
- package/lib/weixin.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js", "../../../node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js", "../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js", "../src/client/index.ts", "../src/client/ChannelsSection.tsx", "../src/client/api.ts", "../src/client/channelRegistry.ts", "../src/client/ChannelRow.tsx", "../src/client/components/ChannelBrandIcon.tsx", "../src/client/components/Switch.tsx", "../src/client/ChannelSetup.tsx", "../src/client/components/CredentialField.tsx", "../src/client/components/OfficialDocsLink.tsx", "../src/client/components/SectionHeading.tsx", "../src/client/setupFormState.ts", "../src/client/ChannelAuth.tsx", "../src/client/components/AuthProgress.tsx", "../src/client/components/QrCodeDisplay.tsx", "../src/client/useChannelAuth.ts", "../src/client/ChannelAccess.tsx", "../src/client/accessPolicyUi.ts", "../src/client/components/AccessWarning.tsx", "../src/client/components/ConversationPicker.tsx", "../src/client/components/IdentityListEditor.tsx", "../src/client/components/GroupAccessCard.tsx", "../src/client/components/BundleUpdateNotice.tsx", "../src/client/components/RepoFooter.tsx", "../src/client/useUpdateCheck.ts", "../src/client/locales.ts"],
|
|
4
|
+
"sourcesContent": ["// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n", "let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n", "exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n", "function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n", "/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n", "/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n", "const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n", "/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n", "const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n", "const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n", "const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n", "const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n", "/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n", "const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n", "const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n", "const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n", "const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n", "const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n", "const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n", "const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n", "const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n", "'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n", "const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n", "const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n", "function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n", "const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n", "const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n", "\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n", "/**\n * @krischoichoi/channel-web \u2014 Web client plugin entry.\n *\n * This file is bundled by esbuild into lib/client.js and wrapped in the\n * Harness `window.__ModuleLoader__.load({ id, factory })` format. It registers\n * the \"\u6E20\u9053\" Settings section via the settings.section slot and the\n * 'channels' locale namespace.\n *\n * Client module graph notes: React, react/jsx-runtime and\n * @deepseek-ai/dsh-client-ui-primitives are static shell identities\n * (PLATFORM_MODULES seeds compiled into the Vite shell), so the bundle keeps\n * them as require() externals instead of inlining them. The dynamic client\n * dependency of this entry is declared in package.json `dsh.client.inject`\n * (currently @deepseek-ai/dsh-client-locale, provider of the \"locale\"\n * service); the plugin context itself is described by LOCAL structural\n * interfaces \u2014 we deliberately do NOT import any @deepseek-ai/dsh-client-*\n * runtime or type package here.\n */\nimport { ChannelsSection } from './ChannelsSection.js';\nimport { locales } from './locales.js';\nimport type { SettingsSectionOwnerProps } from '@deepseek-ai/dsh-client-ui-settings/client';\n\nexport const name = 'channel-web';\n\n/** Loader-level services this client fibre depends on. */\nexport const inject = ['slots', 'locale'];\n\ntype Translate = (key: string) => string;\n\ninterface LocaleContext {\n register(namespace: string, dictionaries: Record<string, Record<string, string>>): unknown;\n bind(namespace: string): Translate;\n}\n\ninterface SlotOptions {\n name: string;\n id: string;\n order?: number;\n label?: string | (() => string);\n locale?: string;\n [key: string]: unknown;\n}\n\ninterface SlotsContext {\n register(options: SlotOptions, component: unknown): unknown;\n inject(name: string, renderer: () => unknown): unknown;\n}\n\ninterface EffectContext {\n effect(callback: () => unknown, label?: string): unknown;\n}\n\ntype ClientContext = EffectContext & {\n locale: LocaleContext;\n slots: SlotsContext;\n};\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => {\n ctx.locale.register('channels', locales as Record<string, Record<string, string>>);\n }, 'channel-web: locales');\n\n const t = ctx.locale.bind('channels');\n\n // Give the section a translator so its body text follows the active locale.\n const Section = function Section(props: SettingsSectionOwnerProps) {\n return ChannelsSection({ ...props, __t: t });\n };\n\n ctx.slots.inject('settings.section', () => {\n return ctx.slots.register(\n {\n name: 'settings.section',\n id: 'channels',\n order: 60,\n label: () => t('nav'),\n locale: 'channels',\n },\n Section,\n );\n });\n}\n", "/**\n * The \"\u6E20\u9053\" (Channels) Settings section (refactor plan \u00A710).\n *\n * The directory is fully backend-driven: on entry it issues exactly one\n * `GET /dsh-channels/api/v2/channels` and renders every channel the host\n * reports, enriched with presentation metadata from `channelRegistry.ts`.\n * Unknown channels still render through the generic fallback.\n *\n * Request lifecycle is strictly event-driven \u2014 no page-level polling:\n * - initial entry + `__requestRefresh` tick \u2192 one GET /channels\n * - browser becomes visible again \u2192 one GET /channels\n * - after setup saved / auth success / enable / disable \u2192 `onChanged` \u2192 one\n * GET /channels\n * - manual retry on error\n *\n * Exactly one row is open at a time (`openChannelId`); `ChannelRow` +\n * `DisclosureRow` guarantee collapsed rows issue zero expanded-content requests.\n *\n * The panel bottom (after the channel list \u2014 never a top banner) hosts the\n * advisory area: `useUpdateCheck` owns the one GET /update-check and hands its\n * result to the pure `BundleUpdateNotice`, followed by the low-key repository\n * footer entry. Both degrade silently.\n */\nimport { useCallback, useEffect, useState } from 'react';\nimport { fetchChannelsV2, type ChannelSummary } from './api.js';\nimport { channelWebDefinition } from './channelRegistry.js';\nimport { ChannelRow } from './ChannelRow.js';\nimport { BundleUpdateNotice } from './components/BundleUpdateNotice.js';\nimport { RepoFooter } from './components/RepoFooter.js';\nimport { useUpdateCheck } from './useUpdateCheck.js';\n\n// The host Settings slot applies 24px inline padding around every section.\n// Expand this section back into that gutter so its local scroller owns the\n// panel edge, while the content below retains the host-aligned reading inset.\nconst settingsSlotInlineInset = 24;\nconst channelContentInlineInset = settingsSlotInlineInset;\n\nexport interface ChannelsSectionProps {\n close?: () => void;\n __t?: (key: string) => string;\n __requestRefresh?: number;\n}\n\nexport function ChannelsSection(props: ChannelsSectionProps) {\n const t: (key: string) => string = props.__t ?? ((key: string) => key);\n const [list, setList] = useState<ChannelSummary[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [openChannelId, setOpenChannelId] = useState<string | null>(null);\n // Advisory bundle-update projection, fully owned by the hook (silent when\n // the check is unavailable; the browser never contacts npm itself). The\n // footer label reuses its `currentVersion`.\n const updateStatus = useUpdateCheck();\n\n const loadChannels = useCallback(async () => {\n try {\n const data = await fetchChannelsV2();\n setList(data);\n setError(null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }, []);\n\n // One directory load on entry + any explicit refresh tick from the host.\n useEffect(() => {\n void loadChannels();\n }, [loadChannels, props.__requestRefresh]);\n\n // Event-driven refresh: returning to a visible tab re-reads the directory.\n // No setInterval anywhere (red line W8).\n useEffect(() => {\n const refreshWhenVisible = () => {\n if (document.visibilityState === 'visible') void loadChannels();\n };\n document.addEventListener('visibilitychange', refreshWhenVisible);\n return () => document.removeEventListener('visibilitychange', refreshWhenVisible);\n }, [loadChannels]);\n\n const toggle = (id: string) => {\n setOpenChannelId((current) => (current === id ? null : id));\n };\n\n const rows = (list ?? [])\n .map((channel) => ({ channel, web: channelWebDefinition(channel.id) }))\n .sort((a, b) => a.web.order - b.web.order);\n\n return (\n // Flex column filling the settings panel. The channel directory owns the\n // scrolling (so an expanded row never moves the panel-bottom advisory\n // area). The host slot has a fixed 24px inline inset, so this component\n // expands into it; the scroll track reaches the panel edge while content\n // retains the same reading inset. The update notice + repository footer\n // stay pinned below the scroll region.\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n boxSizing: 'border-box',\n marginInline: -settingsSlotInlineInset,\n fontFamily: 'inherit',\n color: 'var(--dsw-alias-label-primary)',\n }}\n data-testid=\"channels-section\"\n >\n <div\n style={{\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n scrollbarGutter: 'stable',\n padding: `16px ${channelContentInlineInset}px`,\n }}\n data-testid=\"channel-directory-scroll\"\n >\n {error && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n fontSize: 12,\n color: 'var(--dsw-alias-state-error-primary)',\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l2)',\n borderRadius: 10,\n padding: '8px 12px',\n marginBottom: 14,\n }}\n data-testid=\"channels-error\"\n >\n <span>\n {t('connectionError')}: {error}\n </span>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n void loadChannels();\n }}\n style={{ color: 'var(--dsw-alias-label-primary-bluish)', textDecoration: 'none', whiteSpace: 'nowrap' }}\n >\n {t('retry')}\n </a>\n </div>\n )}\n\n {list === null && !error ? (\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-label-secondary)', padding: '12px 0' }}>{t('loading')}</div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column' }} data-testid=\"channel-directory\">\n {rows.map(({ channel, web }) => (\n <ChannelRow\n key={channel.id}\n channel={channel}\n web={web}\n open={openChannelId === channel.id}\n onToggle={() => toggle(channel.id)}\n onChanged={() => void loadChannels()}\n t={t}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Panel-bottom advisory area (pinned outside the scroll region):\n update hint + centered repository entry. */}\n <div style={{ flex: 'none', padding: `0 ${channelContentInlineInset}px 10px` }}>\n <BundleUpdateNotice update={updateStatus?.update ?? null} t={t} />\n <RepoFooter version={updateStatus?.currentVersion} t={t} />\n </div>\n </div>\n );\n}\n\nexport default ChannelsSection;\n", "/**\n * Client-side DTO + fetch wrapper for the dsh-channels host API (M5).\n *\n * The host serves the control plane under /dsh-channels/api/v2 in the same\n * origin, so plain relative fetch() works. All endpoints return sanitized\n * JSON \u2014 the client never sees a credential ref or a secret value; it only\n * knows `configured` / `writable` booleans. The legacy /v1 auth endpoints are\n * kept behind the same `request()` helper (a parallel host subagent maintains\n * the v1 compat layer) but this client has been migrated to v2.\n */\n\n// ---------------------------------------------------------------------------\n// DTO types\n// ---------------------------------------------------------------------------\n\nexport type AuthMethod = 'qr' | 'device' | 'portal-login' | 'credentials' | 'hybrid';\n\nexport type AuthPhase =\n | 'preparing'\n | 'waiting-scan'\n | 'scanned'\n | 'waiting-confirm'\n | 'verification-required'\n | 'credentials-required'\n | 'authorized'\n | 'expired'\n | 'failed'\n | 'cancelled';\n\nexport type RuntimeState = 'running' | 'stopped';\n\nexport type ConnectionState = 'connected' | 'degraded' | 'disconnected' | 'unknown';\n\n/** v2 channel list summary (GET /channels). */\nexport interface ChannelSummary {\n id: string;\n configured: boolean;\n enabled: boolean;\n mounted: boolean;\n runtime: RuntimeState;\n connection: ConnectionState;\n /** Access readiness of the channel. */\n access: ChannelAccessReadiness;\n}\n\n/** One setup field of a ChannelSetupDescriptor. `ref` is stripped by the host. */\nexport interface ChannelSetupField {\n name: string;\n kind: 'text' | 'secret';\n secret: boolean;\n configured: boolean;\n writable: boolean;\n /**\n * Current value for NON-secret fields only (e.g. appId/clientId). Secret\n * fields never carry it \u2014 the host omits secret values entirely.\n */\n value?: string;\n}\n\n/** v2 setup descriptor (GET /channels/:id/setup). */\nexport interface ChannelSetupDescriptor {\n fields: ChannelSetupField[];\n authMethods: AuthMethod[];\n setupUrl?: string;\n}\n\nexport type PublicQrPayloadKind = 'content' | 'data-url' | 'external-url';\n\nexport interface PublicQrPayload {\n kind: PublicQrPayloadKind;\n value: string;\n expiresAt?: number;\n}\n\nexport interface PublicAuthPrompt {\n kind: 'verification-code' | 'confirm-on-phone' | 'credentials-required' | 'open-browser';\n message?: string;\n}\n\n/** v2 public auth session (POST /channels/:id/auth/sessions). */\nexport interface PublicAuthSession {\n id: string;\n channelId: string;\n state: 'pending' | 'authenticated' | 'expired' | 'failed';\n phase: AuthPhase;\n qr?: PublicQrPayload | null;\n expiresAt?: number;\n prompt?: PublicAuthPrompt | null;\n /** Safe provider polling interval (ms); never a secret (doc \u00A715). */\n pollingIntervalMs?: number;\n}\n\n/** v2 public auth status (GET /channels/:id/auth/sessions/:sessionId). */\nexport interface PublicAuthStatus {\n state: 'pending' | 'authenticated' | 'expired' | 'failed';\n phase: AuthPhase;\n prompt?: PublicAuthPrompt | null;\n expiresAt?: number;\n detail?: string;\n}\n\nexport interface PublicError {\n error: { code: string; message: string };\n}\n\n// ---------------------------------------------------------------------------\n// Access-control DTOs \u2014 mirror @krischoichoi/channel-control shapes.\n// Policies carry ONLY canonical owner/sender/group ids \u2014 never any secret.\n// ---------------------------------------------------------------------------\n\nexport type ChannelAccessReadiness =\n | 'ready'\n | 'needs-owner'\n | 'missing-policy'\n | 'invalid-policy';\n\n/** How a channel determines its local operator / owner identity. */\nexport type OwnerDiscoveryMode = 'account' | 'claim' | 'manual' | 'platform';\n\n/** Declared access capability of a channel. */\nexport interface ChannelAccessDescriptor {\n directMessages: boolean;\n groups: boolean;\n mentions: boolean;\n ownerDiscovery: OwnerDiscoveryMode;\n identityLabels: { user: string; group?: string };\n /** Conversation-identity presentation metadata (see PublicConversationIdentity). */\n identity?: {\n conversation?: {\n externalIdLabel?: string;\n conversationDiscoverable?: boolean;\n };\n };\n defaults?: { requireMention?: boolean };\n}\n\nexport type AccessPreset = 'owner-only' | 'allowlist' | 'custom';\nexport type DirectMessagePolicy = 'disabled' | 'allowlist' | 'open';\nexport type GroupPolicy = 'disabled' | 'allowlist' | 'open';\nexport type GroupSenderPolicy = 'allowlist' | 'open';\n\n/** Sender and activation rule for a named group or the all-groups default. */\nexport interface GroupAccessRule {\n enabled: boolean;\n senderPolicy: GroupSenderPolicy;\n allowFrom: string[];\n requireMention: boolean;\n}\n\n/** Versioned, cross-package access policy (shared contract in channel-core). */\nexport interface ChannelAccessPolicy {\n version: 1;\n preset: AccessPreset;\n ownerId?: string;\n dmPolicy: DirectMessagePolicy;\n allowFrom: string[];\n groupPolicy: GroupPolicy;\n groups: Record<string, GroupAccessRule>;\n defaultGroupRule?: GroupAccessRule;\n}\n\n/** Full access picture for one channel+account. */\nexport interface ChannelAccessState {\n descriptor: ChannelAccessDescriptor;\n readiness: ChannelAccessReadiness;\n policy?: ChannelAccessPolicy;\n owner: { configured: boolean; id?: string; source?: 'account' | 'claim' | 'manual' };\n}\n\n/**\n * Observed conversation identity (GET /channels/:id/conversations). Display\n * metadata only: `canonicalId` is what a policy stores; `externalId` /\n * `displayName` are optional human-facing values.\n */\nexport interface PublicConversationIdentity {\n type: 'group';\n canonicalId: string;\n externalId?: string;\n displayName?: string;\n alias?: string;\n identityConflict?: boolean;\n firstSeenAt: number;\n lastSeenAt: number;\n}\n\nexport type OwnerClaimPhase =\n | 'waiting-message'\n | 'candidate'\n | 'confirmed'\n | 'expired'\n | 'cancelled';\n\n/** Browser-facing owner-claim session. */\nexport interface PublicOwnerClaimSession {\n id: string;\n channelId: string;\n accountId: string;\n phase: OwnerClaimPhase;\n /** Short one-time challenge the local browser shows the operator. NOT a credential. */\n challengeCode?: string;\n expiresAt: number;\n candidate?: { senderId: string };\n}\n\n// ---------------------------------------------------------------------------\n// Bundle update-check DTOs \u2014 mirror @krischoichoi/channel-control shapes. The host\n// performs the npm registry check; the browser only renders this sanitized,\n// secret-free projection (it never contacts npm itself).\n// ---------------------------------------------------------------------------\n\n/** Advisory upgrade hint computed by the host (prompt-only; never installs). */\nexport interface BundleUpdateInfo {\n /** Target version string, e.g. \"0.6.0\". */\n version: string;\n /** Which npm dist-tag provided the target. */\n tag: 'latest' | 'next';\n /** Target sits on a different major.minor line than the installed bundle. */\n crossLine: boolean;\n /** Upgrade commands in execution order. */\n commands: string[];\n}\n\n/** Read-only update status served by GET /update-check. */\nexport interface BundleUpdateStatus {\n currentVersion: string;\n update?: BundleUpdateInfo;\n checkedAt?: number;\n}\n\n// ---------------------------------------------------------------------------\n// fetch helper\n// ---------------------------------------------------------------------------\n\n/** v2 control plane base; v1 kept for the legacy compat surface. */\nconst BASE_V2 = '/dsh-channels/api/v2';\nconst BASE_V1 = '/dsh-channels/api/v1';\n\nexport class ApiError extends Error {\n readonly status: number;\n readonly code?: string;\n constructor(status: number, code: string | undefined, message: string) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n this.code = code;\n }\n}\n\nconst JSON_HEADERS = { 'Content-Type': 'application/json' };\n\nasync function request<T>(path: string, init?: RequestInit, base: string = BASE_V2): Promise<T> {\n const res = await fetch(base + path, init);\n const text = await res.text();\n let data: unknown = null;\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = null;\n }\n if (!res.ok) {\n const err = (data as PublicError | null)?.error;\n throw new ApiError(res.status, err?.code, err?.message ?? `request failed (${res.status})`);\n }\n return data as T;\n}\n\n// ---------------------------------------------------------------------------\n// v2 API\n// ---------------------------------------------------------------------------\n\n/** GET /channels \u2192 ChannelSummary[] */\nexport async function fetchChannelsV2(signal?: AbortSignal): Promise<ChannelSummary[]> {\n const body = await request<{ channels: ChannelSummary[] }>('/channels', { signal });\n return body.channels ?? [];\n}\n\n/**\n * GET /update-check \u2192 BundleUpdateStatus. Failure-tolerant by contract: the\n * caller treats any error as \"no banner\" (an unreachable check must never\n * break the Channels panel).\n */\nexport async function fetchUpdateCheck(signal?: AbortSignal): Promise<BundleUpdateStatus> {\n return request<BundleUpdateStatus>('/update-check', { signal });\n}\n\n/** GET /channels/:id/setup \u2192 ChannelSetupDescriptor */\nexport async function fetchSetup(id: string, signal?: AbortSignal): Promise<ChannelSetupDescriptor> {\n return request<ChannelSetupDescriptor>(`/channels/${encodeURIComponent(id)}/setup`, { signal });\n}\n\n/**\n * PUT /channels/:id/enabled \u2192 ChannelSummary (doc \u00A723). Persists the enabled\n * intent; the control plane starts/stops the runtime accordingly.\n */\nexport async function setChannelEnabled(\n id: string,\n enabled: boolean,\n signal?: AbortSignal,\n): Promise<ChannelSummary> {\n return request<ChannelSummary>(`/channels/${encodeURIComponent(id)}/enabled`, {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ enabled }),\n signal,\n });\n}\n\n/** PATCH /channels/:id/config \u2014 non-secret patch \u2192 { configured, fields } */\nexport async function saveConfig(\n id: string,\n patch: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<{ configured: boolean; fields: ChannelSetupField[] }> {\n return request<{ configured: boolean; fields: ChannelSetupField[] }>(\n `/channels/${encodeURIComponent(id)}/config`,\n { method: 'PATCH', headers: JSON_HEADERS, body: JSON.stringify(patch), signal },\n );\n}\n\n/** PUT /channels/:id/credentials/:field \u2014 never echoes value */\nexport async function saveCredential(\n id: string,\n field: string,\n value: string,\n signal?: AbortSignal,\n): Promise<{ configured: boolean; writable: boolean }> {\n return request<{ configured: boolean; writable: boolean }>(\n `/channels/${encodeURIComponent(id)}/credentials/${encodeURIComponent(field)}`,\n { method: 'PUT', headers: JSON_HEADERS, body: JSON.stringify({ value }), signal },\n );\n}\n\nexport async function applySetup(\n id: string,\n input: {\n config: Record<string, unknown>;\n credentials: Record<string, string>;\n reconcile?: boolean;\n },\n signal?: AbortSignal,\n): Promise<{ configured: boolean; connection: ConnectionState }> {\n return request(`/channels/${encodeURIComponent(id)}/setup`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n signal,\n });\n}\n\n/** POST /channels/:id/auth/sessions \u2192 PublicAuthSession */\nexport async function beginAuth(\n id: string,\n method: AuthMethod,\n accountId?: string,\n signal?: AbortSignal,\n): Promise<PublicAuthSession> {\n const body: Record<string, unknown> = { method };\n if (accountId) body.accountId = accountId;\n return request<PublicAuthSession>(`/channels/${encodeURIComponent(id)}/auth/sessions`, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify(body),\n signal,\n });\n}\n\n/** GET /channels/:id/auth/sessions/:sessionId \u2192 PublicAuthStatus */\nexport async function pollAuthSession(\n id: string,\n sessionId: string,\n signal?: AbortSignal,\n): Promise<PublicAuthStatus> {\n return request<PublicAuthStatus>(\n `/channels/${encodeURIComponent(id)}/auth/sessions/${encodeURIComponent(sessionId)}`,\n { signal },\n );\n}\n\n/** POST /channels/:id/auth/sessions/:sessionId/input \u2192 PublicAuthStatus */\nexport async function submitAuthInput(\n id: string,\n sessionId: string,\n kind: string,\n value: string,\n signal?: AbortSignal,\n): Promise<PublicAuthStatus> {\n return request<PublicAuthStatus>(\n `/channels/${encodeURIComponent(id)}/auth/sessions/${encodeURIComponent(sessionId)}/input`,\n { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({ kind, value }), signal },\n );\n}\n\n/** DELETE /channels/:id/auth/sessions/:sessionId \u2192 204 */\nexport async function cancelAuth(\n id: string,\n sessionId: string,\n signal?: AbortSignal,\n): Promise<void> {\n await request<unknown>(`/channels/${encodeURIComponent(id)}/auth/sessions/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n signal,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Access-control API\n// ---------------------------------------------------------------------------\n\n/** GET /channels/:id/access \u2192 ChannelAccessState */\nexport async function fetchAccess(id: string, signal?: AbortSignal): Promise<ChannelAccessState> {\n return request<ChannelAccessState>(`/channels/${encodeURIComponent(id)}/access`, { signal });\n}\n\n/** PUT /channels/:id/access \u2192 ChannelAccessState */\nexport async function saveAccess(\n id: string,\n policy: ChannelAccessPolicy,\n signal?: AbortSignal,\n): Promise<ChannelAccessState> {\n return request<ChannelAccessState>(`/channels/${encodeURIComponent(id)}/access`, {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify(policy),\n signal,\n });\n}\n\n/** POST /channels/:id/access/owner-claims \u2192 201 PublicOwnerClaimSession */\nexport async function beginOwnerClaim(\n id: string,\n signal?: AbortSignal,\n): Promise<PublicOwnerClaimSession> {\n return request<PublicOwnerClaimSession>(\n `/channels/${encodeURIComponent(id)}/access/owner-claims`,\n { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({}), signal },\n );\n}\n\n/** GET /channels/:id/access/owner-claims/:claimId \u2192 PublicOwnerClaimSession */\nexport async function fetchOwnerClaim(\n id: string,\n claimId: string,\n signal?: AbortSignal,\n): Promise<PublicOwnerClaimSession> {\n return request<PublicOwnerClaimSession>(\n `/channels/${encodeURIComponent(id)}/access/owner-claims/${encodeURIComponent(claimId)}`,\n { signal },\n );\n}\n\n/** POST /channels/:id/access/owner-claims/:claimId/confirm \u2192 ChannelAccessState */\nexport async function confirmOwnerClaim(\n id: string,\n claimId: string,\n signal?: AbortSignal,\n): Promise<ChannelAccessState> {\n return request<ChannelAccessState>(\n `/channels/${encodeURIComponent(id)}/access/owner-claims/${encodeURIComponent(claimId)}/confirm`,\n { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({}), signal },\n );\n}\n\n/** DELETE /channels/:id/access/owner-claims/:claimId \u2192 204 */\nexport async function cancelOwnerClaim(\n id: string,\n claimId: string,\n signal?: AbortSignal,\n): Promise<void> {\n await request<unknown>(\n `/channels/${encodeURIComponent(id)}/access/owner-claims/${encodeURIComponent(claimId)}`,\n { method: 'DELETE', signal },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Conversation identity directory (display/mapping only)\n// ---------------------------------------------------------------------------\n\n/** GET /channels/:id/conversations \u2192 { conversations } */\nexport async function fetchConversations(\n id: string,\n signal?: AbortSignal,\n): Promise<PublicConversationIdentity[]> {\n const body = await request<{ conversations: PublicConversationIdentity[] }>(\n `/channels/${encodeURIComponent(id)}/conversations`,\n { signal },\n );\n return body.conversations;\n}\n\n/**\n * GET /channels/:id/conversations/by-external/:externalId \u2192 the observed\n * identity for an optional human-facing id, or null when never seen.\n */\nexport async function findConversation(\n id: string,\n externalId: string,\n signal?: AbortSignal,\n): Promise<PublicConversationIdentity | null> {\n try {\n return await request<PublicConversationIdentity>(\n `/channels/${encodeURIComponent(id)}/conversations/by-external/${encodeURIComponent(externalId)}`,\n { signal },\n );\n } catch (error) {\n if (error instanceof ApiError && error.status === 404) return null;\n throw error;\n }\n}\n", "/**\n * Web presentation metadata for channels \u2014 the ONLY place platform UI/UX\n * differences may live.\n *\n * This is NOT business logic: the channel list itself comes from the host\n * `GET /channels`; this module only adds display metadata (title copy keys,\n * ordering, accent, field labels, auth prerequisites and official docs links).\n * Unknown future channels fall back to [createGenericChannelWebDefinition]\n * instead of crashing.\n *\n * The small pure helpers at the bottom are the generic replacement for the old\n * `authSetup.ts` platform branches: every decision is derived from\n * registry metadata, never from a `channelId === 'lark'` check.\n */\nimport type { AuthMethod, ChannelSetupDescriptor } from './api.js';\n\nexport type SetupMethod = AuthMethod | 'credentials';\n\nexport interface ChannelWebDefinition {\n id: string;\n /** Stable sort order in the directory (lower first). */\n order: number;\n\n /** Locale key for the display name. */\n titleKey: string;\n /** Optional one-line description shown under the title (not yet surfaced). */\n descriptionKey?: string;\n /** Locale key for the setup intro copy. */\n introKey?: string;\n\n /** Official platform or protocol documentation. Never implies permission status. */\n docsUrl?: string;\n\n /** Brand accent color (used as a subtle tint behind the brand logo). */\n accent?: string;\n\n /** Override labels for setup fields (name \u2192 locale key). */\n fieldLabels?: Record<string, string>;\n\n /**\n * Auth methods that may only begin once the listed setup fields are\n * configured. e.g. Lark `hybrid: ['appId', 'appSecret']`.\n */\n authRequiresConfigured?: Partial<Record<AuthMethod, string[]>>;\n\n /**\n * Primary setup path. When this is an interactive auth method and credential\n * fields also exist, Web presents credentials as an alternative mode instead\n * of rendering both workflows at once.\n */\n preferredSetupMethod?: SetupMethod;\n\n /** Web-only visibility for the optional specified-member editor. */\n memberPicker?: boolean;\n\n}\n\n/**\n * Built-in channel web metadata. Presentation only \u2014 the set of channels the\n * UI actually renders comes from the host directory.\n */\nexport const CHANNEL_WEB: Record<string, ChannelWebDefinition> = {\n weixin: {\n id: 'weixin',\n order: 10,\n titleKey: 'channelWeixin',\n accent: '#07c160',\n docsUrl: 'https://github.com/Tencent/openclaw-weixin',\n },\n\n qq: {\n id: 'qq',\n order: 20,\n titleKey: 'channelQq',\n introKey: 'setupIntro',\n docsUrl: 'https://q.qq.com/qqbot/',\n memberPicker: false,\n },\n\n dingtalk: {\n id: 'dingtalk',\n order: 30,\n titleKey: 'channelDingtalk',\n introKey: 'setupIntroDingtalk',\n docsUrl: 'https://open.dingtalk.com/document/',\n preferredSetupMethod: 'device',\n memberPicker: false,\n },\n\n lark: {\n id: 'lark',\n order: 40,\n titleKey: 'channelLark',\n introKey: 'setupIntroLark',\n docsUrl: 'https://open.feishu.cn/document/',\n preferredSetupMethod: 'credentials',\n memberPicker: true,\n\n authRequiresConfigured: {\n hybrid: ['appId', 'appSecret'],\n },\n },\n\n telegram: {\n id: 'telegram',\n order: 50,\n titleKey: 'channelTelegram',\n introKey: 'setupIntroTelegram',\n docsUrl: 'https://core.telegram.org/bots',\n memberPicker: true,\n },\n} satisfies Record<string, ChannelWebDefinition>;\n\n/**\n * Fallback for a channel the web registry does not know yet: keep rendering it\n * with its raw id as the title instead of dropping it from the directory.\n */\nexport function createGenericChannelWebDefinition(id: string): ChannelWebDefinition {\n return {\n id,\n order: 999,\n titleKey: id,\n };\n}\n\n/** Resolve the web metadata for a channel, with the generic fallback. */\nexport function channelWebDefinition(channelId: string): ChannelWebDefinition {\n return CHANNEL_WEB[channelId] ?? createGenericChannelWebDefinition(channelId);\n}\n\n/**\n * Display title for a channel row. Unknown channels use their raw id as the\n * title key; a translator that has no entry for it (or returns an empty string)\n * must still render the id instead of a blank row.\n */\nexport function channelWebTitle(definition: ChannelWebDefinition, t: (key: string) => string): string {\n return t(definition.titleKey) || definition.titleKey;\n}\n\n// ---------------------------------------------------------------------------\n// Generic setup logic (replaces the removed per-channel branches in authSetup.ts)\n// ---------------------------------------------------------------------------\n\n/** Preserve the provider-declared order while retaining an implicit credentials form. */\nexport function setupMethods(descriptor: ChannelSetupDescriptor): SetupMethod[] {\n const methods: SetupMethod[] = [...descriptor.authMethods];\n if (descriptor.fields.length > 0 && !methods.includes('credentials')) {\n methods.unshift('credentials');\n }\n return methods;\n}\n\n/** Whether credential fields are an alternative to the preferred interactive flow. */\nexport function hasAlternativeCredentials(\n web: ChannelWebDefinition,\n descriptor: ChannelSetupDescriptor,\n): boolean {\n const preferred = web.preferredSetupMethod;\n return preferred !== undefined\n && preferred !== 'credentials'\n && descriptor.fields.length > 0\n && setupMethods(descriptor).includes(preferred);\n}\n\n/**\n * Whether an auth method may begin right now. Methods with registry-declared\n * prerequisites (authRequiresConfigured) are unavailable until every listed\n * field is configured. The credentials form itself has no prerequisites.\n */\nexport function isSetupMethodAvailable(\n web: ChannelWebDefinition,\n method: SetupMethod,\n descriptor: ChannelSetupDescriptor,\n): boolean {\n if (method === 'credentials') return true;\n const required = web.authRequiresConfigured?.[method];\n if (!required || required.length === 0) return true;\n const configured = new Set(descriptor.fields.filter((field) => field.configured).map((field) => field.name));\n return required.every((name) => configured.has(name));\n}\n\n/**\n * Whether a channel offers a non-credentials auth method that is gated behind\n * config the user has not saved yet (the old `isLarkCredentialStep`). The\n * Auth UI uses this to defer beginAuth until the setup form is saved first.\n */\nexport function needsConfigBeforeAuth(\n web: ChannelWebDefinition,\n descriptor: ChannelSetupDescriptor,\n): boolean {\n const gated = descriptor.authMethods.filter((method) => method !== 'credentials');\n if (gated.length === 0) return false;\n return gated.some((method) => !isSetupMethodAvailable(web, method, descriptor));\n}\n\n/** Setup intro copy key: channel-specific when declared, generic otherwise. */\nexport function setupIntroKey(web: ChannelWebDefinition): string {\n return web.introKey ?? 'setupIntro';\n}\n\n/** Keep one docs link near the first channel-specific setup/auth interaction. */\nexport function channelDocsPlacement(\n web: ChannelWebDefinition,\n descriptor: ChannelSetupDescriptor,\n): 'setup' | 'auth' | null {\n if (!web.docsUrl) return null;\n if (hasAlternativeCredentials(web, descriptor)) return 'auth';\n if (descriptor.fields.length > 0) return 'setup';\n return setupMethods(descriptor).some((method) => method !== 'credentials') ? 'auth' : null;\n}\n", "/**\n * One channel row in the Channels directory (plan \u00A78, \u00A79, \u00A725).\n *\n * The disclosure interaction mirrors the Harness Workspace sidebar\n * `ProjectRowItem` (ui-workspace internal): a compact tree row that toggles on\n * whole-row click \u2014 brand icon, chevron that rotates 90\u00B0 when open,\n * `role=\"button\"` + `aria-expanded`, Enter/Space keyboard support. We do NOT\n * depend on `ui-workspace` internals nor on `DisclosureRow` (its layout\n * semantics target Reasoning/Tool-call rows); `ChannelRow` is the channel-web\n * business composition, built on official primitives (`IconTriangleRightFillMedium`,\n * `StateDot`) + the local `Switch` and `--dsw-*` tokens (plan \u00A731).\n *\n * Exactly one channel is expanded at a time (`openChannelId` in\n * ChannelsSection); the expanded body renders only while `open`, so a collapsed\n * row issues 0 setup / 0 auth / 0 access requests (red line W6).\n *\n * The row owns the shared setup descriptor + draft state (so the Auth section\n * can gate its begin button on the same descriptor \u2014 plan \u00A717.2) and the\n * enable/disable lifecycle, exposed as a direct \u542F\u52A8/\u505C\u7528 Switch on the\n * collapsed row (clicking it must not expand the row).\n */\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { Button, IconTriangleRightFillMedium, StateDot } from '@deepseek-ai/dsh-client-ui-primitives';\nimport {\n applySetup,\n fetchSetup,\n setChannelEnabled,\n type ChannelSetupDescriptor,\n type ChannelSummary,\n} from './api.js';\nimport {\n channelWebTitle,\n hasAlternativeCredentials,\n needsConfigBeforeAuth,\n type ChannelWebDefinition,\n} from './channelRegistry.js';\nimport { ChannelBrandIcon } from './components/ChannelBrandIcon.js';\nimport { Switch } from './components/Switch.js';\nimport { ChannelSetup } from './ChannelSetup.js';\nimport { ChannelAuth } from './ChannelAuth.js';\nimport { ChannelAccess } from './ChannelAccess.js';\n\n/**\n * Row-level hover background via a real CSS `:hover` rule. The official\n * primitives ship with stub CSS modules in plugin bundles, so row chrome is\n * ours \u2014 injected once through the same `data-plugin-css` mechanism the\n * official client bundles use. A React-state `:hover` simulation was flaky\n * (highlight could land on the wrong row); pure CSS cannot.\n */\nconst CHANNEL_ROW_CSS_TAG = 'dsh-channels/channel-row.css';\nif (typeof document !== 'undefined') {\n const existing = document.querySelector(`style[data-plugin-css=\"${CHANNEL_ROW_CSS_TAG}\"]`);\n if (!existing) {\n const tag = document.createElement('style');\n tag.dataset.plugin = '@krischoichoi/dsh-channels';\n tag.dataset.pluginCss = CHANNEL_ROW_CSS_TAG;\n tag.textContent =\n '[data-channel-row-toggle]{border-radius:8px}' +\n '[data-channel-row-toggle]:hover{background:var(--dsw-alias-interactive-bg-hover)}';\n document.head.appendChild(tag);\n }\n}\n\nexport interface ChannelRowProps {\n channel: ChannelSummary;\n web: ChannelWebDefinition;\n open: boolean;\n onToggle: () => void;\n t: (key: string) => string;\n /** Event-driven refresh after enable/disable, setup save or auth success. */\n onChanged: () => void;\n}\n\nexport function ChannelRow(props: ChannelRowProps) {\n const { channel, web, open, onToggle, t, onChanged } = props;\n\n // Shared setup state: fetched once per expansion, fed to both the setup form\n // and the auth prerequisite gate.\n const [descriptor, setDescriptor] = useState<ChannelSetupDescriptor | null>(null);\n const [setupLoading, setSetupLoading] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n const [drafts, setDrafts] = useState<Record<string, string>>({});\n const [edited, setEdited] = useState<Set<string>>(new Set());\n const [showCredentialSetup, setShowCredentialSetup] = useState(false);\n const [accessRevision, setAccessRevision] = useState(0);\n\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const setupController = useRef<AbortController | null>(null);\n\n const loadSetup = useCallback(() => {\n setupController.current?.abort();\n const controller = new AbortController();\n setupController.current = controller;\n fetchSetup(channel.id, controller.signal)\n .then((setup) => {\n if (controller.signal.aborted) return;\n setDescriptor(setup);\n setSetupLoading(false);\n setSetupError(null);\n setDrafts(() => {\n const seed: Record<string, string> = {};\n for (const field of setup.fields) {\n if (!field.secret && field.value) seed[field.name] = field.value;\n }\n return seed;\n });\n setEdited(new Set());\n })\n .catch((cause) => {\n if (controller.signal.aborted) return;\n setSetupLoading(false);\n setSetupError(cause instanceof Error ? cause.message : String(cause));\n });\n }, [channel.id]);\n\n // Fetch the descriptor whenever the row is opened (W6: only expanded rows).\n useEffect(() => {\n if (!open) return;\n setShowCredentialSetup(false);\n setSetupLoading(true);\n loadSetup();\n return () => setupController.current?.abort();\n }, [open, loadSetup]);\n\n const toggleFromKeyboard = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n // Keys typed while the enable/disable switch is focused belong to the\n // switch (it stops its own propagation too); never expand from those.\n if ((event.target as HTMLElement).closest?.('[data-channel-switch]')) return;\n event.preventDefault();\n onToggle();\n };\n\n const toggleEnabled = async () => {\n if (busy) return;\n setBusy(true);\n setActionError(null);\n try {\n await setChannelEnabled(channel.id, !channel.enabled);\n onChanged();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setBusy(false);\n }\n };\n\n // Compute the effective config/credentials patch for changed draft fields.\n // A secret field counts as changed when EDITED \u2014 including a cleared (empty)\n // draft, which becomes an empty credential value meaning \"clear that\n // credential\". Untouched fields are skipped so configured values persist.\n const buildPatch = (setup: ChannelSetupDescriptor) => {\n const config: Record<string, unknown> = {};\n const credentials: Record<string, string> = {};\n for (const field of setup.fields) {\n if (!edited.has(field.name)) continue;\n const value = (drafts[field.name] ?? '').trim();\n if (field.secret) credentials[field.name] = value;\n else config[field.name] = value;\n }\n return { config, credentials };\n };\n\n // \u00A717.2: persist unsaved drafts WITHOUT reconciling the runtime, then refresh\n // the descriptor so the auth gate reflects the saved state.\n const saveSetupForAuth = async () => {\n if (!descriptor) return;\n const { config, credentials } = buildPatch(descriptor);\n await applySetup(channel.id, { config, credentials, reconcile: false });\n await loadSetup();\n setAccessRevision((revision) => revision + 1);\n };\n\n const hasUnsavedSetup = descriptor\n ? descriptor.fields.some((field) => edited.has(field.name))\n : false;\n\n const handleSetupSaved = () => {\n setAccessRevision((revision) => revision + 1);\n loadSetup();\n onChanged();\n };\n\n const handleAuthorized = () => {\n setAccessRevision((revision) => revision + 1);\n loadSetup();\n onChanged();\n };\n\n const alternativeCredentials = descriptor\n ? hasAlternativeCredentials(web, descriptor)\n : false;\n const authDeferred = descriptor\n ? needsConfigBeforeAuth(web, descriptor)\n : false;\n\n const accent = web.accent ?? 'var(--dsw-alias-label-tertiary)';\n\n return (\n <div\n style={{ borderBottom: '1px solid var(--dsw-alias-border-l1)' }}\n data-testid={'channel-row-' + channel.id}\n data-channel-enabled={channel.enabled}\n >\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={open}\n onClick={onToggle}\n onKeyDown={toggleFromKeyboard}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n height: 36,\n padding: '0 8px',\n cursor: 'pointer',\n userSelect: 'none',\n color: 'var(--dsw-alias-label-primary)',\n }}\n data-testid=\"channel-row-toggle\"\n data-channel-row-toggle\n >\n {/* Expanding caret sits LEFT of the brand icon, like a standard tree\n row (plan \u00A78): \u25B8 [icon] title ... */}\n <span\n style={{\n flex: 'none',\n display: 'inline-flex',\n color: 'var(--dsw-alias-label-tertiary)',\n transition: 'transform 150ms ease',\n transform: open ? 'rotate(90deg)' : undefined,\n }}\n >\n <IconTriangleRightFillMedium size={14} />\n </span>\n\n <span\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: accent + '1f',\n }}\n >\n <ChannelBrandIcon channelId={channel.id} size={16} />\n </span>\n\n <span\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: 14,\n lineHeight: '20px',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n }}\n >\n {channelWebTitle(web, t)}\n </span>\n\n <span\n style={{\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 12,\n color: 'var(--dsw-alias-label-secondary)',\n }}\n data-testid=\"channel-collapsed-status\"\n >\n <StateDot state={collapsedDot(channel)} size={8} />\n <span>{collapsedLabel(channel, t)}</span>\n {accessWarning(channel, t) && (\n <span\n style={{\n color: 'var(--dsw-alias-state-warn-primary)',\n whiteSpace: 'nowrap',\n }}\n data-testid=\"channel-access-warning\"\n >\n {accessWarning(channel, t)}\n </span>\n )}\n </span>\n\n {/* \u542F\u52A8 / \u505C\u7528 \u2014 a direct switch on the collapsed row, replacing the\n old \"\u9AD8\u7EA7\u64CD\u4F5C\" button. Clicking it must not expand the row (the\n Switch stops propagation). */}\n <span\n style={{ flex: 'none', display: 'inline-flex', alignItems: 'center', marginLeft: 2 }}\n >\n <Switch\n checked={channel.enabled}\n disabled={busy}\n onChange={() => void toggleEnabled()}\n aria-label={channel.enabled ? t('disableChannel') : t('enableChannel')}\n testId={'channel-switch-' + channel.id}\n />\n </span>\n </div>\n\n {open && (\n <div\n style={{\n padding: '16px 4px 24px',\n display: 'flex',\n flexDirection: 'column',\n gap: 24,\n }}\n data-testid=\"channel-row-body\"\n >\n {alternativeCredentials && (\n <div\n role=\"group\"\n aria-label={t('setupMethod')}\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(min(128px, 100%), 1fr))',\n gap: 6,\n width: 'min(100%, 320px)',\n }}\n data-testid=\"setup-method-selector\"\n >\n <Button\n type=\"button\"\n size=\"sm\"\n variant={!showCredentialSetup ? 'primary' : 'ghost'}\n style={{ width: '100%', whiteSpace: 'nowrap' }}\n aria-pressed={!showCredentialSetup}\n onClick={() => setShowCredentialSetup(false)}\n >\n {t('scanAuthTab')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={showCredentialSetup ? 'primary' : 'ghost'}\n style={{ width: '100%', whiteSpace: 'nowrap' }}\n aria-pressed={showCredentialSetup}\n onClick={() => setShowCredentialSetup(true)}\n >\n {t('existingCredentialsTab')}\n </Button>\n </div>\n )}\n\n {(!alternativeCredentials || showCredentialSetup) && (\n <ChannelSetup\n channel={channel}\n web={web}\n descriptor={descriptor}\n loading={setupLoading}\n loadError={setupError}\n drafts={drafts}\n edited={edited}\n onDraftsChange={setDrafts}\n onEditedChange={setEdited}\n t={t}\n onSaved={handleSetupSaved}\n />\n )}\n\n {(!alternativeCredentials || !showCredentialSetup) && !authDeferred && (\n <ChannelAuth\n channel={channel}\n web={web}\n descriptor={descriptor}\n hasUnsavedSetup={hasUnsavedSetup}\n saveSetup={saveSetupForAuth}\n onAuthorized={handleAuthorized}\n t={t}\n />\n )}\n\n <ChannelAccess\n channel={channel}\n web={web}\n t={t}\n onChanged={onChanged}\n refreshKey={accessRevision}\n />\n </div>\n )}\n\n {/* Enable/disable failures surface directly under the row so they stay\n visible even while the row is collapsed (the switch lives on the\n collapsed row now, not inside the expanded body). */}\n {actionError && (\n <div\n style={{\n fontSize: 12,\n color: 'var(--dsw-alias-state-error-primary)',\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 8,\n padding: '8px 10px',\n margin: '0 8px 8px',\n }}\n data-testid=\"row-action-error\"\n >\n {actionError}\n </div>\n )}\n </div>\n );\n}\n\n/** Trailing summary on the collapsed row: connection dot + configuration state. */\nfunction collapsedLabel(channel: ChannelSummary, t: (key: string) => string): string {\n if (channel.runtime === 'running' && channel.connection === 'connected') return t('statusConnected');\n return channel.configured ? t('configured') : t('notConfigured');\n}\n\nfunction collapsedDot(channel: ChannelSummary): 'done' | 'ongoing' | 'error' {\n if (channel.runtime === 'running' && channel.connection === 'connected') return 'done';\n if (channel.enabled && channel.runtime === 'running' && channel.connection === 'disconnected') return 'error';\n return 'ongoing';\n}\n\n/**\n * Surface access-readiness trouble on the collapsed row (plan \u00A728) so the\n * operator can see why inbound is gated before expanding the row. Empty string\n * when nothing is wrong.\n */\nfunction accessWarning(channel: ChannelSummary, t: (key: string) => string): string {\n switch (channel.access) {\n case 'needs-owner':\n return t('readinessNeedsOwner');\n case 'missing-policy':\n return t('readinessMissingPolicy');\n case 'invalid-policy':\n return t('readinessInvalidPolicy');\n default:\n return '';\n }\n}\n\nexport default ChannelRow;\n", "/**\n * Real channel brand logos (WeChat / QQ / DingTalk / Lark / Telegram), filled in their\n * brand colors. Path data sourced from Simple Icons (WeChat, Tencent QQ) and\n * Iconify's ant-design / icon-park brand sets (DingTalk, Lark). Kept as inline\n * SVG so the client bundle stays self-contained (no runtime dependency).\n */\ninterface BrandPath {\n d: string;\n fillRule?: 'evenodd';\n}\n\ninterface BrandIconSpec {\n viewBox: string;\n color: string;\n paths: BrandPath[];\n}\n\nconst BRAND_ICONS: Record<string, BrandIconSpec> = {\n weixin: {\n viewBox: '0 0 24 24',\n color: '#07c160',\n paths: [\n {\n d: 'M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z',\n },\n ],\n },\n qq: {\n viewBox: '0 0 24 24',\n color: '#1ebafc',\n paths: [\n {\n d: 'M21.395 15.035a39.548 39.548 0 0 0-.803-2.264l-1.079-2.695c.001-.032.014-.562.014-.836C19.526 4.632 17.351 0 12 0S4.474 4.632 4.474 9.241c0 .274.013.804.014.836l-1.08 2.695a38.97 38.97 0 0 0-.802 2.264c-1.021 3.283-.69 4.643-.438 4.673.54.065 2.103-2.472 2.103-2.472 0 1.469.756 3.387 2.394 4.771-.612.188-1.363.479-1.845.835-.434.32-.379.646-.301.778.343.578 5.883.369 7.482.189 1.6.18 7.14.389 7.483-.189.078-.132.132-.458-.301-.778-.483-.356-1.233-.646-1.846-.836 1.637-1.384 2.393-3.302 2.393-4.771 0 0 1.563 2.537 2.103 2.472.251-.03.581-1.39-.438-4.673zM12.662 4.846c.039-1.052.659-1.878 1.385-1.846s1.281.912 1.242 1.964c-.039 1.051-.659 1.878-1.385 1.846s-1.282-.912-1.242-1.964zM9.954 3c.725-.033 1.345.794 1.384 1.846.04 1.052-.517 1.931-1.242 1.963-.726.033-1.346-.794-1.385-1.845C8.672 3.912 9.228 3.033 9.954 3zM7.421 8.294c.194-.43 2.147-.908 4.566-.908h.026c2.418 0 4.372.479 4.566.908a.14.14 0 0 1 .014.061c0 .031-.01.059-.026.083-.163.238-2.333 1.416-4.553 1.416h-.026c-2.221 0-4.39-1.178-4.553-1.416a.136.136 0 0 1-.014-.144zm10.422 8.622c-.22 3.676-2.403 5.987-5.774 6.021h-.137c-3.37-.033-5.554-2.345-5.773-6.021-.081-1.35.001-2.496.147-3.43.318.063.638.122.958.176v3.506s1.658.334 3.318.103v-3.225c.488.027.96.04 1.406.034h.025c1.678.021 3.714-.204 5.683-.594.146.934.227 2.08.147 3.43zM10.48 5.804c.313-.041.542-.409.508-.825-.033-.415-.314-.72-.629-.679-.313.04-.541.409-.508.824.034.417.315.72.629.68zM14.479 5.156c.078.037.221.042.289-.146.035-.095.025-.165-.009-.214-.023-.033-.133-.118-.371-.176-.904-.22-1.341.384-1.405.499-.04.072-.012.176.056.227.067.051.139.037.179-.006.58-.628 1.21-.208 1.261-.184z',\n },\n ],\n },\n dingtalk: {\n viewBox: '0 0 1024 1024',\n color: '#0089ff',\n paths: [\n {\n d: 'M573.7 252.5C422.5 197.4 201.3 96.7 201.3 96.7c-15.7-4.1-17.9 11.1-17.9 11.1c-5 61.1 33.6 160.5 53.6 182.8c19.9 22.3 319.1 113.7 319.1 113.7S326 357.9 270.5 341.9c-55.6-16-37.9 17.8-37.9 17.8c11.4 61.7 64.9 131.8 107.2 138.4c42.2 6.6 220.1 4 220.1 4s-35.5 4.1-93.2 11.9c-42.7 5.8-97 12.5-111.1 17.8c-33.1 12.5 24 62.6 24 62.6c84.7 76.8 129.7 50.5 129.7 50.5c33.3-10.7 61.4-18.5 85.2-24.2L565 743.1h84.6L603 928l205.3-271.9H700.8l22.3-38.7c.3.5.4.8.4.8S799.8 496.1 829 433.8l.6-1h-.1c5-10.8 8.6-19.7 10-25.8c17-71.3-114.5-99.4-265.8-154.5',\n },\n ],\n },\n lark: {\n viewBox: '0 0 48 48',\n color: '#3370ff',\n paths: [\n {\n d: 'M41.0716 5.99409L3.31071 16.5187L12.3856 25.8126L20.7998 25.9594L30.4827 16.5187C30.2266 15.9943 30.0985 15.5552 30.0985 15.2013C30.0985 14.4074 30.4104 13.7786 30.8947 13.333C31.7241 12.57 32.7222 12.4558 33.8889 12.9905L41.0716 5.99409Z',\n fillRule: 'evenodd',\n },\n {\n d: 'M42.1021 6.72842L31.5775 44.4893L22.2836 35.4144L22.1367 27.0002L31.5115 17.4816C32.0195 17.8454 32.5743 18.0105 33.1759 17.9769C34.0784 17.9264 34.6614 17.3813 34.9349 17.0602C35.2083 16.7392 35.5293 16.2051 35.5025 15.4113C35.4847 14.8821 35.3109 14.3941 34.9812 13.9472L42.1021 6.72842Z',\n fillRule: 'evenodd',\n },\n ],\n },\n telegram: {\n viewBox: '0 0 24 24',\n color: '#26a5e4',\n paths: [\n {\n d: 'M23.91 3.79L20.3 20.84c-.25 1.12-.93 1.4-1.88.87l-5.19-3.82-2.5 2.4c-.28.28-.51.51-1.05.51l.37-5.28L19.1 6.9c.42-.37-.09-.58-.65-.21L7.42 13.02l-5.11-1.6c-1.11-.35-1.13-1.11.23-1.64L22.4 2.46c.93-.35 1.74.21 1.51 1.33z',\n },\n ],\n },\n};\n\nexport interface ChannelBrandIconProps {\n channelId: string;\n size?: number;\n}\n\n/** Render the real brand logo for a channel, filled in its brand color. */\nexport function ChannelBrandIcon({ channelId, size = 16 }: ChannelBrandIconProps) {\n const spec = BRAND_ICONS[channelId];\n if (!spec) return null;\n return (\n <svg\n width={size}\n height={size}\n viewBox={spec.viewBox}\n fill={spec.color}\n aria-hidden=\"true\"\n style={{ display: 'block', flex: 'none' }}\n >\n {spec.paths.map((p, i) => (\n <path key={i} d={p.d} fillRule={p.fillRule} />\n ))}\n </svg>\n );\n}\n\nexport default ChannelBrandIcon;\n", "/**\n * Accessible on/off switch for the channel row's enable lifecycle\n * (\u542F\u52A8 / \u505C\u7528).\n *\n * `@deepseek-ai/dsh-client-ui-primitives` does not export a Switch yet, so\n * this is a small business-local control that follows the harness's own\n * switch precedent (the trajectory toolbar's `role=\"switch\"` button: track +\n * thumb, `aria-checked`, `--dsw-alias-state-business-primary` ON state) and\n * the `--dsw-*` token family \u2014 no dependency on internal packages (plan \u00A78\n * \"\u4E0D\u4F9D\u8D56 ui-workspace \u5185\u90E8\u7EC4\u4EF6\").\n *\n * The switch lives INSIDE the row's `role=\"button\"` disclosure toggle, so it\n * stops propagation of click and Enter/Space keydown: toggling enable/disable\n * must never expand/collapse the row (same pattern as the official\n * `ProjectRowItem` action buttons calling `e.stopPropagation()`).\n */\nconst SWITCH_CSS_TAG = 'dsh-channels/switch.css';\nif (typeof document !== 'undefined') {\n const existing = document.querySelector(`style[data-plugin-css=\"${SWITCH_CSS_TAG}\"]`);\n if (!existing) {\n const tag = document.createElement('style');\n tag.dataset.plugin = '@krischoichoi/dsh-channels';\n tag.dataset.pluginCss = SWITCH_CSS_TAG;\n tag.textContent =\n '[data-channel-switch]:focus-visible{outline:1px solid var(--dsw-alias-state-business-primary);outline-offset:1px}';\n document.head.appendChild(tag);\n }\n}\n\nexport interface SwitchProps {\n checked: boolean;\n disabled?: boolean;\n onChange: (next: boolean) => void;\n 'aria-label'?: string;\n testId?: string;\n}\n\nexport function Switch(props: SwitchProps) {\n const { checked, disabled, onChange } = props;\n const ariaLabel = props['aria-label'];\n const testId = props.testId;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={ariaLabel}\n disabled={disabled}\n data-channel-switch\n data-testid={testId}\n onClick={(event) => {\n // The switch is a child of the row's disclosure toggle: never let the\n // click bubble into expand/collapse.\n event.stopPropagation();\n event.preventDefault();\n onChange(!checked);\n }}\n // Also swallow the raw pointer/mouse events so fast presses or a future\n // pointerdown-based handler on the row can never see them (full\n // click-through isolation).\n onPointerDown={(event) => event.stopPropagation()}\n onPointerUp={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onMouseUp={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n // The row's own Enter/Space handler must not see keys typed on the\n // switch (it would expand the row while toggling).\n if (event.key === 'Enter' || event.key === ' ') event.stopPropagation();\n }}\n style={{\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n width: 32,\n height: 18,\n padding: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n background: 'transparent',\n border: 'none',\n borderRadius: 999,\n opacity: disabled ? 0.55 : 1,\n }}\n >\n <span\n aria-hidden=\"true\"\n data-on={checked || undefined}\n style={{\n boxSizing: 'border-box',\n position: 'relative',\n display: 'block',\n width: 32,\n height: 18,\n borderRadius: 999,\n background: checked ? 'var(--dsw-alias-state-business-primary)' : 'var(--dsw-alias-border-l2)',\n transition: 'background-color 120ms ease',\n }}\n >\n <span\n style={{\n position: 'absolute',\n top: 2,\n left: 2,\n width: 14,\n height: 14,\n borderRadius: '50%',\n background: 'var(--dsw-alias-bg-layer-1)',\n transition: 'transform 120ms ease',\n transform: checked ? 'translateX(14px)' : undefined,\n }}\n />\n </span>\n </button>\n );\n}\n\nexport default Switch;\n", "/**\n * Inline setup form for one expanded channel (plan \u00A717.1, \u00A78.1).\n *\n * The descriptor + draft state are owned by the row (so the Auth section can\n * gate on the same descriptor); this component renders the fields and owns the\n * \"\u4FDD\u5B58\u5E76\u8FDE\u63A5\" action: `applySetup(channelId, { config, credentials,\n * reconcile: true })`. No channel-specific branches \u2014 intro copy and field\n * labels come from `channelRegistry.ts`.\n */\nimport { useEffect, useRef, useState, type Dispatch, type SetStateAction } from 'react';\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives';\nimport {\n applySetup,\n type ChannelSetupDescriptor,\n type ChannelSummary,\n} from './api.js';\nimport { channelDocsPlacement, setupIntroKey, type ChannelWebDefinition } from './channelRegistry.js';\nimport { CredentialField } from './components/CredentialField.js';\nimport { OfficialDocsLink } from './components/OfficialDocsLink.js';\nimport { SectionHeading } from './components/SectionHeading.js';\nimport { canSaveSetup, changedSetupFields } from './setupFormState.js';\n\nexport interface ChannelSetupProps {\n channel: ChannelSummary;\n web: ChannelWebDefinition;\n descriptor: ChannelSetupDescriptor | null;\n loading: boolean;\n loadError: string | null;\n drafts: Record<string, string>;\n edited: Set<string>;\n onDraftsChange: Dispatch<SetStateAction<Record<string, string>>>;\n onEditedChange: Dispatch<SetStateAction<Set<string>>>;\n t: (key: string) => string;\n /** Event-driven refresh after a successful save (directory + descriptor reload). */\n onSaved: () => void;\n}\n\nexport function ChannelSetup(props: ChannelSetupProps) {\n const { channel, web, descriptor, loading, loadError, drafts, edited, onDraftsChange, onEditedChange, t, onSaved } = props;\n\n if (loading) {\n return (\n <section aria-label={t('setupSection')} data-testid=\"channel-setup\">\n <SectionHeading title={t('setupSection')} />\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)' }}>{t('loading')}</div>\n </section>\n );\n }\n if (loadError || !descriptor) {\n return (\n <section aria-label={t('setupSection')} data-testid=\"channel-setup\">\n <SectionHeading title={t('setupSection')} />\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{loadError ?? '?'}</div>\n </section>\n );\n }\n\n // No config fields (e.g. Weixin): hide the whole \"\u5E94\u7528\u914D\u7F6E\" section instead\n // of showing an empty \"\u6B64\u6E20\u9053\u65E0\u9700\u586B\u5199\u914D\u7F6E\" placeholder.\n if (descriptor.fields.length === 0) return null;\n\n return (\n <section aria-label={t('setupSection')} data-testid=\"channel-setup\">\n <SectionHeading\n title={t('setupSection')}\n action={\n channelDocsPlacement(web, descriptor) === 'setup' && web.docsUrl\n ? <OfficialDocsLink href={web.docsUrl} label={t('viewOfficialDocs')} />\n : undefined\n }\n />\n <SetupForm\n channelId={channel.id}\n descriptor={descriptor}\n web={web}\n drafts={drafts}\n edited={edited}\n onDraftsChange={onDraftsChange}\n onEditedChange={onEditedChange}\n t={t}\n onSaved={onSaved}\n />\n </section>\n );\n}\n\nfunction SetupForm({\n channelId,\n descriptor,\n web,\n drafts,\n edited,\n onDraftsChange,\n onEditedChange,\n t,\n onSaved,\n}: {\n channelId: string;\n descriptor: ChannelSetupDescriptor;\n web: ChannelWebDefinition;\n drafts: Record<string, string>;\n edited: Set<string>;\n onDraftsChange: Dispatch<SetStateAction<Record<string, string>>>;\n onEditedChange: Dispatch<SetStateAction<Set<string>>>;\n t: (key: string) => string;\n onSaved: () => void;\n}) {\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [savedNotice, setSavedNotice] = useState<string | null>(null);\n const saveController = useRef<AbortController | null>(null);\n\n useEffect(() => {\n return () => saveController.current?.abort();\n }, []);\n\n // A field is \"changed\" when the user actually edited it \u2014 for credentials\n // this includes DELETING the value (empty draft = clear that credential on\n // save). Untouched fields are never resent, so a configured secret keeps its\n // stored value unless the user explicitly clears it.\n const changed = changedSetupFields(descriptor, edited);\n const canSubmit = canSaveSetup(saving);\n\n const submit = async () => {\n const config: Record<string, unknown> = {};\n const credentials: Record<string, string> = {};\n for (const field of changed) {\n const value = drafts[field.name]!.trim();\n if (field.secret) credentials[field.name] = value;\n else config[field.name] = value;\n }\n\n setSaving(true);\n setError(null);\n setSavedNotice(null);\n const controller = new AbortController();\n saveController.current = controller;\n try {\n await applySetup(channelId, { config, credentials, reconcile: true }, controller.signal);\n if (controller.signal.aborted) return;\n // Clear secret drafts so an untouched secret is never resent on the next\n // edit cycle; keep non-secret values visible.\n onDraftsChange((current) => {\n const next = { ...current };\n for (const field of descriptor.fields) {\n if (field.secret) next[field.name] = '';\n }\n return next;\n });\n onEditedChange(new Set());\n setSavedNotice(t('setupSaved'));\n onSaved();\n } catch (cause) {\n if (controller.signal.aborted) return;\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n saveController.current = null;\n setSaving(false);\n }\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }} data-testid=\"credentials-form\">\n <p style={{ margin: 0, fontSize: 13, lineHeight: 1.6, color: 'var(--dsw-alias-label-secondary)' }}>\n {t(setupIntroKey(web))}\n </p>\n {descriptor.setupUrl && (\n <a\n href={descriptor.setupUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ fontSize: 12, color: 'var(--dsw-alias-label-primary-bluish)', textDecoration: 'none', width: 'fit-content' }}\n >\n {t('openPlatform')} \u2197\n </a>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {descriptor.fields.map((field) => (\n <CredentialField\n key={field.name}\n field={field}\n value={drafts[field.name] ?? ''}\n onChange={(value) => {\n onDraftsChange((current) => ({ ...current, [field.name]: value }));\n onEditedChange((current) => new Set(current).add(field.name));\n }}\n t={t}\n disabled={saving}\n />\n ))}\n </div>\n {error && <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{t('saveError')}: {error}</div>}\n {savedNotice && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-success-primary)' }} data-testid=\"setup-saved-notice\">\n {savedNotice}\n </div>\n )}\n <div>\n <Button variant=\"primary\" size=\"sm\" onClick={() => void submit()} disabled={!canSubmit} data-testid=\"setup-save\">\n {saving ? t('saving') : t('saveAndConnect')}\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ChannelSetup;\n", "import { useState } from 'react';\nimport { Input, Pill } from '@deepseek-ai/dsh-client-ui-primitives';\nimport type { ChannelSetupField } from '../api.js';\n\nexport interface CredentialFieldProps {\n field: ChannelSetupField;\n value: string;\n onChange: (value: string) => void;\n t: (key: string) => string;\n disabled?: boolean;\n}\n\n/** Shown as a fake password value while a configured secret is not being edited. */\nconst MASKED_SECRET = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\n/**\n * Presentational setup field. Saving is owned by the parent form so a channel\n * with multiple credentials still has one user action.\n *\n * Non-secret fields show their current value (seeded by the parent from\n * `field.value`). Configured secret fields show a masked placeholder value;\n * focusing clears the mask so the user can type a replacement, and leaving the\n * field empty keeps the existing secret. The \"\u5DF2\u914D\u7F6E/\u672A\u914D\u7F6E\" pill is gone:\n * the field's own value/mask already communicates that state.\n */\nexport function CredentialField(props: CredentialFieldProps) {\n const { field, value, onChange, t, disabled = false } = props;\n\n const isSecret = field.kind === 'secret';\n const inputDisabled = !field.writable || disabled;\n const [editing, setEditing] = useState(false);\n\n // A configured secret with no typed replacement shows masked dots; focusing\n // switches to the real (empty) value so a fresh replacement can be entered.\n const masked = isSecret && field.configured && !editing && !value;\n const displayValue = masked ? MASKED_SECRET : value;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }} data-testid={'credential-field-' + field.name}>\n <label style={{ fontSize: 12, opacity: 0.85, display: 'flex', alignItems: 'center', gap: 6 }}>\n {field.name}\n {!field.writable && <Pill active={false}>{t('readonlyHint')}</Pill>}\n </label>\n <Input\n type={isSecret ? 'password' : 'text'}\n value={displayValue}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => {\n if (isSecret && field.configured) setEditing(true);\n }}\n onBlur={() => setEditing(false)}\n placeholder={t('inputValue')}\n disabled={inputDisabled}\n />\n </div>\n );\n}\n\nexport default CredentialField;\n", "export function OfficialDocsLink({ href, label }: { href: string; label: string }) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n flex: 'none',\n fontSize: 12,\n fontWeight: 400,\n letterSpacing: 0,\n color: 'var(--dsw-alias-label-primary-bluish)',\n textDecoration: 'none',\n }}\n data-testid=\"official-docs-link\"\n >\n {label} \u2197\n </a>\n );\n}\n\nexport default OfficialDocsLink;\n", "/**\n * Shared section heading for the inline accordion areas (plan \u00A78.1, \u00A731).\n * Extracted so every expanded-channel section uses identical chrome instead of\n * four local copies (plan \u00A738 Phase 7 cleanup).\n */\nimport type { ReactNode } from 'react';\n\nexport function SectionHeading({ title, action }: { title: string; action?: ReactNode }) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: 0,\n color: 'var(--dsw-alias-label-secondary)',\n marginBottom: 12,\n }}\n >\n <span>{title}</span>\n {action}\n </div>\n );\n}\n\nexport default SectionHeading;\n", "import type { ChannelSetupDescriptor } from './api.js';\n\n/** Fields intentionally changed by the operator, including secret fields. */\nexport function changedSetupFields(descriptor: ChannelSetupDescriptor, edited: Set<string>) {\n return descriptor.fields.filter((field) => edited.has(field.name));\n}\n\n/** Setup status and field completeness must not gate a user-initiated save. */\nexport function canSaveSetup(saving: boolean): boolean {\n return !saving;\n}\n", "/**\n * Inline interactive-auth section for one expanded channel (plan \u00A78.1, \u00A717.2).\n *\n * Rendered only while the row is open (DisclosureRow children), so no auth\n * request exists for a collapsed row (red line W6). beginAuth happens ONLY on\n * an explicit user click of \"\u5F00\u59CB\u6388\u6743\" (red line W7, 39.4/39.5); the loop,\n * cancellation and visibility pausing all live in `useChannelAuth`.\n *\n * The method list and prerequisite gating are derived from the setup descriptor\n * plus `channelRegistry.ts` metadata \u2014 this component contains no built-in\n * channel id checks (red line W2).\n */\nimport { useState } from 'react';\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives';\nimport type { AuthMethod, ChannelSetupDescriptor, ChannelSummary } from './api.js';\nimport {\n channelDocsPlacement,\n needsConfigBeforeAuth,\n setupMethods,\n type ChannelWebDefinition,\n} from './channelRegistry.js';\nimport { AuthProgress } from './components/AuthProgress.js';\nimport { OfficialDocsLink } from './components/OfficialDocsLink.js';\nimport { QrCodeDisplay } from './components/QrCodeDisplay.js';\nimport { SectionHeading } from './components/SectionHeading.js';\nimport { useChannelAuth } from './useChannelAuth.js';\n\nexport interface ChannelAuthProps {\n channel: ChannelSummary;\n web: ChannelWebDefinition;\n /** Latest setup descriptor (owned by the row; prerequisite gating input). */\n descriptor: ChannelSetupDescriptor | null;\n /** Whether the setup form holds unsaved drafts (persisted before auth). */\n hasUnsavedSetup: boolean;\n /** Persist the setup form without reconciling the runtime. */\n saveSetup: () => Promise<void>;\n /** Event-driven refresh after a successful authorization. */\n onAuthorized: () => void;\n t: (key: string) => string;\n}\n\nexport function ChannelAuth(props: ChannelAuthProps) {\n const { channel, web, descriptor, hasUnsavedSetup, saveSetup, onAuthorized, t } = props;\n const auth = useChannelAuth({\n channelId: channel.id,\n web,\n descriptor,\n hasUnsavedSetup,\n saveSetup,\n onAuthorized,\n t,\n });\n\n const [selectedMethod, setSelectedMethod] = useState<AuthMethod | null>(null);\n\n const interactiveMethods = (descriptor ? setupMethods(descriptor) : [])\n .filter((method): method is AuthMethod => method !== 'credentials');\n\n if (interactiveMethods.length === 0) return null;\n\n const method = selectedMethod ?? interactiveMethods[0]!;\n const gated = needsConfigBeforeAuth(web, descriptor ?? { fields: [], authMethods: [] });\n const onBegin = () => void auth.begin(method);\n\n return (\n <section aria-label={t('authSection')} data-testid=\"channel-auth\">\n <SectionHeading\n title={t('authSection')}\n action={\n descriptor && channelDocsPlacement(web, descriptor) === 'auth' && web.docsUrl\n ? <OfficialDocsLink href={web.docsUrl} label={t('viewOfficialDocs')} />\n : undefined\n }\n />\n\n {interactiveMethods.length > 1 && (\n <div style={{ display: 'flex', gap: 6, marginBottom: 10 }}>\n {interactiveMethods.map((m) => (\n <Button\n key={m}\n type=\"button\"\n size=\"sm\"\n variant={method === m ? 'primary' : 'ghost'}\n disabled={!auth.canBegin(m)}\n onClick={() => setSelectedMethod(m)}\n >\n {authMethodLabel(m, t)}\n </Button>\n ))}\n </div>\n )}\n\n {!auth.active ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start' }}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onBegin}\n disabled={auth.busy || gated || !auth.canBegin(method)}\n data-testid=\"auth-begin\"\n >\n {auth.busy ? t('saving') : t('beginAuth')}\n </Button>\n {gated && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-warn-primary)' }} data-testid=\"auth-gated-hint\">\n {t('authNeedsConfigFirst')}\n </div>\n )}\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 12 }} data-testid=\"auth-flow\">\n {auth.session?.qr && auth.status?.state !== 'expired' && (\n <QrCodeDisplay payload={auth.session.qr} width={208} t={t} />\n )}\n {auth.status && (\n <div style={{ width: '100%' }}>\n <AuthProgress\n channelId={channel.id}\n sessionId={auth.session?.id ?? ''}\n status={auth.status}\n t={t}\n onRegenerate={() => void auth.begin(method)}\n />\n </div>\n )}\n </div>\n )}\n\n {auth.error && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)', marginTop: 8 }} data-testid=\"auth-error\">\n {auth.error}\n </div>\n )}\n </section>\n );\n}\n\nfunction authMethodLabel(method: AuthMethod, t: (key: string) => string): string {\n if (method === 'portal-login') return t('portalLoginTab');\n if (method === 'device' || method === 'hybrid') return t('scanAuthTab');\n return t('scanTab');\n}\n\nexport default ChannelAuth;\n", "import { useState } from 'react';\nimport { Button, Input } from '@deepseek-ai/dsh-client-ui-primitives';\nimport { submitAuthInput, type PublicAuthStatus } from '../api.js';\n\nexport interface AuthProgressProps {\n channelId: string;\n sessionId: string;\n status: PublicAuthStatus;\n t: (key: string) => string;\n /** Fire to begin a fresh auth session (expired \u2192 regenerate, failed \u2192 retry). */\n onRegenerate?: () => void;\n}\n\n/**\n * Renders a PublicAuthStatus by phase (\u00A7Task 8). It NEVER parses `detail` to\n * decide behaviour \u2014 phase alone drives the UI. 'verification-required' shows\n * an inline verification-code input that calls submitAuthInput. The parent\n * observes `authorized`/failed via polling and advances the flow itself.\n */\nexport function AuthProgress(props: AuthProgressProps) {\n const { channelId, sessionId, status, t, onRegenerate } = props;\n\n if (status.phase === 'authorized' || status.state === 'authenticated') {\n return (\n <div data-testid=\"auth-progress\" style={{ fontSize: 13, color: 'var(--dsw-alias-state-success-primary)', textAlign: 'center', padding: '12px 0' }}>\n {t('success')}\n </div>\n );\n }\n\n if (status.phase === 'expired' || status.state === 'expired') {\n return (\n <div data-testid=\"auth-progress\" style={{ textAlign: 'center', padding: '16px 0' }}>\n <div style={{ fontSize: 13, marginBottom: 12 }}>{t('expired')}</div>\n <Button variant=\"outline\" size=\"sm\" onClick={onRegenerate} data-testid=\"auth-retry\">\n {t('regenerate')}\n </Button>\n </div>\n );\n }\n\n if (status.phase === 'failed' || status.state === 'failed') {\n return (\n <div data-testid=\"auth-progress\" style={{ textAlign: 'center', padding: '16px 0' }}>\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-state-error-primary)', marginBottom: 12 }}>\n {t('failed')}{status.detail ? ': ' + status.detail : ''}\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={onRegenerate} data-testid=\"auth-retry\">\n {t('retry')}\n </Button>\n </div>\n );\n }\n\n switch (status.phase) {\n case 'waiting-scan':\n return <div data-testid=\"auth-progress\" style={hint()}>{t('waitingScan')}</div>;\n case 'scanned':\n return <div data-testid=\"auth-progress\" style={hint()}>{t('scannedConfirm')}</div>;\n case 'waiting-confirm':\n return <div data-testid=\"auth-progress\" style={hint()}>{t('confirmOnPhone')}</div>;\n case 'credentials-required':\n return <div data-testid=\"auth-progress\" style={hint()}>{t('credentialsRequired')}</div>;\n case 'verification-required':\n return <VerifyCodeInput channelId={channelId} sessionId={sessionId} t={t} />;\n case 'preparing':\n default:\n return <div data-testid=\"auth-progress\" style={hint()}>{t('preparing')}</div>;\n }\n}\n\nfunction VerifyCodeInput({\n channelId,\n sessionId,\n t,\n}: {\n channelId: string;\n sessionId: string;\n t: (key: string) => string;\n}) {\n const [code, setCode] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async () => {\n if (!code.trim()) return;\n setSubmitting(true);\n setError(null);\n try {\n await submitAuthInput(channelId, sessionId, 'verification-code', code.trim());\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <div data-testid=\"auth-progress\" style={{ marginTop: 4 }}>\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)', marginBottom: 6 }}>{t('needVerifyCode')}</div>\n <Input\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder={t('verifyCodePlaceholder')}\n data-testid=\"verify-code-input\"\n />\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={submitting || !code.trim()}\n style={{ marginTop: 8, width: '100%' }}\n >\n {submitting ? '\u2026' : t('submit')}\n </Button>\n {error && <div style={{ fontSize: 11, color: 'var(--dsw-alias-state-error-primary)', marginTop: 6 }}>{error}</div>}\n </div>\n );\n}\n\ntype CssStyle = Record<string, string | number>;\n\nfunction hint(): CssStyle {\n return { fontSize: 13, color: 'var(--dsw-alias-label-secondary)', textAlign: 'center' as const, padding: '12px 0' };\n}\n\nexport default AuthProgress;\n", "\nimport QRCode from 'qrcode';\nimport { useEffect, useState } from 'react';\nimport type { PublicQrPayload } from '../api.js';\n\nexport interface QrCodeDisplayProps {\n /** QR payload; null/undefined shows the \"waiting\" placeholder. */\n payload?: PublicQrPayload | null;\n width?: number;\n t: (key: string) => string;\n}\n\n/**\n * Generic QR renderer (\u00A738) \u2014 the ONLY QR component in the client.\n *\n * Render rules:\n * - kind 'data-url' \u2192 the host already gave us an image; render <img>.\n * - kind 'content' \u2192 encode with qrcode.toDataURL(), showing a loading\n * state meanwhile and a fallback link on error.\n * - kind 'external-url' \u2192 encode the URL as a QR code and offer a\n * \"\u5728\u65B0\u7A97\u53E3\u6253\u5F00\" link next to it.\n * - no payload \u2192 \"\u7B49\u5F85\u626B\u7801\" placeholder (t('waitingScan')).\n *\n * A countdown is shown when payload.expiresAt is present.\n * Dependency-light: react + react/jsx-runtime only; qrcode is bundled inline.\n */\nexport function QrCodeDisplay(props: QrCodeDisplayProps) {\n const { payload, width = 208, t } = props;\n const [qrImage, setQrImage] = useState<string | null>(null);\n const [qrRenderError, setQrRenderError] = useState<string | null>(null);\n const [secondsLeft, setSecondsLeft] = useState(0);\n\n // Encode content/external-url payloads locally into a PNG data URL.\n useEffect(() => {\n let disposed = false;\n const value = payload && payload.kind !== 'data-url' ? payload.value : undefined;\n\n if (value == null) {\n setQrImage(null);\n setQrRenderError(null);\n return;\n }\n\n setQrImage(null);\n setQrRenderError(null);\n QRCode.toDataURL(value, { errorCorrectionLevel: 'M', margin: 1, width })\n .then((dataUrl) => {\n if (!disposed) setQrImage(dataUrl);\n })\n .catch((err) => {\n if (!disposed) setQrRenderError(err instanceof Error ? err.message : String(err));\n });\n\n return () => {\n disposed = true;\n };\n }, [payload?.kind, payload?.value, width]);\n\n // Countdown ticker driven by payload.expiresAt.\n useEffect(() => {\n const expiresAt = payload?.expiresAt;\n if (expiresAt == null) return;\n setSecondsLeft(Math.max(0, Math.ceil((expiresAt - Date.now()) / 1000)));\n const id = setInterval(() => setSecondsLeft(Math.max(0, Math.ceil((expiresAt - Date.now()) / 1000))), 1000);\n return () => clearInterval(id);\n }, [payload?.expiresAt]);\n\n if (!payload) {\n return (\n <div style={{ textAlign: 'center', padding: '24px 0', fontSize: 13, color: 'var(--dsw-alias-label-tertiary)' }} data-testid=\"qr-auth-image\">\n {t('waitingScan')}\n </div>\n );\n }\n\n const isExternal = payload.kind === 'external-url';\n const imgStyle: Record<string, string | number> = {\n width, height: width, objectFit: 'contain', background: '#fff',\n border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 6,\n };\n\n let body;\n if (payload.kind === 'data-url') {\n body = <img src={payload.value} alt=\"QR\" data-testid=\"qr-auth-image\" style={imgStyle} />;\n } else if (qrImage) {\n body = <img src={qrImage} alt=\"QR\" data-testid=\"qr-auth-image\" style={imgStyle} />;\n } else if (qrRenderError) {\n body = (\n <a\n href={payload.value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid=\"qr-auth-image\"\n style={{ color: 'var(--dsw-alias-label-primary-bluish)', fontSize: 13, textDecoration: 'underline' }}\n >\n {t('openLink')}\n </a>\n );\n } else {\n body = <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)' }}>{t('loading')}</div>;\n }\n\n return (\n <div style={{ textAlign: 'center', padding: '12px 0' }}>\n {body}\n {isExternal && (\n <div style={{ marginTop: 8 }}>\n <a\n href={payload.value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid=\"qr-open-link\"\n style={{ color: 'var(--dsw-alias-label-primary-bluish)', fontSize: 12, textDecoration: 'underline' }}\n >\n {t('openLink')} \u2197\n </a>\n </div>\n )}\n {payload.expiresAt != null && (\n <div style={{ fontSize: 11, color: 'var(--dsw-alias-label-tertiary)', marginTop: 6 }} data-testid=\"qr-countdown\">\n {t('expiresIn')} {secondsLeft}{t('seconds')}\n </div>\n )}\n </div>\n );\n}\n\nexport default QrCodeDisplay;\n", "/**\n * `useChannelAuth` \u2014 the shared interactive-auth lifecycle for one expanded\n * channel.\n *\n * Hard requirements implemented here:\n * - explicit user action: `begin()` is only ever called from a user click\n * (red line W7); expanding a row never auto-begins auth\n * - poll loop is `setTimeout`-after-`await`, never `setInterval` and\n * aborts the in-flight request before scheduling (AbortSignal, \u00A716)\n * - polling only while the session is pending AND the document is visible\n * (\u00A711/\u00A713); hidden \u2192 pause (timer cleared, session kept), visible \u2192\n * immediate single poll then the normal interval resumes\n * - terminal states (authenticated/expired/failed) stop the loop (39.8)\n * - collapse/unmount/switch \u2192 abort in-flight HTTP + DELETE the auth session\n * + clear the timer (\u00A712)\n * - prerequisite gating (\u00A717.2): a method with registry-declared config\n * prerequisites first persists any unsaved setup drafts\n * (`applySetup` reconcile:false), re-fetches the setup descriptor and only\n * then begins auth \u2014 all derived from `channelRegistry.ts` metadata, never\n * a per-channel branch (red lines W1/W2)\n *\n * The hook is mounted inside the expanded DisclosureRow children, so it only\n * exists while the row is open (red line W6).\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n beginAuth as apiBeginAuth,\n cancelAuth,\n fetchSetup,\n pollAuthSession,\n type AuthMethod,\n type ChannelSetupDescriptor,\n type PublicAuthSession,\n type PublicAuthStatus,\n} from './api.js';\nimport {\n isSetupMethodAvailable,\n type ChannelWebDefinition,\n} from './channelRegistry.js';\n\nexport interface UseChannelAuthOptions {\n channelId: string;\n web: ChannelWebDefinition;\n /** Latest setup descriptor (owned by the row; prerequisite gating input). */\n descriptor: ChannelSetupDescriptor | null;\n /** Whether the setup form holds drafts that should be persisted before auth. */\n hasUnsavedSetup: boolean;\n /**\n * Persist the current setup form WITHOUT reconciling the runtime\n * (`applySetup(..., { reconcile: false })`), so an auth flow can make\n * prerequisite config effective first.\n */\n saveSetup: () => Promise<void>;\n /** Event-driven refresh after a successful authorization. */\n onAuthorized?: () => void;\n t: (key: string) => string;\n}\n\nexport interface UseChannelAuthResult {\n /** Whether an interactive auth session is currently being driven. */\n active: boolean;\n busy: boolean;\n session: PublicAuthSession | null;\n status: PublicAuthStatus | null;\n error: string | null;\n /** True when `method` may begin right now (prerequisites configured). */\n canBegin(method: AuthMethod): boolean;\n /** User action \u2014 begin the interactive auth flow for `method`. */\n begin(method: AuthMethod): Promise<void>;\n /** Cancel the active session and clear all state. */\n cancel(): Promise<void>;\n}\n\nconst DEFAULT_POLL_INTERVAL_MS = 3000;\nconst TERMINAL_STATES: ReadonlySet<string> = new Set(['authenticated', 'expired', 'failed']);\n\nexport function useChannelAuth(options: UseChannelAuthOptions): UseChannelAuthResult {\n const { channelId, web, descriptor, hasUnsavedSetup, saveSetup, onAuthorized, t } = options;\n\n const [session, setSession] = useState<PublicAuthSession | null>(null);\n const [status, setStatus] = useState<PublicAuthStatus | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const sessionRef = useRef<PublicAuthSession | null>(null);\n const timerRef = useRef<number | undefined>(undefined);\n const controllerRef = useRef<AbortController | null>(null);\n const onAuthorizedRef = useRef(onAuthorized);\n onAuthorizedRef.current = onAuthorized;\n\n const clearTimer = () => {\n if (timerRef.current !== undefined) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n\n const intervalMs = () => sessionRef.current?.pollingIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n\n // One poll cycle, then schedule the next via setTimeout (never setInterval).\n const pollOnce = useCallback(async () => {\n const current = sessionRef.current;\n // No session / terminal / hidden \u2192 the loop must not continue.\n if (!current || TERMINAL_STATES.has(current.state)) return;\n if (document.visibilityState !== 'visible') return;\n\n const controller = new AbortController();\n controllerRef.current = controller;\n try {\n const next = await pollAuthSession(channelId, current.id, controller.signal);\n if (controller.signal.aborted) return;\n setStatus(next);\n\n if (next.state === 'authenticated' || next.phase === 'authorized') {\n clearTimer();\n sessionRef.current = null;\n setSession(null);\n onAuthorizedRef.current?.();\n return;\n }\n if (TERMINAL_STATES.has(next.state)) {\n // expired / failed: stop polling, keep the status for the UI.\n clearTimer();\n return;\n }\n // Continue: wait `interval` AFTER the request settled (\u00A714).\n clearTimer();\n timerRef.current = window.setTimeout(() => void pollOnce(), intervalMs());\n } catch (cause) {\n if (controller.signal.aborted) return;\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }, [channelId]);\n\n const cancel = useCallback(async () => {\n clearTimer();\n controllerRef.current?.abort();\n const active = sessionRef.current;\n sessionRef.current = null;\n setSession(null);\n setStatus(null);\n if (active?.id) await cancelAuth(channelId, active.id).catch(() => {});\n }, [channelId]);\n\n // Pause while hidden, resume (immediate poll) when visible (\u00A713, 39.7).\n useEffect(() => {\n const onVisibility = () => {\n if (document.visibilityState === 'visible') {\n const current = sessionRef.current;\n if (current && !TERMINAL_STATES.has(current.state)) void pollOnce();\n } else {\n clearTimer();\n }\n };\n document.addEventListener('visibilitychange', onVisibility);\n return () => document.removeEventListener('visibilitychange', onVisibility);\n }, [pollOnce]);\n\n // Unmount / collapse / switch: abort HTTP, DELETE the auth session, clear\n // the timer (\u00A712, 39.6).\n useEffect(() => {\n return () => {\n clearTimer();\n controllerRef.current?.abort();\n const active = sessionRef.current;\n if (active?.id) void cancelAuth(channelId, active.id).catch(() => {});\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channelId]);\n\n const begin = useCallback(\n async (method: AuthMethod) => {\n if (busy) return;\n setError(null);\n setBusy(true);\n try {\n // \u00A717.2 prerequisite flow: when the method needs setup fields configured\n // first, persist any unsaved drafts (reconcile:false), re-fetch the\n // descriptor and only continue once configured.\n if (descriptor && !isSetupMethodAvailable(web, method, descriptor)) {\n if (hasUnsavedSetup) await saveSetup();\n const fresh = await fetchSetup(channelId);\n if (!isSetupMethodAvailable(web, method, fresh)) {\n setError(t('authNeedsConfigFirst'));\n return;\n }\n }\n\n const previous = sessionRef.current;\n if (previous?.id) await cancelAuth(channelId, previous.id).catch(() => {});\n sessionRef.current = null;\n setSession(null);\n\n const next = await apiBeginAuth(channelId, method);\n sessionRef.current = next;\n setSession(next);\n setStatus({\n state: next.state,\n phase: next.phase,\n prompt: next.prompt,\n expiresAt: next.expiresAt,\n });\n if (next.state === 'authenticated' || next.phase === 'authorized') {\n clearTimer();\n sessionRef.current = null;\n setSession(null);\n onAuthorizedRef.current?.();\n return;\n }\n // Kick off the poll loop for the pending session.\n void pollOnce();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setBusy(false);\n }\n },\n [busy, channelId, web, descriptor, hasUnsavedSetup, saveSetup, t, pollOnce],\n );\n\n const canBegin = useCallback(\n (method: AuthMethod): boolean => {\n if (!descriptor) return false;\n return isSetupMethodAvailable(web, method, descriptor);\n },\n [web, descriptor],\n );\n\n return {\n active: session !== null,\n busy,\n session,\n status,\n error,\n canBegin,\n begin,\n cancel,\n };\n}\n", "/**\n * Inline \"\u5B89\u5168\u8BBF\u95EE / Secure access\" section for one expanded channel (plan\n * \u00A737\u2013\u00A741).\n *\n * This is the access-control ACL editor: owner status + owner-claim flow, the\n * independent DM and named-group controls. It stays\n * DELIBERATELY separate from platform permissions and never touches the Agent\n * model. The Web UI does not infer or display platform authorization status.\n *\n * Rendered only while the row is open (no collapsed-row access request, red\n * line W6). The only polling is a LOCAL ~2s loop while an owner-claim session\n * is waiting for a candidate \u2014 there is no page-level polling (W8). Weixin\n * (`ownerDiscovery === 'account'`) needs no claim: the owner is auto-identified\n * and group controls are hidden (`descriptor.groups === false`).\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives';\nimport {\n beginOwnerClaim,\n cancelOwnerClaim,\n confirmOwnerClaim,\n fetchAccess,\n fetchConversations,\n fetchOwnerClaim,\n saveAccess,\n type ChannelAccessPolicy,\n type ChannelAccessState,\n type ChannelSummary,\n type PublicConversationIdentity,\n type PublicOwnerClaimSession,\n} from './api.js';\nimport {\n createNamedGroupAccessRule,\n directMessageAccessMode,\n groupAccessMode,\n hasEditableAccessControls,\n isDirectMessageAccessEditable,\n prepareAccessPolicyForSave,\n withDirectMessageAccessMode,\n withGroupAccessMode,\n type DirectMessageAccessMode,\n type GroupAccessMode,\n} from './accessPolicyUi.js';\nimport { type ChannelWebDefinition } from './channelRegistry.js';\nimport { AccessWarning } from './components/AccessWarning.js';\nimport {\n ConversationPicker,\n conversationTitle,\n shortId,\n} from './components/ConversationPicker.js';\nimport { GroupAccessCard } from './components/GroupAccessCard.js';\nimport { IdentityListEditor } from './components/IdentityListEditor.js';\nimport { SectionHeading } from './components/SectionHeading.js';\n\nexport interface ChannelAccessProps {\n channel: ChannelSummary;\n web: ChannelWebDefinition;\n t: (key: string) => string;\n onChanged: () => void;\n /** Changes whenever setup/auth may alter provider-scoped identities. */\n refreshKey?: number;\n}\n\n/** A pristine, blank custom policy used the first time there is no saved one. */\nfunction blankPolicy(ownerId?: string): ChannelAccessPolicy {\n return {\n version: 1,\n preset: 'owner-only',\n ownerId,\n dmPolicy: 'allowlist',\n allowFrom: ownerId ? [ownerId] : [],\n groupPolicy: 'disabled',\n groups: {},\n };\n}\n\nexport function ChannelAccess({ channel, web, t, onChanged, refreshKey }: ChannelAccessProps) {\n const [state, setState] = useState<ChannelAccessState | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n // Draft policy being edited (mirrors the saved state until the user edits).\n const [draft, setDraft] = useState<ChannelAccessPolicy | null>(null);\n const [saving, setSaving] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const [savedNotice, setSavedNotice] = useState<string | null>(null);\n\n // Owner-claim flow.\n const [claim, setClaim] = useState<PublicOwnerClaimSession | null>(null);\n const [claimError, setClaimError] = useState<string | null>(null);\n const [claimBusy, setClaimBusy] = useState(false);\n\n // Add-group input (local to this section).\n const [groupDraft, setGroupDraft] = useState('');\n\n // Conversation identity directory (only fetched for channels declaring a\n // discoverable conversation identity, e.g. QQ group_openid).\n const [conversations, setConversations] = useState<PublicConversationIdentity[] | null>(null);\n\n const controller = useRef<AbortController | null>(null);\n const conversationController = useRef<AbortController | null>(null);\n\n const loadConversations = useCallback((id: string) => {\n conversationController.current?.abort();\n const c = new AbortController();\n conversationController.current = c;\n fetchConversations(id, c.signal)\n .then((next) => {\n if (!c.signal.aborted) setConversations(next);\n })\n .catch(() => {\n if (!c.signal.aborted) setConversations(null);\n });\n }, []);\n\n const load = () => {\n controller.current?.abort();\n const c = new AbortController();\n controller.current = c;\n fetchAccess(channel.id, c.signal)\n .then((next) => {\n if (c.signal.aborted) return;\n setState(next);\n setLoadError(null);\n // (Re)seed the draft only when it was never initialized or the saved\n // policy is entirely absent \u2014 preserve any in-progress edits otherwise.\n setDraft((current) => current ?? next.policy ?? blankPolicy(next.owner.id));\n // Channel conversation identities (e.g. QQ group_openid) come from the directory.\n if (next.descriptor.identity?.conversation?.conversationDiscoverable) {\n loadConversations(channel.id);\n }\n })\n .catch((cause) => {\n if (c.signal.aborted) return;\n setLoadError(cause instanceof Error ? cause.message : String(cause));\n });\n };\n\n useEffect(() => {\n load();\n return () => {\n controller.current?.abort();\n conversationController.current?.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channel.id, refreshKey]);\n\n // Poll the claim ~2s while it is waiting for a candidate message. This is a\n // LOCAL loop gated to an active claim in this already-expanded row \u2014 no\n // page-level polling. It MUST be declared before the early return below: if\n // a hook sits after `if (!state) return`, the first render calls fewer hooks\n // than later renders and React throws #310 (\"more hooks than previous\").\n useEffect(() => {\n if (!claim || claim.phase !== 'waiting-message') return;\n const timer = setInterval(async () => {\n try {\n const next = await fetchOwnerClaim(channel.id, claim.id);\n setClaim(next);\n if (next.phase === 'candidate') {\n clearInterval(timer);\n }\n } catch {\n // transient poll failure: keep waiting unless it cannot be re-polled\n }\n }, 2000);\n return () => clearInterval(timer);\n }, [claim, channel.id]);\n\n if (loadError || !state || !draft) {\n return (\n <section aria-label={t('accessSection')} data-testid=\"channel-access\">\n <SectionHeading title={t('accessSection')} />\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>{loadError ?? '\u2026'}</div>\n </section>\n );\n }\n\n const descriptor = state.descriptor;\n const isAccountDiscovery = descriptor.ownerDiscovery === 'account';\n const isPlatformDiscovery = descriptor.ownerDiscovery === 'platform';\n const dmAccessEditable = isDirectMessageAccessEditable(descriptor.ownerDiscovery);\n const accessControlsEditable = hasEditableAccessControls(descriptor.ownerDiscovery, descriptor.groups);\n\n const ownerId = draft.ownerId ?? state.owner.id;\n const ownerIdentified = state.owner.configured || Boolean(ownerId);\n\n const dmAccess = directMessageAccessMode(draft, ownerId);\n const groupAccess = groupAccessMode(draft);\n const ownerRequiredBeforeSave = dmAccess === 'owner-only' && !ownerId;\n const policyForSave = (): ChannelAccessPolicy => prepareAccessPolicyForSave(draft, ownerId);\n\n const submit = async () => {\n setSaving(true);\n setActionError(null);\n setSavedNotice(null);\n try {\n const candidate = policyForSave();\n const saved = await saveAccess(channel.id, candidate);\n setState(saved);\n setDraft(saved.policy ?? candidate);\n setSavedNotice(t('accessSaved'));\n onChanged();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setSaving(false);\n }\n };\n\n // ---- owner claim flow -----------------------------------------------------\n\n const startClaim = async () => {\n setClaimBusy(true);\n setClaimError(null);\n setClaim(null);\n try {\n const session = await beginOwnerClaim(channel.id);\n setClaim(session);\n } catch (cause) {\n setClaimError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setClaimBusy(false);\n }\n };\n\n const confirmClaim = async () => {\n if (!claim?.candidate) {\n setActionError(t('confirmBeforeCandidateError'));\n return;\n }\n setClaimBusy(true);\n setActionError(null);\n try {\n const next = await confirmOwnerClaim(channel.id, claim.id);\n setState(next);\n setDraft(next.policy ?? blankPolicy(next.owner.id));\n setClaim({ ...claim, phase: 'confirmed' });\n onChanged();\n } catch (cause) {\n setActionError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setClaimBusy(false);\n }\n };\n\n const cancelFlow = async () => {\n if (!claim) return;\n try {\n await cancelOwnerClaim(channel.id, claim.id);\n } finally {\n setClaim(null);\n }\n };\n\n const setDmAccess = (mode: DirectMessageAccessMode) => {\n setDraft((current) => (current ? withDirectMessageAccessMode(current, mode, ownerId) : current));\n };\n\n // ---- conversation identity directory helpers (plan \u00A77/\u00A737) ---------------\n const identityConversation = descriptor.identity?.conversation;\n const conversationDiscoverable = identityConversation?.conversationDiscoverable === true;\n const groupLabel = descriptor.identityLabels.group ?? 'Group';\n const conversationById = new Map(\n (conversations ?? []).map((identity) => [identity.canonicalId, identity] as const),\n );\n\n const addGroupId = (id: string) => {\n if (!id) return;\n setDraft((current) => {\n if (!current || current.groups[id]) return current;\n return {\n ...current,\n groupPolicy: 'allowlist',\n groups: {\n ...current.groups,\n [id]: createNamedGroupAccessRule(\n ownerId,\n descriptor.defaults?.requireMention === true,\n ),\n },\n };\n });\n };\n\n const addGroup = () => {\n addGroupId(groupDraft.trim());\n setGroupDraft('');\n };\n\n /** Card title: alias \u2192 displayName \u2192 discovered canonical OpenID. */\n const groupCardTitle = (groupId: string): string | undefined => {\n const identity = conversationById.get(groupId);\n if (!identity) return undefined;\n return conversationTitle(identity, groupLabel) ?? `${groupLabel} OpenID \u00B7 ${shortId(groupId)}`;\n };\n\n return (\n <section aria-label={t('accessSection')} data-testid=\"channel-access\">\n <SectionHeading title={t('accessSection')} />\n\n {/* ---- readiness / security banners (plan \u00A728) ---- */}\n {state.readiness === 'needs-owner' && (\n <div style={{ marginBottom: 12 }}>\n <AccessWarning testId=\"access-needs-owner\">{t('readinessNeedsOwner')}</AccessWarning>\n </div>\n )}\n {state.readiness === 'missing-policy' && (\n <div style={{ marginBottom: 12 }}>\n <AccessWarning testId=\"access-missing-policy\">{t('readinessMissingPolicy')}</AccessWarning>\n </div>\n )}\n {state.readiness === 'invalid-policy' && (\n <div style={{ marginBottom: 12 }}>\n <AccessWarning testId=\"access-invalid-policy\">{t('readinessInvalidPolicy')}</AccessWarning>\n </div>\n )}\n\n {/* ---- owner area (plan \u00A738) ---- */}\n {!isPlatformDiscovery && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginBottom: 16 }} data-testid=\"access-owner\">\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>{t('ownerSection')}</span>\n {isAccountDiscovery ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-label-primary)' }} data-testid=\"owner-status-account\">\n {ownerIdentified ? t('ownerIdentified') : t('ownerAutoIdentified')}\n </div>\n {ownerId && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }} data-testid=\"owner-id\">\n {ownerId}\n </div>\n )}\n </div>\n ) : ownerIdentified ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-label-primary)' }} data-testid=\"owner-status-confirmed\">\n {t('ownerIdentified')}\n </div>\n {ownerId && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }} data-testid=\"owner-id\">\n {ownerId}\n </div>\n )}\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start' }}>\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-label-tertiary)' }} data-testid=\"owner-unidentified\">\n {t('ownerNotIdentified')}\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => void startClaim()} disabled={claimBusy} data-testid=\"owner-claim-begin\">\n {t('identifyMyAccount')}\n </Button>\n </div>\n )}\n\n {claim && (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 8,\n padding: 10,\n }}\n data-testid=\"owner-claim-flow\"\n >\n {claim.challengeCode && claim.phase === 'waiting-message' && (\n <>\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-label-secondary)' }}>{t('claimInstruction')}</div>\n <code\n data-testid=\"claim-challenge\"\n style={{\n fontSize: 13,\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l2)',\n borderRadius: 6,\n padding: '6px 10px',\n fontFamily: 'ui-monospace, monospace',\n color: 'var(--dsw-alias-label-primary)',\n width: 'fit-content',\n }}\n >\n /dsh-claim {claim.challengeCode}\n </code>\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)' }} data-testid=\"claim-waiting\">\n {t('waitingForMessage')}\n </div>\n </>\n )}\n {claim.phase === 'candidate' && claim.candidate && (\n <>\n <div style={{ fontSize: 13, color: 'var(--dsw-alias-label-secondary)' }}>\n {t('detectedCandidatePrefix')} <strong data-testid=\"claim-sender\">{claim.candidate.senderId}</strong>\n </div>\n <div style={{ display: 'flex', gap: 8 }}>\n <Button variant=\"primary\" size=\"sm\" onClick={() => void confirmClaim()} disabled={claimBusy} data-testid=\"claim-confirm\">\n {t('confirmIsMe')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void cancelFlow()} data-testid=\"claim-cancel\">\n {t('cancel')}\n </Button>\n </div>\n </>\n )}\n </div>\n )}\n {claimError && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }} data-testid=\"claim-error\">\n {claimError}\n </div>\n )}\n </div>\n )}\n\n {/* ---- DM controls (plan \u00A739) ---- */}\n {isPlatformDiscovery && descriptor.directMessages ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, marginBottom: 16 }} data-testid=\"access-dm-platform\">\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>{t('dmSection')}</span>\n <div\n style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: 13, color: 'var(--dsw-alias-label-primary)' }}\n data-testid=\"dm-platform-fixed\"\n >\n <span style={{ color: 'var(--dsw-alias-state-success-primary)' }}>\u2713</span>\n {t('dmPlatformFixed')}\n </div>\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)' }}>\n {t('dmPlatformFixedHint')}\n </div>\n </div>\n ) : !isPlatformDiscovery && (!isAccountDiscovery || descriptor.directMessages) ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginBottom: 16 }} data-testid=\"access-dm\">\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>{t('dmSection')}</span>\n {!dmAccessEditable ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 13,\n color: 'var(--dsw-alias-label-primary)',\n }}\n data-testid=\"dm-owner-only-fixed\"\n >\n <span style={{ color: 'var(--dsw-alias-state-success-primary)' }}>\u2713</span>\n {t('dmOwnerOnly')}\n </div>\n ) : (\n <>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 12 }} data-testid=\"dm-access-mode\">\n {(\n [\n ['disabled', t('dmDisabled')],\n ['owner-only', t('dmOwnerOnly')],\n ['allowlist', t('dmAllowlist')],\n ['open', t('dmOpen')],\n ] as Array<[DirectMessageAccessMode, string]>\n ).map(([value, label]) => {\n return (\n <label\n key={value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n cursor: 'pointer',\n color:\n value === 'open'\n ? 'var(--dsw-alias-state-warn-primary)'\n : 'var(--dsw-alias-label-primary)',\n }}\n >\n <input\n type=\"radio\"\n name=\"dm-access-mode\"\n checked={dmAccess === value}\n onChange={() => setDmAccess(value)}\n data-testid={'dm-' + value}\n />\n {label}\n </label>\n );\n })}\n </div>\n {dmAccess === 'allowlist' && (\n <IdentityListEditor\n ids={draft.allowFrom}\n onChange={(ids) => setDraft((c) => (c ? { ...c, preset: 'custom', allowFrom: ids } : c))}\n label={t('allowUsers')}\n t={t}\n />\n )}\n {dmAccess === 'open' && (\n <AccessWarning testId=\"dm-open-danger\">{t('dmOpenDanger')}</AccessWarning>\n )}\n </>\n )}\n </div>\n ) : null}\n\n {/* ---- group controls (plan \u00A740) \u2014 only when the channel supports them ---- */}\n {descriptor.groups === true ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginBottom: 16 }} data-testid=\"access-groups\">\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>{t('groupSection')}</span>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 12 }} data-testid=\"group-access-mode\">\n {(\n [\n ['disabled', t('groupDisabled')],\n ['allowlist', t('groupSpecified')],\n ['open', t('groupAllDanger')],\n ] as Array<[GroupAccessMode, string]>\n ).map(([value, label]) => (\n <label\n key={value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n cursor: 'pointer',\n color: value === 'open'\n ? 'var(--dsw-alias-state-warn-primary)'\n : 'var(--dsw-alias-label-primary)',\n }}\n >\n <input\n type=\"radio\"\n name=\"group-access-mode\"\n checked={groupAccess === value}\n onChange={() => setDraft((c) => c\n ? withGroupAccessMode(c, value, ownerId, descriptor.defaults?.requireMention === true)\n : c)}\n data-testid={'group-' + value}\n />\n {label}\n </label>\n ))}\n </div>\n\n {draft.groupPolicy === 'allowlist' && (\n <>\n {conversationDiscoverable ? (\n <ConversationPicker\n key={`${channel.id}:${refreshKey ?? 0}`}\n channelId={channel.id}\n groupLabel={groupLabel}\n addedIds={Object.keys(draft.groups)}\n onAdd={addGroupId}\n t={t}\n />\n ) : (\n <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>\n <input\n value={groupDraft}\n placeholder={t('groupIdPlaceholder')}\n onChange={(e) => setGroupDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') addGroup();\n }}\n data-testid=\"group-add-input\"\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: 13,\n padding: '4px 8px',\n borderRadius: 6,\n border: '1px solid var(--dsw-alias-border-l2)',\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n outline: 'none',\n }}\n />\n <Button variant=\"outline\" size=\"sm\" onClick={addGroup} disabled={!groupDraft.trim()} data-testid=\"group-add\">\n {t('addGroup')}\n </Button>\n </div>\n )}\n\n {Object.entries(draft.groups).length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {Object.entries(draft.groups).map(([groupId, rule]) => {\n const cardTitle = groupCardTitle(groupId);\n return (\n <GroupAccessCard\n key={groupId}\n groupId={groupId}\n title={cardTitle}\n meta={`OpenID: ${shortId(groupId)}`}\n conflict={conversationById.get(groupId)?.identityConflict === true}\n rule={rule}\n ownerId={ownerId}\n mentions={descriptor.mentions === true}\n memberPicker={web.memberPicker}\n userLabel={descriptor.identityLabels.user}\n onChange={(next) =>\n setDraft((c) => (c ? { ...c, groups: { ...c.groups, [groupId]: next } } : c))\n }\n onRemove={() =>\n setDraft((c) => {\n if (!c) return c;\n const groups = { ...c.groups };\n delete groups[groupId];\n return { ...c, groups, groupPolicy: Object.keys(groups).length ? 'allowlist' : 'disabled' };\n })\n }\n t={t}\n />\n );\n })}\n </div>\n )}\n </>\n )}\n {draft.groupPolicy === 'open' && draft.defaultGroupRule && (\n <>\n <AccessWarning testId=\"all-groups-danger\">{t('groupAllDangerHint')}</AccessWarning>\n <GroupAccessCard\n groupId={t('allGroups')}\n rule={draft.defaultGroupRule}\n ownerId={ownerId}\n mentions={descriptor.mentions === true}\n memberPicker={web.memberPicker}\n userLabel={descriptor.identityLabels.user}\n onChange={(next) => setDraft((c) => c ? { ...c, defaultGroupRule: next } : c)}\n fixedEnabled\n t={t}\n />\n </>\n )}\n </div>\n ) : dmAccessEditable ? (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)', marginBottom: 16 }} data-testid=\"access-no-groups\">\n {t('noGroupSupport')}\n </div>\n ) : null}\n\n {/* ---- save ---- */}\n {accessControlsEditable && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start' }}>\n <Button variant=\"primary\" size=\"sm\" onClick={() => void submit()} disabled={saving || ownerRequiredBeforeSave} data-testid=\"access-save\">\n {saving ? t('saving') : t('saveAccess')}\n </Button>\n {savedNotice && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-success-primary)' }} data-testid=\"access-saved\">\n {savedNotice}\n </div>\n )}\n {actionError && (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }} data-testid=\"access-error\">\n {actionError}\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n\nexport default ChannelAccess;\n", "import type { ChannelAccessPolicy, GroupAccessRule, OwnerDiscoveryMode } from './api.js';\n\nexport type DirectMessageAccessMode = 'disabled' | 'owner-only' | 'allowlist' | 'open';\nexport type GroupSenderAccessMode = 'owner-only' | 'allowlist' | 'open';\nexport type GroupAccessMode = 'disabled' | 'allowlist' | 'open';\n\nexport function createNamedGroupAccessRule(\n ownerId: string | undefined,\n requireMention = false,\n): GroupAccessRule {\n return {\n enabled: true,\n senderPolicy: 'allowlist',\n allowFrom: ownerId ? [ownerId] : [],\n requireMention,\n };\n}\n\nexport function groupAccessMode(policy: ChannelAccessPolicy): GroupAccessMode {\n return policy.groupPolicy;\n}\n\nexport function withGroupAccessMode(\n policy: ChannelAccessPolicy,\n mode: GroupAccessMode,\n ownerId: string | undefined,\n requireMention = false,\n): ChannelAccessPolicy {\n if (mode === 'open') {\n return {\n ...policy,\n version: 1,\n preset: 'custom',\n groupPolicy: 'open',\n groups: {},\n defaultGroupRule: policy.defaultGroupRule ?? {\n enabled: true,\n senderPolicy: 'open',\n allowFrom: [],\n requireMention,\n },\n };\n }\n\n const { defaultGroupRule: _defaultGroupRule, ...rest } = policy;\n return {\n ...rest,\n preset: 'custom',\n groupPolicy: mode,\n groups: mode === 'disabled' ? {} : rest.groups,\n };\n}\n\nexport function isDirectMessageAccessEditable(ownerDiscovery: OwnerDiscoveryMode): boolean {\n return ownerDiscovery === 'claim' || ownerDiscovery === 'manual';\n}\n\nexport function hasEditableAccessControls(\n ownerDiscovery: OwnerDiscoveryMode,\n groupsSupported: boolean,\n): boolean {\n return isDirectMessageAccessEditable(ownerDiscovery) || groupsSupported;\n}\n\nfunction isOwnerOnly(values: string[], ownerId: string | undefined): boolean {\n return Boolean(ownerId) && values.length === 1 && values[0] === ownerId;\n}\n\nexport function directMessageAccessMode(\n policy: ChannelAccessPolicy,\n ownerId: string | undefined,\n): DirectMessageAccessMode {\n if (policy.dmPolicy === 'disabled') return 'disabled';\n if (policy.dmPolicy === 'open') return 'open';\n // The initial unsaved draft expresses the recommended owner-only intent\n // before an owner exists. No persisted owner-only policy can omit ownerId.\n if (!ownerId && policy.preset === 'owner-only' && policy.allowFrom.length === 0) return 'owner-only';\n return isOwnerOnly(policy.allowFrom, ownerId) ? 'owner-only' : 'allowlist';\n}\n\nexport function withDirectMessageAccessMode(\n policy: ChannelAccessPolicy,\n mode: DirectMessageAccessMode,\n ownerId: string | undefined,\n): ChannelAccessPolicy {\n switch (mode) {\n case 'disabled':\n return { ...policy, preset: 'custom', dmPolicy: 'disabled', allowFrom: [] };\n case 'owner-only':\n return { ...policy, preset: 'custom', dmPolicy: 'allowlist', allowFrom: ownerId ? [ownerId] : [] };\n case 'allowlist':\n return {\n ...policy,\n preset: 'custom',\n dmPolicy: 'allowlist',\n allowFrom: isOwnerOnly(policy.allowFrom, ownerId) ? [] : policy.allowFrom,\n };\n case 'open':\n return { ...policy, preset: 'custom', dmPolicy: 'open', allowFrom: [] };\n }\n}\n\n/**\n * Keep the persisted preset as a canonical summary for compatibility. The Web\n * editor is driven by the actual DM/group rules, never by this preset.\n */\nexport function prepareAccessPolicyForSave(\n policy: ChannelAccessPolicy,\n ownerId: string | undefined,\n): ChannelAccessPolicy {\n const withOwner = ownerId && !policy.ownerId ? { ...policy, ownerId } : policy;\n const hasGroupConfiguration =\n withOwner.groupPolicy !== 'disabled' || Object.keys(withOwner.groups).length > 0;\n\n if (!hasGroupConfiguration && isOwnerOnly(withOwner.allowFrom, ownerId) && withOwner.dmPolicy === 'allowlist') {\n return { ...withOwner, preset: 'owner-only' };\n }\n if (!hasGroupConfiguration && withOwner.dmPolicy === 'allowlist') {\n return { ...withOwner, preset: 'allowlist' };\n }\n return { ...withOwner, preset: 'custom' };\n}\n\nexport function groupSenderAccessMode(\n rule: GroupAccessRule,\n ownerId: string | undefined,\n): GroupSenderAccessMode {\n if (rule.senderPolicy === 'open') return 'open';\n return isOwnerOnly(rule.allowFrom, ownerId) ? 'owner-only' : 'allowlist';\n}\n\nexport function withGroupSenderAccessMode(\n rule: GroupAccessRule,\n mode: GroupSenderAccessMode,\n ownerId: string | undefined,\n): GroupAccessRule {\n switch (mode) {\n case 'owner-only':\n return { ...rule, senderPolicy: 'allowlist', allowFrom: ownerId ? [ownerId] : [] };\n case 'allowlist':\n return {\n ...rule,\n senderPolicy: 'allowlist',\n allowFrom: isOwnerOnly(rule.allowFrom, ownerId) ? [] : rule.allowFrom,\n };\n case 'open':\n return { ...rule, senderPolicy: 'open', allowFrom: [] };\n }\n}\n", "/**\n * Small inline danger warning banner (plan \u00A739/\u00A740: dmPolicy=open, or a group\n * senderPolicy=open) and informational warnings (readiness needs-owner /\n * missing-policy / invalid-policy). Uses the danger token family so it reads\n * as a warning, not a neutral hint.\n */\nexport interface AccessWarningProps {\n children: React.ReactNode;\n testId?: string;\n}\n\nexport function AccessWarning({ children, testId }: AccessWarningProps) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 6,\n fontSize: 12,\n lineHeight: 1.5,\n color: 'var(--dsw-alias-state-warn-primary)',\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 8,\n padding: '6px 10px',\n }}\n data-testid={testId}\n >\n <span aria-hidden=\"true\" style={{ flex: 'none' }}>\u26A0</span>\n <span>{children}</span>\n </div>\n );\n}\n\nexport default AccessWarning;\n", "/**\n * ConversationPicker \u2014 add an already discovered group to the policy.\n *\n * For channels whose descriptor declares\n * `identity.conversation.conversationDiscoverable` (QQ), the picker lists the\n * canonical identities the conversation directory observed. QQ's platform\n * payload does not reliably provide a human QQ group number, so there is no\n * manual input or identifier guessing path.\n *\n * This component only ever handles directory DTOs: the canonical id saved into\n * the policy comes from the control plane, never typed here.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives';\nimport { fetchConversations, type PublicConversationIdentity } from '../api.js';\n\n/** Short debug form of an opaque canonical id (e.g. `04E\u2026A91`). */\nexport function shortId(id: string): string {\n return id.length > 12 ? `${id.slice(0, 4)}\u2026${id.slice(-4)}` : id;\n}\n\n/**\n * Display title for one conversation identity (plan \u00A737 order): alias \u2192\n * displayName \u2192 `${groupLabel} ${externalId}` \u2192 undefined (caller falls back\n * to the short canonical id).\n */\nexport function conversationTitle(\n identity: PublicConversationIdentity,\n groupLabel: string,\n): string | undefined {\n return (\n identity.alias ??\n identity.displayName ??\n (identity.externalId ? `${groupLabel} ${identity.externalId}` : undefined)\n );\n}\n\nexport interface ConversationPickerProps {\n channelId: string;\n /** Label for a group (e.g. 'QQ\u7FA4'), used as the display fallback prefix. */\n groupLabel: string;\n /** Canonical ids already present in the draft policy. */\n addedIds: string[];\n /** Called with the RESOLVED canonical id to add to the policy. */\n onAdd: (canonicalId: string) => void;\n t: (key: string) => string;\n}\n\nexport function ConversationPicker({\n channelId,\n groupLabel,\n addedIds,\n onAdd,\n t,\n}: ConversationPickerProps) {\n const [conversations, setConversations] = useState<PublicConversationIdentity[] | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const controller = useRef<AbortController | null>(null);\n\n const load = useCallback(() => {\n controller.current?.abort();\n const c = new AbortController();\n controller.current = c;\n fetchConversations(channelId, c.signal)\n .then((next) => {\n if (c.signal.aborted) return;\n setConversations(next);\n setLoadFailed(false);\n })\n .catch((cause) => {\n if (c.signal.aborted) return;\n if (cause instanceof DOMException && cause.name === 'AbortError') return;\n setLoadFailed(true);\n });\n }, [channelId]);\n\n useEffect(() => {\n load();\n return () => controller.current?.abort();\n }, [load]);\n\n const discovered = (conversations ?? []).filter(\n (identity) => !addedIds.includes(identity.canonicalId),\n );\n\n return (\n <div\n style={{ display: 'flex', flexDirection: 'column', gap: 8 }}\n data-testid=\"conversation-picker\"\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>\n {t('conversationDiscovered')}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={load}\n data-testid=\"conversation-refresh\"\n >\n {t('conversationRefresh')}\n </Button>\n </div>\n\n {loadFailed ? (\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-state-error-primary)' }}>\n {t('connectionError')}\n </div>\n ) : conversations !== null && discovered.length === 0 ? (\n <div\n style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)' }}\n data-testid=\"conversation-empty\"\n >\n {t('conversationEmpty')\n .replace('{groupLabel}', groupLabel)}\n </div>\n ) : (\n conversations && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }} data-testid=\"conversation-list\">\n {discovered.map((identity) => {\n const title = conversationTitle(identity, groupLabel) ?? `${groupLabel} OpenID`;\n return (\n <div\n key={identity.canonicalId}\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n data-testid=\"conversation-row\"\n >\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n title={identity.canonicalId}\n style={{\n fontSize: 13,\n color: 'var(--dsw-alias-label-primary)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {title}\n </div>\n <div style={{ fontSize: 12, color: 'var(--dsw-alias-label-tertiary)' }}>\n OpenID: {identity.canonicalId}\n </div>\n {identity.identityConflict && (\n <div\n style={{ fontSize: 12, color: 'var(--dsw-alias-state-warn-primary)' }}\n data-testid=\"conversation-conflict\"\n >\n {t('conversationIdentityConflict')}\n </div>\n )}\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onAdd(identity.canonicalId)}\n data-testid=\"conversation-add\"\n >\n {t('conversationAdd')}\n </Button>\n </div>\n );\n })}\n </div>\n )\n )}\n\n </div>\n );\n}\n\nexport default ConversationPicker;\n", "/**\n * Editable list of canonical IDs (add/remove) for an allowlist (plan \u00A739/\u00A740).\n * Each row is a read-only ID chip with a remove button (\u00D7); a trailing input\n * accepts a new ID and commits it on Enter. IDs are canonical and opaque \u2014 no\n * lowercase, no fuzzy matching \u2014 matches the channel-core contract.\n */\nimport { useState } from 'react';\n\nexport interface IdentityListEditorProps {\n ids: string[];\n onChange: (ids: string[]) => void;\n label: string;\n t: (key: string) => string;\n}\n\nexport function IdentityListEditor({ ids, onChange, label, t }: IdentityListEditorProps) {\n const [draft, setDraft] = useState('');\n\n const commit = () => {\n const value = draft.trim();\n if (!value) return;\n if (ids.includes(value)) return;\n onChange([...ids, value]);\n setDraft('');\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>{label}</span>\n {ids.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {ids.map((id) => (\n <div\n key={id}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 13,\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 6,\n padding: '4px 8px',\n }}\n data-testid=\"identity-chip\"\n >\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', color: 'var(--dsw-alias-label-primary)' }}>\n {id}\n </span>\n <button\n type=\"button\"\n aria-label={t('rmGroup')}\n data-testid=\"identity-remove\"\n onClick={() => onChange(ids.filter((x) => x !== id))}\n style={{\n flex: 'none',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 14,\n lineHeight: 1,\n padding: 2,\n }}\n >\n \u00D7\n </button>\n </div>\n ))}\n </div>\n )}\n <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>\n <input\n value={draft}\n placeholder={t('userPlaceholder')}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit();\n }}\n data-testid=\"identity-input\"\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: 13,\n padding: '4px 8px',\n borderRadius: 6,\n border: '1px solid var(--dsw-alias-border-l2)',\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n outline: 'none',\n }}\n />\n <button\n type=\"button\"\n onClick={commit}\n disabled={!draft.trim()}\n data-testid=\"identity-add\"\n style={{\n flex: 'none',\n fontSize: 13,\n padding: '4px 10px',\n borderRadius: 6,\n border: '1px solid var(--dsw-alias-border-l2)',\n background: 'transparent',\n cursor: draft.trim() ? 'pointer' : 'not-allowed',\n color: 'var(--dsw-alias-label-primary)',\n opacity: draft.trim() ? 1 : 0.5,\n }}\n >\n {t('addUser')}\n </button>\n </div>\n </div>\n );\n}\n\nexport default IdentityListEditor;\n", "/**\n * Editor for ONE named-group access rule (plan \u00A740).\n *\n * Each card is keyed by its canonical group id (the user adds groups by id in\n * the parent section; the id is fixed per card). Fields: the group id label,\n * senderPolicy radio (owner-only / specified / all members danger), the member\n * allowlist (only when senderPolicy === 'allowlist'), requireMention checkbox\n * (only when `descriptor.mentions === true`), and an enabled toggle. Sender\n * 'open' shows the danger warning.\n */\nimport type { GroupAccessRule } from '../api.js';\nimport {\n groupSenderAccessMode,\n withGroupSenderAccessMode,\n type GroupSenderAccessMode,\n} from '../accessPolicyUi.js';\nimport { AccessWarning } from './AccessWarning.js';\nimport { IdentityListEditor } from './IdentityListEditor.js';\nimport { Switch } from './Switch.js';\n\nexport interface GroupAccessCardProps {\n /** Canonical conversation/group id this card edits. */\n groupId: string;\n /**\n * Optional display title (alias \u2192 displayName \u2192 canonical OpenID);\n * defaults to the canonical groupId when the directory has no mapping.\n */\n title?: string;\n /** Optional secondary line (e.g. the short canonical id for debugging). */\n meta?: string;\n /** The platform identity behind this conversation changed (plan \u00A723). */\n conflict?: boolean;\n rule: GroupAccessRule;\n ownerId?: string;\n mentions: boolean;\n memberPicker?: boolean;\n /** Display label for the member identity (e.g. descriptor.identityLabels.user). */\n userLabel: string;\n onChange: (next: GroupAccessRule) => void;\n onRemove?: () => void;\n fixedEnabled?: boolean;\n t: (key: string) => string;\n}\n\nexport function GroupAccessCard({ groupId, title, meta, conflict, rule, ownerId, mentions, memberPicker = true, userLabel, onChange, onRemove, fixedEnabled = false, t }: GroupAccessCardProps) {\n const sender = groupSenderAccessMode(rule, ownerId);\n const canSpecifyMembers = memberPicker;\n\n const setSender = (next: GroupSenderAccessMode) => {\n onChange(withGroupSenderAccessMode(rule, next, ownerId));\n };\n\n const radio = (value: GroupSenderAccessMode, label: string, danger = false) => {\n const disabled = value === 'owner-only' && !ownerId;\n return (\n <label\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: danger\n ? 'var(--dsw-alias-state-warn-primary)'\n : disabled\n ? 'var(--dsw-alias-label-tertiary)'\n : 'var(--dsw-alias-label-primary)',\n }}\n >\n <input\n type=\"radio\"\n name={'group-sender-' + groupId}\n checked={sender === value}\n disabled={disabled}\n onChange={() => setSender(value)}\n data-testid={'group-sender-' + value}\n />\n {label}\n </label>\n );\n };\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 8,\n padding: 10,\n }}\n data-testid=\"group-card\"\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <span\n data-testid=\"group-id\"\n style={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: 13,\n fontWeight: 600,\n color: 'var(--dsw-alias-label-primary)',\n }}\n >\n {title ?? groupId}\n </span>\n {meta && (\n <span\n data-testid=\"group-id-meta\"\n style={{\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: 12,\n fontWeight: 400,\n color: 'var(--dsw-alias-label-tertiary)',\n }}\n >\n {meta}\n </span>\n )}\n {conflict && (\n <span\n data-testid=\"group-identity-conflict\"\n style={{\n display: 'block',\n fontSize: 12,\n color: 'var(--dsw-alias-state-warn-primary)',\n }}\n >\n {t('conversationIdentityConflict')}\n </span>\n )}\n </div>\n {onRemove && <button\n type=\"button\"\n onClick={onRemove}\n aria-label={t('rmGroup')}\n data-testid=\"group-remove\"\n style={{\n flex: 'none',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 14,\n lineHeight: 1,\n padding: 2,\n }}\n >\n \u00D7\n </button>}\n {!fixedEnabled && <Switch\n checked={rule.enabled}\n onChange={(v) => onChange({ ...rule, enabled: v })}\n aria-label={t('groupEnable')}\n testId=\"group-enabled\"\n />}\n </div>\n\n {rule.enabled && (\n <>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <span style={{ fontSize: 12, color: 'var(--dsw-alias-label-secondary)' }}>{t('memberAccess')}</span>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 12 }}>\n {radio('owner-only', t('memberOnly'))}\n {canSpecifyMembers && radio('allowlist', t('memberSpecified'))}\n {radio('open', t('memberAllDanger'), true)}\n </div>\n </div>\n\n {canSpecifyMembers && sender === 'allowlist' && (\n <IdentityListEditor\n ids={rule.allowFrom}\n onChange={(ids) => onChange({ ...rule, allowFrom: ids })}\n label={userLabel}\n t={t}\n />\n )}\n\n {sender === 'open' && (\n <AccessWarning testId=\"group-open-danger\">{t('memberAllDangerHint')}</AccessWarning>\n )}\n\n </>\n )}\n\n {/* Mention gating belongs to this conversation's group rule. Keep the\n control visible even when the rule is temporarily disabled so a\n named group does not lose the setting (the all-groups card is just\n another GroupAccessCard instance). */}\n {mentions && (\n <label\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n cursor: 'pointer',\n color: 'var(--dsw-alias-label-primary)',\n }}\n >\n <input\n type=\"checkbox\"\n checked={rule.requireMention}\n onChange={(e) => onChange({ ...rule, requireMention: e.target.checked })}\n data-testid=\"group-require-mention\"\n />\n {t('requireMention')}\n </label>\n )}\n </div>\n );\n}\n\nexport default GroupAccessCard;\n", "/**\n * Advisory \"new bundle version available\" notice rendered at the bottom of the\n * Channels panel (below the channel list \u2014 never a top banner). Pure display:\n * it receives the host's sanitized `BundleUpdateInfo` DTO, holds no state and\n * fetches nothing (`useUpdateCheck` owns the request). When no update is known\n * (up-to-date, check failed or still pending) it renders nothing.\n */\nimport type { BundleUpdateInfo } from '../api.js';\n\nexport interface BundleUpdateNoticeProps {\n /** Sanitized host DTO, or null when no update is known \u2192 render nothing. */\n update: BundleUpdateInfo | null;\n t: (key: string) => string;\n}\n\nexport function BundleUpdateNotice({ update, t }: BundleUpdateNoticeProps) {\n if (!update) return null;\n\n return (\n <div\n style={{\n fontSize: 12,\n lineHeight: 1.6,\n color: 'var(--dsw-alias-label-primary)',\n background: 'var(--dsw-alias-bg-layer-1)',\n border: '1px solid var(--dsw-alias-border-l2)',\n borderRadius: 10,\n padding: '8px 12px',\n marginTop: 14,\n }}\n data-testid=\"update-banner\"\n >\n <span>\n {t('updateAvailable').replace('{version}', update.version).replace('{tag}', update.tag)}\n </span>\n {update.crossLine && (\n <div style={{ color: 'var(--dsw-alias-label-secondary)' }}>{t('updateCrossLineHint')}</div>\n )}\n {update.commands.map((command) => (\n <div\n key={command}\n style={{\n fontFamily: 'var(--dsw-alias-font-family-mono, monospace)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {command}\n </div>\n ))}\n </div>\n );\n}\n\nexport default BundleUpdateNotice;\n", "/**\n * Low-key repository entry pinned at the bottom of the Channels panel.\n *\n * The label is the product name plus the installed bundle version (taken\n * from the host's update-check projection and omitted when that check is\n * unavailable). Three plain external links \u2014 repository, README docs and\n * the issue tracker \u2014 opened in a new tab with the same `target`/`rel`\n * convention as `OfficialDocsLink`. No new runtime dependency.\n */\nexport const REPOSITORY_URL = 'https://github.com/wsz987/dsh-channels';\nexport const REPOSITORY_README_URL = 'https://github.com/wsz987/dsh-channels#readme';\nexport const REPOSITORY_ISSUES_URL = 'https://github.com/wsz987/dsh-channels/issues';\n\nconst anchorStyle = {\n color: 'var(--dsw-alias-label-primary-bluish)',\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n} as const;\n\nexport interface RepoFooterProps {\n t: (key: string) => string;\n /** Installed bundle version from the update-check DTO; omitted gracefully. */\n version?: string;\n}\n\nexport function RepoFooter({ t, version }: RepoFooterProps) {\n const label = version ? `dsh-channels ${version}` : 'dsh-channels';\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 10,\n paddingTop: 10,\n borderTop: '1px solid var(--dsw-alias-border-l1)',\n fontSize: 12,\n lineHeight: 1.6,\n color: 'var(--dsw-alias-label-secondary)',\n }}\n data-testid=\"repo-footer\"\n >\n <span>{label}</span>\n <a href={REPOSITORY_URL} target=\"_blank\" rel=\"noopener noreferrer\" style={anchorStyle}>\n {t('repoFooterRepo')} \u2197\n </a>\n <a href={REPOSITORY_README_URL} target=\"_blank\" rel=\"noopener noreferrer\" style={anchorStyle}>\n {t('repoFooterDocs')} \u2197\n </a>\n <a href={REPOSITORY_ISSUES_URL} target=\"_blank\" rel=\"noopener noreferrer\" style={anchorStyle}>\n {t('repoFooterIssue')} \u2197\n </a>\n </div>\n );\n}\n\nexport default RepoFooter;\n", "/**\n * `useUpdateCheck` \u2014 the advisory bundle-update state for the Channels panel.\n *\n * Owns the one GET /dsh-channels/api/v2/update-check the panel issues, so the\n * section itself stays a pure mount point:\n * - fetched once per mount (the notice is advisory; the host caches its npm\n * registry check and stamps `checkedAt`)\n * - strictly non-fatal: any failure (network, non-2xx, bad JSON) degrades to\n * `null` \u2014 no error state, no toast; an unreachable check must never break\n * or disturb the Channels panel\n * - the in-flight request is aborted on unmount so no stale answer lands\n * - the browser never contacts npm itself \u2014 the host performs the check and\n * serves the sanitized, secret-free projection (red line: no direct npm\n * registry access from the client)\n *\n * Returns the full status (not just `update`): the panel-bottom repository\n * footer labels itself with `currentVersion` from the same projection.\n */\nimport { useEffect, useState } from 'react';\nimport { fetchUpdateCheck, type BundleUpdateStatus } from './api.js';\n\n/** The update-check projection, or `null` while pending / failed. */\nexport function useUpdateCheck(): BundleUpdateStatus | null {\n const [status, setStatus] = useState<BundleUpdateStatus | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n fetchUpdateCheck(controller.signal)\n .then((result) => {\n if (!controller.signal.aborted) setStatus(result);\n })\n .catch(() => {\n // Silent degradation by contract \u2014 see header.\n });\n return () => controller.abort();\n }, []);\n\n return status;\n}\n", "\n/**\n * Locale dictionaries for the \"\u6E20\u9053\" (Channels) Settings section.\n * Keyed namespace: 'channels'.\n */\nexport const locales = {\n zh: {\n nav: '\u6E20\u9053',\n channelWeixin: '\u5FAE\u4FE1',\n channelQq: 'QQ',\n channelDingtalk: '\u9489\u9489',\n channelLark: '\u98DE\u4E66',\n channelTelegram: 'Telegram',\n loading: '\u52A0\u8F7D\u4E2D\u2026',\n configured: '\u5DF2\u914D\u7F6E',\n notConfigured: '\u672A\u914D\u7F6E',\n // status\n statusConnected: '\u5DF2\u8FDE\u63A5',\n // generic form\n saving: '\u4FDD\u5B58\u4E2D\u2026',\n saveError: '\u4FDD\u5B58\u5931\u8D25',\n inputValue: '\u8F93\u5165',\n readonlyHint: '\u53EA\u8BFB',\n // setup copy\n setupIntro: '\u586B\u5199\u6E20\u9053\u51ED\u8BC1\uFF0C\u4FDD\u5B58\u540E\u81EA\u52A8\u8FDE\u63A5\u3002\u5DF2\u914D\u7F6E\u7684\u5B57\u6BB5\u53EF\u7559\u7A7A\u3002',\n setupIntroDingtalk: '\u586B\u5199\u5DF2\u6709\u9489\u9489\u5E94\u7528\u7684 Client ID \u548C Client Secret\uFF0C\u4FDD\u5B58\u540E\u8FDE\u63A5\u3002\u5DF2\u914D\u7F6E\u7684\u5B57\u6BB5\u53EF\u7559\u7A7A\u3002',\n setupIntroLark: '\u586B\u5199 App ID \u548C App Secret \u540E\u4FDD\u5B58\u5373\u53EF\u8FDE\u63A5\uFF1B\u626B\u7801\u6388\u6743\u53EF\u4E00\u952E\u914D\u7F6E\u673A\u5668\u4EBA\uFF0C\u7528\u4E8E\u63A5\u5165 deepseek-harness\u3002\u5DF2\u914D\u7F6E\u7684\u5B57\u6BB5\u53EF\u7559\u7A7A\u3002',\n setupIntroTelegram: '\u5728 @BotFather \u521B\u5EFA\u673A\u5668\u4EBA\u5E76\u83B7\u53D6 Bot Token\uFF0C\u586B\u5199\u540E\u4FDD\u5B58\u5373\u53EF\u8FDE\u63A5\u3002\u5DF2\u914D\u7F6E\u7684\u5B57\u6BB5\u53EF\u7559\u7A7A\u3002',\n scanTab: '\u626B\u7801\u767B\u5F55',\n scanAuthTab: '\u626B\u7801\u6388\u6743',\n portalLoginTab: '\u5E73\u53F0\u626B\u7801',\n setupMethod: '\u914D\u7F6E\u65B9\u5F0F',\n existingCredentialsTab: '\u5DF2\u6709\u5E94\u7528\u51ED\u8BC1',\n saveAndConnect: '\u4FDD\u5B58\u5E76\u8FDE\u63A5',\n openPlatform: '\u6253\u5F00\u5B98\u65B9\u5F00\u653E\u5E73\u53F0',\n viewOfficialDocs: '\u5B98\u65B9\u6587\u6863',\n incompleteSetup: '\u8BF7\u586B\u5199\u6240\u6709\u5C1A\u672A\u914D\u7F6E\u7684\u5FC5\u586B\u9879',\n setupSaved: '\u914D\u7F6E\u5DF2\u4FDD\u5B58\uFF0C\u6E20\u9053\u8FDE\u63A5\u5DF2\u542F\u52A8',\n done: '\u5B8C\u6210',\n // inline setup sections\n setupSection: '\u5E94\u7528\u914D\u7F6E',\n // inline auth section\n authSection: '\u6388\u6743',\n beginAuth: '\u5F00\u59CB\u6388\u6743',\n authNeedsConfigFirst: '\u8BF7\u5148\u5728\u300C\u5E94\u7528\u914D\u7F6E\u300D\u4E2D\u586B\u5199\u5E76\u4FDD\u5B58\u5FC5\u586B\u51ED\u8BC1\uFF0C\u518D\u5F00\u59CB\u6388\u6743',\n // access control section\n accessSection: '\u5B89\u5168\u8BBF\u95EE',\n ownerSection: '\u6240\u6709\u8005',\n ownerIdentified: '\u5DF2\u8BC6\u522B',\n ownerNotIdentified: '\u5C1A\u672A\u8BC6\u522B\u4F60\u7684\u804A\u5929\u8D26\u53F7',\n ownerAutoIdentified: '\u5DF2\u81EA\u52A8\u8BC6\u522B',\n identifyMyAccount: '\u8BC6\u522B\u6211\u7684\u8D26\u53F7',\n claimInstruction: '\u8BF7\u79C1\u804A Bot \u53D1\u9001:',\n waitingForMessage: '\u7B49\u5F85\u6D88\u606F...',\n detectedCandidatePrefix: '\u68C0\u6D4B\u5230:',\n confirmIsMe: '\u786E\u8BA4\u8FD9\u662F\u6211',\n cancel: '\u53D6\u6D88',\n dmSection: '\u79C1\u804A\u8BBF\u95EE',\n dmOwnerOnly: '\u4EC5\u81EA\u5DF1',\n dmDisabled: '\u7981\u7528',\n dmAllowlist: '\u6307\u5B9A\u7528\u6237',\n dmOpen: '\u6240\u6709\u4EBA\uFF08\u5371\u9669\uFF09',\n dmOpenDanger: '\u4EFB\u4F55\u80FD\u591F\u79C1\u804A\u8BE5 Bot \u7684\u8FDC\u7A0B\u7528\u6237\u90FD\u53EF\u4EE5\u9A71\u52A8\u672C\u673A Agent',\n allowUsers: '\u5141\u8BB8\u7528\u6237',\n addUser: '+ \u6DFB\u52A0',\n userPlaceholder: '\u7528\u6237 ID',\n groupSection: '\u7FA4\u804A\u8BBF\u95EE',\n groupEnable: '\u542F\u7528',\n groupDisabled: '\u7981\u7528',\n groupSpecified: '\u6307\u5B9A\u7FA4\u7EC4',\n groupAllDanger: '\u6240\u6709\u7FA4\u7EC4\uFF08\u5371\u9669\uFF09',\n groupAllDangerHint: 'Bot \u6240\u5728\u6216\u80FD\u63A5\u6536\u6D88\u606F\u7684\u4EFB\u4F55\u7FA4\u7EC4\u90FD\u5C06\u5339\u914D\u6B64\u89C4\u5219',\n allGroups: '\u6240\u6709\u7FA4\u7EC4\u7684\u6210\u5458\u89C4\u5219',\n addGroup: '\u6DFB\u52A0\u7FA4',\n groupIdPlaceholder: 'Group ID',\n memberAccess: '\u5141\u8BB8\u6210\u5458',\n memberOnly: '\u4EC5\u81EA\u5DF1',\n memberSpecified: '\u6307\u5B9A\u6210\u5458',\n memberAllDanger: '\u7FA4\u5185\u6240\u6709\u6210\u5458\uFF08\u5371\u9669\uFF09',\n memberAllDangerHint: '\u8BE5\u7FA4\u5185\u4EFB\u4F55\u6210\u5458\u90FD\u53EF\u4EE5\u9A71\u52A8\u672C\u673A Agent',\n requireMention: '\u5FC5\u987B @\u673A\u5668\u4EBA',\n noGroupSupport: '\u5F53\u524D\u6E20\u9053\u4E0D\u652F\u6301\u7FA4\u804A',\n rmGroup: '\u79FB\u9664',\n dmPlatformFixed: '\u4EC5\u673A\u5668\u4EBA\u6240\u5C5E QQ \u53EF\u79C1\u804A',\n dmPlatformFixedHint: 'QQ \u5E73\u53F0\u5DF2\u9650\u5236\u79C1\u804A\u8BBF\u95EE\uFF0C\u65E0\u9700\u989D\u5916\u914D\u7F6E\u3002',\n conversationDiscovered: '\u6700\u8FD1\u53D1\u73B0',\n conversationRefresh: '\u5237\u65B0',\n conversationAdd: '\u6DFB\u52A0',\n conversationEmpty: '\u6682\u672A\u53D1\u73B0\u4EFB\u4F55\u7FA4\u3002\u8BF7\u5C06\u673A\u5668\u4EBA\u52A0\u5165\u7FA4\uFF0C\u5E76\u5728\u7FA4\u4E2D @\u673A\u5668\u4EBA \u53D1\u9001\u4E00\u6761\u6D88\u606F\uFF0C\u7136\u540E\u70B9\u51FB\u5237\u65B0\u3002',\n conversationIdentityConflict: '\u26A0 \u7FA4\u8EAB\u4EFD\u4FE1\u606F\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u786E\u8BA4',\n readinessNeedsOwner: '\u26A0 \u9700\u8981\u8BC6\u522B\u4F60\u7684\u8D26\u53F7',\n readinessMissingPolicy: '\u26A0 \u8BBF\u95EE\u6743\u9650\u672A\u914D\u7F6E',\n readinessInvalidPolicy: '\u26A0 \u8BBF\u95EE\u6743\u9650\u914D\u7F6E\u65E0\u6548',\n saveAccess: '\u4FDD\u5B58\u8BBF\u95EE\u914D\u7F6E',\n accessSaved: '\u8BBF\u95EE\u914D\u7F6E\u5DF2\u4FDD\u5B58',\n confirmBeforeCandidateError: '\u8FD8\u6CA1\u6709\u68C0\u6D4B\u5230\u5019\u9009\u6D88\u606F',\n claimExpiredOrInvalid: '\u8BC6\u522B\u8BF7\u6C42\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u8BD5',\n // enable lifecycle (row switch)\n enableChannel: '\u542F\u52A8\u6E20\u9053',\n disableChannel: '\u505C\u7528\u6E20\u9053',\n // auth progress\n waitingScan: '\u7B49\u5F85\u626B\u7801',\n scannedConfirm: '\u5DF2\u626B\u7801\uFF0C\u8BF7\u786E\u8BA4',\n confirmOnPhone: '\u8BF7\u5728\u624B\u673A\u4E0A\u786E\u8BA4',\n credentialsRequired: '\u8BF7\u586B\u5199 AppID / AppSecret',\n preparing: '\u51C6\u5907\u4E2D\u2026',\n needVerifyCode: '\u9700\u8981\u9A8C\u8BC1\u7801',\n verifyCodePlaceholder: '\u8F93\u5165\u9A8C\u8BC1\u7801',\n success: '\u8BA4\u8BC1\u6210\u529F',\n expired: '\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F',\n failed: '\u8BA4\u8BC1\u5931\u8D25',\n regenerate: '\u91CD\u65B0\u751F\u6210',\n submit: '\u63D0\u4EA4',\n // qr display\n openLink: '\u5728\u65B0\u7A97\u53E3\u6253\u5F00',\n // misc\n expiresIn: '\u5269\u4F59',\n seconds: '\u79D2',\n connectionError: '\u8FDE\u63A5\u51FA\u9519',\n retry: '\u91CD\u8BD5',\n // bundle update notice (prompt-only; the host performed the npm check)\n updateAvailable: '\u65B0\u7248\u672C {version} \u53EF\u7528\uFF08{tag}\uFF09',\n updateCrossLineHint: '\u8DE8\u7248\u672C\u7EBF\u5347\u7EA7\uFF1A\u8BF7\u5148\u5347\u7EA7 Harness CLI\uFF0C\u518D\u91CD\u65B0\u5B89\u88C5 bundle\uFF08\u6309\u987A\u5E8F\u6267\u884C\uFF09',\n // panel-bottom repository entry\n repoFooterRepo: '\u4ED3\u5E93',\n repoFooterDocs: '\u6587\u6863',\n repoFooterIssue: '\u53CD\u9988 issue',\n },\n en: {\n nav: 'Channels',\n channelWeixin: 'Weixin',\n channelQq: 'QQ',\n channelDingtalk: 'DingTalk',\n channelLark: 'Lark',\n channelTelegram: 'Telegram',\n loading: 'Loading\u2026',\n configured: 'Configured',\n notConfigured: 'Not configured',\n // status\n statusConnected: 'Connected',\n // generic form\n saving: 'Saving\u2026',\n saveError: 'Save failed',\n inputValue: 'Value',\n readonlyHint: 'Read-only',\n // setup copy\n setupIntro: 'Enter channel credentials and connect. Leave configured fields blank to keep them unchanged.',\n setupIntroDingtalk: 'Enter the Client ID and Client Secret of an existing DingTalk app, then save and connect. Leave configured fields blank to keep them unchanged.',\n setupIntroLark: 'Save and connect directly with App ID and App Secret. Scanning one-click configures the bot to connect to deepseek-harness. Leave configured fields blank to keep them unchanged.',\n setupIntroTelegram: 'Create a bot and get its Bot Token from @BotFather, then save and connect. Leave configured fields blank to keep them unchanged.',\n scanTab: 'Scan to sign in',\n scanAuthTab: 'Scan to authorize',\n portalLoginTab: 'Platform login',\n setupMethod: 'Setup method',\n existingCredentialsTab: 'Existing app credentials',\n saveAndConnect: 'Save and connect',\n openPlatform: 'Open official developer console',\n viewOfficialDocs: 'Official docs',\n incompleteSetup: 'Complete every required field that is not configured yet',\n setupSaved: 'Configuration saved and channel connection started',\n done: 'Done',\n // inline setup sections\n setupSection: 'Application config',\n // inline auth section\n authSection: 'Authorization',\n beginAuth: 'Begin authorization',\n authNeedsConfigFirst: 'Fill in and save the required credentials under \"Application config\" first',\n // access control section\n accessSection: 'Secure access',\n ownerSection: 'Owner',\n ownerIdentified: 'Identified',\n ownerNotIdentified: 'Your chat account is not identified yet',\n ownerAutoIdentified: 'Auto-identified',\n identifyMyAccount: 'Identify my account',\n claimInstruction: 'Send to the bot via DM:',\n waitingForMessage: 'Waiting for message...',\n detectedCandidatePrefix: 'Detected:',\n confirmIsMe: \"That's me\",\n cancel: 'Cancel',\n dmSection: 'Direct-message access',\n dmOwnerOnly: 'Owner only',\n dmDisabled: 'Disabled',\n dmAllowlist: 'Specific users',\n dmOpen: 'Everyone (danger)',\n dmOpenDanger: 'Any remote user who can DM this bot can drive the local Agent',\n allowUsers: 'Allowed users',\n addUser: '+ Add',\n userPlaceholder: 'User ID',\n groupSection: 'Group-chat access',\n groupEnable: 'Enabled',\n groupDisabled: 'Disabled',\n groupSpecified: 'Specific groups',\n groupAllDanger: 'All groups (danger)',\n groupAllDangerHint: 'This rule applies to every group where the bot can receive messages',\n allGroups: 'Member rule for all groups',\n addGroup: 'Add group',\n groupIdPlaceholder: 'Group ID',\n memberAccess: 'Allowed members',\n memberOnly: 'Owner only',\n memberSpecified: 'Specific members',\n memberAllDanger: 'All members in this group (danger)',\n memberAllDangerHint: 'Any member of this group can drive the local Agent',\n requireMention: 'Must @ the bot',\n noGroupSupport: 'This channel does not support group chats',\n rmGroup: 'Remove',\n dmPlatformFixed: 'Only the bot owner can DM this bot',\n dmPlatformFixedHint: 'The QQ platform restricts private chat to the bot owner; no extra configuration needed.',\n conversationDiscovered: 'Recently discovered',\n conversationRefresh: 'Refresh',\n conversationAdd: 'Add',\n conversationEmpty: 'No groups discovered yet. Add the bot to a group, @-mention it once, then click refresh.',\n conversationIdentityConflict: '\u26A0 Group identity changed; please re-confirm',\n readinessNeedsOwner: '\u26A0 Need to identify your account',\n readinessMissingPolicy: '\u26A0 Access policy not configured',\n readinessInvalidPolicy: '\u26A0 Invalid access policy',\n saveAccess: 'Save access config',\n accessSaved: 'Access config saved',\n confirmBeforeCandidateError: 'No candidate message detected yet',\n claimExpiredOrInvalid: 'The identification request expired or is invalid; please retry',\n // enable lifecycle (row switch)\n enableChannel: 'Enable channel',\n disableChannel: 'Disable channel',\n // auth progress\n waitingScan: 'Waiting for scan',\n scannedConfirm: 'Scanned, please confirm',\n confirmOnPhone: 'Please confirm on your phone',\n credentialsRequired: 'Enter App ID / App Secret',\n preparing: 'Preparing\u2026',\n needVerifyCode: 'Verification code required',\n verifyCodePlaceholder: 'Enter verification code',\n success: 'Authentication successful',\n expired: 'QR code expired',\n failed: 'Authentication failed',\n regenerate: 'Regenerate',\n submit: 'Submit',\n // qr display\n openLink: 'Open in new window',\n // misc\n expiresIn: 'Expires in',\n seconds: 's',\n connectionError: 'Connection error',\n retry: 'Retry',\n // bundle update notice (prompt-only; the host performed the npm check)\n updateAvailable: 'New version {version} available ({tag})',\n updateCrossLineHint: 'Cross-line upgrade: upgrade the Harness CLI first, then re-add the bundle (run in order)',\n // panel-bottom repository entry\n repoFooterRepo: 'Repository',\n repoFooterDocs: 'Docs',\n repoFooterIssue: 'Feedback',\n },\n} as const;\n\nexport type ChannelNavNamespaces = 'zh' | 'en';\nexport type ChannelLocale = typeof locales;\n"],
|
|
5
|
+
"mappings": "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AA,MAAI;AAAA,MACZ;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MACZ;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MACZ;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MACZ;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MACb;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MACb;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MACd;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MACd;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MACd;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MACd;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACf;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MAChB;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MAChB;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MAChB;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MAChB;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MAChB;AAAA,MAAK;AAAA,MAAK;AAAA,MAAM;AAAA,MAChB;AAAA,MAAK;AAAA,M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",
|
|
6
|
+
"names": ["module", "module", "module", "module", "module", "module", "module", "module", "module", "module", "require_utils", "QRCode", "import_react", "name", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_jsx_runtime", "QRCode", "import_react", "import_jsx_runtime", "method", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "Section"]
|
|
7
|
+
}
|