skybridge 0.0.0-dev.bc9b932 → 0.0.0-dev.bcab395

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 (193) hide show
  1. package/README.md +17 -8
  2. package/dist/cli/detect-port.d.ts +18 -0
  3. package/dist/cli/detect-port.js +61 -0
  4. package/dist/cli/detect-port.js.map +1 -0
  5. package/dist/cli/header.js +1 -1
  6. package/dist/cli/header.js.map +1 -1
  7. package/dist/cli/tunnel-control-server.d.ts +9 -0
  8. package/dist/cli/tunnel-control-server.js +31 -0
  9. package/dist/cli/tunnel-control-server.js.map +1 -0
  10. package/dist/cli/tunnel-control-server.test.js +39 -0
  11. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  12. package/dist/cli/tunnel-handler.d.ts +3 -0
  13. package/dist/cli/tunnel-handler.js +48 -0
  14. package/dist/cli/tunnel-handler.js.map +1 -0
  15. package/dist/cli/tunnel-handler.test.d.ts +1 -0
  16. package/dist/cli/tunnel-handler.test.js +105 -0
  17. package/dist/cli/tunnel-handler.test.js.map +1 -0
  18. package/dist/cli/tunnel.d.ts +57 -0
  19. package/dist/cli/tunnel.js +154 -0
  20. package/dist/cli/tunnel.js.map +1 -0
  21. package/dist/cli/tunnel.test.d.ts +1 -0
  22. package/dist/cli/tunnel.test.js +190 -0
  23. package/dist/cli/tunnel.test.js.map +1 -0
  24. package/dist/cli/types.d.ts +5 -0
  25. package/dist/cli/types.js +2 -0
  26. package/dist/cli/types.js.map +1 -0
  27. package/dist/cli/use-messages.d.ts +3 -0
  28. package/dist/cli/use-messages.js +11 -0
  29. package/dist/cli/use-messages.js.map +1 -0
  30. package/dist/cli/use-nodemon.d.ts +2 -6
  31. package/dist/cli/use-nodemon.js +20 -17
  32. package/dist/cli/use-nodemon.js.map +1 -1
  33. package/dist/cli/use-tunnel.d.ts +14 -0
  34. package/dist/cli/use-tunnel.js +131 -0
  35. package/dist/cli/use-tunnel.js.map +1 -0
  36. package/dist/commands/build.js +28 -7
  37. package/dist/commands/build.js.map +1 -1
  38. package/dist/commands/dev.d.ts +3 -1
  39. package/dist/commands/dev.js +50 -8
  40. package/dist/commands/dev.js.map +1 -1
  41. package/dist/commands/start.d.ts +3 -1
  42. package/dist/commands/start.js +30 -9
  43. package/dist/commands/start.js.map +1 -1
  44. package/dist/server/asset-base-url-transform-plugin.d.ts +5 -6
  45. package/dist/server/asset-base-url-transform-plugin.js +8 -9
  46. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  47. package/dist/server/asset-base-url-transform-plugin.test.js +12 -13
  48. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  49. package/dist/server/content-helpers.d.ts +27 -0
  50. package/dist/server/content-helpers.js +46 -0
  51. package/dist/server/content-helpers.js.map +1 -0
  52. package/dist/server/content-helpers.test.d.ts +1 -0
  53. package/dist/server/content-helpers.test.js +70 -0
  54. package/dist/server/content-helpers.test.js.map +1 -0
  55. package/dist/server/express.d.ts +15 -0
  56. package/dist/server/express.js +95 -0
  57. package/dist/server/express.js.map +1 -0
  58. package/dist/server/express.test.d.ts +1 -0
  59. package/dist/server/express.test.js +348 -0
  60. package/dist/server/express.test.js.map +1 -0
  61. package/dist/server/index.d.ts +5 -3
  62. package/dist/server/index.js +3 -2
  63. package/dist/server/index.js.map +1 -1
  64. package/dist/server/metric.d.ts +14 -0
  65. package/dist/server/metric.js +62 -0
  66. package/dist/server/metric.js.map +1 -0
  67. package/dist/server/middleware.d.ts +124 -0
  68. package/dist/server/middleware.js +93 -0
  69. package/dist/server/middleware.js.map +1 -0
  70. package/dist/server/middleware.test-d.d.ts +1 -0
  71. package/dist/server/middleware.test-d.js +75 -0
  72. package/dist/server/middleware.test-d.js.map +1 -0
  73. package/dist/server/middleware.test.d.ts +1 -0
  74. package/dist/server/middleware.test.js +493 -0
  75. package/dist/server/middleware.test.js.map +1 -0
  76. package/dist/server/server.d.ts +137 -63
  77. package/dist/server/server.js +348 -77
  78. package/dist/server/server.js.map +1 -1
  79. package/dist/server/templateHelper.d.ts +5 -6
  80. package/dist/server/templateHelper.js.map +1 -1
  81. package/dist/server/templates/development.hbs +2 -57
  82. package/dist/server/templates/production.hbs +1 -1
  83. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  84. package/dist/server/tunnel-proxy-router.js +110 -0
  85. package/dist/server/tunnel-proxy-router.js.map +1 -0
  86. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  87. package/dist/server/tunnel-proxy-router.test.js +229 -0
  88. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  89. package/dist/server/viewsDevServer.d.ts +14 -0
  90. package/dist/server/viewsDevServer.js +45 -0
  91. package/dist/server/viewsDevServer.js.map +1 -0
  92. package/dist/test/utils.d.ts +13 -21
  93. package/dist/test/utils.js +42 -37
  94. package/dist/test/utils.js.map +1 -1
  95. package/dist/test/view.test.d.ts +1 -0
  96. package/dist/test/view.test.js +523 -0
  97. package/dist/test/view.test.js.map +1 -0
  98. package/dist/version.d.ts +1 -0
  99. package/dist/version.js +5 -0
  100. package/dist/version.js.map +1 -0
  101. package/dist/web/bridges/apps-sdk/adaptor.d.ts +7 -5
  102. package/dist/web/bridges/apps-sdk/adaptor.js +39 -16
  103. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
  104. package/dist/web/bridges/apps-sdk/bridge.d.ts +1 -1
  105. package/dist/web/bridges/apps-sdk/index.d.ts +1 -1
  106. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  107. package/dist/web/bridges/apps-sdk/types.d.ts +24 -13
  108. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  109. package/dist/web/bridges/mcp-app/adaptor.d.ts +16 -4
  110. package/dist/web/bridges/mcp-app/adaptor.js +121 -38
  111. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
  112. package/dist/web/bridges/mcp-app/bridge.d.ts +13 -30
  113. package/dist/web/bridges/mcp-app/bridge.js +43 -196
  114. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  115. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -3
  116. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +2 -2
  117. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  118. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -41
  119. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  120. package/dist/web/bridges/types.d.ts +17 -6
  121. package/dist/web/components/modal-provider.js +2 -4
  122. package/dist/web/components/modal-provider.js.map +1 -1
  123. package/dist/web/create-store.js +15 -1
  124. package/dist/web/create-store.js.map +1 -1
  125. package/dist/web/create-store.test.js +9 -4
  126. package/dist/web/create-store.test.js.map +1 -1
  127. package/dist/web/data-llm.test.js +11 -8
  128. package/dist/web/data-llm.test.js.map +1 -1
  129. package/dist/web/generate-helpers.d.ts +20 -18
  130. package/dist/web/generate-helpers.js +20 -18
  131. package/dist/web/generate-helpers.js.map +1 -1
  132. package/dist/web/generate-helpers.test-d.js +20 -20
  133. package/dist/web/generate-helpers.test-d.js.map +1 -1
  134. package/dist/web/hooks/index.d.ts +1 -1
  135. package/dist/web/hooks/index.js.map +1 -1
  136. package/dist/web/hooks/test/utils.js +4 -0
  137. package/dist/web/hooks/test/utils.js.map +1 -1
  138. package/dist/web/hooks/use-display-mode.d.ts +3 -3
  139. package/dist/web/hooks/use-display-mode.js.map +1 -1
  140. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  141. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  142. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  143. package/dist/web/hooks/use-files.d.ts +2 -1
  144. package/dist/web/hooks/use-files.js +1 -0
  145. package/dist/web/hooks/use-files.js.map +1 -1
  146. package/dist/web/hooks/use-files.test.js +27 -3
  147. package/dist/web/hooks/use-files.test.js.map +1 -1
  148. package/dist/web/hooks/use-layout.test.js +3 -3
  149. package/dist/web/hooks/use-layout.test.js.map +1 -1
  150. package/dist/web/hooks/use-open-external.d.ts +3 -1
  151. package/dist/web/hooks/use-open-external.js +1 -1
  152. package/dist/web/hooks/use-open-external.js.map +1 -1
  153. package/dist/web/hooks/use-open-external.test.js +26 -11
  154. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  155. package/dist/web/hooks/use-request-modal.test.js +5 -1
  156. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  157. package/dist/web/hooks/use-set-open-in-app-url.test.js +5 -11
  158. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  159. package/dist/web/hooks/use-tool-info.test.js +1 -1
  160. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  161. package/dist/web/hooks/use-user.js +18 -2
  162. package/dist/web/hooks/use-user.js.map +1 -1
  163. package/dist/web/hooks/use-user.test.js +29 -1
  164. package/dist/web/hooks/use-user.test.js.map +1 -1
  165. package/dist/web/hooks/use-widget-state.test.js +123 -7
  166. package/dist/web/hooks/use-widget-state.test.js.map +1 -1
  167. package/dist/web/index.d.ts +1 -0
  168. package/dist/web/index.js.map +1 -1
  169. package/dist/web/plugin/plugin.d.ts +4 -1
  170. package/dist/web/plugin/plugin.js +113 -18
  171. package/dist/web/plugin/plugin.js.map +1 -1
  172. package/dist/web/plugin/scan-views.d.ts +8 -0
  173. package/dist/web/plugin/scan-views.js +70 -0
  174. package/dist/web/plugin/scan-views.js.map +1 -0
  175. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  176. package/dist/web/plugin/scan-views.test.js +67 -0
  177. package/dist/web/plugin/scan-views.test.js.map +1 -0
  178. package/dist/web/plugin/transform-data-llm.js +1 -1
  179. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  180. package/dist/web/plugin/validate-view.d.ts +1 -0
  181. package/dist/web/plugin/validate-view.js +9 -0
  182. package/dist/web/plugin/validate-view.js.map +1 -0
  183. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  184. package/dist/web/plugin/validate-view.test.js +24 -0
  185. package/dist/web/plugin/validate-view.test.js.map +1 -0
  186. package/package.json +33 -25
  187. package/tsconfig.base.json +33 -0
  188. package/dist/server/widgetsDevServer.d.ts +0 -12
  189. package/dist/server/widgetsDevServer.js +0 -57
  190. package/dist/server/widgetsDevServer.js.map +0 -1
  191. package/dist/test/widget.test.js +0 -255
  192. package/dist/test/widget.test.js.map +0 -1
  193. /package/dist/{test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/cli/tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,190 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { Readable } from "node:stream";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { parseStdoutLine, TunnelManager } from "./tunnel.js";
5
+ describe("parseStdoutLine", () => {
6
+ it("returns a connected event when the forwarding line is seen", () => {
7
+ const result = parseStdoutLine("Forwarding: https://abc.tunnel.example -> http://localhost:3000");
8
+ expect(result).toEqual({
9
+ kind: "connected",
10
+ url: "https://abc.tunnel.example",
11
+ });
12
+ });
13
+ it("strips a trailing slash from the forwarded URL", () => {
14
+ const result = parseStdoutLine("Forwarding: https://abc.tunnel.example/ -> http://localhost:3000");
15
+ expect(result).toEqual({
16
+ kind: "connected",
17
+ url: "https://abc.tunnel.example",
18
+ });
19
+ });
20
+ it("returns a starting event for any other non-empty line", () => {
21
+ expect(parseStdoutLine("Opening tunnel...")).toEqual({
22
+ kind: "starting",
23
+ message: "Opening tunnel...",
24
+ });
25
+ });
26
+ it("returns null for empty lines", () => {
27
+ expect(parseStdoutLine("")).toBeNull();
28
+ expect(parseStdoutLine(" ")).toBeNull();
29
+ });
30
+ });
31
+ function makeFakeChild() {
32
+ const child = new EventEmitter();
33
+ child.stdout = new Readable({ read() { } });
34
+ child.stderr = new Readable({ read() { } });
35
+ child.kill = vi.fn(() => true);
36
+ return child;
37
+ }
38
+ describe("TunnelManager", () => {
39
+ beforeEach(() => {
40
+ vi.useFakeTimers();
41
+ });
42
+ afterEach(() => {
43
+ vi.useRealTimers();
44
+ });
45
+ it("starts idle", () => {
46
+ const manager = new TunnelManager({
47
+ getPort: () => 3000,
48
+ spawn: () => makeFakeChild(),
49
+ });
50
+ expect(manager.getState()).toEqual({ status: "idle" });
51
+ });
52
+ it("transitions idle -> starting -> connected as stdout reports progress", () => {
53
+ const child = makeFakeChild();
54
+ const manager = new TunnelManager({
55
+ getPort: () => 3000,
56
+ spawn: () => child,
57
+ });
58
+ const states = [];
59
+ manager.on("state", (s) => states.push(s.status));
60
+ manager.start();
61
+ child.stdout.emit("data", Buffer.from("Opening tunnel...\n"));
62
+ child.stdout.emit("data", Buffer.from("Forwarding: https://abc.tunnel.example -> http://localhost:3000\n"));
63
+ expect(states).toEqual(["starting", "starting", "connected"]);
64
+ expect(manager.getState()).toEqual({
65
+ status: "connected",
66
+ url: "https://abc.tunnel.example",
67
+ });
68
+ });
69
+ it("emits activity events for stdout lines after connect", () => {
70
+ const child = makeFakeChild();
71
+ const manager = new TunnelManager({
72
+ getPort: () => 3000,
73
+ spawn: () => child,
74
+ });
75
+ const activity = [];
76
+ manager.on("activity", (a) => activity.push({ text: a.text, level: a.level }));
77
+ manager.start();
78
+ child.stdout.emit("data", Buffer.from("Forwarding: https://abc.tunnel.example -> http://localhost:3000\n"));
79
+ child.stdout.emit("data", Buffer.from("GET /widgets/foo\n"));
80
+ child.stderr.emit("data", Buffer.from("connection wobble\n"));
81
+ expect(activity).toEqual([
82
+ { text: "GET /widgets/foo", level: "log" },
83
+ { text: "connection wobble", level: "error" },
84
+ ]);
85
+ });
86
+ it("calling start twice does not spawn twice", () => {
87
+ const spawn = vi.fn(() => makeFakeChild());
88
+ const manager = new TunnelManager({ getPort: () => 3000, spawn });
89
+ manager.start();
90
+ manager.start();
91
+ expect(spawn).toHaveBeenCalledTimes(1);
92
+ });
93
+ it("transitions to error when the connection times out", () => {
94
+ const child = makeFakeChild();
95
+ const manager = new TunnelManager({
96
+ getPort: () => 3000,
97
+ spawn: () => child,
98
+ });
99
+ manager.start();
100
+ vi.advanceTimersByTime(60_000);
101
+ expect(manager.getState().status).toBe("error");
102
+ expect(child.kill).toHaveBeenCalled();
103
+ });
104
+ it("preserves the timeout error message when the killed child later emits close", () => {
105
+ const child = makeFakeChild();
106
+ const manager = new TunnelManager({
107
+ getPort: () => 3000,
108
+ spawn: () => child,
109
+ });
110
+ manager.start();
111
+ vi.advanceTimersByTime(60_000);
112
+ // The killed child emits a non-zero close after the timeout fired.
113
+ child.emit("close", 1);
114
+ expect(manager.getState()).toEqual({
115
+ status: "error",
116
+ message: "Tunnel connection timed out after one minute",
117
+ });
118
+ });
119
+ it("stop() kills the subprocess and goes idle", () => {
120
+ const child = makeFakeChild();
121
+ const manager = new TunnelManager({
122
+ getPort: () => 3000,
123
+ spawn: () => child,
124
+ });
125
+ manager.start();
126
+ manager.stop();
127
+ expect(child.kill).toHaveBeenCalled();
128
+ expect(manager.getState()).toEqual({ status: "idle" });
129
+ });
130
+ it("subscribers get the current state on subscribe", () => {
131
+ const child = makeFakeChild();
132
+ const manager = new TunnelManager({
133
+ getPort: () => 3000,
134
+ spawn: () => child,
135
+ });
136
+ manager.start();
137
+ child.stdout.emit("data", Buffer.from("Forwarding: https://abc.tunnel.example -> http://localhost:3000\n"));
138
+ let received;
139
+ const unsubscribe = manager.subscribe((s) => {
140
+ received = s;
141
+ });
142
+ expect(received).toEqual({
143
+ status: "connected",
144
+ url: "https://abc.tunnel.example",
145
+ });
146
+ unsubscribe();
147
+ });
148
+ it("ignores deferred close from a child that was replaced via stop()+start()", () => {
149
+ const childA = makeFakeChild();
150
+ const childB = makeFakeChild();
151
+ let spawnCount = 0;
152
+ const manager = new TunnelManager({
153
+ getPort: () => 3000,
154
+ spawn: () => (spawnCount++ === 0 ? childA : childB),
155
+ });
156
+ manager.start();
157
+ manager.stop();
158
+ manager.start();
159
+ childB.stdout.emit("data", Buffer.from("Forwarding: https://abc.tunnel.example -> http://localhost:3000\n"));
160
+ expect(manager.getState()).toEqual({
161
+ status: "connected",
162
+ url: "https://abc.tunnel.example",
163
+ });
164
+ // Stale close from childA arrives only now — must not clobber state.
165
+ childA.emit("close", null);
166
+ expect(manager.getState()).toEqual({
167
+ status: "connected",
168
+ url: "https://abc.tunnel.example",
169
+ });
170
+ });
171
+ it("ignores deferred error from a child that was replaced via stop()+start()", () => {
172
+ const childA = makeFakeChild();
173
+ const childB = makeFakeChild();
174
+ let spawnCount = 0;
175
+ const manager = new TunnelManager({
176
+ getPort: () => 3000,
177
+ spawn: () => (spawnCount++ === 0 ? childA : childB),
178
+ });
179
+ manager.start();
180
+ manager.stop();
181
+ manager.start();
182
+ childB.stdout.emit("data", Buffer.from("Forwarding: https://abc.tunnel.example -> http://localhost:3000\n"));
183
+ childA.emit("error", new Error("late spawn failure"));
184
+ expect(manager.getState()).toEqual({
185
+ status: "connected",
186
+ url: "https://abc.tunnel.example",
187
+ });
188
+ });
189
+ });
190
+ //# sourceMappingURL=tunnel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.test.js","sourceRoot":"","sources":["../../src/cli/tunnel.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type Message = {
2
+ id: string;
3
+ text: string;
4
+ type: "log" | "restart" | "error";
5
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { Message } from "./types.js";
2
+ export type PushMessage = (text: string, type: Message["type"]) => void;
3
+ export declare function useMessages(): [Array<Message>, PushMessage];
@@ -0,0 +1,11 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { useCallback, useState } from "react";
3
+ const MAX_MESSAGES = 10;
4
+ export function useMessages() {
5
+ const [messages, setMessages] = useState([]);
6
+ const push = useCallback((text, type) => {
7
+ setMessages((prev) => [...prev, { id: randomUUID(), text, type }].slice(-MAX_MESSAGES));
8
+ }, []);
9
+ return [messages, push];
10
+ }
11
+ //# sourceMappingURL=use-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-messages.js","sourceRoot":"","sources":["../../src/cli/use-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG9C,MAAM,YAAY,GAAG,EAAE,CAAC;AAIxB,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAE7D,MAAM,IAAI,GAAG,WAAW,CAAc,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACnD,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CACnB,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CACjE,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,6 +1,2 @@
1
- type Message = {
2
- text: string;
3
- type: "log" | "restart" | "error";
4
- };
5
- export declare function useNodemon(env: NodeJS.ProcessEnv): Array<Message>;
6
- export {};
1
+ import type { PushMessage } from "./use-messages.js";
2
+ export declare function useNodemon(env: NodeJS.ProcessEnv, pushMessage: PushMessage): void;
@@ -1,24 +1,31 @@
1
- import nodemonOriginal, {} from "nodemon";
2
- import { useEffect, useState } from "react";
1
+ import { existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import nodemonOriginal from "nodemon";
4
+ import { useEffect } from "react";
3
5
  const nodemon = nodemonOriginal;
4
- export function useNodemon(env) {
5
- const [messages, setMessages] = useState([]);
6
+ export function useNodemon(env, pushMessage) {
6
7
  useEffect(() => {
7
- nodemon({
8
- env,
9
- configFile: "nodemon.json",
10
- stdout: false,
11
- });
8
+ const configFile = resolve(process.cwd(), "nodemon.json");
9
+ const config = existsSync(configFile)
10
+ ? {
11
+ configFile,
12
+ }
13
+ : {
14
+ watch: ["src"],
15
+ ext: "ts,json",
16
+ exec: "tsx src/server.ts",
17
+ };
18
+ nodemon({ ...config, env, stdout: false });
12
19
  const handleStdoutData = (chunk) => {
13
20
  const message = chunk.toString().trim();
14
21
  if (message) {
15
- setMessages((prev) => [...prev, { text: message, type: "log" }]);
22
+ pushMessage(message, "log");
16
23
  }
17
24
  };
18
25
  const handleStderrData = (chunk) => {
19
26
  const message = chunk.toString().trim();
20
27
  if (message) {
21
- setMessages((prev) => [...prev, { text: message, type: "error" }]);
28
+ pushMessage(message, "error");
22
29
  }
23
30
  };
24
31
  const setupStdoutListener = () => {
@@ -39,10 +46,7 @@ export function useNodemon(env) {
39
46
  });
40
47
  nodemon.on("restart", (files) => {
41
48
  const restartMessage = `Server restarted due to file changes: ${files.join(", ")}`;
42
- setMessages((prev) => [
43
- ...prev,
44
- { text: restartMessage, type: "restart" },
45
- ]);
49
+ pushMessage(restartMessage, "restart");
46
50
  setupStdoutListener();
47
51
  setupStderrListener();
48
52
  });
@@ -55,7 +59,6 @@ export function useNodemon(env) {
55
59
  }
56
60
  nodemon.emit("quit");
57
61
  };
58
- }, [env]);
59
- return messages;
62
+ }, [env, pushMessage]);
60
63
  }
61
64
  //# sourceMappingURL=use-nodemon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-nodemon.js","sourceRoot":"","sources":["../../src/cli/use-nodemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-nodemon.js","sourceRoot":"","sources":["../../src/cli/use-nodemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PushMessage } from "./use-messages.js";
2
+ export type TunnelState = {
3
+ status: "idle";
4
+ } | {
5
+ status: "starting";
6
+ message: string;
7
+ } | {
8
+ status: "connected";
9
+ url: string;
10
+ } | {
11
+ status: "error";
12
+ message: string;
13
+ };
14
+ export declare function useTunnel(port: number | null, pushMessage: PushMessage, verbose: boolean, autoStart: boolean): TunnelState;
@@ -0,0 +1,131 @@
1
+ import { useEffect, useState } from "react";
2
+ const POST_RETRY_DELAY_MS = 250;
3
+ export function useTunnel(port, pushMessage, verbose, autoStart) {
4
+ const [state, setState] = useState(port !== null && autoStart
5
+ ? { status: "starting", message: "Starting tunnel…" }
6
+ : { status: "idle" });
7
+ useEffect(() => {
8
+ if (port === null) {
9
+ return;
10
+ }
11
+ const baseUrl = `http://localhost:${port}`;
12
+ const controller = new AbortController();
13
+ let cancelled = false;
14
+ const pushLog = (text, type) => {
15
+ const time = new Date().toLocaleTimeString("en-US", {
16
+ hour: "numeric",
17
+ minute: "2-digit",
18
+ second: "2-digit",
19
+ hour12: true,
20
+ });
21
+ pushMessage(`${time} [tunnel] ${text}`, type);
22
+ };
23
+ const handleEvent = (event, data) => {
24
+ if (event === "state") {
25
+ const next = JSON.parse(data);
26
+ setState(next);
27
+ return;
28
+ }
29
+ if (event === "activity") {
30
+ if (!verbose) {
31
+ return;
32
+ }
33
+ const activity = JSON.parse(data);
34
+ pushLog(activity.text, activity.level);
35
+ }
36
+ };
37
+ const consumeSse = async () => {
38
+ const res = await fetch(`${baseUrl}/__skybridge/tunnel/events`, {
39
+ signal: controller.signal,
40
+ headers: { Accept: "text/event-stream" },
41
+ });
42
+ if (!res.ok || !res.body) {
43
+ throw new Error(`SSE connection failed (${res.status})`);
44
+ }
45
+ const reader = res.body.getReader();
46
+ const decoder = new TextDecoder();
47
+ let buffer = "";
48
+ while (!cancelled) {
49
+ const { value, done } = await reader.read();
50
+ if (done) {
51
+ return;
52
+ }
53
+ buffer += decoder.decode(value, { stream: true });
54
+ // SSE frames are separated by a blank line ("\n\n").
55
+ let sep = buffer.indexOf("\n\n");
56
+ while (sep !== -1) {
57
+ const frame = buffer.slice(0, sep);
58
+ buffer = buffer.slice(sep + 2);
59
+ let eventName = "message";
60
+ const dataLines = [];
61
+ for (const rawLine of frame.split("\n")) {
62
+ const line = rawLine.replace(/\r$/, "");
63
+ if (line.startsWith("event:")) {
64
+ eventName = line.slice(6).trim();
65
+ }
66
+ else if (line.startsWith("data:")) {
67
+ dataLines.push(line.slice(5).trimStart());
68
+ }
69
+ }
70
+ if (dataLines.length > 0) {
71
+ handleEvent(eventName, dataLines.join("\n"));
72
+ }
73
+ sep = buffer.indexOf("\n\n");
74
+ }
75
+ }
76
+ };
77
+ const postUntilStarted = async () => {
78
+ // Retry indefinitely until POST lands once. Bounded by the effect
79
+ // lifetime via controller.abort() on unmount. Once the manager has
80
+ // been started, this returns and never POSTs again — a user-driven
81
+ // DELETE /tunnel won't be auto-undone.
82
+ while (!cancelled) {
83
+ try {
84
+ const res = await fetch(`${baseUrl}/__skybridge/tunnel`, {
85
+ method: "POST",
86
+ signal: controller.signal,
87
+ });
88
+ if (res.ok) {
89
+ return;
90
+ }
91
+ }
92
+ catch {
93
+ // dev server not up yet (or restarting under nodemon) — wait, retry
94
+ }
95
+ await new Promise((r) => setTimeout(r, POST_RETRY_DELAY_MS));
96
+ }
97
+ };
98
+ // Always observe the tunnel state so external triggers (curl, future
99
+ // devtools UI) update the cli UI. `autoStart` only decides whether we
100
+ // also POST /tunnel on mount. Reconnects indefinitely so we survive
101
+ // dev-server boot delay and nodemon restarts; the cli owns the actual
102
+ // subprocess so a temporarily-unreachable dev server is fine.
103
+ const observe = async () => {
104
+ while (!cancelled) {
105
+ try {
106
+ await consumeSse();
107
+ }
108
+ catch {
109
+ // network error or stream ended abnormally — fall through to retry
110
+ }
111
+ if (cancelled) {
112
+ return;
113
+ }
114
+ await new Promise((r) => setTimeout(r, POST_RETRY_DELAY_MS));
115
+ }
116
+ };
117
+ // observe() always runs — it owns the cli's view of tunnel state. POST is
118
+ // a fire-and-forget side-effect that nudges the manager into starting and
119
+ // retries until it lands at least once.
120
+ if (autoStart) {
121
+ void postUntilStarted();
122
+ }
123
+ void observe();
124
+ return () => {
125
+ cancelled = true;
126
+ controller.abort();
127
+ };
128
+ }, [port, pushMessage, verbose, autoStart]);
129
+ return state;
130
+ }
131
+ //# sourceMappingURL=use-tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tunnel.js","sourceRoot":"","sources":["../../src/cli/use-tunnel.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,48 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cpSync, rmSync } from "node:fs";
2
+ import { rmSync } from "node:fs";
3
3
  import { Command } from "@oclif/core";
4
4
  import { Box, render, Text } from "ink";
5
5
  import { useEffect } from "react";
6
6
  import { Header } from "../cli/header.js";
7
7
  import { useExecuteSteps } from "../cli/use-execute-steps.js";
8
+ import { scanAndWriteViewsDts } from "../web/plugin/scan-views.js";
9
+ async function resolveViewsDir(root) {
10
+ const { loadConfigFromFile } = await import("vite");
11
+ const loaded = await loadConfigFromFile({ command: "build", mode: "production" }, undefined, root);
12
+ const isPluginCandidate = (value) => typeof value === "object" && value !== null;
13
+ const plugins = [];
14
+ const walk = (value) => {
15
+ if (Array.isArray(value)) {
16
+ value.forEach(walk);
17
+ }
18
+ else if (isPluginCandidate(value)) {
19
+ plugins.push(value);
20
+ }
21
+ };
22
+ walk(loaded?.config.plugins ?? []);
23
+ return plugins.find((p) => p.name === "skybridge")?.api?.viewsDir;
24
+ }
8
25
  export const commandSteps = [
9
26
  {
10
- label: "Building widgets",
11
- command: "vite build -c web/vite.config.ts",
27
+ label: "Scanning views",
28
+ run: async () => {
29
+ const root = process.cwd();
30
+ const viewsDir = await resolveViewsDir(root);
31
+ scanAndWriteViewsDts(root, viewsDir);
32
+ },
12
33
  },
13
34
  {
14
35
  label: "Compiling server",
15
36
  run: () => rmSync("dist", { recursive: true, force: true }),
16
- command: "tsc -p tsconfig.server.json",
37
+ command: "tsc -b --force",
17
38
  },
18
39
  {
19
- label: "Copying static assets",
20
- run: () => cpSync("web/dist", "dist/assets", { recursive: true }),
40
+ label: "Building views",
41
+ command: "vite build",
21
42
  },
22
43
  ];
23
44
  export default class Build extends Command {
24
- static description = "Build the widgets and MCP server";
45
+ static description = "Build the views and MCP server";
25
46
  static examples = ["skybridge build"];
26
47
  static flags = {};
27
48
  async run() {
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.tsx"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@ export default class Dev extends Command {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static flags: {
6
- "use-forwarded-host": import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ port: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ tunnel: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
9
  };
8
10
  run(): Promise<void>;
9
11
  }