@linxin666/dsh-remote-web-ui 0.1.18 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +54 -11
- package/lib/client.js.map +1 -1
- package/lib/index.js +137 -96
- package/lib/mobile.js +18 -5
- package/lib/mobile.js.map +1 -1
- package/lib/types/client/FooterRemoteEntry.js +1 -1
- package/lib/types/client/PluginSettingsCard.d.ts +1 -1
- package/lib/types/client/PluginSettingsCard.d.ts.map +1 -1
- package/lib/types/client/RemoteEntry.d.ts.map +1 -1
- package/lib/types/client/RemoteEntry.js +41 -11
- package/lib/types/client/RemotePanel.d.ts +1 -0
- package/lib/types/client/RemotePanel.d.ts.map +1 -1
- package/lib/types/client/RemotePanel.js +2 -2
- package/lib/types/client/RemoteSettingsCard.d.ts +5 -0
- package/lib/types/client/RemoteSettingsCard.d.ts.map +1 -1
- package/lib/types/client/RemoteSettingsCard.js +9 -2
- package/lib/types/client/UpdateEntry.js +1 -1
- package/lib/types/client/UpdatePanel.js +1 -1
- package/lib/types/client/deep-link.js +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +20 -14
- package/lib/types/client/settings-form.d.ts +8 -0
- package/lib/types/client/settings-form.d.ts.map +1 -1
- package/lib/types/client/settings-form.js +15 -1
- package/lib/types/client/update-api.d.ts.map +1 -1
- package/lib/types/gate.d.ts +4 -9
- package/lib/types/gate.d.ts.map +1 -1
- package/lib/types/gate.js +5 -32
- package/lib/types/http.d.ts +14 -0
- package/lib/types/http.d.ts.map +1 -0
- package/lib/types/http.js +27 -0
- package/lib/types/index.d.ts +3 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +12 -10
- package/lib/types/invariant.d.ts.map +1 -1
- package/lib/types/loopback.d.ts +25 -0
- package/lib/types/loopback.d.ts.map +1 -0
- package/lib/types/loopback.js +68 -0
- package/lib/types/mobile/api.js +1 -1
- package/lib/types/mobile/index.js +3 -3
- package/lib/types/mobile/markdown.d.ts +6 -4
- package/lib/types/mobile/markdown.d.ts.map +1 -1
- package/lib/types/mobile/markdown.js +8 -4
- package/lib/types/mobile/markdown.test.js +5 -1
- package/lib/types/mobile/messages.d.ts.map +1 -1
- package/lib/types/mobile/messages.js +14 -1
- package/lib/types/mobile/messages.test.js +1 -1
- package/lib/types/mobile/mobile-theme.test.js +2 -2
- package/lib/types/mobile/mux.d.ts.map +1 -1
- package/lib/types/mobile/mux.js +1 -1
- package/lib/types/mobile/mux.test.js +1 -1
- package/lib/types/mobile/rpc.d.ts.map +1 -1
- package/lib/types/mobile/theme-toggle.js +1 -1
- package/lib/types/mobile/views/App.d.ts +0 -11
- package/lib/types/mobile/views/App.d.ts.map +1 -1
- package/lib/types/mobile/views/App.js +6 -6
- package/lib/types/mobile/views/ChatView.js +6 -6
- package/lib/types/mobile/views/ChatView.test.js +3 -3
- package/lib/types/mobile/views/SessionListView.js +3 -3
- package/lib/types/mobile/views/SessionListView.test.js +2 -2
- package/lib/types/mobile/views/WorkspaceView.js +3 -3
- package/lib/types/mobile/views/WorkspaceView.test.js +3 -3
- package/lib/types/mobile-api.d.ts +1 -1
- package/lib/types/mobile-api.d.ts.map +1 -1
- package/lib/types/mobile-api.js +11 -18
- package/lib/types/mobile-routes.d.ts.map +1 -1
- package/lib/types/mobile-routes.js +17 -11
- package/lib/types/mount-once.d.ts +25 -0
- package/lib/types/mount-once.d.ts.map +1 -0
- package/lib/types/mount-once.js +42 -0
- package/lib/types/pairing.d.ts.map +1 -1
- package/lib/types/routes.d.ts +6 -6
- package/lib/types/routes.d.ts.map +1 -1
- package/lib/types/routes.js +14 -19
- package/lib/types/tunnel.d.ts.map +1 -1
- package/lib/types/update-routes.d.ts +2 -2
- package/lib/types/update-routes.d.ts.map +1 -1
- package/lib/types/update-routes.js +1 -6
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +6 -3
- package/package.json +1 -1
- package/src/client/RemoteEntry.tsx +38 -6
- package/src/client/RemotePanel.tsx +1 -1
- package/src/client/RemoteSettingsCard.tsx +8 -0
- package/src/client/index.ts +13 -7
- package/src/client/settings-form.ts +15 -1
- package/src/gate.ts +5 -30
- package/src/http.ts +30 -0
- package/src/index.ts +4 -1
- package/src/loopback.ts +63 -0
- package/src/mobile/markdown.test.ts +5 -0
- package/src/mobile/markdown.ts +7 -4
- package/src/mobile/messages.ts +14 -1
- package/src/mobile/views/App.tsx +0 -12
- package/src/mobile-api.ts +9 -17
- package/src/mobile-routes.ts +16 -10
- package/src/mount-once.ts +48 -0
- package/src/routes.ts +11 -17
- package/src/update-routes.ts +1 -7
- package/src/update.ts +6 -3
package/lib/client.js
CHANGED
|
@@ -2001,8 +2001,16 @@ window.__ModuleLoader__.load({
|
|
|
2001
2001
|
* rendered by {@link UpdateEntry}. Component-local state per the client
|
|
2002
2002
|
* stack rules: nothing here survives remounts or crosses entries.
|
|
2003
2003
|
*/
|
|
2004
|
-
/**
|
|
2004
|
+
/**
|
|
2005
|
+
* Apply one status frame onto the current state: the ready state mirrors
|
|
2006
|
+
* the full phase/device picture, while the lan-required banner only keeps
|
|
2007
|
+
* the auto-tunnel frame (the signal for the running re-issue).
|
|
2008
|
+
*/
|
|
2005
2009
|
function mergeFrame(state, frame) {
|
|
2010
|
+
if (state.kind === "lan-required") return {
|
|
2011
|
+
...state,
|
|
2012
|
+
...frame.tunnel !== void 0 ? { tunnel: frame.tunnel } : {}
|
|
2013
|
+
};
|
|
2006
2014
|
if (state.kind !== "ready") return state;
|
|
2007
2015
|
return {
|
|
2008
2016
|
...state,
|
|
@@ -2020,6 +2028,10 @@ window.__ModuleLoader__.load({
|
|
|
2020
2028
|
function RemoteEntry({ wide, useWorkspaces, t }) {
|
|
2021
2029
|
const [open, setOpen] = (0, react.useState)(false);
|
|
2022
2030
|
const [state, setState] = (0, react.useState)({ kind: "lan-required" });
|
|
2031
|
+
const stateRef = (0, react.useRef)(state);
|
|
2032
|
+
(0, react.useEffect)(() => {
|
|
2033
|
+
stateRef.current = state;
|
|
2034
|
+
}, [state]);
|
|
2023
2035
|
const [copied, setCopied] = (0, react.useState)(false);
|
|
2024
2036
|
const eventSource = (0, react.useRef)(void 0);
|
|
2025
2037
|
const workspaceId = useWorkspaces((s) => s.recentWorkspaceId);
|
|
@@ -2058,14 +2070,19 @@ window.__ModuleLoader__.load({
|
|
|
2058
2070
|
setOpen(true);
|
|
2059
2071
|
const next = await mint();
|
|
2060
2072
|
setState(next);
|
|
2061
|
-
if (next.kind !== "ready") return;
|
|
2073
|
+
if (next.kind !== "ready" && next.kind !== "lan-required") return;
|
|
2062
2074
|
const source = new EventSource("/api/pair/events");
|
|
2063
2075
|
eventSource.current = source;
|
|
2064
2076
|
source.onmessage = (event) => {
|
|
2065
2077
|
try {
|
|
2066
2078
|
const frame = JSON.parse(event.data);
|
|
2067
2079
|
if (frame.type !== "state") return;
|
|
2068
|
-
|
|
2080
|
+
const previous = stateRef.current;
|
|
2081
|
+
if (previous.kind === "lan-required" && frame.tunnel?.state === "running" && previous.tunnel?.state !== "running") {
|
|
2082
|
+
mint().then(setState);
|
|
2083
|
+
return;
|
|
2084
|
+
}
|
|
2085
|
+
setState((current) => mergeFrame(current, frame));
|
|
2069
2086
|
} catch {}
|
|
2070
2087
|
};
|
|
2071
2088
|
}, [mint]);
|
|
@@ -2558,6 +2575,9 @@ window.__ModuleLoader__.load({
|
|
|
2558
2575
|
specs;
|
|
2559
2576
|
staged = /* @__PURE__ */ new Map();
|
|
2560
2577
|
listeners = /* @__PURE__ */ new Set();
|
|
2578
|
+
/** The scope subscription installed in the constructor; released by dispose(). */
|
|
2579
|
+
disposeScope;
|
|
2580
|
+
disposed = false;
|
|
2561
2581
|
saving = false;
|
|
2562
2582
|
failed = false;
|
|
2563
2583
|
failedReason;
|
|
@@ -2565,10 +2585,20 @@ window.__ModuleLoader__.load({
|
|
|
2565
2585
|
constructor(scope, specs) {
|
|
2566
2586
|
this.scope = scope;
|
|
2567
2587
|
this.specs = new Map(specs.map((spec) => [spec.field, spec]));
|
|
2568
|
-
scope.subscribe(() => {
|
|
2588
|
+
this.disposeScope = scope.subscribe(() => {
|
|
2569
2589
|
this.publish();
|
|
2570
2590
|
});
|
|
2571
2591
|
}
|
|
2592
|
+
/**
|
|
2593
|
+
* Release the scope subscription and every bound store listener. The card
|
|
2594
|
+
* must call this on teardown; later calls are no-ops.
|
|
2595
|
+
*/
|
|
2596
|
+
dispose() {
|
|
2597
|
+
if (this.disposed) return;
|
|
2598
|
+
this.disposed = true;
|
|
2599
|
+
this.disposeScope();
|
|
2600
|
+
this.listeners.clear();
|
|
2601
|
+
}
|
|
2572
2602
|
/** Publish a projection of this form, rebuilt whenever the scope or a draft changes. */
|
|
2573
2603
|
bind(project) {
|
|
2574
2604
|
const store = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)(project());
|
|
@@ -2811,6 +2841,13 @@ window.__ModuleLoader__.load({
|
|
|
2811
2841
|
...this.form.actions()
|
|
2812
2842
|
};
|
|
2813
2843
|
}
|
|
2844
|
+
/**
|
|
2845
|
+
* Release the card's scope subscription and bound stores; the slot
|
|
2846
|
+
* disposer calls this on teardown.
|
|
2847
|
+
*/
|
|
2848
|
+
dispose() {
|
|
2849
|
+
this.form.dispose();
|
|
2850
|
+
}
|
|
2814
2851
|
};
|
|
2815
2852
|
/**
|
|
2816
2853
|
* Render the remote-control card.
|
|
@@ -3349,13 +3386,19 @@ window.__ModuleLoader__.load({
|
|
|
3349
3386
|
};
|
|
3350
3387
|
});
|
|
3351
3388
|
const remoteSettings = new RemoteSettingsCardController(settingsScope);
|
|
3352
|
-
ctx.slots.inject("web-ui.plugin.item", () =>
|
|
3353
|
-
|
|
3354
|
-
|
|
3355
|
-
|
|
3356
|
-
|
|
3357
|
-
|
|
3358
|
-
|
|
3389
|
+
ctx.slots.inject("web-ui.plugin.item", () => {
|
|
3390
|
+
const unregister = ctx.slots.register({
|
|
3391
|
+
name: "web-ui.plugin.item",
|
|
3392
|
+
id: "remote-web-ui",
|
|
3393
|
+
order: 90,
|
|
3394
|
+
locale: NS,
|
|
3395
|
+
inject: () => remoteSettings.inject()
|
|
3396
|
+
}, RemoteSettingsCard);
|
|
3397
|
+
return () => {
|
|
3398
|
+
remoteSettings.dispose();
|
|
3399
|
+
unregister();
|
|
3400
|
+
};
|
|
3401
|
+
});
|
|
3359
3402
|
let disposeRuntime;
|
|
3360
3403
|
const syncRuntime = () => {
|
|
3361
3404
|
if (enabled() && disposeRuntime === void 0) disposeRuntime = ctx.effect(() => {
|