@dshfly/remote-connector 0.2.1
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/LICENSE +21 -0
- package/README.md +44 -0
- package/config.js +69 -0
- package/cordis.patch.yml +6 -0
- package/core/cloud.js +55 -0
- package/core/connector-core.js +910 -0
- package/core/dsh-web.js +556 -0
- package/core/keys.js +68 -0
- package/core/path-guard.js +60 -0
- package/core/pending-approvals.js +80 -0
- package/core/push-notifier.js +79 -0
- package/core/session-titles.js +85 -0
- package/core/tunnel.js +607 -0
- package/dist/client.js +556 -0
- package/dist/client.js.map +7 -0
- package/http-api.js +531 -0
- package/index.js +173 -0
- package/mobile-bridge/README.md +33 -0
- package/mobile-bridge/core/bridge-core.js +367 -0
- package/mobile-bridge/core/enumerate.js +44 -0
- package/mobile-bridge/core/files.js +431 -0
- package/mobile-bridge/core/roots.js +50 -0
- package/mobile-bridge/index.js +59 -0
- package/package.json +87 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/index.jsx", "../src/client/locales.js", "../src/client/SettingsSection.jsx", "../src/client/api.js"],
|
|
4
|
+
"sourcesContent": ["// packages/remote-connector/src/client/index.jsx\n// @dshfly/remote-connector \u7684 DSH web client \u5165\u53E3\uFF08\u6D4F\u89C8\u5668\u4FA7\uFF09\u3002\n// \u5951\u7EA6\uFF08\u5BF9\u9F50 orbis @orbisapp/remote-dsh/src/client/index.tsx\uFF09\uFF1A\n// exports[\"./client\"] \u6307\u5411\u6784\u5EFA\u4EA7\u7269\uFF1Bdsh.client.inject \u58F0\u660E\u4F9D\u8D56\uFF1B\n// apply(ClientContext) \u6CE8\u518C\u8BCD\u5178 + \u5411\u8BBE\u7F6E\u7A97\u53E3\u6CE8\u518C\u72EC\u7ACB section\uFF08\u51FA\u73B0\u5728\u8BBE\u7F6E\u5DE6\u4FA7\u83DC\u5355\uFF09\u3002\n\nimport { zh, en } from './locales';\nimport { SettingsSection } from './SettingsSection';\n\nconst namespace = 'dshfly';\n\nexport const inject = ['slots', 'locale'];\n\nexport function apply(context) {\n context.effect(\n () => context.locale.register(namespace, { zh, en }),\n 'dshfly-remote-connector: dictionaries',\n );\n const translate = context.locale.bind(namespace);\n const injected = () => ({ t: translate });\n // settings.section\uFF08list slot\uFF09\uFF1A\u8BBE\u7F6E\u7A97\u53E3\u5DE6\u4FA7\u83DC\u5355\u7684\u6570\u636E\u6E90\u2014\u2014\u6BCF\u4E2A entry \u4E00\u4E2A\u83DC\u5355\u9879\uFF0C\n // \u70B9\u51FB\u540E\u53F3\u4FA7\u5185\u5BB9\u533A\u6E32\u67D3\u5BF9\u5E94\u7EC4\u4EF6\uFF08props: { close } + inject \u7684 { t }\uFF09\u3002\n // \u81EA settings.plugins.tab\uFF08\"\u8BBE\u7F6E-\u63D2\u4EF6\" tab \u5185\uFF09\u8FC1\u5165\uFF082026-08\uFF09\uFF1A\u914D\u5BF9\u9762\u677F\u6210\u4E3A\u72EC\u7ACB\u83DC\u5355\u9879\u3002\n context.slots.inject('settings.section', () =>\n context.slots.register(\n {\n name: 'settings.section',\n id: 'dshfly-remote-connector',\n order: 30, // \u4F4D\u4E8E\u5185\u7F6E models(10) \u7B49\u4E4B\u540E\n label: () => translate('nav'),\n inject: injected,\n },\n SettingsSection,\n ),\n );\n}\n", "// packages/remote-connector/src/client/locales.js\n// \u8BBE\u7F6E\u9875\u8BCD\u5178\uFF08zh/en\uFF0Clocale.register \u53CC\u8BED\u6587\u6863\u8981\u6C42\u5E73\u8861\uFF09\u3002\n\nexport const zh = {\n nav: '\u8FDC\u7A0B\u8FDE\u63A5',\n statusConnected: '\u5DF2\u8FDE\u63A5',\n statusConnecting: '\u8FDE\u63A5\u4E2D',\n statusDisconnected: '\u672A\u8FDE\u63A5',\n relayServer: '\u4E2D\u7EE7\u670D\u52A1\u5668',\n version: '\u7248\u672C',\n checkUpdate: '\u68C0\u67E5\u66F4\u65B0',\n updateAvailable: '\u53D1\u73B0\u65B0\u7248\u672C',\n upgrade: '\u4E00\u952E\u5347\u7EA7',\n upgrading: '\u5347\u7EA7\u4E2D\u2026',\n upgradeDone: '\u5347\u7EA7\u5B8C\u6210\uFF0C\u8BF7\u91CD\u542F dsh web \u751F\u6548',\n upgradeFailed: '\u5347\u7EA7\u5931\u8D25',\n upToDate: '\u5DF2\u662F\u6700\u65B0\u7248\u672C',\n checkFailed: '\u68C0\u67E5\u66F4\u65B0\u5931\u8D25',\n accountName: '\u8D26\u53F7',\n deviceId: '\u8BBE\u5907 ID',\n hostname: '\u8BA1\u7B97\u673A\u540D',\n pairedDevices: '\u5DF2\u914D\u5BF9\u8BBE\u5907',\n noDevices: '\u6682\u65E0\u5DF2\u914D\u5BF9\u8BBE\u5907',\n lastUsed: '\u6700\u8FD1\u4F7F\u7528',\n never: '\u4ECE\u672A',\n unpair: '\u89E3\u9664\u914D\u5BF9',\n deviceOnline: '\u5728\u7EBF',\n deviceOffline: '\u79BB\u7EBF',\n startPairing: '\u65B0\u5EFA\u914D\u5BF9',\n pairingTitle: '\u914D\u5BF9\u4E8C\u7EF4\u7801',\n waitingScan: '\u7B49\u5F85\u624B\u673A\u626B\u7801\u2026\uFF0810 \u5206\u949F\u6709\u6548\uFF09',\n recommendedTitle: '\u63A8\u8350\u63D2\u4EF6',\n recommendedHint: '\u88C5\u5230\u672C\u673A dsh web \u540E\uFF0C\u624B\u673A App \u7684\u63D2\u4EF6 Tab \u4F1A\u81EA\u52A8\u51FA\u73B0\uFF1A',\n install: '\u4E00\u952E\u5B89\u88C5',\n installing: '\u5B89\u88C5\u4E2D\u2026',\n installed: '\u5DF2\u5B89\u88C5',\n installDone: '\u5B89\u88C5\u5B8C\u6210\uFF0C\u65E0\u9700\u91CD\u542F',\n installReboot: '\u5DF2\u5B89\u88C5\uFF0C\u9700\u91CD\u542F dsh web \u540E\u751F\u6548',\n installFailed: '\u5B89\u88C5\u5931\u8D25',\n awaitingConfirm: '\u6709\u4E00\u53F0\u624B\u673A\u8BF7\u6C42\u4E0E\u672C\u673A\u914D\u5BF9',\n confirmPairing: '\u914D\u5BF9\u8BF7\u6C42',\n approve: '\u786E\u8BA4\u901A\u8FC7',\n reject: '\u62D2\u7EDD',\n pairingDone: '\u914D\u5BF9\u5B8C\u6210',\n pairingRejected: '\u5DF2\u62D2\u7EDD\u8BE5\u914D\u5BF9\u8BF7\u6C42',\n copyLink: '\u590D\u5236\u94FE\u63A5',\n copied: '\u5DF2\u590D\u5236',\n refresh: '\u5237\u65B0',\n operationFailed: '\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5',\n loadFailed: '\u52A0\u8F7D\u72B6\u6001\u5931\u8D25',\n confirmUnpair: '\u786E\u8BA4\u89E3\u9664\u8FD9\u53F0\u8BBE\u5907\u7684\u914D\u5BF9\uFF1F',\n fullDisk: '\u5141\u8BB8\u6D4F\u89C8\u5B8C\u6574\u78C1\u76D8',\n fullDiskHint: '\u5F00\u542F\u540E\u624B\u673A\u53EF\u6D4F\u89C8\u6574\u4E2A\u6587\u4EF6\u7CFB\u7EDF\u5E76\u65B0\u5EFA\u4EFB\u610F\u4F4D\u7F6E\u7684\u5DE5\u4F5C\u533A\uFF1B\u5173\u95ED\u5219\u4EC5\u9650\u5DF2\u767B\u8BB0\u5DE5\u4F5C\u533A\u4E0E dsh web \u4E3B\u76EE\u5F55',\n permissionChanged: '\u6743\u9650\u5DF2\u66F4\u65B0',\n intro: '\u901A\u8FC7\u624B\u673A App \u968F\u65F6\u968F\u5730\u8FDE\u63A5 DeepSeek Harness\u2014\u2014\u7AEF\u5230\u7AEF\u52A0\u5BC6\u3001\u5B89\u5168\u4E2D\u7EE7\uFF0C\u590D\u6742\u7F51\u7EDC\u73AF\u5883\u4E5F\u80FD\u7A33\u5B9A\u8FDE\u63A5\u3002',\n confirm: '\u786E\u5B9A',\n cancel: '\u53D6\u6D88',\n scanHint: '\u5728\u624B\u673A\u4E0A\u4F7F\u7528 DSH Fly \u626B\u7801',\n shortCodeHint: '\u8BF7\u6838\u5BF9\u624B\u673A\u5C4F\u5E55\u4E0A\u7684\u914D\u5BF9\u7801',\n shortCodeCompare: '\u4E0E\u624B\u673A\u300C\u914D\u5BF9\u5B8C\u6210\u300D\u9875\u663E\u793A\u7684 8 \u4F4D\u7801\u4E00\u81F4\u624D\u53EF\u786E\u8BA4\u2014\u2014\u7801\u4E0D\u540C\u8BF4\u660E\u4E2D\u7EE7\u88AB\u7BE1\u6539',\n knownDevice: '\u8FD9\u662F\u5DF2\u914D\u5BF9\u8FC7\u7684\u8BBE\u5907\uFF0C\u786E\u8BA4\u540E\u514D\u7801\u91CD\u8FDE',\n tokenRevoked: '\u8BBE\u5907\u5DF2\u64A4\u9500',\n tokenRevokedTip: '\u672C\u673A\u5DF2\u88AB\u4E2D\u7EE7\u64A4\u9500\uFF0C\u9700\u91CD\u65B0\u521D\u59CB\u5316\u540E\u518D\u914D\u5BF9',\n tokenExpired: '\u51ED\u8BC1\u5DF2\u8FC7\u671F',\n tokenExpiredTip: '\u8BBE\u5907\u51ED\u8BC1\u5DF2\u8FC7\u671F\uFF0C\u6B63\u5728\u81EA\u52A8\u5237\u65B0\uFF08\u4E00\u822C\u51E0\u79D2\u5185\u6062\u590D\uFF09',\n tokenExpiring: '\u51ED\u8BC1\u5373\u5C06\u8FC7\u671F',\n tokenExpiringTip: '\u8BBE\u5907\u51ED\u8BC1\u5C06\u5728 12 \u5C0F\u65F6\u5185\u8FC7\u671F\uFF0C\u4F1A\u81EA\u52A8\u5237\u65B0',\n tokenUnregistered: '\u672A\u767B\u8BB0',\n tokenUnregisteredTip: '\u672C\u673A\u5C1A\u672A\u5728\u4E2D\u7EE7\u767B\u8BB0\uFF0C\u65B0\u5EFA\u914D\u5BF9\u4F1A\u81EA\u52A8\u767B\u8BB0',\n};\n\nexport const en = {\n nav: 'Remote Connector',\n statusConnected: 'Connected',\n statusConnecting: 'Connecting',\n statusDisconnected: 'Disconnected',\n relayServer: 'Relay server',\n version: 'Version',\n checkUpdate: 'Check update',\n updateAvailable: 'New version available',\n upgrade: 'Upgrade',\n upgrading: 'Upgrading\u2026',\n upgradeDone: 'Upgrade done, restart dsh web to apply',\n upgradeFailed: 'Upgrade failed',\n upToDate: 'Up to date',\n checkFailed: 'Update check failed',\n accountName: 'Account',\n deviceId: 'Device ID',\n hostname: 'Hostname',\n pairedDevices: 'Paired devices',\n noDevices: 'No paired devices',\n lastUsed: 'Last used',\n never: 'never',\n unpair: 'Unpair',\n deviceOnline: 'Online',\n deviceOffline: 'Offline',\n startPairing: 'New pairing',\n pairingTitle: 'Pairing QR',\n waitingScan: 'Waiting for phone scan\u2026 (10 min)',\n awaitingConfirm: 'A phone is requesting to pair with this machine',\n confirmPairing: 'Pairing request',\n approve: 'Approve',\n reject: 'Reject',\n pairingDone: 'Paired',\n pairingRejected: 'Pairing request rejected',\n copyLink: 'Copy link',\n copied: 'Copied',\n refresh: 'Refresh',\n operationFailed: 'Operation failed, retry',\n loadFailed: 'Failed to load status',\n confirmUnpair: 'Unpair this device?',\n fullDisk: 'Allow full disk browsing',\n fullDiskHint: 'When on, the phone can browse the whole filesystem and create workspaces anywhere; when off, it is limited to registered workspaces and the dsh web home directory',\n permissionChanged: 'Permission updated',\n intro: 'Connect to DeepSeek Harness from your phone anytime, anywhere \u2014 end-to-end encrypted, secure relay, stable under any network conditions.',\n confirm: 'OK',\n cancel: 'Cancel',\n scanHint: 'Scan with the DSH Fly app on your phone',\n shortCodeHint: 'Compare with the pairing code on the phone screen',\n shortCodeCompare: 'Only confirm if it matches the 8-char code on the phone\\'s \"paired\" screen \u2014 a mismatch means the relay was tampered with',\n knownDevice: 'This device was paired before; confirm to reconnect without a code',\n tokenRevoked: 'Device revoked',\n tokenRevokedTip: 'This machine was revoked by the relay; reinitialize before pairing',\n tokenExpired: 'Credential expired',\n tokenExpiredTip: 'Device credential expired, auto-refreshing (usually recovers in seconds)',\n tokenExpiring: 'Credential expiring',\n tokenExpiringTip: 'Device credential expires within 12h, auto-refreshed',\n tokenUnregistered: 'Unregistered',\n tokenUnregisteredTip: 'Not registered on the relay; a new pairing registers it automatically',\n recommendedTitle: 'Recommended plugins',\n recommendedHint: 'Installed into this dsh web, they appear in the app plugin tab automatically:',\n install: 'Install',\n installing: 'Installing\u2026',\n installed: 'Installed',\n installDone: 'Installed, no restart needed',\n installReboot: 'Installed, restart dsh web to apply',\n installFailed: 'Install failed',\n};\n", "// packages/remote-connector/src/client/SettingsSection.jsx\n// dsh web \u8BBE\u7F6E\u9875\"\u63D2\u4EF6\"tab \u7684\u914D\u5BF9\u9762\u677F\uFF1A\u8FDE\u63A5\u72B6\u6001 / \u914D\u5BF9\u4E8C\u7EF4\u7801 / \u8BBE\u5907\u7BA1\u7406 / \u4E8C\u6B21\u786E\u8BA4\u3002\n// \u96F6\u914D\u7F6E\uFF1ArelayUrl/\u8D26\u53F7\u5747\u6765\u81EA\u63D2\u4EF6\u540E\u7AEF\uFF08/dshfly/status\uFF09\uFF0C\u672C\u9762\u677F\u53EA\u505A\u5C55\u793A\u4E0E\u64CD\u4F5C\u3002\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { getStatus, startPairing, getPairing, confirmPairing, rejectPairing, unpair, setPermission, getRecommendedPlugins, installPlugin, checkUpdate, upgrade } from './api';\n\nconst sectionStyle = {\n display: 'grid',\n gap: 20,\n maxWidth: 760, // \u5BF9\u9F50 DSH \u5185\u7F6E\u8BBE\u7F6E\u9875 section\uFF08.pbvGtq_section max-width:760px\uFF09\n padding: '8px 0 32px',\n};\n\nconst cardStyle = {\n border: '1px solid var(--dsh-border, rgba(127, 127, 127, .28))',\n borderRadius: 12,\n padding: 16,\n display: 'grid',\n gap: 12,\n};\n\nconst rowStyle = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n flexWrap: 'wrap',\n};\n\nconst labelStyle = { fontSize: 12, opacity: 0.65 };\n\nconst badgeStyle = (color) => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 13,\n padding: '3px 10px',\n borderRadius: 999,\n border: '1px solid currentColor',\n color,\n});\n\nconst btnStyle = {\n border: '1px solid var(--dsh-border, rgba(127, 127, 127, .35))',\n borderRadius: 8,\n background: 'transparent',\n color: 'inherit',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: 13,\n};\n\n// \u6BCF\u53F0\u914D\u5BF9\u8BBE\u5907\u7684\u8FDE\u63A5\u72B6\u6001\u63D0\u793A\uFF08M5.12 \u65B9\u6848C\uFF1A\u624B\u673A /events \u5728\u7EBF\u72B6\u6001\uFF0C\u8BBE\u5907\u5217\u8868\"\u89E3\u9664\u914D\u5BF9\"\u6309\u94AE\u5DE6\u4FA7\uFF09\nconst deviceStatusStyle = (online) => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n fontSize: 12,\n padding: '2px 8px',\n borderRadius: 999,\n border: '1px solid currentColor',\n color: online ? '#2f9e44' : '#868e96',\n whiteSpace: 'nowrap',\n});\n\n// \u6743\u9650\u5F00\u5173\uFF08\u786E\u8BA4\u5F39\u7A97 / \u8BBE\u5907\u5217\u8868\u5171\u7528\uFF09\uFF1Acheckbox \u6837\u5F0F\nconst switchStyle = { display: 'flex', alignItems: 'center', gap: 8, fontSize: 13 };\n\n// \u914D\u5BF9\u786E\u8BA4\u5F39\u7A97\uFF08\u5C45\u4E2D\u906E\u7F69\uFF0C\u786E\u8BA4/\u62D2\u7EDD\u6309\u94AE\u9192\u76EE\uFF09\nconst modalBackdropStyle = {\n position: 'fixed', inset: 0, zIndex: 9999,\n background: 'rgba(0, 0, 0, 0.55)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 24,\n};\nconst modalCardStyle = {\n background: 'var(--dsh-card-bg, #fff)',\n color: 'var(--dsh-card-fg, #1a1d26)',\n borderRadius: 16, padding: 24, maxWidth: 380, width: '100%',\n boxShadow: '0 12px 40px rgba(0,0,0,.35)',\n};\nconst modalTitleStyle = { fontSize: 17, fontWeight: '700', marginBottom: 10 };\n\nfunction statusBadge(connection, t, relayUrl) {\n // title\uFF1A\u60AC\u6D6E\u63D0\u793A\u4E2D\u7EE7\u670D\u52A1\u5668\u5730\u5740\uFF08\u4E0D\u76F4\u63A5\u5C55\u793A\uFF0C\u9632\u7BE1\u6539\u66B4\u9732\u9762\uFF1B2026-08 \u5B89\u5168\u6536\u7D27\uFF09\n const tip = relayUrl ? `${t('relayServer')}: ${relayUrl}` : undefined;\n if (connection === 'connected') return <span style={badgeStyle('#2f9e44')} title={tip}>\u25CF {t('statusConnected')}</span>;\n if (connection === 'connecting') return <span style={badgeStyle('#e8890c')} title={tip}>\u25D0 {t('statusConnecting')}</span>;\n return <span style={badgeStyle('#c92a2a')} title={tip}>\u25CB {t('statusDisconnected')}</span>;\n}\n\n// device token \u5065\u5EB7\u72B6\u6001\uFF082026-08 \u81EA\u6108\uFF09\uFF1A\u63D0\u524D\u9884\u8B66\"\u5373\u5C06\u8FC7\u671F/\u5DF2\u8FC7\u671F/\u5DF2\u64A4\u9500\"\uFF0C\u800C\u975E 401 \u624D\u53BB\u731C\nfunction tokenBadge(tokenState, t) {\n // expiringAt \u53EA\u505A\u60AC\u6D6E\u63D0\u793A\uFF08\u771F\u5B9E\u72B6\u6001\u81EA\u6108\u540E\u81EA\u52A8\u7FFB\u8F6C\uFF0C\u4E0D\u9700\u5C55\u793A\u5177\u4F53\u65F6\u95F4\uFF09\n if (tokenState === 'revoked') return <span style={badgeStyle('#c92a2a')} title={t('tokenRevokedTip')}>\u26A0 {t('tokenRevoked')}</span>;\n if (tokenState === 'expired') return <span style={badgeStyle('#c92a2a')} title={t('tokenExpiredTip')}>\u26A0 {t('tokenExpired')}</span>;\n if (tokenState === 'expiring') return <span style={badgeStyle('#e8890c')} title={t('tokenExpiringTip')}>\u25D0 {t('tokenExpiring')}</span>;\n if (tokenState === 'unregistered') return <span style={badgeStyle('#868e96')} title={t('tokenUnregisteredTip')}>\u25CB {t('tokenUnregistered')}</span>;\n // 'ok' / 'unknown' / \u7F3A\u7701\uFF1A\u4E0D\u8BEF\u5BFC\n return null;\n}\n\nfunction fmtTime(ts, t) {\n if (!ts) return t('never');\n const d = new Date(ts);\n return `${d.getMonth() + 1}/${d.getDate()} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;\n}\n\nexport function SettingsSection({ t }) {\n const [status, setStatus] = useState(null);\n const [pairing, setPairing] = useState(null); // {pairingId, fp, deepLink, qrDataUrl, phase, phonePk?}\n const [confirmFullDisk, setConfirmFullDisk] = useState(false); // \u914D\u5BF9\u786E\u8BA4\u65F6\u7684\u5B8C\u6574\u78C1\u76D8\u6743\u9650\uFF08\u9ED8\u8BA4\u5173\uFF09\n const [busy, setBusy] = useState(null);\n const [error, setError] = useState(null);\n const [notice, setNotice] = useState(null);\n const [recommended, setRecommended] = useState(null); // \u63A8\u8350\u63D2\u4EF6\u5217\u8868\uFF08null = \u672A\u52A0\u8F7D\uFF09\n const [installBusy, setInstallBusy] = useState(null); // \u6B63\u5728\u5B89\u88C5\u7684\u63D2\u4EF6 id\n const [installNotice, setInstallNotice] = useState(null); // {id, text, kind}\n const [updateInfo, setUpdateInfo] = useState(null); // {current, latest, updateAvailable, error?} \u5347\u7EA7\u68C0\u67E5\n const [updateBusy, setUpdateBusy] = useState(false);\n const [toast, setToast] = useState(null); // {text, kind} \u5F31\u5F39\u7A97\uFF08\u81EA\u52A8\u6D88\u5931\uFF09\n\n // \u5F31\u5F39\u7A97\uFF1A\u663E\u793A\u540E 3s \u81EA\u52A8\u6D88\u5931\uFF08\u68C0\u67E5\u5931\u8D25/\u5347\u7EA7\u7ED3\u679C\u7528\uFF0C\u4E0D\u5E38\u9A7B\u754C\u9762\uFF09\n const toastTimer = useRef(null);\n const showToast = useCallback((text, kind = 'ok') => {\n setToast({ text, kind });\n if (toastTimer.current) clearTimeout(toastTimer.current);\n toastTimer.current = setTimeout(() => setToast(null), 3000);\n }, []);\n\n // \u5347\u7EA7\u68C0\u67E5\uFF1Amanual=false\uFF08\u8FDB\u5165\u9875\u9762\u81EA\u52A8\uFF09\u5931\u8D25\u9759\u9ED8\uFF1Bmanual=true\uFF08\u7528\u6237\u70B9\u51FB\uFF09\u5931\u8D25/\u5DF2\u6700\u65B0\u8D70\u5F31\u5F39\u7A97\n const loadUpdate = useCallback(async (manual = false) => {\n try {\n const r = await checkUpdate();\n setUpdateInfo(r);\n if (manual) {\n if (r.updateAvailable) showToast(t('updateAvailable') + ` v${r.latest}`, 'ok');\n else if (r.error) showToast(`${t('checkFailed')}\uFF1A${r.error}`, 'err');\n else showToast(t('upToDate'), 'ok');\n }\n } catch (e) {\n setUpdateInfo({ error: e.message });\n if (manual) showToast(`${t('checkFailed')}\uFF1A${e.message}`, 'err');\n }\n }, [t, showToast]);\n\n useEffect(() => {\n void loadUpdate(false); // \u8FDB\u5165\u9875\u9762\u81EA\u52A8\u68C0\u67E5\uFF1A\u5931\u8D25\u9759\u9ED8\n }, [loadUpdate]);\n\n const onUpgrade = useCallback(async () => {\n setUpdateBusy(true);\n try {\n await upgrade();\n showToast(t('upgradeDone'), 'ok');\n } catch (e) {\n showToast(`${t('upgradeFailed')}\uFF1A${e.message}`, 'err');\n } finally {\n setUpdateBusy(false);\n }\n }, [t, showToast]);\n\n // \u63A8\u8350\u63D2\u4EF6\u52A0\u8F7D\uFF08\u8FDB\u5165\u8BBE\u7F6E\u9875 + \u5B89\u88C5\u540E\u5237\u65B0\uFF09\n const loadRecommended = useCallback(async () => {\n try {\n const r = await getRecommendedPlugins();\n setRecommended(r.plugins || []);\n } catch (e) {\n setRecommended([]); // \u540E\u7AEF\u672A\u5B9E\u73B0/\u5F02\u5E38\uFF1A\u9759\u9ED8\u9690\u85CF\u63A8\u8350\u5361\n }\n }, []);\n\n useEffect(() => {\n void loadRecommended();\n }, [loadRecommended]);\n\n const onInstallPlugin = useCallback(async (id) => {\n setInstallBusy(id);\n setInstallNotice(null);\n try {\n const r = await installPlugin(id);\n setInstallNotice({ id, text: r.rebootNeeded ? t('installReboot') : t('installDone'), kind: 'ok' });\n void loadRecommended();\n } catch (e) {\n setInstallNotice({ id, text: `${t('installFailed')}\uFF1A${e.message}`, kind: 'err' });\n } finally {\n setInstallBusy(null);\n }\n }, [t, loadRecommended]);\n\n const refresh = useCallback(async () => {\n try {\n setStatus(await getStatus());\n } catch (e) {\n setError(e.message);\n }\n }, []);\n\n // \u72B6\u6001\u8F6E\u8BE2\n useEffect(() => {\n void refresh();\n const timer = window.setInterval(() => void refresh(), 2000);\n return () => window.clearInterval(timer);\n }, [refresh]);\n\n // \u914D\u5BF9\u4E2D\u8F6E\u8BE2\uFF1A\u624B\u673A\u63D0\u4EA4\uFF08completed\uFF09\u2192 \u663E\u793A\u786E\u8BA4\uFF1B\u786E\u8BA4\u540E\uFF08done\uFF09\u2192 \u6536\u5C3E\n useEffect(() => {\n if (!pairing || pairing.phase === 'done' || pairing.phase === 'awaiting-confirm') return;\n let alive = true;\n const timer = window.setInterval(async () => {\n try {\n const st = await getPairing(pairing.pairingId);\n if (st.status === 'completed' && alive) {\n // \u624B\u673A\u5DF2\u63D0\u4EA4\uFF08completed\uFF09\uFF1A\u8BB0\u5F55\u624B\u673A\u8EAB\u4EFD\u516C\u94A5\u3001\u8BBE\u5907\u540D\u3001\u77ED\u7801\uFF08A0 \u7801\u6BD4\u5BF9\uFF09\n setPairing((p) => ({\n ...p,\n phase: 'awaiting-confirm',\n phonePk: st.phone?.pk_identity || p.phonePk,\n phoneName: st.phone?.name || p.phoneName,\n shortCode: st.shortCode || null, // A0\uFF1A\u9996\u6B21\u914D\u5BF9\u77ED\u7801\uFF08connector \u672C\u5730\u8BA1\u7B97\uFF09\n known: !!st.known, // A0\uFF1A\u5DF2 pin \u8BBE\u5907 \u2192 \u514D\u7801\u76F4\u63A5\u786E\u8BA4\n }));\n } else if (st.status === 'done' && alive) {\n setPairing((p) => ({ ...p, phase: 'done' }));\n void refresh();\n }\n } catch {}\n }, 1500);\n return () => {\n alive = false;\n window.clearInterval(timer);\n };\n }, [pairing, refresh]);\n\n async function run(label, action) {\n try {\n setBusy(label);\n setError(null);\n setNotice(null);\n await action();\n } catch (e) {\n setError(e.message || t('operationFailed'));\n } finally {\n setBusy(null);\n }\n }\n\n async function onStartPairing() {\n await run('pair', async () => {\n const p = await startPairing();\n setPairing({ ...p, phase: 'waiting-scan' });\n });\n }\n\n async function onConfirm() {\n if (!pairing) return;\n await run('confirm', async () => {\n await confirmPairing(pairing.pairingId, confirmFullDisk);\n setPairing((p) => ({ ...p, phase: 'done' }));\n setConfirmFullDisk(false); // \u590D\u4F4D\uFF0C\u4E0B\u6B21\u914D\u5BF9\u91CD\u65B0\u9009\u62E9\n await refresh();\n });\n }\n\n async function onReject() {\n if (!pairing) return;\n await run('reject', async () => {\n await rejectPairing(pairing.pairingId);\n setPairing(null); // \u62D2\u7EDD\u540E\u56DE\u5230\u521D\u59CB\u6001\uFF08\u53EF\u91CD\u65B0\u65B0\u5EFA\u914D\u5BF9\uFF09\n setNotice(t('pairingRejected'));\n });\n }\n\n async function onUnpair(phonePk) {\n if (!window.confirm(t('confirmUnpair'))) return;\n await run('unpair', async () => {\n await unpair(phonePk);\n await refresh();\n });\n }\n\n async function onTogglePermission(phonePk, fullDisk) {\n await run('perm', async () => {\n await setPermission(phonePk, fullDisk);\n await refresh();\n setNotice(t('permissionChanged'));\n });\n }\n\n async function onCopyLink() {\n if (!pairing?.deepLink) return;\n try {\n await navigator.clipboard.writeText(pairing.deepLink);\n setNotice(t('copied'));\n } catch {\n setError(t('operationFailed'));\n }\n }\n\n // \u4E2D\u7EE7\u5730\u5740\u7F16\u8F91\u5DF2\u79FB\u9664\uFF082026-08 \u5B89\u5168\u6536\u7D27\uFF1A\u9632\u7BE1\u6539\u4E2D\u7EE7\u670D\u52A1\u5668\uFF1B\u6362\u4E2D\u7EE7\u8D70 keys.relayUrl \u6587\u4EF6\u914D\u7F6E\uFF09\n\n const connected = status?.connection === 'connected';\n const devices = status?.devices || [];\n // \u63A8\u8350\u63D2\u4EF6\uFF1A\u53EA\u5C55\u793A\u672A\u5B89\u88C5\u7684\uFF1B\u5168\u90E8\u5DF2\u5B89\u88C5\u5219\u6574\u5361\u9690\u85CF\uFF08\u8FC7\u6EE4\u5DF2\u88C5\u63D2\u4EF6\uFF09\n const recommendedPending = (recommended || []).filter((p) => !p.installed);\n\n return (\n <div style={sectionStyle}>\n {/* \u6807\u9898\u884C\uFF082026-08 \u5BF9\u9F50 DSH \u5185\u7F6E\u8BBE\u7F6E\u9875 .heading\uFF1A18px/600\uFF09+ \u53F3\u4FA7\u7248\u672C\u53F7 + SVG \u68C0\u67E5\u6309\u94AE */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 16 }}>\n <h2 style={{ margin: 0, fontSize: 18, fontWeight: 600, color: 'var(--dsw-alias-label-primary, inherit)' }}>\n {t('nav')}\n </h2>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexShrink: 0 }}>\n <code style={{ fontSize: 13, opacity: 0.75 }}>{status?.version ? `v${status.version}` : '\u2026'}</code>\n <button\n title={t('checkUpdate')}\n aria-label={t('checkUpdate')}\n onClick={() => loadUpdate(true)}\n disabled={updateBusy}\n style={{\n border: 'none', background: 'transparent', cursor: updateBusy ? 'default' : 'pointer',\n padding: 6, borderRadius: 6, color: 'inherit', opacity: updateBusy ? 0.4 : 0.7, lineHeight: 0,\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 12a9 9 0 1 1-2.64-6.36\" />\n <polyline points=\"21 3 21 9 15 9\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* \u4ECB\u7ECD\uFF08\u5BF9\u9F50 DSH .intro\uFF1A13px + label-tertiary\uFF09 */}\n <p style={{ margin: 0, fontSize: 13, color: 'var(--dsw-alias-label-tertiary, inherit)', lineHeight: 1.6, maxWidth: 560 }}>\n {t('intro')}\n </p>\n\n {/* \u6709\u65B0\u7248\uFF1A\u6761\u4EF6\u6A2A\u5E45\uFF08\u4EC5\u66F4\u65B0\u53EF\u7528\u65F6\u51FA\u73B0\uFF0C\u4E0D\u5F71\u54CD\u5E38\u89C4\u5E03\u5C40\uFF09 */}\n {updateInfo?.updateAvailable && (\n <div style={{ ...cardStyle, borderColor: '#e8890c', padding: '10px 16px' }}>\n <div style={{ ...rowStyle, gap: 10 }}>\n <span style={{ fontSize: 13, color: '#e8890c' }}>\n {t('updateAvailable')} v{updateInfo.latest}\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <button style={btnStyle} onClick={onUpgrade} disabled={updateBusy}>\n {updateBusy ? t('upgrading') : t('upgrade')}\n </button>\n </span>\n </div>\n </div>\n )}\n\n {/* \u8FDE\u63A5\u72B6\u6001 */}\n <div style={cardStyle}>\n {/* \u4E2D\u7EE7\u670D\u52A1\u5668\uFF082026-08 \u5B89\u5168\u6536\u7D27\uFF09\uFF1A\u4E0D\u663E\u793A\u5730\u5740\u4E0E\u7F16\u8F91\u6309\u94AE\uFF0C\u53EA\u663E\u793A\u8FDE\u63A5\u72B6\u6001\uFF1B\n \u5730\u5740\u7ECF\u72B6\u6001\u5FBD\u6807\u60AC\u6D6E\u63D0\u793A\uFF08title\uFF09 */}\n <div style={rowStyle}>\n <span style={labelStyle}>{t('relayServer')}</span>\n <span style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {statusBadge(status?.connection, t, status?.relayUrl)}\n {tokenBadge(status?.tokenState, t)}\n </span>\n </div>\n {/* \u7248\u672C + \u5347\u7EA7\u68C0\u67E5\u5DF2\u79FB\u81F3\u9875\u9762\u6807\u9898\u884C\uFF082026-08 \u5E03\u5C40\u4FEE\u6B63\uFF09\uFF1A\u907F\u514D\u5360\u7528\u8FDE\u63A5\u72B6\u6001\u5361\u8868\u683C\u884C */}\n <div style={rowStyle}>\n <span style={labelStyle}>{t('accountName')}</span>\n <code>{status?.accountName || '\u2026'}</code>\n </div>\n <div style={rowStyle}>\n <span style={labelStyle}>{t('deviceId')}</span>\n <code>{status?.deviceId ? status.deviceId.slice(0, 12) + '\u2026' : '\u2026'}</code>\n </div>\n <div style={rowStyle}>\n <span style={labelStyle}>{t('hostname')}</span>\n <code>{status?.hostname || '\u2026'}</code>\n </div>\n </div>\n\n {/* \u63A8\u8350\u63D2\u4EF6\uFF082026-08\uFF09\uFF1A\u5B98\u65B9\u63D2\u4EF6\u4E00\u952E\u88C5\u5230\u672C\u673A dsh web\uFF08\u767D\u540D\u5355\uFF0C\u70ED\u52A0\u8F7D\uFF09\uFF1B\u53EA\u5C55\u793A\u672A\u5B89\u88C5\u7684\uFF0C\n \u5168\u90E8\u5DF2\u5B89\u88C5\u5219\u6574\u5361\u9690\u85CF\uFF08recommendedPending \u8FC7\u6EE4 installed\uFF09 */}\n {recommendedPending.length > 0 && (\n <div style={cardStyle}>\n <div style={{ fontSize: 15, fontWeight: '600' }}>{t('recommendedTitle')}</div>\n <div style={{ fontSize: 13, opacity: 0.7, lineHeight: 1.5 }}>{t('recommendedHint')}</div>\n {recommendedPending.map((p) => (\n <div key={p.id} style={rowStyle}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: 13 }}>\n <span>{p.icon ? <span style={{ fontSize: 16 }}>\uD83D\uDCE6</span> : null}</span>\n <span><strong>{p.title}</strong> \u2014 {p.description}</span>\n </span>\n <button\n style={btnStyle}\n onClick={() => onInstallPlugin(p.id)}\n disabled={installBusy !== null}\n >\n {installBusy === p.id ? t('installing') : t('install')}\n </button>\n {installNotice?.id === p.id && (\n <span style={{ fontSize: 12, color: installNotice.kind === 'err' ? '#c92a2a' : '#2f9e44' }}>\n {installNotice.text}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* \u914D\u5BF9 */}\n <div style={cardStyle}>\n <div style={rowStyle}>\n <strong>{t('pairingTitle')}</strong>\n {!pairing && (\n <button style={btnStyle} onClick={onStartPairing} disabled={busy !== null || !connected}>\n {t('startPairing')}\n </button>\n )}\n </div>\n\n {pairing && pairing.phase === 'waiting-scan' && pairing.qrDataUrl && (\n <div style={{ display: 'grid', justifyItems: 'center', gap: 10 }}>\n <img src={pairing.qrDataUrl} alt=\"QR\" style={{ width: 220, height: 220, borderRadius: 8 }} />\n <div style={{ fontSize: 13, opacity: 0.75 }}>{t('scanHint')}</div>\n <div style={{ fontSize: 12, opacity: 0.6 }}>\n {pairing.pairingId} \u00B7 {pairing.fp.slice(0, 12)}\u2026\n </div>\n <button style={btnStyle} onClick={onCopyLink}>{t('copyLink')}</button>\n </div>\n )}\n\n {pairing && pairing.phase === 'done' && (\n <div style={{ display: 'grid', gap: 10 }}>\n <div style={{ fontSize: 14, color: '#2f9e44' }}>{t('pairingDone')}</div>\n <button style={btnStyle} onClick={() => setPairing(null)} disabled={busy !== null}>\n {t('startPairing')}\n </button>\n </div>\n )}\n </div>\n\n {/* \u914D\u5BF9\u786E\u8BA4\u5F39\u7A97\uFF1A\u624B\u673A\u63D0\u4EA4\u540E\u5F39\u51FA\uFF0C\u663E\u773C\u7684\u786E\u8BA4/\u62D2\u7EDD\uFF08\u4E0D\u518D\u7528\u4E0D\u663E\u773C\u7684\u5185\u8054\u6309\u94AE\uFF09 */}\n {pairing && pairing.phase === 'awaiting-confirm' && (\n <div style={modalBackdropStyle}>\n <div style={modalCardStyle}>\n <div style={modalTitleStyle}>{t('confirmPairing')}</div>\n <div style={{ fontSize: 14, opacity: 0.8, marginBottom: 6 }}>\n {t('awaitingConfirm')}\n </div>\n <div style={{ fontSize: 13, opacity: 0.65, marginBottom: 14 }}>\n {/* \u53EF\u8BFB\u8BBE\u5907\u540D\u4F18\u5148\uFF1B\u65E0\uFF08\u65E7\u624B\u673A\u672A\u63D0\u4EA4\uFF09\u5219\u56DE\u9000\u8BBE\u5907 ID \u77ED\u7801 */}\n {pairing.phoneName\n ? `${t('deviceId')}: ${pairing.phoneName}`\n : `${pairing.pairingId.slice(0, 8)}\u2026 \u00B7 ${t('deviceId')}: ${pairing.phonePk ? pairing.phonePk.slice(0, 10) + '\u2026' : '\u2014'}`}\n </div>\n {/* A0\uFF08S0\uFF09\u914D\u5BF9\u951A\u5B9A\uFF1A\u9996\u6B21\u914D\u5BF9\u5C55\u793A\u77ED\u7801\uFF0C\u4E0E\u624B\u673A\u5C4F\u5E55\u6BD4\u5BF9\u4E00\u81F4\u624D\u786E\u8BA4\uFF08\u4E2D\u7EE7\u65E0\u6CD5\u4F2A\u9020\u4E24\u7AEF\uFF09 */}\n {pairing.shortCode && (\n <div style={{ background: 'var(--dsh-border, rgba(127,127,127,.08))', borderRadius: 8, padding: '12px 14px', marginBottom: 12, textAlign: 'center' }}>\n <div style={{ fontSize: 12, opacity: 0.7, marginBottom: 6 }}>{t('shortCodeHint')}</div>\n <div style={{ fontSize: 28, fontWeight: 800, letterSpacing: 4, fontFamily: 'monospace', color: 'var(--dsh-fg, #1a1d26)' }}>{pairing.shortCode}</div>\n <div style={{ fontSize: 12, opacity: 0.6, marginTop: 6, lineHeight: 1.5 }}>{t('shortCodeCompare')}</div>\n </div>\n )}\n {pairing.known && (\n <div style={{ fontSize: 13, opacity: 0.7, marginBottom: 12 }}>{t('knownDevice')}</div>\n )}\n {/* \u5B8C\u6574\u78C1\u76D8\u6743\u9650\uFF082026-08\uFF09\uFF1A\u786E\u8BA4\u65F6\u9009\u62E9\uFF0C\u914D\u5BF9\u540E\u53EF\u5728\u8BBE\u5907\u5217\u8868\u4FEE\u6539 */}\n <label style={{ ...switchStyle, marginBottom: 16, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={confirmFullDisk}\n onChange={(e) => setConfirmFullDisk(e.target.checked)}\n disabled={busy !== null}\n />\n <span>{t('fullDisk')}</span>\n </label>\n <div style={{ fontSize: 12, opacity: 0.6, marginBottom: 16, lineHeight: 1.5 }}>{t('fullDiskHint')}</div>\n <div style={{ display: 'flex', gap: 10 }}>\n <button style={{ ...btnStyle, flex: 1, background: '#fff', borderColor: '#c92a2a', color: '#c92a2a', fontWeight: '600', padding: '12px 16px' }} onClick={onReject} disabled={busy !== null}>\n {t('reject')}\n </button>\n <button style={{ ...btnStyle, flex: 2, background: '#2f9e44', borderColor: '#2f9e44', color: '#fff', fontWeight: '700', padding: '12px 16px' }} onClick={onConfirm} disabled={busy !== null}>\n {t('approve')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* \u5DF2\u914D\u5BF9\u8BBE\u5907 */}\n <div style={cardStyle}>\n <strong>{t('pairedDevices')}</strong>\n {devices.length === 0 && <div style={{ fontSize: 13, opacity: 0.6 }}>{t('noDevices')}</div>}\n {devices.map((d) => (\n <div key={d.phonePk} style={{ ...rowStyle, padding: '6px 0', borderTop: '1px solid var(--dsh-border, rgba(127,127,127,.15))' }}>\n <div style={{ display: 'grid', gap: 4 }}>\n {/* \u8BBE\u5907\u540D\uFF08\u624B\u673A\u4E0A\u62A5\uFF0C2026-08\uFF09\uFF1A\u6709\u540D\u5B57\u663E\u793A\u540D\u5B57\uFF0C\u5426\u5219\u56DE\u9000\u77ED\u7801 */}\n <code style={{ fontSize: 13, fontWeight: d.name ? 600 : 400 }}>{d.name || d.shortId + '\u2026'}</code>\n <span style={{ fontSize: 12, opacity: 0.6 }}>\n {t('lastUsed')}: {fmtTime(d.lastUsedAt, t)}\n </span>\n {/* \u5B8C\u6574\u78C1\u76D8\u6743\u9650\uFF1A\u663E\u793A + \u4FEE\u6539\uFF082026-08\uFF09 */}\n <label style={{ ...switchStyle, cursor: 'pointer', opacity: 0.9 }}>\n <input\n type=\"checkbox\"\n checked={!!(d.permission && d.permission.fullDisk)}\n onChange={(e) => onTogglePermission(d.phonePk, e.target.checked)}\n disabled={busy !== null}\n />\n <span>{t('fullDisk')}</span>\n </label>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n {/* \u8FDE\u63A5\u72B6\u6001\u63D0\u793A\uFF08M5.12\uFF09\uFF1A\u5728\u7EBF\u7EFF / \u79BB\u7EBF\u7070\uFF0C\u4F4D\u4E8E\u89E3\u9664\u914D\u5BF9\u6309\u94AE\u5DE6\u4FA7 */}\n <span style={deviceStatusStyle(d.online !== false)}>\n {d.online === false ? `\u25CB ${t('deviceOffline')}` : `\u25CF ${t('deviceOnline')}`}\n </span>\n <button style={btnStyle} onClick={() => onUnpair(d.phonePk)} disabled={busy !== null}>\n {t('unpair')}\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {notice && <div style={{ fontSize: 13, color: '#2f9e44' }}>{notice}</div>}\n {error && <div style={{ fontSize: 13, color: '#c92a2a' }}>{error}</div>}\n\n {/* \u5F31\u5F39\u7A97\uFF082026-08\uFF1A\u68C0\u67E5\u66F4\u65B0\u5931\u8D25/\u5DF2\u6700\u65B0\u3001\u5347\u7EA7\u7ED3\u679C\uFF1Bfixed \u53F3\u4E0A\u89D2\uFF0C3s \u81EA\u52A8\u6D88\u5931\uFF0C\u4E0D\u5E38\u9A7B\uFF09 */}\n {toast && (\n <div style={{\n position: 'fixed', top: 24, right: 24, zIndex: 10000,\n background: toast.kind === 'err' ? '#c92a2a' : '#2f9e44',\n color: '#fff', borderRadius: 8, padding: '10px 16px', fontSize: 13,\n boxShadow: '0 8px 24px rgba(0,0,0,.25)', maxWidth: 320, lineHeight: 1.5,\n }}>\n {toast.text}\n </div>\n )}\n </div>\n );\n}\n", "// packages/remote-connector/src/client/api.js\n// /dshfly \u540E\u7AEF\u8DEF\u7531\u7684\u524D\u7AEF\u5C01\u88C5\uFF08\u540C\u6E90\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u6D4F\u89C8\u5668 fetch\uFF09\u3002\n// \u8DEF\u7531\u5B9E\u73B0\u89C1 ../../http-api.js\uFF1Bloopback \u6805\u680F\u8981\u6C42 Host \u4E3A 127.0.0.1\uFF08dsh web \u6052\u7ED1 loopback\uFF0C\n// \u6D4F\u89C8\u5668\u540C\u6E90\u8BF7\u6C42\u5929\u7136\u6EE1\u8DB3\uFF1BPOST \u5E26\u540C\u6E90 Origin \u4EA6\u901A\u8FC7\uFF09\u3002\n\nasync function request(path, init) {\n const headers = new Headers(init?.headers);\n if (init?.body !== undefined && !headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n const response = await fetch(path, { ...init, headers, cache: 'no-store' });\n let payload = null;\n try {\n payload = await response.json();\n } catch {}\n if (!response.ok) {\n throw new Error((payload && payload.error) || `HTTP ${response.status}`);\n }\n return payload;\n}\n\nexport const getStatus = () => request('/dshfly/status');\nexport const startPairing = () => request('/dshfly/pair', { method: 'POST' });\nexport const getPairing = (id) => request(`/dshfly/pair/${encodeURIComponent(id)}`);\nexport const confirmPairing = (id, fullDisk = false) =>\n request(`/dshfly/pair/${encodeURIComponent(id)}/confirm`, { method: 'POST', body: JSON.stringify({ fullDisk }) });\nexport const rejectPairing = (id) => request(`/dshfly/pair/${encodeURIComponent(id)}/reject`, { method: 'POST' });\nexport const unpair = (phonePk) => request('/dshfly/unpair', { method: 'POST', body: JSON.stringify({ phonePk }) });\nexport const setPermission = (phonePk, fullDisk) =>\n request('/dshfly/permissions', { method: 'POST', body: JSON.stringify({ phonePk, fullDisk }) });\nexport const getRecommendedPlugins = () => request('/dshfly/plugins/recommended');\nexport const installPlugin = (id) =>\n request('/dshfly/plugins/install', { method: 'POST', body: JSON.stringify({ id }) });\nexport const checkUpdate = () => request('/dshfly/plugins/checkUpdate');\nexport const upgrade = () => request('/dshfly/plugins/upgrade', { method: 'POST' });\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React"]
|
|
7
|
+
}
|