@co0ontty/wand 4.72.2 → 4.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/config.js +20 -0
  3. package/dist/daemon-connection.d.ts +9 -0
  4. package/dist/daemon-connection.js +86 -0
  5. package/dist/distribution-manager.d.ts +5 -0
  6. package/dist/distribution-manager.js +79 -1
  7. package/dist/git-quick-commit.js +12 -0
  8. package/dist/message-truncator.js +6 -0
  9. package/dist/native/darwin-arm64/wand-render +0 -0
  10. package/dist/native/darwin-arm64/wand-render.sha256 +1 -0
  11. package/dist/native/darwin-arm64/wand-render.version +1 -0
  12. package/dist/native/darwin-x64/wand-render +0 -0
  13. package/dist/native/darwin-x64/wand-render.sha256 +1 -0
  14. package/dist/native/darwin-x64/wand-render.version +1 -0
  15. package/dist/native/linux-arm64/wand-render +0 -0
  16. package/dist/native/linux-arm64/wand-render.sha256 +1 -0
  17. package/dist/native/linux-arm64/wand-render.version +1 -0
  18. package/dist/native/linux-x64/wand-render +0 -0
  19. package/dist/native/linux-x64/wand-render.sha256 +1 -0
  20. package/dist/native/linux-x64/wand-render.version +1 -0
  21. package/dist/process-manager.d.ts +10 -0
  22. package/dist/process-manager.js +73 -4
  23. package/dist/render-binary.d.ts +61 -0
  24. package/dist/render-binary.js +204 -0
  25. package/dist/render-daemon-client.d.ts +171 -0
  26. package/dist/render-daemon-client.js +1114 -0
  27. package/dist/render-host.d.ts +64 -0
  28. package/dist/render-host.js +301 -0
  29. package/dist/render-protocol.d.ts +128 -0
  30. package/dist/render-protocol.js +99 -0
  31. package/dist/render-structured-client.d.ts +80 -0
  32. package/dist/render-structured-client.js +513 -0
  33. package/dist/render-structured-host.d.ts +31 -0
  34. package/dist/render-structured-host.js +218 -0
  35. package/dist/render-structured-protocol.d.ts +101 -0
  36. package/dist/render-structured-protocol.js +35 -0
  37. package/dist/server-session-routes.js +72 -9
  38. package/dist/server-task-routes.js +52 -3
  39. package/dist/server-update-routes.d.ts +2 -0
  40. package/dist/server-update-routes.js +44 -0
  41. package/dist/server.js +31 -9
  42. package/dist/session-transport.js +1 -1
  43. package/dist/storage.d.ts +2 -1
  44. package/dist/storage.js +14 -5
  45. package/dist/structured-client-protocol.d.ts +3 -1
  46. package/dist/structured-client-protocol.js +85 -25
  47. package/dist/structured-content.d.ts +20 -3
  48. package/dist/structured-content.js +80 -1
  49. package/dist/structured-exec-host.js +7 -1
  50. package/dist/structured-exec-pump.js +6 -2
  51. package/dist/structured-pi-adapter.js +18 -2
  52. package/dist/structured-session-manager.d.ts +2 -0
  53. package/dist/structured-session-manager.js +27 -3
  54. package/dist/task-types.d.ts +2 -0
  55. package/dist/terminal-daemon-client.d.ts +9 -2
  56. package/dist/terminal-daemon-client.js +119 -46
  57. package/dist/terminal-daemon-server.js +20 -4
  58. package/dist/terminal-host.d.ts +6 -0
  59. package/dist/terminal-host.js +3 -0
  60. package/dist/tui/ipc-server.js +12 -0
  61. package/dist/types.d.ts +19 -1
  62. package/dist/unix-socket-keepalive.d.ts +3 -0
  63. package/dist/unix-socket-keepalive.js +94 -0
  64. package/dist/web-ui/content/scripts.js +68 -68
  65. package/dist/web-ui/content/styles.css +1 -1
  66. package/dist/web-ui/content/tailwind.css +12 -0
  67. package/dist/web-ui/embedded-assets.js +2 -2
  68. package/dist/ws-broadcast.d.ts +1 -1
  69. package/dist/ws-broadcast.js +17 -5
  70. package/package.json +8 -3
  71. package/scripts/install-render-binary.js +499 -0
  72. package/scripts/stage-render-binaries.js +626 -0
@@ -0,0 +1,94 @@
1
+ import { lstatSync, utimesSync } from "node:fs";
2
+ import { getErrorMessage } from "./error-utils.js";
3
+ /** Restore only a missing endpoint; existing connections and their owners stay alive. */
4
+ export function keepUnixSocketAlive(server, socketPath, onListening, intervalMs = 1_000) {
5
+ if (process.platform === "win32")
6
+ return () => { };
7
+ let identity = lstatSync(socketPath);
8
+ let recovering = false;
9
+ let binding = false;
10
+ let stopped = false;
11
+ let lastTouch = Date.now();
12
+ let warned = false;
13
+ const report = (error) => {
14
+ if (warned)
15
+ return;
16
+ warned = true;
17
+ process.stderr.write(`[wand] Socket recovery failed: ${getErrorMessage(error)}\n`);
18
+ };
19
+ const onError = (error) => {
20
+ if (!recovering)
21
+ return;
22
+ binding = false;
23
+ report(error);
24
+ };
25
+ const onListeningAgain = () => {
26
+ if (!binding)
27
+ return;
28
+ binding = false;
29
+ if (stopped) {
30
+ server.close();
31
+ return;
32
+ }
33
+ try {
34
+ onListening();
35
+ identity = lstatSync(socketPath);
36
+ lastTouch = Date.now();
37
+ recovering = false;
38
+ warned = false;
39
+ process.stderr.write("[wand] Restored missing Unix socket; existing sessions preserved.\n");
40
+ }
41
+ catch (error) {
42
+ report(error);
43
+ }
44
+ };
45
+ server.on("error", onError);
46
+ server.on("listening", onListeningAgain);
47
+ const timer = setInterval(() => {
48
+ if (stopped || binding)
49
+ return;
50
+ try {
51
+ const current = lstatSync(socketPath);
52
+ // Never touch a replacement file/socket owned by another listener.
53
+ if (current.dev === identity.dev && current.ino === identity.ino
54
+ && Date.now() - lastTouch >= 60_000) {
55
+ const now = new Date();
56
+ utimesSync(socketPath, now, now);
57
+ lastTouch = Date.now();
58
+ }
59
+ return;
60
+ }
61
+ catch (error) {
62
+ if (error.code !== "ENOENT") {
63
+ report(error);
64
+ return;
65
+ }
66
+ }
67
+ if (!server.listening && !recovering)
68
+ return;
69
+ recovering = true;
70
+ binding = true;
71
+ // close() stops accepting immediately; do not await existing connections,
72
+ // which must remain usable while this same server binds a new endpoint.
73
+ if (server.listening)
74
+ server.close();
75
+ try {
76
+ server.listen(socketPath);
77
+ }
78
+ catch (error) {
79
+ binding = false;
80
+ report(error);
81
+ }
82
+ }, intervalMs);
83
+ timer.unref();
84
+ return () => {
85
+ stopped = true;
86
+ clearInterval(timer);
87
+ // Keep the listener through an in-flight bind so shutdown cannot recreate
88
+ // a reachable endpoint after the caller has closed the daemon.
89
+ if (binding)
90
+ server.once("listening", () => server.close());
91
+ server.off("listening", onListeningAgain);
92
+ server.off("error", onError);
93
+ };
94
+ }