@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.
Files changed (100) hide show
  1. package/lib/client.js +54 -11
  2. package/lib/client.js.map +1 -1
  3. package/lib/index.js +137 -96
  4. package/lib/mobile.js +18 -5
  5. package/lib/mobile.js.map +1 -1
  6. package/lib/types/client/FooterRemoteEntry.js +1 -1
  7. package/lib/types/client/PluginSettingsCard.d.ts +1 -1
  8. package/lib/types/client/PluginSettingsCard.d.ts.map +1 -1
  9. package/lib/types/client/RemoteEntry.d.ts.map +1 -1
  10. package/lib/types/client/RemoteEntry.js +41 -11
  11. package/lib/types/client/RemotePanel.d.ts +1 -0
  12. package/lib/types/client/RemotePanel.d.ts.map +1 -1
  13. package/lib/types/client/RemotePanel.js +2 -2
  14. package/lib/types/client/RemoteSettingsCard.d.ts +5 -0
  15. package/lib/types/client/RemoteSettingsCard.d.ts.map +1 -1
  16. package/lib/types/client/RemoteSettingsCard.js +9 -2
  17. package/lib/types/client/UpdateEntry.js +1 -1
  18. package/lib/types/client/UpdatePanel.js +1 -1
  19. package/lib/types/client/deep-link.js +1 -1
  20. package/lib/types/client/index.d.ts.map +1 -1
  21. package/lib/types/client/index.js +20 -14
  22. package/lib/types/client/settings-form.d.ts +8 -0
  23. package/lib/types/client/settings-form.d.ts.map +1 -1
  24. package/lib/types/client/settings-form.js +15 -1
  25. package/lib/types/client/update-api.d.ts.map +1 -1
  26. package/lib/types/gate.d.ts +4 -9
  27. package/lib/types/gate.d.ts.map +1 -1
  28. package/lib/types/gate.js +5 -32
  29. package/lib/types/http.d.ts +14 -0
  30. package/lib/types/http.d.ts.map +1 -0
  31. package/lib/types/http.js +27 -0
  32. package/lib/types/index.d.ts +3 -1
  33. package/lib/types/index.d.ts.map +1 -1
  34. package/lib/types/index.js +12 -10
  35. package/lib/types/invariant.d.ts.map +1 -1
  36. package/lib/types/loopback.d.ts +25 -0
  37. package/lib/types/loopback.d.ts.map +1 -0
  38. package/lib/types/loopback.js +68 -0
  39. package/lib/types/mobile/api.js +1 -1
  40. package/lib/types/mobile/index.js +3 -3
  41. package/lib/types/mobile/markdown.d.ts +6 -4
  42. package/lib/types/mobile/markdown.d.ts.map +1 -1
  43. package/lib/types/mobile/markdown.js +8 -4
  44. package/lib/types/mobile/markdown.test.js +5 -1
  45. package/lib/types/mobile/messages.d.ts.map +1 -1
  46. package/lib/types/mobile/messages.js +14 -1
  47. package/lib/types/mobile/messages.test.js +1 -1
  48. package/lib/types/mobile/mobile-theme.test.js +2 -2
  49. package/lib/types/mobile/mux.d.ts.map +1 -1
  50. package/lib/types/mobile/mux.js +1 -1
  51. package/lib/types/mobile/mux.test.js +1 -1
  52. package/lib/types/mobile/rpc.d.ts.map +1 -1
  53. package/lib/types/mobile/theme-toggle.js +1 -1
  54. package/lib/types/mobile/views/App.d.ts +0 -11
  55. package/lib/types/mobile/views/App.d.ts.map +1 -1
  56. package/lib/types/mobile/views/App.js +6 -6
  57. package/lib/types/mobile/views/ChatView.js +6 -6
  58. package/lib/types/mobile/views/ChatView.test.js +3 -3
  59. package/lib/types/mobile/views/SessionListView.js +3 -3
  60. package/lib/types/mobile/views/SessionListView.test.js +2 -2
  61. package/lib/types/mobile/views/WorkspaceView.js +3 -3
  62. package/lib/types/mobile/views/WorkspaceView.test.js +3 -3
  63. package/lib/types/mobile-api.d.ts +1 -1
  64. package/lib/types/mobile-api.d.ts.map +1 -1
  65. package/lib/types/mobile-api.js +11 -18
  66. package/lib/types/mobile-routes.d.ts.map +1 -1
  67. package/lib/types/mobile-routes.js +17 -11
  68. package/lib/types/mount-once.d.ts +25 -0
  69. package/lib/types/mount-once.d.ts.map +1 -0
  70. package/lib/types/mount-once.js +42 -0
  71. package/lib/types/pairing.d.ts.map +1 -1
  72. package/lib/types/routes.d.ts +6 -6
  73. package/lib/types/routes.d.ts.map +1 -1
  74. package/lib/types/routes.js +14 -19
  75. package/lib/types/tunnel.d.ts.map +1 -1
  76. package/lib/types/update-routes.d.ts +2 -2
  77. package/lib/types/update-routes.d.ts.map +1 -1
  78. package/lib/types/update-routes.js +1 -6
  79. package/lib/types/update.d.ts.map +1 -1
  80. package/lib/types/update.js +6 -3
  81. package/package.json +1 -1
  82. package/src/client/RemoteEntry.tsx +38 -6
  83. package/src/client/RemotePanel.tsx +1 -1
  84. package/src/client/RemoteSettingsCard.tsx +8 -0
  85. package/src/client/index.ts +13 -7
  86. package/src/client/settings-form.ts +15 -1
  87. package/src/gate.ts +5 -30
  88. package/src/http.ts +30 -0
  89. package/src/index.ts +4 -1
  90. package/src/loopback.ts +63 -0
  91. package/src/mobile/markdown.test.ts +5 -0
  92. package/src/mobile/markdown.ts +7 -4
  93. package/src/mobile/messages.ts +14 -1
  94. package/src/mobile/views/App.tsx +0 -12
  95. package/src/mobile-api.ts +9 -17
  96. package/src/mobile-routes.ts +16 -10
  97. package/src/mount-once.ts +48 -0
  98. package/src/routes.ts +11 -17
  99. package/src/update-routes.ts +1 -7
  100. 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
- /** Apply one status frame onto the current ready state. */
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
- setState((previous) => mergeFrame(previous, frame));
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", () => ctx.slots.register({
3353
- name: "web-ui.plugin.item",
3354
- id: "remote-web-ui",
3355
- order: 90,
3356
- locale: NS,
3357
- inject: () => remoteSettings.inject()
3358
- }, RemoteSettingsCard));
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(() => {