@linxin666/dsh-remote-web-ui 0.1.1 → 0.1.3

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.
Files changed (79) hide show
  1. package/README.md +4 -1
  2. package/lib/client.js +35 -0
  3. package/lib/client.js.map +1 -0
  4. package/lib/mobile.js +15467 -0
  5. package/lib/mobile.js.map +1 -0
  6. package/lib/types/client/FooterRemoteEntry.d.ts +22 -0
  7. package/lib/types/client/FooterRemoteEntry.d.ts.map +1 -0
  8. package/lib/types/client/FooterRemoteEntry.js +10 -0
  9. package/lib/types/client/PairFailedNotice.js +24 -0
  10. package/lib/types/client/PairFailedNotice.js.map +1 -0
  11. package/lib/types/client/PhoneIcon.js +9 -0
  12. package/lib/types/client/PhoneIcon.js.map +1 -0
  13. package/lib/types/client/PluginSettingsCard.js +39 -0
  14. package/lib/types/client/PluginSettingsCard.js.map +1 -0
  15. package/lib/types/client/RemoteEntry.js +162 -0
  16. package/lib/types/client/RemoteEntry.js.map +1 -0
  17. package/lib/types/client/RemotePanel.js +34 -0
  18. package/lib/types/client/RemotePanel.js.map +1 -0
  19. package/lib/types/client/RemoteSettingsCard.js +59 -0
  20. package/lib/types/client/RemoteSettingsCard.js.map +1 -0
  21. package/lib/types/client/deep-link.js +118 -0
  22. package/lib/types/client/deep-link.js.map +1 -0
  23. package/lib/types/client/index.d.ts.map +1 -1
  24. package/lib/types/client/index.js +134 -0
  25. package/lib/types/client/index.js.map +1 -0
  26. package/lib/types/client/locales.js +141 -0
  27. package/lib/types/client/locales.js.map +1 -0
  28. package/lib/types/client/pair-api.js +123 -0
  29. package/lib/types/client/pair-api.js.map +1 -0
  30. package/lib/types/client/settings-form.js +211 -0
  31. package/lib/types/client/settings-form.js.map +1 -0
  32. package/lib/types/gate.js +121 -0
  33. package/lib/types/gate.js.map +1 -0
  34. package/lib/types/index.js +227 -0
  35. package/lib/types/index.js.map +1 -0
  36. package/lib/types/invariant.js +23 -0
  37. package/lib/types/invariant.js.map +1 -0
  38. package/lib/types/lan.js +19 -0
  39. package/lib/types/lan.js.map +1 -0
  40. package/lib/types/mobile/api.js +60 -0
  41. package/lib/types/mobile/api.js.map +1 -0
  42. package/lib/types/mobile/index.js +25 -0
  43. package/lib/types/mobile/index.js.map +1 -0
  44. package/lib/types/mobile/messages.js +449 -0
  45. package/lib/types/mobile/messages.js.map +1 -0
  46. package/lib/types/mobile/messages.test.js +189 -0
  47. package/lib/types/mobile/messages.test.js.map +1 -0
  48. package/lib/types/mobile/mobile-styles.js +853 -0
  49. package/lib/types/mobile/mobile-styles.js.map +1 -0
  50. package/lib/types/mobile/mobile-theme.js +70 -0
  51. package/lib/types/mobile/mobile-theme.test.js +71 -0
  52. package/lib/types/mobile/mux.js +110 -0
  53. package/lib/types/mobile/mux.js.map +1 -0
  54. package/lib/types/mobile/rpc.js +83 -0
  55. package/lib/types/mobile/rpc.js.map +1 -0
  56. package/lib/types/mobile/theme-toggle.js +26 -0
  57. package/lib/types/mobile/views/App.js +102 -0
  58. package/lib/types/mobile/views/App.js.map +1 -0
  59. package/lib/types/mobile/views/ChatView.js +348 -0
  60. package/lib/types/mobile/views/ChatView.js.map +1 -0
  61. package/lib/types/mobile/views/ChatView.test.js +215 -0
  62. package/lib/types/mobile/views/SessionListView.js +108 -0
  63. package/lib/types/mobile/views/SessionListView.js.map +1 -0
  64. package/lib/types/mobile/views/SessionListView.test.js +110 -0
  65. package/lib/types/mobile/views/WorkspaceView.js +43 -0
  66. package/lib/types/mobile/views/WorkspaceView.js.map +1 -0
  67. package/lib/types/mobile-api.js +263 -0
  68. package/lib/types/mobile-api.js.map +1 -0
  69. package/lib/types/mobile-routes.js +71 -0
  70. package/lib/types/mobile-routes.js.map +1 -0
  71. package/lib/types/pairing.js +285 -0
  72. package/lib/types/pairing.js.map +1 -0
  73. package/lib/types/routes.js +327 -0
  74. package/lib/types/routes.js.map +1 -0
  75. package/lib/types/tunnel.js +222 -0
  76. package/lib/types/tunnel.js.map +1 -0
  77. package/package.json +9 -6
  78. package/src/client/FooterRemoteEntry.tsx +31 -0
  79. package/src/client/index.ts +23 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Sidebar footer-seat wrapper for the remote-control entry.
3
+ *
4
+ * Current dsh web shells declare `sidebar.footer.action` (the seat beside the
5
+ * settings trigger) instead of the legacy `sidebar.remote` seat this plugin
6
+ * was written against. The footer seat supplies `{ wide }` but not the
7
+ * `useWorkspaces` projection hook, so this wrapper substitutes a
8
+ * workspace-agnostic selector: pairing without a deep-linked workspace is
9
+ * fully supported by the host `/api/pair` routes.
10
+ */
11
+ import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
12
+ /** Entry props: the footer seat's column state + the standard locale seat. */
13
+ export type FooterRemoteEntryProps = PropsLocale<'remote'> & {
14
+ wide: boolean;
15
+ };
16
+ /**
17
+ * Render the remote-control trigger + pairing panel from the footer seat.
18
+ * @param props - composed slot props (footer seat subset).
19
+ * @returns the entry element tree.
20
+ */
21
+ export declare function FooterRemoteEntry(props: FooterRemoteEntryProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=FooterRemoteEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FooterRemoteEntry.d.ts","sourceRoot":"","sources":["../../../src/client/FooterRemoteEntry.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAGnE,8EAA8E;AAC9E,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAE9E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,+BAS9D"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { RemoteEntry } from "./RemoteEntry.js";
3
+ /**
4
+ * Render the remote-control trigger + pairing panel from the footer seat.
5
+ * @param props - composed slot props (footer seat subset).
6
+ * @returns the entry element tree.
7
+ */
8
+ export function FooterRemoteEntry(props) {
9
+ return (_jsx(RemoteEntry, { wide: props.wide, useWorkspaces: () => undefined, useSessions: () => undefined, t: props.t }));
10
+ }
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * One-time failed-pairing notice: a fixed toast rendered on the phone after
4
+ * a QR accept failed (invalid/used token or a network error). Mounted by
5
+ * the client apply with a plain React root — no slot machinery for a
6
+ * transient diagnostic.
7
+ */
8
+ import { useEffect, useState } from 'react';
9
+ import css from './remote.module.css';
10
+ /**
11
+ * Render the failed-pair toast (auto-dismisses).
12
+ * @param props - localized copy.
13
+ * @returns the toast element.
14
+ */
15
+ export function PairFailedNotice({ t }) {
16
+ const [visible, setVisible] = useState(true);
17
+ useEffect(() => {
18
+ const timer = window.setTimeout(() => { setVisible(false); }, 8000);
19
+ return () => { window.clearTimeout(timer); };
20
+ }, []);
21
+ if (!visible)
22
+ return null;
23
+ return (_jsxs("div", { className: css.notice, role: "alert", children: [_jsx("p", { className: css.noticeTitle, children: t('pair.failed.title') }), _jsx("p", { className: css.noticeDetail, children: t('pair.failed.detail') })] }));
24
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PairFailedNotice.js","sourceRoot":"","sources":["../../../src/client/PairFailedNotice.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,GAAG,MAAM,qBAAqB,CAAA;AAOrC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,CAAC,EAAyB;IAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5G,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAClE,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAA;IAC7C,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,OAAO,CACL,eAAK,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAC,OAAO,aACtC,YAAG,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,CAAC,CAAC,mBAAmB,CAAC,GAAK,EAC3D,YAAG,SAAS,EAAE,GAAG,CAAC,YAAY,YAAG,CAAC,CAAC,oBAAoB,CAAC,GAAK,IACzD,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Render the phone icon.
4
+ * @param props - size and optional class.
5
+ * @returns the svg element.
6
+ */
7
+ export function PhoneIcon({ size = 16, className }) {
8
+ return (_jsx("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M4.2 1.8h2.4l.9 2.4-1.5 1.1a7.4 7.4 0 0 0 4.7 4.7l1.1-1.5 2.4.9v2.4a.9.9 0 0 1-1 .9A11.4 11.4 0 0 1 3.3 2.8a.9.9 0 0 1 .9-1Z", stroke: "currentColor", strokeWidth: "1.3", strokeLinejoin: "round" }) }));
9
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhoneIcon.js","sourceRoot":"","sources":["../../../src/client/PhoneIcon.tsx"],"names":[],"mappings":";AAcA;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAkB;IAChE,OAAO,CACL,cAAK,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,YACtG,eACE,CAAC,EAAC,8HAA8H,EAChI,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,cAAc,EAAC,OAAO,GACtB,GACE,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Shared chrome for the plugin settings card: a disclosure header naming the
4
+ * plugin and what its settings govern, the controls inside, and the save that
5
+ * writes them. Renders nothing while the namespace is unavailable — a
6
+ * deployment that does not compose the owning plugin should show no trace of
7
+ * it. Mirrors the official ui-plugin-config PluginCard in a self-contained
8
+ * slice (this package must not depend on a sibling UI package).
9
+ */
10
+ import { useState } from 'react';
11
+ import css from './settings-card.module.css';
12
+ /**
13
+ * Render one plugin settings card.
14
+ * @param props - the plugin's copy keys, its form state, and its controls.
15
+ * @returns the card, or nothing when the namespace is unavailable.
16
+ */
17
+ export function PluginSettingsCard(props) {
18
+ const [open, setOpen] = useState(false);
19
+ const { state } = props;
20
+ if (!state.available)
21
+ return null;
22
+ const title = props.t(props.titleKey);
23
+ const blocked = !state.dirty || state.invalid || state.saving;
24
+ return (_jsxs("li", { className: css.card, children: [_jsxs("button", { type: "button", className: css.header, "aria-expanded": open, "aria-label": `${props.t(open ? 'settings.collapse' : 'settings.expand')}: ${title}`, onClick: () => { setOpen(!open); }, children: [_jsxs("span", { className: css.headText, children: [_jsx("span", { className: css.name, children: title }), _jsx("span", { className: css.description, children: props.t(props.descriptionKey) })] }), state.dirty ? _jsx("span", { className: css.pending, children: props.t('settings.unsaved') }) : null, _jsx("span", { className: open ? css.chevronOpen : css.chevron, children: "\u25BE" })] }), open
25
+ ? (_jsxs("div", { className: css.body, children: [!state.writable ? _jsx("p", { className: css.readOnly, role: "status", children: props.t('settings.readOnly') }) : null, props.children, _jsxs("div", { className: css.footer, children: [state.failed ? _jsx("p", { className: css.failed, role: "status", children: props.t('settings.saveFailed') }) : null, _jsx("button", { type: "button", className: css.discard, disabled: !state.dirty || state.saving, onClick: props.onDiscard, children: props.t('settings.discard') }), _jsx("button", { type: "button", className: css.save, disabled: blocked, onClick: props.onSave, children: props.t(!state.saving ? 'settings.save' : 'settings.saving') })] })] }))
26
+ : null] }));
27
+ }
28
+ /** A staged value field. `numeric` only hints the keypad: which drafts a field accepts is decided by its spec. */
29
+ export function ValueField(props) {
30
+ return (_jsxs("div", { className: css.field, children: [_jsxs("div", { className: css.head, children: [_jsx("label", { className: css.label, htmlFor: props.id, children: props.label }), props.overridden
31
+ ? (_jsxs("span", { className: css.badges, children: [_jsx("span", { className: css.badge, children: props.overriddenLabel }), _jsx("button", { type: "button", className: css.reset, disabled: props.disabled, onClick: props.onReset, children: props.resetLabel })] }))
32
+ : null] }), _jsx("input", { id: props.id, className: props.invalid ? css.inputInvalid : css.input, type: "text", ...props.numeric === true ? { inputMode: 'numeric' } : {}, ...props.invalid ? { 'aria-invalid': true } : {}, value: props.text, placeholder: props.placeholder ?? '', disabled: props.disabled, onChange: (event) => { props.onEdit(event.target.value); } }), _jsx("p", { className: props.invalid ? css.invalid : css.hint, children: props.invalid ? props.invalidLabel : props.hint })] }));
33
+ }
34
+ /** A staged boolean field: 继承 / 开 / 关. */
35
+ export function BooleanField(props) {
36
+ return (_jsxs("div", { className: css.field, children: [_jsxs("div", { className: css.head, children: [_jsx("label", { className: css.label, htmlFor: props.id, children: props.label }), props.overridden
37
+ ? (_jsxs("span", { className: css.badges, children: [_jsx("span", { className: css.badge, children: props.overriddenLabel }), _jsx("button", { type: "button", className: css.reset, disabled: props.disabled, onClick: props.onReset, children: props.resetLabel })] }))
38
+ : null] }), _jsxs("select", { id: props.id, className: css.select, value: props.text, disabled: props.disabled, onChange: (event) => { props.onEdit(event.target.value); }, children: [_jsx("option", { value: "", children: props.inheritLabel }), _jsx("option", { value: "true", children: props.onLabel }), _jsx("option", { value: "false", children: props.offLabel })] }), _jsx("p", { className: css.hint, children: props.hint })] }));
39
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginSettingsCard.js","sourceRoot":"","sources":["../../../src/client/PluginSettingsCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The sidebar remote-control seat: the phone-icon trigger beside the
4
+ * settings button plus the pairing panel modal. Owns the panel behavior —
5
+ * token minting on open, the status SSE subscription, stop/refresh/copy —
6
+ * and renders the pure {@link RemotePanel} body. Component-local state per
7
+ * the client stack rules: nothing here survives remounts or crosses
8
+ * entries.
9
+ */
10
+ import { useCallback, useEffect, useRef, useState } from 'react';
11
+ import { createPortal } from 'react-dom';
12
+ import { RemotePanel } from "./RemotePanel.js";
13
+ import { copyText, issuePair, stopPair } from "./pair-api.js";
14
+ import { PhoneIcon } from "./PhoneIcon.js";
15
+ import css from './remote.module.css';
16
+ /** Apply one status frame onto the current ready state. */
17
+ function mergeFrame(state, frame) {
18
+ if (state.kind !== 'ready')
19
+ return state;
20
+ return {
21
+ ...state,
22
+ phase: frame.phase,
23
+ deviceCount: frame.deviceCount,
24
+ onlineCount: frame.onlineCount,
25
+ ...(frame.tunnel !== undefined ? { tunnel: frame.tunnel } : {}),
26
+ };
27
+ }
28
+ /**
29
+ * Render the remote-control trigger and panel.
30
+ * @param props - composed slot props (contract in this package).
31
+ * @returns the entry element tree.
32
+ */
33
+ export function RemoteEntry({ wide, useWorkspaces, t }) {
34
+ const [open, setOpen] = useState(false);
35
+ const [state, setState] = useState({ kind: 'lan-required' });
36
+ const [copied, setCopied] = useState(false);
37
+ const eventSource = useRef(undefined);
38
+ // The current workspace (the recent-workspace projection the shell's New
39
+ // Session flow targets) — the deep-link target for the phone.
40
+ const workspaceId = useWorkspaces(s => s.recentWorkspaceId);
41
+ const closeEventSource = useCallback(() => {
42
+ eventSource.current?.close();
43
+ eventSource.current = undefined;
44
+ }, []);
45
+ const mint = useCallback(async (address) => {
46
+ let result;
47
+ try {
48
+ result = await issuePair(workspaceId, address);
49
+ }
50
+ catch {
51
+ // Fetch/network failure: show an explicit state instead of silently
52
+ // leaving the panel on its initial banner.
53
+ return { kind: 'unreachable' };
54
+ }
55
+ if (!result.ok) {
56
+ // 403 is the loopback-only fence refusing a LAN origin (the panel is a
57
+ // desktop control endpoint); 409 means the server never bound 0.0.0.0;
58
+ // 400 means the requested LAN literal is no longer constructible.
59
+ if (result.code === 'forbidden')
60
+ return { kind: 'loopback-required' };
61
+ if (result.code === 'unknown-address')
62
+ return { kind: 'unreachable' };
63
+ return { kind: 'lan-required' };
64
+ }
65
+ const publicBaseUrl = result.publicBaseUrl;
66
+ return {
67
+ kind: 'ready',
68
+ url: result.url,
69
+ expiresAt: result.expiresAt,
70
+ expired: Date.now() > result.expiresAt,
71
+ phase: 'waiting',
72
+ deviceCount: 0,
73
+ onlineCount: 0,
74
+ // Whether this QR is built on the configured public (tunneled) base.
75
+ public: publicBaseUrl !== undefined && result.url.startsWith(publicBaseUrl),
76
+ ...(publicBaseUrl !== undefined ? { publicBaseUrl } : {}),
77
+ // The issued URL names the requested (or default first) literal; the
78
+ // public link has no LAN literal, so no radio row is selected then.
79
+ address: address ?? result.lanAddresses[0] ?? '',
80
+ lanAddresses: result.lanAddresses,
81
+ };
82
+ }, [workspaceId]);
83
+ const openPanel = useCallback(async () => {
84
+ setOpen(true);
85
+ const next = await mint();
86
+ setState(next);
87
+ // Live status: the desktop panel mirrors the pairing service state. The
88
+ // stream only makes sense in the ready state — on a failure banner the
89
+ // events endpoint is unreachable too (loopback fence), so opening it
90
+ // would just start a doomed reconnect loop.
91
+ if (next.kind !== 'ready')
92
+ return;
93
+ const source = new EventSource('/api/pair/events');
94
+ eventSource.current = source;
95
+ source.onmessage = (event) => {
96
+ try {
97
+ const frame = JSON.parse(event.data);
98
+ if (frame.type !== 'state')
99
+ return;
100
+ setState(previous => mergeFrame(previous, frame));
101
+ }
102
+ catch {
103
+ // Malformed frames are dropped; the snapshot on open is authoritative.
104
+ }
105
+ };
106
+ }, [mint]);
107
+ const closePanel = useCallback(() => {
108
+ closeEventSource();
109
+ setOpen(false);
110
+ }, [closeEventSource]);
111
+ // Expiry flip: one timeout per token lifetime (reset by refresh).
112
+ useEffect(() => {
113
+ if (state.kind !== 'ready')
114
+ return;
115
+ if (state.expired)
116
+ return;
117
+ const delay = state.expiresAt - Date.now();
118
+ if (delay <= 0) {
119
+ setState(previous => previous.kind === 'ready' ? { ...previous, expired: true } : previous);
120
+ return;
121
+ }
122
+ const timer = window.setTimeout(() => {
123
+ setState(previous => previous.kind === 'ready' ? { ...previous, expired: true } : previous);
124
+ }, delay);
125
+ return () => { window.clearTimeout(timer); };
126
+ }, [state]);
127
+ // Unmount safety: never leave the stream open.
128
+ useEffect(() => closeEventSource, [closeEventSource]);
129
+ const handleStop = useCallback(() => {
130
+ // A failed stop request is harmless: the optimistic phase flip below
131
+ // keeps the UI honest, and the status stream confirms the stopped phase.
132
+ void stopPair().catch(() => { });
133
+ // Optimistic fallback; the status stream confirms with the stopped phase.
134
+ setState(previous => previous.kind === 'ready' ? { ...previous, phase: 'stopped' } : previous);
135
+ }, []);
136
+ const handleRefresh = useCallback(() => {
137
+ void mint().then(setState);
138
+ }, [mint]);
139
+ /** Re-mint against another LAN literal (multi-homed machines). */
140
+ const handlePickAddress = useCallback((address) => {
141
+ void mint(address).then(setState);
142
+ }, [mint]);
143
+ /** Re-mint against the configured public (tunneled) base. */
144
+ const handlePickPublic = useCallback(() => {
145
+ void mint().then(setState);
146
+ }, [mint]);
147
+ const handleCopy = useCallback(() => {
148
+ if (state.kind !== 'ready')
149
+ return;
150
+ void copyText(state.url).then((ok) => {
151
+ if (!ok)
152
+ return;
153
+ setCopied(true);
154
+ window.setTimeout(() => { setCopied(false); }, 1500);
155
+ });
156
+ }, [state]);
157
+ return (_jsxs(_Fragment, { children: [_jsx(TooltipAnchor, { wide: wide, label: t('entry.label'), onClick: openPanel }), open && createPortal((_jsxs("div", { className: css.overlay, role: "presentation", children: [_jsx("div", { className: css.mask, "aria-hidden": "true", onClick: closePanel }), _jsx(RemotePanel, { t: t, state: state, copied: copied, onClose: closePanel, onStop: handleStop, onRefresh: handleRefresh, onCopy: handleCopy, onPickAddress: handlePickAddress, onPickPublic: handlePickPublic })] })), document.body)] }));
158
+ }
159
+ /** The trigger: an icon button matching the settings rail/row geometry. */
160
+ function TooltipAnchor({ wide, label, onClick }) {
161
+ return (_jsx("button", { type: "button", className: css.trigger, "data-wide": wide ? undefined : 'rail', "aria-label": label, title: label, onClick: onClick, children: _jsx(PhoneIcon, { size: wide ? 16 : 18 }) }));
162
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteEntry.js","sourceRoot":"","sources":["../../../src/client/RemoteEntry.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The mobile remote-control panel body: status card (state text + badge),
4
+ * the QR code, the open-on-phone hint with the link text, and the three
5
+ * actions (stop / refresh / copy). Pure presentation — all state and
6
+ * actions arrive through props from the entry's behavior component.
7
+ */
8
+ import clsx from 'clsx';
9
+ import { QRCodeSVG } from 'qrcode.react';
10
+ import { IconCloseOutline16, IconCopyOutline16, IconLinkOutline16, IconRefreshOutline16, IconStopFill16, } from '@deepseek-ai/dsh-client-ui-primitives';
11
+ import { formatClock } from "./pair-api.js";
12
+ import css from './remote.module.css';
13
+ /** Badge text + tone per phase (ready states only). */
14
+ function statusOf(t, state) {
15
+ switch (state.phase) {
16
+ case 'connected': return { text: t('status.connected', { n: state.onlineCount }), tone: 'connected' };
17
+ case 'disconnected': return { text: t('status.disconnected'), tone: 'disconnected' };
18
+ case 'stopped': return { text: t('status.stopped'), tone: 'stopped' };
19
+ case 'lan-required': return { text: t('status.lanRequired'), tone: 'stopped' };
20
+ case 'waiting': return { text: t('status.waiting'), tone: 'waiting' };
21
+ }
22
+ }
23
+ /**
24
+ * Render the pairing panel.
25
+ * @param props - copy, state, and actions.
26
+ * @returns the panel element tree.
27
+ */
28
+ export function RemotePanel({ t, state, copied, onClose, onStop, onRefresh, onCopy, onPickAddress, onPickPublic }) {
29
+ return (_jsxs("div", { className: css.panel, role: "dialog", "aria-modal": "true", "aria-label": t('title'), children: [_jsxs("div", { className: css.header, children: [_jsxs("div", { className: css.heading, children: [_jsx("h2", { className: css.title, children: t('title') }), _jsx("p", { className: css.subtitle, children: t('subtitle') })] }), _jsx("button", { type: "button", className: css.close, "aria-label": t('close.label'), onClick: onClose, children: _jsx(IconCloseOutline16, { size: 14 }) })] }), state.kind === 'lan-required' ? (_jsxs("div", { className: css.banner, role: "alert", children: [_jsx("p", { className: css.bannerTitle, children: t('status.lanRequired') }), _jsx("p", { className: css.bannerHint, children: t('status.lanRequiredHint') })] })) : state.kind === 'loopback-required' ? (_jsxs("div", { className: css.banner, role: "alert", children: [_jsx("p", { className: css.bannerTitle, children: t('status.loopbackRequired') }), _jsx("p", { className: css.bannerHint, children: t('status.loopbackRequiredHint') })] })) : state.kind === 'unreachable' ? (_jsxs("div", { className: css.banner, role: "alert", children: [_jsx("p", { className: css.bannerTitle, children: t('status.unreachable') }), _jsx("p", { className: css.bannerHint, children: t('status.unreachableHint') })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: css.card, children: [_jsxs("div", { className: css.cardHeader, children: [_jsx("span", { className: css.cardTitle, children: t('card.title') }), _jsxs("span", { className: css.badges, children: [state.public && _jsx("span", { className: clsx(css.badge, css.badgePublic), children: t('public.badge') }), _jsx("span", { className: clsx(css.badge, css[`badge-${statusOf(t, state).tone}`]), children: statusOf(t, state).text })] })] }), _jsx("div", { className: css.qrWrap, "data-testid": "remote-qr", children: _jsx(QRCodeSVG, { value: state.url, size: 184, level: "M", marginSize: 1, className: css.qr }) }), state.expired
30
+ ? _jsx("p", { className: css.expired, children: t('pair.expired') })
31
+ : _jsx("p", { className: css.expiry, children: t('pair.expires', { time: formatClock(state.expiresAt) }) })] }), _jsx("p", { className: css.hint, children: state.public ? t('pair.publicHint') : t('pair.hint') }), _jsx("p", { className: css.link, title: state.url, children: state.url }), state.phase === 'stopped' && _jsx("p", { className: css.stoppedHint, children: t('stopped.hint') }), state.tunnel !== undefined && state.tunnel.state !== 'running' && (_jsx("p", { className: state.tunnel.state === 'failed' ? css.tunnelFailed : css.tunnelNote, role: "status", children: state.tunnel.state === 'failed'
32
+ ? t('tunnel.failed', { error: state.tunnel.error ?? t('tunnel.unknownError') })
33
+ : t('tunnel.starting') })), (state.publicBaseUrl !== undefined || state.lanAddresses.length > 1) && (_jsxs("fieldset", { className: css.addresses, children: [_jsx("legend", { children: t('address.label') }), state.publicBaseUrl !== undefined && (_jsxs("label", { className: css.address, children: [_jsx("input", { type: "radio", name: "lan-address", "aria-label": t('address.public'), checked: state.public, onChange: onPickPublic }), _jsx("span", { children: t('address.public') }), _jsx("code", { className: css.addressValue, children: state.publicBaseUrl })] }, "public")), state.lanAddresses.map(address => (_jsxs("label", { className: css.address, children: [_jsx("input", { type: "radio", name: "lan-address", "aria-label": address, checked: !state.public && address === state.address, onChange: () => onPickAddress(address) }), _jsx("span", { children: t('address.lan') }), _jsx("code", { className: css.addressValue, children: address })] }, address))), _jsx("p", { className: css.addressHint, children: t('address.hint') })] })), _jsxs("div", { className: css.actions, children: [_jsxs("button", { type: "button", className: css.action, onClick: onStop, children: [_jsx(IconStopFill16, { size: 14 }), t('action.stop')] }), _jsxs("button", { type: "button", className: css.action, onClick: onRefresh, children: [_jsx(IconRefreshOutline16, { size: 14 }), t('action.refresh')] }), _jsxs("button", { type: "button", className: css.action, onClick: onCopy, children: [copied ? _jsx(IconCopyOutline16, { size: 14 }) : _jsx(IconLinkOutline16, { size: 14 }), copied ? t('action.copied') : t('action.copy')] })] })] }))] }));
34
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemotePanel.js","sourceRoot":"","sources":["../../../src/client/RemotePanel.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EACL,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,GAC/F,MAAM,uCAAuC,CAAA;AAG9C,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAA;AACnE,OAAO,GAAG,MAAM,qBAAqB,CAAA;AA0CrC,uDAAuD;AACvD,SAAS,QAAQ,CACf,CAAwB,EACxB,KAA6C;IAE7C,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;QACrG,KAAK,cAAc,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;QACpF,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QACrE,KAAK,cAAc,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC9E,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IACvE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAoB;IACjI,OAAO,CACL,eAAK,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAC,QAAQ,gBAAY,MAAM,gBAAa,CAAC,CAAC,OAAO,CAAC,aAC/E,eAAK,SAAS,EAAE,GAAG,CAAC,MAAM,aACxB,eAAK,SAAS,EAAE,GAAG,CAAC,OAAO,aACzB,aAAI,SAAS,EAAE,GAAG,CAAC,KAAK,YAAG,CAAC,CAAC,OAAO,CAAC,GAAM,EAC3C,YAAG,SAAS,EAAE,GAAG,CAAC,QAAQ,YAAG,CAAC,CAAC,UAAU,CAAC,GAAK,IAC3C,EACN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,KAAK,gBAAc,CAAC,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,YACxF,KAAC,kBAAkB,IAAC,IAAI,EAAE,EAAE,GAAI,GACzB,IACL,EAEL,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,CAC/B,eAAK,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAC,OAAO,aACtC,YAAG,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,CAAC,CAAC,oBAAoB,CAAC,GAAK,EAC5D,YAAG,SAAS,EAAE,GAAG,CAAC,UAAU,YAAG,CAAC,CAAC,wBAAwB,CAAC,GAAK,IAC3D,CACP,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,CACvC,eAAK,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAC,OAAO,aACtC,YAAG,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,CAAC,CAAC,yBAAyB,CAAC,GAAK,EACjE,YAAG,SAAS,EAAE,GAAG,CAAC,UAAU,YAAG,CAAC,CAAC,6BAA6B,CAAC,GAAK,IAChE,CACP,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CACjC,eAAK,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAC,OAAO,aACtC,YAAG,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,CAAC,CAAC,oBAAoB,CAAC,GAAK,EAC5D,YAAG,SAAS,EAAE,GAAG,CAAC,UAAU,YAAG,CAAC,CAAC,wBAAwB,CAAC,GAAK,IAC3D,CACP,CAAC,CAAC,CAAC,CACF,8BACE,eAAK,SAAS,EAAE,GAAG,CAAC,IAAI,aACtB,eAAK,SAAS,EAAE,GAAG,CAAC,UAAU,aAC5B,eAAM,SAAS,EAAE,GAAG,CAAC,SAAS,YAAG,CAAC,CAAC,YAAY,CAAC,GAAQ,EACxD,gBAAM,SAAS,EAAE,GAAG,CAAC,MAAM,aACxB,KAAK,CAAC,MAAM,IAAI,eAAM,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,YAAG,CAAC,CAAC,cAAc,CAAC,GAAQ,EAC9F,eAAM,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,YACtE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GACnB,IACF,IACH,EACN,cAAK,SAAS,EAAE,GAAG,CAAC,MAAM,iBAAc,WAAW,YACjD,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,GAAG,EAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,GAAI,GAClF,EACL,KAAK,CAAC,OAAO;gCACZ,CAAC,CAAC,YAAG,SAAS,EAAE,GAAG,CAAC,OAAO,YAAG,CAAC,CAAC,cAAc,CAAC,GAAK;gCACpD,CAAC,CAAC,YAAG,SAAS,EAAE,GAAG,CAAC,MAAM,YAAG,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,GAAK,IACzF,EAEN,YAAG,SAAS,EAAE,GAAG,CAAC,IAAI,YAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAK,EAClF,YAAG,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,YAAG,KAAK,CAAC,GAAG,GAAK,EACxD,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,YAAG,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,CAAC,CAAC,cAAc,CAAC,GAAK,EACnF,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CACjE,YAAG,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAC,QAAQ,YAC7F,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ;4BAC9B,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC;4BAC/E,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GACtB,CACL,EAEA,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CACvE,oBAAU,SAAS,EAAE,GAAG,CAAC,SAAS,aAChC,2BAAS,CAAC,CAAC,eAAe,CAAC,GAAU,EACpC,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,CACpC,iBAAoB,SAAS,EAAE,GAAG,CAAC,OAAO,aACxC,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,aAAa,gBACN,CAAC,CAAC,gBAAgB,CAAC,EAC/B,OAAO,EAAE,KAAK,CAAC,MAAM,EACrB,QAAQ,EAAE,YAAY,GACtB,EACF,yBAAO,CAAC,CAAC,gBAAgB,CAAC,GAAQ,EAClC,eAAM,SAAS,EAAE,GAAG,CAAC,YAAY,YAAG,KAAK,CAAC,aAAa,GAAQ,KATtD,QAAQ,CAUX,CACT,EACA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CACjC,iBAAqB,SAAS,EAAE,GAAG,CAAC,OAAO,aACzC,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,aAAa,gBACN,OAAO,EACnB,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,KAAK,CAAC,OAAO,EACnD,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,GACtC,EACF,yBAAO,CAAC,CAAC,aAAa,CAAC,GAAQ,EAC/B,eAAM,SAAS,EAAE,GAAG,CAAC,YAAY,YAAG,OAAO,GAAQ,KATzC,OAAO,CAUX,CACT,CAAC,EACF,YAAG,SAAS,EAAE,GAAG,CAAC,WAAW,YAAG,CAAC,CAAC,cAAc,CAAC,GAAK,IAC7C,CACZ,EAED,eAAK,SAAS,EAAE,GAAG,CAAC,OAAO,aACzB,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,aAC1D,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,EAC3B,CAAC,CAAC,aAAa,CAAC,IACV,EACT,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,aAC7D,KAAC,oBAAoB,IAAC,IAAI,EAAE,EAAE,GAAI,EACjC,CAAC,CAAC,gBAAgB,CAAC,IACb,EACT,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,aACzD,MAAM,CAAC,CAAC,CAAC,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,EAC1E,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IACxC,IACL,IACL,CACJ,IACG,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PluginSettingsCard, ValueField, BooleanField } from "./PluginSettingsCard.js";
3
+ import { CardForm, booleanField, numberField, textField } from "./settings-form.js";
4
+ /** Bridges the `remote-web-ui` scope onto the card's staged form. */
5
+ export class RemoteSettingsCardController {
6
+ form;
7
+ store;
8
+ /** @param scope - the bound settings scope for the `remote-web-ui` namespace. */
9
+ constructor(scope) {
10
+ this.form = new CardForm(scope, [
11
+ booleanField('enabled'),
12
+ numberField('tokenTtlMs'),
13
+ numberField('offlineAfterMs'),
14
+ numberField('maxDevices'),
15
+ textField('cookieName'),
16
+ booleanField('requirePairingForLan'),
17
+ textField('publicBaseUrl'),
18
+ booleanField('autoTunnel'),
19
+ ]);
20
+ this.store = this.form.bind(() => this.projection());
21
+ }
22
+ projection() {
23
+ return {
24
+ ...this.form.shell(),
25
+ enabled: this.form.field('enabled'),
26
+ tokenTtlMs: this.form.field('tokenTtlMs'),
27
+ offlineAfterMs: this.form.field('offlineAfterMs'),
28
+ maxDevices: this.form.field('maxDevices'),
29
+ cookieName: this.form.field('cookieName'),
30
+ requirePairingForLan: this.form.field('requirePairingForLan'),
31
+ publicBaseUrl: this.form.field('publicBaseUrl'),
32
+ autoTunnel: this.form.field('autoTunnel'),
33
+ };
34
+ }
35
+ /**
36
+ * Build the face the card's slot registration injects.
37
+ * @returns the card's snapshot and its form actions.
38
+ */
39
+ inject() {
40
+ return { hooks: { remoteSettingsCard: this.store }, ...this.form.actions() };
41
+ }
42
+ }
43
+ /**
44
+ * Render the remote-control card.
45
+ * @param props - locale copy, the card snapshot, and its form actions.
46
+ * @returns the card.
47
+ */
48
+ export function RemoteSettingsCard(props) {
49
+ const { t } = props;
50
+ const state = props.useRemoteSettingsCard(snapshot => snapshot);
51
+ const disabled = !state.writable;
52
+ const fieldProps = {
53
+ overriddenLabel: t('settings.overridden'),
54
+ resetLabel: t('settings.reset'),
55
+ invalidLabel: t('settings.invalidNumber'),
56
+ disabled,
57
+ };
58
+ return (_jsxs(PluginSettingsCard, { t: t, titleKey: "settings.title", descriptionKey: "settings.description", state: state, onSave: props.save, onDiscard: props.discard, children: [_jsx(BooleanField, { id: "settings-remote-enabled", label: t('settings.enabled'), hint: t('settings.enabledHint'), inheritLabel: t('settings.inherit'), onLabel: t('settings.on'), offLabel: t('settings.off'), ...fieldProps, ...state.enabled, onEdit: (text) => { props.edit('enabled', text); }, onReset: () => { props.resetField('enabled'); } }), _jsx(ValueField, { id: "settings-remote-token-ttl", label: t('settings.tokenTtlMs'), hint: t('settings.tokenTtlMsHint'), numeric: true, ...fieldProps, ...state.tokenTtlMs, onEdit: (text) => { props.edit('tokenTtlMs', text); }, onReset: () => { props.resetField('tokenTtlMs'); } }), _jsx(ValueField, { id: "settings-remote-offline", label: t('settings.offlineAfterMs'), hint: t('settings.offlineAfterMsHint'), numeric: true, ...fieldProps, ...state.offlineAfterMs, onEdit: (text) => { props.edit('offlineAfterMs', text); }, onReset: () => { props.resetField('offlineAfterMs'); } }), _jsx(ValueField, { id: "settings-remote-max-devices", label: t('settings.maxDevices'), hint: t('settings.maxDevicesHint'), numeric: true, ...fieldProps, ...state.maxDevices, onEdit: (text) => { props.edit('maxDevices', text); }, onReset: () => { props.resetField('maxDevices'); } }), _jsx(ValueField, { id: "settings-remote-cookie", label: t('settings.cookieName'), hint: t('settings.cookieNameHint'), ...fieldProps, ...state.cookieName, onEdit: (text) => { props.edit('cookieName', text); }, onReset: () => { props.resetField('cookieName'); } }), _jsx(BooleanField, { id: "settings-remote-fence", label: t('settings.requirePairingForLan'), hint: t('settings.requirePairingForLanHint'), inheritLabel: t('settings.inherit'), onLabel: t('settings.on'), offLabel: t('settings.off'), ...fieldProps, ...state.requirePairingForLan, onEdit: (text) => { props.edit('requirePairingForLan', text); }, onReset: () => { props.resetField('requirePairingForLan'); } }), _jsx(ValueField, { id: "settings-remote-public-base", label: t('settings.publicBaseUrl'), hint: t('settings.publicBaseUrlHint'), placeholder: "https://example.trycloudflare.com", ...fieldProps, ...state.publicBaseUrl, onEdit: (text) => { props.edit('publicBaseUrl', text); }, onReset: () => { props.resetField('publicBaseUrl'); } }), _jsx(BooleanField, { id: "settings-remote-auto-tunnel", label: t('settings.autoTunnel'), hint: t('settings.autoTunnelHint'), inheritLabel: t('settings.inherit'), onLabel: t('settings.on'), offLabel: t('settings.off'), ...fieldProps, ...state.autoTunnel, onEdit: (text) => { props.edit('autoTunnel', text); }, onReset: () => { props.resetField('autoTunnel'); } })] }));
59
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteSettingsCard.js","sourceRoot":"","sources":["../../../src/client/RemoteSettingsCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Phone-side boot flow: the QR link's `pair` + `workspace` parameters.
3
+ * Runs from the client apply on every page load, on any device:
4
+ * - `pair` present → accept the token, then reload so the whole SPA boots
5
+ * with the device cookie (the accept endpoint is exempt from the pairing
6
+ * gate; every other /api request needs the cookie).
7
+ * - `workspace` present (and paired) → deep-link: connect that workspace's
8
+ * session and open it, then strip the parameter.
9
+ * Failure of accept leaves a sessionStorage marker the entry renders as a
10
+ * one-time notice.
11
+ */
12
+ import { acceptPair, readPairParams } from "./pair-api.js";
13
+ /** sessionStorage key for the failed-pair notice. */
14
+ export const PAIR_FAILED_MARKER = 'dsh-remote-pair-failed';
15
+ /** Poll budget for the runtime services (activation order is unconstrained). */
16
+ const SERVICE_WAIT_MS = 10_000;
17
+ /** The browser implementation of {@link PageSurface}. */
18
+ export const browserPage = {
19
+ get href() {
20
+ return window.location.href;
21
+ },
22
+ replaceState(url) {
23
+ window.history.replaceState(null, '', url);
24
+ },
25
+ navigate(url) {
26
+ window.location.assign(url);
27
+ },
28
+ reload() {
29
+ window.location.reload();
30
+ },
31
+ };
32
+ /** Whether this browser looks like a phone/tablet (the simplified mobile surface). */
33
+ export function isMobileSurface() {
34
+ if (typeof navigator === 'undefined')
35
+ return false;
36
+ return /Android|iPhone|iPad|iPod|Mobile|mobile/i.test(navigator.userAgent);
37
+ }
38
+ /**
39
+ * Run the pair/workspace boot flow for this page load.
40
+ * @param ctx - client root context (workspaces/sessions read at need time).
41
+ * @param search - the current location.search.
42
+ * @param page - the page surface (defaults to the browser).
43
+ */
44
+ export function runPairBootFlow(ctx, search, page = browserPage) {
45
+ const params = readPairParams(search);
46
+ if (params.pair !== undefined) {
47
+ void runAccept(params.pair, page);
48
+ return;
49
+ }
50
+ if (params.workspace !== undefined) {
51
+ void runDeepLink(ctx, params.workspace, page);
52
+ }
53
+ }
54
+ /** Accept the token, then reload (the workspace param survives the reload). */
55
+ async function runAccept(token, page) {
56
+ let ok = false;
57
+ try {
58
+ const result = await acceptPair(token);
59
+ ok = result.ok;
60
+ if (!ok)
61
+ sessionStorage.setItem(PAIR_FAILED_MARKER, 'failed');
62
+ }
63
+ catch {
64
+ sessionStorage.setItem(PAIR_FAILED_MARKER, 'failed');
65
+ }
66
+ // Drop the token from the URL either way: an accepted token is consumed
67
+ // (a re-scan would 409), and a failed one must not loop.
68
+ const url = new URL(page.href);
69
+ url.searchParams.delete('pair');
70
+ page.replaceState(`${url.pathname}${url.search}${url.hash}`);
71
+ if (ok) {
72
+ // Phones land on the standalone simplified surface (the full desktop UI
73
+ // is not built for small screens); desktops stay on the full UI.
74
+ if (isMobileSurface())
75
+ page.navigate('/m');
76
+ else
77
+ page.reload();
78
+ }
79
+ }
80
+ /**
81
+ * Connect the deep-linked workspace and open its session. Waits for the
82
+ * runtime services AND for the target workspace to appear in the workspace
83
+ * list (both are asynchronous after boot), then connects and opens; gives
84
+ * up silently within the budget — the workspace param is stripped either
85
+ * way, so a late failure cannot loop.
86
+ * @param ctx - client root context.
87
+ * @param workspaceId - the target workspace.
88
+ * @param page - the page surface.
89
+ */
90
+ async function runDeepLink(ctx, workspaceId, page) {
91
+ const target = workspaceId;
92
+ const deadline = Date.now() + SERVICE_WAIT_MS;
93
+ while (Date.now() < deadline) {
94
+ const workspaces = ctx.get('workspaces');
95
+ const sessions = ctx.get('sessions');
96
+ if (workspaces !== undefined && sessions !== undefined) {
97
+ const items = workspaces.list.getSnapshot().items;
98
+ if (items.some(item => item.workspaceId === target)) {
99
+ try {
100
+ // Open unconditionally: a host-side "current" session may already
101
+ // exist (multi-client mirroring), but the QR's workspace target is
102
+ // explicit user intent and must win.
103
+ const sessionId = await workspaces.connectWorkspace(target);
104
+ sessions.open(sessionId);
105
+ }
106
+ catch {
107
+ // Unknown workspace or a failed connect: fall through to the
108
+ // runtime's own default initial selection.
109
+ }
110
+ break;
111
+ }
112
+ }
113
+ await new Promise(resolve => setTimeout(resolve, 200));
114
+ }
115
+ const url = new URL(page.href);
116
+ url.searchParams.delete('workspace');
117
+ page.replaceState(`${url.pathname}${url.search}${url.hash}`);
118
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-link.js","sourceRoot":"","sources":["../../../src/client/deep-link.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAY3E,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAIrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAE/F,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,0CAA0C;QAC1C,MAAM,EAAE,SAAS,CAAA;KAClB;IAED,UAAU,OAAO;QACf;;;;WAIG;QACH,gBAAgB,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,uBAAuB,CAAA;SAAE,CAAA;QACnF;;;;;WAKG;QACH,oBAAoB,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,4BAA4B,CAAA;SAAE,CAAA;KAC3F;CACF;AAED,4GAA4G;AAC5G,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,IAAI,EAAE,OAAO,CAAA;CACd;AAED,mEAAmE;AACnE,MAAM,WAAW,4BAA4B;IAC3C,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB;AAWD,wCAAwC;AACxC,eAAO,MAAM,MAAM,UAA+D,CAAA;AAElF;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAmF9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAa3E,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAIrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAE/F,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,0CAA0C;QAC1C,MAAM,EAAE,SAAS,CAAA;KAClB;IAED,UAAU,OAAO;QACf;;;;WAIG;QACH,gBAAgB,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,uBAAuB,CAAA;SAAE,CAAA;QACnF;;;;;WAKG;QACH,oBAAoB,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,4BAA4B,CAAA;SAAE,CAAA;KAC3F;CACF;AAED,4GAA4G;AAC5G,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,IAAI,EAAE,OAAO,CAAA;CACd;AAED,mEAAmE;AACnE,MAAM,WAAW,4BAA4B;IAC3C,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB;AAWD,wCAAwC;AACxC,eAAO,MAAM,MAAM,UAA+D,CAAA;AAElF;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAyG9C"}