skybridge 0.0.0-dev.8064c90 → 0.0.0-dev.808e3f7

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 (140) hide show
  1. package/dist/cli/header.js +1 -1
  2. package/dist/cli/header.js.map +1 -1
  3. package/dist/cli/tunnel-control-server.d.ts +9 -0
  4. package/dist/cli/tunnel-control-server.js +31 -0
  5. package/dist/cli/tunnel-control-server.js.map +1 -0
  6. package/dist/cli/tunnel-control-server.test.js +39 -0
  7. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  8. package/dist/cli/tunnel.d.ts +57 -0
  9. package/dist/cli/tunnel.js +154 -0
  10. package/dist/cli/tunnel.js.map +1 -0
  11. package/dist/cli/tunnel.test.js +190 -0
  12. package/dist/cli/tunnel.test.js.map +1 -0
  13. package/dist/cli/tunnelHandler.d.ts +3 -0
  14. package/dist/cli/tunnelHandler.js +48 -0
  15. package/dist/cli/tunnelHandler.js.map +1 -0
  16. package/dist/cli/tunnelHandler.test.d.ts +1 -0
  17. package/dist/cli/tunnelHandler.test.js +95 -0
  18. package/dist/cli/tunnelHandler.test.js.map +1 -0
  19. package/dist/cli/use-messages.d.ts +3 -0
  20. package/dist/cli/use-messages.js +11 -0
  21. package/dist/cli/use-messages.js.map +1 -0
  22. package/dist/cli/use-nodemon.d.ts +2 -2
  23. package/dist/cli/use-nodemon.js +8 -24
  24. package/dist/cli/use-nodemon.js.map +1 -1
  25. package/dist/cli/use-tunnel.d.ts +13 -7
  26. package/dist/cli/use-tunnel.js +112 -72
  27. package/dist/cli/use-tunnel.js.map +1 -1
  28. package/dist/commands/build.js +28 -7
  29. package/dist/commands/build.js.map +1 -1
  30. package/dist/commands/dev.d.ts +1 -0
  31. package/dist/commands/dev.js +35 -6
  32. package/dist/commands/dev.js.map +1 -1
  33. package/dist/commands/start.js +7 -10
  34. package/dist/commands/start.js.map +1 -1
  35. package/dist/server/asset-base-url-transform-plugin.d.ts +5 -6
  36. package/dist/server/asset-base-url-transform-plugin.js +8 -9
  37. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  38. package/dist/server/asset-base-url-transform-plugin.test.js +12 -13
  39. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  40. package/dist/server/content-helpers.d.ts +27 -0
  41. package/dist/server/content-helpers.js +46 -0
  42. package/dist/server/content-helpers.js.map +1 -0
  43. package/dist/server/content-helpers.test.d.ts +1 -0
  44. package/dist/server/content-helpers.test.js +70 -0
  45. package/dist/server/content-helpers.test.js.map +1 -0
  46. package/dist/server/express.d.ts +1 -1
  47. package/dist/server/express.js +21 -3
  48. package/dist/server/express.js.map +1 -1
  49. package/dist/server/express.test.js +98 -2
  50. package/dist/server/express.test.js.map +1 -1
  51. package/dist/server/index.d.ts +4 -3
  52. package/dist/server/index.js +3 -2
  53. package/dist/server/index.js.map +1 -1
  54. package/dist/server/metric.d.ts +14 -0
  55. package/dist/server/metric.js +62 -0
  56. package/dist/server/metric.js.map +1 -0
  57. package/dist/server/middleware.test.js +12 -9
  58. package/dist/server/middleware.test.js.map +1 -1
  59. package/dist/server/server.d.ts +95 -72
  60. package/dist/server/server.js +201 -65
  61. package/dist/server/server.js.map +1 -1
  62. package/dist/server/templateHelper.d.ts +5 -5
  63. package/dist/server/templates/development.hbs +2 -2
  64. package/dist/server/templates/production.hbs +1 -1
  65. package/dist/server/tunnelProxyRouter.d.ts +6 -0
  66. package/dist/server/tunnelProxyRouter.js +94 -0
  67. package/dist/server/tunnelProxyRouter.js.map +1 -0
  68. package/dist/server/tunnelProxyRouter.test.d.ts +1 -0
  69. package/dist/server/tunnelProxyRouter.test.js +221 -0
  70. package/dist/server/tunnelProxyRouter.test.js.map +1 -0
  71. package/dist/server/viewsDevServer.d.ts +14 -0
  72. package/dist/server/viewsDevServer.js +45 -0
  73. package/dist/server/viewsDevServer.js.map +1 -0
  74. package/dist/test/utils.d.ts +13 -21
  75. package/dist/test/utils.js +42 -37
  76. package/dist/test/utils.js.map +1 -1
  77. package/dist/test/view.test.d.ts +1 -0
  78. package/dist/test/view.test.js +523 -0
  79. package/dist/test/view.test.js.map +1 -0
  80. package/dist/version.d.ts +1 -0
  81. package/dist/version.js +5 -0
  82. package/dist/version.js.map +1 -0
  83. package/dist/web/bridges/apps-sdk/adaptor.d.ts +4 -2
  84. package/dist/web/bridges/apps-sdk/adaptor.js +24 -12
  85. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
  86. package/dist/web/bridges/apps-sdk/types.d.ts +10 -5
  87. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  88. package/dist/web/bridges/mcp-app/adaptor.d.ts +10 -0
  89. package/dist/web/bridges/mcp-app/adaptor.js +84 -0
  90. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
  91. package/dist/web/bridges/types.d.ts +9 -3
  92. package/dist/web/components/modal-provider.js +1 -1
  93. package/dist/web/components/modal-provider.js.map +1 -1
  94. package/dist/web/create-store.js +15 -1
  95. package/dist/web/create-store.js.map +1 -1
  96. package/dist/web/generate-helpers.d.ts +20 -18
  97. package/dist/web/generate-helpers.js +20 -18
  98. package/dist/web/generate-helpers.js.map +1 -1
  99. package/dist/web/generate-helpers.test-d.js +20 -20
  100. package/dist/web/generate-helpers.test-d.js.map +1 -1
  101. package/dist/web/hooks/use-files.d.ts +2 -1
  102. package/dist/web/hooks/use-files.js +1 -0
  103. package/dist/web/hooks/use-files.js.map +1 -1
  104. package/dist/web/hooks/use-files.test.js +22 -2
  105. package/dist/web/hooks/use-files.test.js.map +1 -1
  106. package/dist/web/hooks/use-widget-state.test.js +114 -1
  107. package/dist/web/hooks/use-widget-state.test.js.map +1 -1
  108. package/dist/web/index.d.ts +1 -0
  109. package/dist/web/index.js.map +1 -1
  110. package/dist/web/plugin/plugin.d.ts +4 -1
  111. package/dist/web/plugin/plugin.js +112 -25
  112. package/dist/web/plugin/plugin.js.map +1 -1
  113. package/dist/web/plugin/scan-views.d.ts +8 -0
  114. package/dist/web/plugin/scan-views.js +70 -0
  115. package/dist/web/plugin/scan-views.js.map +1 -0
  116. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  117. package/dist/web/plugin/scan-views.test.js +67 -0
  118. package/dist/web/plugin/scan-views.test.js.map +1 -0
  119. package/dist/web/plugin/transform-data-llm.js +1 -1
  120. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  121. package/dist/web/plugin/validate-view.d.ts +1 -0
  122. package/dist/web/plugin/validate-view.js +9 -0
  123. package/dist/web/plugin/validate-view.js.map +1 -0
  124. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  125. package/dist/web/plugin/validate-view.test.js +24 -0
  126. package/dist/web/plugin/validate-view.test.js.map +1 -0
  127. package/package.json +13 -9
  128. package/tsconfig.base.json +2 -0
  129. package/dist/server/widgetsDevServer.d.ts +0 -13
  130. package/dist/server/widgetsDevServer.js +0 -57
  131. package/dist/server/widgetsDevServer.js.map +0 -1
  132. package/dist/test/widget.test.js +0 -263
  133. package/dist/test/widget.test.js.map +0 -1
  134. package/dist/web/plugin/validate-widget.d.ts +0 -5
  135. package/dist/web/plugin/validate-widget.js +0 -27
  136. package/dist/web/plugin/validate-widget.js.map +0 -1
  137. package/dist/web/plugin/validate-widget.test.js +0 -42
  138. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  139. /package/dist/{test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  140. /package/dist/{web/plugin/validate-widget.test.d.ts → cli/tunnel.test.d.ts} +0 -0
@@ -0,0 +1,95 @@
1
+ import { EventEmitter } from "node:events";
2
+ import http from "node:http";
3
+ import { Readable } from "node:stream";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { TunnelManager } from "./tunnel.js";
6
+ import { createTunnelHandler } from "./tunnelHandler.js";
7
+ let openServer;
8
+ afterEach(() => openServer?.close());
9
+ function makeFakeChild() {
10
+ const child = new EventEmitter();
11
+ child.stdout = new Readable({ read() { } });
12
+ child.stderr = new Readable({ read() { } });
13
+ child.kill = vi.fn(() => true);
14
+ return child;
15
+ }
16
+ async function listen(handler) {
17
+ const server = http.createServer(handler);
18
+ await new Promise((resolve) => server.listen(0, resolve));
19
+ const port = server.address().port;
20
+ return { port, server };
21
+ }
22
+ async function listenWithHandler() {
23
+ const child = makeFakeChild();
24
+ const manager = new TunnelManager({
25
+ getPort: () => 3000,
26
+ spawn: () => child,
27
+ });
28
+ const { port, server } = await listen(createTunnelHandler(manager));
29
+ openServer = server;
30
+ return { port, child, manager };
31
+ }
32
+ describe("createTunnelHandler", () => {
33
+ it("POST /tunnel starts the tunnel and returns the current state", async () => {
34
+ const { port, child } = await listenWithHandler();
35
+ const res = await fetch(`http://localhost:${port}/tunnel`, {
36
+ method: "POST",
37
+ });
38
+ expect(res.status).toBe(200);
39
+ expect(await res.json()).toEqual({
40
+ status: "starting",
41
+ message: "Starting tunnel…",
42
+ });
43
+ expect(child.kill).not.toHaveBeenCalled();
44
+ });
45
+ it("POST /tunnel is idempotent — second call does not respawn", async () => {
46
+ const { port, manager } = await listenWithHandler();
47
+ const startSpy = vi.spyOn(manager, "start");
48
+ await fetch(`http://localhost:${port}/tunnel`, { method: "POST" });
49
+ await fetch(`http://localhost:${port}/tunnel`, { method: "POST" });
50
+ expect(startSpy).toHaveBeenCalledTimes(2);
51
+ // Manager.start() is internally idempotent (verified in tunnel.test.ts).
52
+ });
53
+ it("DELETE /tunnel stops the tunnel", async () => {
54
+ const { port, child } = await listenWithHandler();
55
+ await fetch(`http://localhost:${port}/tunnel`, { method: "POST" });
56
+ const res = await fetch(`http://localhost:${port}/tunnel`, {
57
+ method: "DELETE",
58
+ });
59
+ expect(res.status).toBe(200);
60
+ expect(await res.json()).toEqual({ status: "idle" });
61
+ expect(child.kill).toHaveBeenCalled();
62
+ });
63
+ it("GET /tunnel/events streams the current state on connect", async () => {
64
+ const { port, child } = await listenWithHandler();
65
+ await fetch(`http://localhost:${port}/tunnel`, { method: "POST" });
66
+ child.stdout.emit("data", Buffer.from("Forwarding: https://abc.tunnel.example -> http://localhost:3000\n"));
67
+ const res = await fetch(`http://localhost:${port}/tunnel/events`);
68
+ expect(res.headers.get("content-type")).toMatch(/text\/event-stream/);
69
+ expect(res.body).toBeTruthy();
70
+ const reader = res.body.getReader();
71
+ const { value } = await reader.read();
72
+ const chunk = new TextDecoder().decode(value);
73
+ expect(chunk).toContain("event: state");
74
+ expect(chunk).toContain('"status":"connected"');
75
+ expect(chunk).toContain('"url":"https://abc.tunnel.example"');
76
+ await reader.cancel();
77
+ });
78
+ it("GET /tunnel/events sends the current error state on connect", async () => {
79
+ const { port, child } = await listenWithHandler();
80
+ await fetch(`http://localhost:${port}/tunnel`, { method: "POST" });
81
+ child.stderr.emit("data", Buffer.from("boom: tunnel auth failed\n"));
82
+ child.emit("close", 1);
83
+ const res = await fetch(`http://localhost:${port}/tunnel/events`);
84
+ expect(res.headers.get("content-type")).toMatch(/text\/event-stream/);
85
+ expect(res.body).toBeTruthy();
86
+ const reader = res.body.getReader();
87
+ const { value } = await reader.read();
88
+ const chunk = new TextDecoder().decode(value);
89
+ expect(chunk).toContain("event: state");
90
+ expect(chunk).toContain('"status":"error"');
91
+ expect(chunk).toContain("boom: tunnel auth failed");
92
+ await reader.cancel();
93
+ });
94
+ });
95
+ //# sourceMappingURL=tunnelHandler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnelHandler.test.js","sourceRoot":"","sources":["../../src/cli/tunnelHandler.test.ts"],"names":[],"mappings":"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"}
@@ -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,2 +1,2 @@
1
- import type { Message } from "./types.js";
2
- export declare function useNodemon(env: NodeJS.ProcessEnv): Array<Message>;
1
+ import type { PushMessage } from "./use-messages.js";
2
+ export declare function useNodemon(env: NodeJS.ProcessEnv, pushMessage: PushMessage): void;
@@ -1,11 +1,9 @@
1
- import { randomUUID } from "node:crypto";
2
1
  import { existsSync } from "node:fs";
3
2
  import { resolve } from "node:path";
4
3
  import nodemonOriginal from "nodemon";
5
- import { useEffect, useState } from "react";
4
+ import { useEffect } from "react";
6
5
  const nodemon = nodemonOriginal;
7
- export function useNodemon(env) {
8
- const [messages, setMessages] = useState([]);
6
+ export function useNodemon(env, pushMessage) {
9
7
  useEffect(() => {
10
8
  const configFile = resolve(process.cwd(), "nodemon.json");
11
9
  const config = existsSync(configFile)
@@ -13,31 +11,21 @@ export function useNodemon(env) {
13
11
  configFile,
14
12
  }
15
13
  : {
16
- watch: ["server/src"],
14
+ watch: ["src"],
17
15
  ext: "ts,json",
18
- exec: "tsx server/src/index.ts",
16
+ exec: "tsx src/server.ts",
19
17
  };
20
18
  nodemon({ ...config, env, stdout: false });
21
19
  const handleStdoutData = (chunk) => {
22
20
  const message = chunk.toString().trim();
23
21
  if (message) {
24
- setMessages((prev) => [
25
- ...prev,
26
- { id: randomUUID(), text: message, type: "log" },
27
- ].slice(-10));
22
+ pushMessage(message, "log");
28
23
  }
29
24
  };
30
25
  const handleStderrData = (chunk) => {
31
26
  const message = chunk.toString().trim();
32
27
  if (message) {
33
- setMessages((prev) => [
34
- ...prev,
35
- {
36
- id: randomUUID(),
37
- text: message,
38
- type: "error",
39
- },
40
- ].slice(-10));
28
+ pushMessage(message, "error");
41
29
  }
42
30
  };
43
31
  const setupStdoutListener = () => {
@@ -58,10 +46,7 @@ export function useNodemon(env) {
58
46
  });
59
47
  nodemon.on("restart", (files) => {
60
48
  const restartMessage = `Server restarted due to file changes: ${files.join(", ")}`;
61
- setMessages((prev) => [
62
- ...prev,
63
- { id: randomUUID(), text: restartMessage, type: "restart" },
64
- ]);
49
+ pushMessage(restartMessage, "restart");
65
50
  setupStdoutListener();
66
51
  setupStderrListener();
67
52
  });
@@ -74,7 +59,6 @@ export function useNodemon(env) {
74
59
  }
75
60
  nodemon.emit("quit");
76
61
  };
77
- }, [env]);
78
- return messages;
62
+ }, [env, pushMessage]);
79
63
  }
80
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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"}
@@ -1,8 +1,14 @@
1
- import type { Message } from "./types.js";
2
- type TunnelState = {
3
- label: string;
4
- labelColor: "yellow" | "white" | "red";
5
- logs: Message[];
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;
6
13
  };
7
- export declare function useTunnel(port: number | null): TunnelState;
8
- export {};
14
+ export declare function useTunnel(port: number | null, pushMessage: PushMessage, verbose: boolean, autoStart: boolean): TunnelState;
@@ -1,30 +1,17 @@
1
- import { spawn } from "node:child_process";
2
- import { randomUUID } from "node:crypto";
3
1
  import { useEffect, useState } from "react";
4
- export function useTunnel(port) {
5
- const [label, setLabel] = useState({
6
- text: "Starting...",
7
- color: "yellow",
8
- });
9
- const [logs, setLogs] = useState([]);
2
+ const POST_RETRY_BUDGET_MS = 5_000;
3
+ const POST_RETRY_DELAY_MS = 250;
4
+ export function useTunnel(port, pushMessage, verbose, autoStart) {
5
+ const [state, setState] = useState(port !== null && autoStart
6
+ ? { status: "starting", message: "Starting tunnel…" }
7
+ : { status: "idle" });
10
8
  useEffect(() => {
11
9
  if (port === null) {
12
10
  return;
13
11
  }
14
- const tunnelProcess = spawn("npx", ["--yes", "alpic", "tunnel", "--port", String(port), "--plain"], {
15
- stdio: ["ignore", "pipe", "pipe"],
16
- });
17
- let stderrBuffer = "";
18
- let connected = false;
19
- const timeout = setTimeout(() => {
20
- if (!connected) {
21
- setLabel({
22
- text: "Tunnel connection timed out after one minute",
23
- color: "red",
24
- });
25
- tunnelProcess.kill();
26
- }
27
- }, 60_000);
12
+ const baseUrl = `http://localhost:${port}`;
13
+ const controller = new AbortController();
14
+ let cancelled = false;
28
15
  const pushLog = (text, type) => {
29
16
  const time = new Date().toLocaleTimeString("en-US", {
30
17
  hour: "numeric",
@@ -32,70 +19,123 @@ export function useTunnel(port) {
32
19
  second: "2-digit",
33
20
  hour12: true,
34
21
  });
35
- setLogs((prev) => [
36
- ...prev,
37
- {
38
- id: randomUUID(),
39
- text: `${time} [tunnel] ${text}`,
40
- type,
41
- },
42
- ].slice(-10));
22
+ pushMessage(`${time} [tunnel] ${text}`, type);
43
23
  };
44
- const handleStdout = (data) => {
45
- const lines = data.toString().trim().split("\n").filter(Boolean);
46
- for (const line of lines) {
47
- if (connected) {
48
- pushLog(line, "log");
24
+ const handleEvent = (event, data) => {
25
+ if (event === "state") {
26
+ const next = JSON.parse(data);
27
+ setState(next);
28
+ return;
29
+ }
30
+ if (event === "activity") {
31
+ if (!verbose) {
32
+ return;
49
33
  }
50
- else {
51
- const match = line.match(/Forwarding:\s+(https:\/\/\S+)\s*->\s*(\S+)/);
52
- if (match?.[1]) {
53
- connected = true;
54
- clearTimeout(timeout);
55
- setLabel({ text: line, color: "white" });
34
+ const activity = JSON.parse(data);
35
+ pushLog(activity.text, activity.level);
36
+ }
37
+ };
38
+ const consumeSse = async () => {
39
+ const res = await fetch(`${baseUrl}/tunnel/events`, {
40
+ signal: controller.signal,
41
+ headers: { Accept: "text/event-stream" },
42
+ });
43
+ if (!res.ok || !res.body) {
44
+ throw new Error(`SSE connection failed (${res.status})`);
45
+ }
46
+ const reader = res.body.getReader();
47
+ const decoder = new TextDecoder();
48
+ let buffer = "";
49
+ while (!cancelled) {
50
+ const { value, done } = await reader.read();
51
+ if (done) {
52
+ return;
53
+ }
54
+ buffer += decoder.decode(value, { stream: true });
55
+ // SSE frames are separated by a blank line ("\n\n").
56
+ let sep = buffer.indexOf("\n\n");
57
+ while (sep !== -1) {
58
+ const frame = buffer.slice(0, sep);
59
+ buffer = buffer.slice(sep + 2);
60
+ let eventName = "message";
61
+ const dataLines = [];
62
+ for (const rawLine of frame.split("\n")) {
63
+ const line = rawLine.replace(/\r$/, "");
64
+ if (line.startsWith("event:")) {
65
+ eventName = line.slice(6).trim();
66
+ }
67
+ else if (line.startsWith("data:")) {
68
+ dataLines.push(line.slice(5).trimStart());
69
+ }
56
70
  }
57
- else {
58
- setLabel({ text: line, color: "yellow" });
71
+ if (dataLines.length > 0) {
72
+ handleEvent(eventName, dataLines.join("\n"));
59
73
  }
74
+ sep = buffer.indexOf("\n\n");
60
75
  }
61
76
  }
62
77
  };
63
- const handleStderr = (data) => {
64
- const text = data.toString().trim();
65
- if (text) {
66
- stderrBuffer = (stderrBuffer + text).slice(-1024);
67
- for (const line of text.split("\n").filter(Boolean)) {
68
- if (connected) {
69
- pushLog(line, "error");
78
+ const postWithRetry = async () => {
79
+ const deadline = Date.now() + POST_RETRY_BUDGET_MS;
80
+ while (!cancelled) {
81
+ try {
82
+ const res = await fetch(`${baseUrl}/tunnel`, {
83
+ method: "POST",
84
+ signal: controller.signal,
85
+ });
86
+ if (res.ok) {
87
+ return true;
70
88
  }
71
89
  }
90
+ catch {
91
+ // dev server not up yet
92
+ }
93
+ if (Date.now() >= deadline) {
94
+ setState({
95
+ status: "error",
96
+ message: "Could not reach dev server to start tunnel",
97
+ });
98
+ return false;
99
+ }
100
+ await new Promise((r) => setTimeout(r, POST_RETRY_DELAY_MS));
72
101
  }
102
+ return false;
73
103
  };
74
- if (tunnelProcess.stdout) {
75
- tunnelProcess.stdout.on("data", handleStdout);
104
+ // Always observe the tunnel state so external triggers (curl, future
105
+ // devtools UI) update the cli UI. `autoStart` only decides whether we
106
+ // also POST /tunnel on mount. Reconnects indefinitely so we survive
107
+ // dev-server boot delay and nodemon restarts; the cli owns the actual
108
+ // subprocess so a temporarily-unreachable dev server is fine.
109
+ const observe = async () => {
110
+ while (!cancelled) {
111
+ try {
112
+ await consumeSse();
113
+ }
114
+ catch {
115
+ // network error or stream ended abnormally — fall through to retry
116
+ }
117
+ if (cancelled) {
118
+ return;
119
+ }
120
+ await new Promise((r) => setTimeout(r, POST_RETRY_DELAY_MS));
121
+ }
122
+ };
123
+ if (autoStart) {
124
+ void postWithRetry().then((ok) => {
125
+ if (!ok || cancelled) {
126
+ return;
127
+ }
128
+ void observe();
129
+ });
76
130
  }
77
- if (tunnelProcess.stderr) {
78
- tunnelProcess.stderr.on("data", handleStderr);
131
+ else {
132
+ void observe();
79
133
  }
80
- tunnelProcess.on("error", (err) => {
81
- clearTimeout(timeout);
82
- setLabel({ text: err.message, color: "red" });
83
- });
84
- tunnelProcess.on("close", (code) => {
85
- clearTimeout(timeout);
86
- if (code !== 0 && code !== null) {
87
- const detail = stderrBuffer.trim() || `exited with code ${code}`;
88
- setLabel({
89
- text: `${detail}. Try manually: npx alpic tunnel --port ${port}`,
90
- color: "red",
91
- });
92
- }
93
- });
94
134
  return () => {
95
- clearTimeout(timeout);
96
- tunnelProcess.kill();
135
+ cancelled = true;
136
+ controller.abort();
97
137
  };
98
- }, [port]);
99
- return { label: label.text, labelColor: label.color, logs };
138
+ }, [port, pushMessage, verbose, autoStart]);
139
+ return state;
100
140
  }
101
141
  //# sourceMappingURL=use-tunnel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-tunnel.js","sourceRoot":"","sources":["../../src/cli/use-tunnel.ts"],"names":[],"mappings":"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"}
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 -b",
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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"}
@@ -5,6 +5,7 @@ export default class Dev extends Command {
5
5
  static flags: {
6
6
  port: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
7
  tunnel: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
9
  };
9
10
  run(): Promise<void>;
10
11
  }