@jait/gateway 0.1.145 → 0.1.147

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 (185) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +12 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/providers/claude-code-provider.d.ts +8 -2
  5. package/dist/providers/claude-code-provider.d.ts.map +1 -1
  6. package/dist/providers/claude-code-provider.js +51 -6
  7. package/dist/providers/claude-code-provider.js.map +1 -1
  8. package/dist/providers/contracts.d.ts +5 -2
  9. package/dist/providers/contracts.d.ts.map +1 -1
  10. package/dist/providers/contracts.js +4 -1
  11. package/dist/providers/contracts.js.map +1 -1
  12. package/dist/providers/copilot-provider.d.ts +39 -0
  13. package/dist/providers/copilot-provider.d.ts.map +1 -0
  14. package/dist/providers/copilot-provider.js +481 -0
  15. package/dist/providers/copilot-provider.js.map +1 -0
  16. package/dist/providers/gemini-provider.d.ts +37 -0
  17. package/dist/providers/gemini-provider.d.ts.map +1 -0
  18. package/dist/providers/gemini-provider.js +379 -0
  19. package/dist/providers/gemini-provider.js.map +1 -0
  20. package/dist/providers/opencode-provider.d.ts +36 -0
  21. package/dist/providers/opencode-provider.d.ts.map +1 -0
  22. package/dist/providers/opencode-provider.js +344 -0
  23. package/dist/providers/opencode-provider.js.map +1 -0
  24. package/dist/providers/registry.d.ts +3 -0
  25. package/dist/providers/registry.d.ts.map +1 -1
  26. package/dist/providers/registry.js +3 -0
  27. package/dist/providers/registry.js.map +1 -1
  28. package/dist/routes/git.d.ts +1 -0
  29. package/dist/routes/git.d.ts.map +1 -1
  30. package/dist/routes/git.js +147 -0
  31. package/dist/routes/git.js.map +1 -1
  32. package/dist/routes/preview.d.ts +7 -0
  33. package/dist/routes/preview.d.ts.map +1 -0
  34. package/dist/routes/preview.js +72 -0
  35. package/dist/routes/preview.js.map +1 -0
  36. package/dist/routes/workspace.d.ts.map +1 -1
  37. package/dist/routes/workspace.js +212 -0
  38. package/dist/routes/workspace.js.map +1 -1
  39. package/dist/server.d.ts +1 -0
  40. package/dist/server.d.ts.map +1 -1
  41. package/dist/server.js +4 -0
  42. package/dist/server.js.map +1 -1
  43. package/dist/services/git.d.ts +14 -0
  44. package/dist/services/git.d.ts.map +1 -1
  45. package/dist/services/git.js +80 -0
  46. package/dist/services/git.js.map +1 -1
  47. package/dist/services/preview-runner.d.ts +46 -0
  48. package/dist/services/preview-runner.d.ts.map +1 -0
  49. package/dist/services/preview-runner.js +218 -0
  50. package/dist/services/preview-runner.js.map +1 -0
  51. package/dist/services/preview.d.ts +65 -0
  52. package/dist/services/preview.d.ts.map +1 -0
  53. package/dist/services/preview.js +265 -0
  54. package/dist/services/preview.js.map +1 -0
  55. package/dist/surfaces/browser.d.ts +12 -0
  56. package/dist/surfaces/browser.d.ts.map +1 -1
  57. package/dist/surfaces/browser.js +57 -0
  58. package/dist/surfaces/browser.js.map +1 -1
  59. package/dist/surfaces/filesystem.d.ts +7 -0
  60. package/dist/surfaces/filesystem.d.ts.map +1 -1
  61. package/dist/surfaces/filesystem.js +74 -2
  62. package/dist/surfaces/filesystem.js.map +1 -1
  63. package/dist/tools/architecture-tools.d.ts +8 -0
  64. package/dist/tools/architecture-tools.d.ts.map +1 -0
  65. package/dist/tools/architecture-tools.js +42 -0
  66. package/dist/tools/architecture-tools.js.map +1 -0
  67. package/dist/tools/index.d.ts +4 -1
  68. package/dist/tools/index.d.ts.map +1 -1
  69. package/dist/tools/index.js +13 -3
  70. package/dist/tools/index.js.map +1 -1
  71. package/dist/tools/preview-tools.d.ts +27 -3
  72. package/dist/tools/preview-tools.d.ts.map +1 -1
  73. package/dist/tools/preview-tools.js +236 -19
  74. package/dist/tools/preview-tools.js.map +1 -1
  75. package/dist/tools/tool-names.d.ts +7 -0
  76. package/dist/tools/tool-names.d.ts.map +1 -1
  77. package/dist/tools/tool-names.js +8 -0
  78. package/dist/tools/tool-names.js.map +1 -1
  79. package/package.json +1 -1
  80. package/web-dist/assets/_basePickBy-CMcRAnqh.js +1 -0
  81. package/web-dist/assets/_baseUniq-DiG-gjzX.js +1 -0
  82. package/web-dist/assets/arc-8zSvdafL.js +1 -0
  83. package/web-dist/assets/architectureDiagram-2XIMDMQ5-uV_qdZLp.js +36 -0
  84. package/web-dist/assets/blockDiagram-WCTKOSBZ-D_DoJaaX.js +132 -0
  85. package/web-dist/assets/c4Diagram-IC4MRINW-Ce0cQzk3.js +10 -0
  86. package/web-dist/assets/channel-BHaRqHuw.js +1 -0
  87. package/web-dist/assets/chunk-4BX2VUAB-D4AMg2Bs.js +1 -0
  88. package/web-dist/assets/chunk-55IACEB6-DoMMBL__.js +1 -0
  89. package/web-dist/assets/chunk-FMBD7UC4-CYf525fL.js +15 -0
  90. package/web-dist/assets/chunk-JSJVCQXG-Nss8Md0k.js +1 -0
  91. package/web-dist/assets/chunk-KX2RTZJC-_0pgSdsc.js +1 -0
  92. package/web-dist/assets/chunk-NQ4KR5QH-DAIj1AYn.js +220 -0
  93. package/web-dist/assets/chunk-QZHKN3VN-rSyB5-Hb.js +1 -0
  94. package/web-dist/assets/chunk-WL4C6EOR-CpTjmrFV.js +189 -0
  95. package/web-dist/assets/classDiagram-VBA2DB6C-D-jlQbaz.js +1 -0
  96. package/web-dist/assets/classDiagram-v2-RAHNMMFH-D-jlQbaz.js +1 -0
  97. package/web-dist/assets/clone-xemW6BD5.js +1 -0
  98. package/web-dist/assets/cose-bilkent-S5V4N54A-bW-AeIv0.js +1 -0
  99. package/web-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  100. package/web-dist/assets/dagre-KLK3FWXG-C3LgqjWf.js +4 -0
  101. package/web-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  102. package/web-dist/assets/diagram-E7M64L7V-FSqHe-E-.js +24 -0
  103. package/web-dist/assets/diagram-IFDJBPK2-CVKla5Pl.js +43 -0
  104. package/web-dist/assets/diagram-P4PSJMXO-DbdkNkqR.js +24 -0
  105. package/web-dist/assets/erDiagram-INFDFZHY-GDZX_pjq.js +70 -0
  106. package/web-dist/assets/flowDiagram-PKNHOUZH-Cg_Kg-6s.js +162 -0
  107. package/web-dist/assets/ganttDiagram-A5KZAMGK-BNj6qaAZ.js +292 -0
  108. package/web-dist/assets/gitGraphDiagram-K3NZZRJ6-CYDlDHPF.js +65 -0
  109. package/web-dist/assets/graph-CgnxvBit.js +1 -0
  110. package/web-dist/assets/index-0BjDR9yA.js +1109 -0
  111. package/web-dist/assets/{index-CBnIwext.css → index-BVFq-LvQ.css} +1 -1
  112. package/web-dist/assets/infoDiagram-LFFYTUFH-BuSCypq8.js +2 -0
  113. package/web-dist/assets/ishikawaDiagram-PHBUUO56-AjFXL8hp.js +70 -0
  114. package/web-dist/assets/journeyDiagram-4ABVD52K-T24AykCT.js +139 -0
  115. package/web-dist/assets/kanban-definition-K7BYSVSG-BFmOJ3Za.js +89 -0
  116. package/web-dist/assets/katex-BkgLa5T_.js +261 -0
  117. package/web-dist/assets/layout-DBZbe3s5.js +1 -0
  118. package/web-dist/assets/linear-DH_G-pjt.js +1 -0
  119. package/web-dist/assets/mindmap-definition-YRQLILUH-DmrFp1JV.js +68 -0
  120. package/web-dist/assets/pieDiagram-SKSYHLDU-DICPv0I1.js +30 -0
  121. package/web-dist/assets/quadrantDiagram-337W2JSQ-4ZQkWCL2.js +7 -0
  122. package/web-dist/assets/requirementDiagram-Z7DCOOCP-xuxQgvoc.js +73 -0
  123. package/web-dist/assets/sankeyDiagram-WA2Y5GQK-fZCbCQr0.js +10 -0
  124. package/web-dist/assets/sequenceDiagram-2WXFIKYE-BpvPwC4U.js +145 -0
  125. package/web-dist/assets/stateDiagram-RAJIS63D-CtazoD_k.js +1 -0
  126. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-C8JhD5ad.js +1 -0
  127. package/web-dist/assets/timeline-definition-YZTLITO2-TOninkTE.js +61 -0
  128. package/web-dist/assets/treemap-KZPCXAKY-DN7nCe4Y.js +162 -0
  129. package/web-dist/assets/vennDiagram-LZ73GAT5-Cu5kB4rI.js +34 -0
  130. package/web-dist/assets/xychartDiagram-JWTSCODW-CKRZxJIX.js +7 -0
  131. package/web-dist/dist/assets/_basePickBy-CMcRAnqh.js +1 -0
  132. package/web-dist/dist/assets/_baseUniq-DiG-gjzX.js +1 -0
  133. package/web-dist/dist/assets/arc-8zSvdafL.js +1 -0
  134. package/web-dist/dist/assets/architectureDiagram-2XIMDMQ5-uV_qdZLp.js +36 -0
  135. package/web-dist/dist/assets/blockDiagram-WCTKOSBZ-D_DoJaaX.js +132 -0
  136. package/web-dist/dist/assets/c4Diagram-IC4MRINW-Ce0cQzk3.js +10 -0
  137. package/web-dist/dist/assets/channel-BHaRqHuw.js +1 -0
  138. package/web-dist/dist/assets/chunk-4BX2VUAB-D4AMg2Bs.js +1 -0
  139. package/web-dist/dist/assets/chunk-55IACEB6-DoMMBL__.js +1 -0
  140. package/web-dist/dist/assets/chunk-FMBD7UC4-CYf525fL.js +15 -0
  141. package/web-dist/dist/assets/chunk-JSJVCQXG-Nss8Md0k.js +1 -0
  142. package/web-dist/dist/assets/chunk-KX2RTZJC-_0pgSdsc.js +1 -0
  143. package/web-dist/dist/assets/chunk-NQ4KR5QH-DAIj1AYn.js +220 -0
  144. package/web-dist/dist/assets/chunk-QZHKN3VN-rSyB5-Hb.js +1 -0
  145. package/web-dist/dist/assets/chunk-WL4C6EOR-CpTjmrFV.js +189 -0
  146. package/web-dist/dist/assets/classDiagram-VBA2DB6C-D-jlQbaz.js +1 -0
  147. package/web-dist/dist/assets/classDiagram-v2-RAHNMMFH-D-jlQbaz.js +1 -0
  148. package/web-dist/dist/assets/clone-xemW6BD5.js +1 -0
  149. package/web-dist/dist/assets/cose-bilkent-S5V4N54A-bW-AeIv0.js +1 -0
  150. package/web-dist/dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  151. package/web-dist/dist/assets/dagre-KLK3FWXG-C3LgqjWf.js +4 -0
  152. package/web-dist/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  153. package/web-dist/dist/assets/diagram-E7M64L7V-FSqHe-E-.js +24 -0
  154. package/web-dist/dist/assets/diagram-IFDJBPK2-CVKla5Pl.js +43 -0
  155. package/web-dist/dist/assets/diagram-P4PSJMXO-DbdkNkqR.js +24 -0
  156. package/web-dist/dist/assets/erDiagram-INFDFZHY-GDZX_pjq.js +70 -0
  157. package/web-dist/dist/assets/flowDiagram-PKNHOUZH-Cg_Kg-6s.js +162 -0
  158. package/web-dist/dist/assets/ganttDiagram-A5KZAMGK-BNj6qaAZ.js +292 -0
  159. package/web-dist/dist/assets/gitGraphDiagram-K3NZZRJ6-CYDlDHPF.js +65 -0
  160. package/web-dist/dist/assets/graph-CgnxvBit.js +1 -0
  161. package/web-dist/dist/assets/index-0BjDR9yA.js +1109 -0
  162. package/web-dist/dist/assets/{index-CBnIwext.css → index-BVFq-LvQ.css} +1 -1
  163. package/web-dist/dist/assets/infoDiagram-LFFYTUFH-BuSCypq8.js +2 -0
  164. package/web-dist/dist/assets/ishikawaDiagram-PHBUUO56-AjFXL8hp.js +70 -0
  165. package/web-dist/dist/assets/journeyDiagram-4ABVD52K-T24AykCT.js +139 -0
  166. package/web-dist/dist/assets/kanban-definition-K7BYSVSG-BFmOJ3Za.js +89 -0
  167. package/web-dist/dist/assets/katex-BkgLa5T_.js +261 -0
  168. package/web-dist/dist/assets/layout-DBZbe3s5.js +1 -0
  169. package/web-dist/dist/assets/linear-DH_G-pjt.js +1 -0
  170. package/web-dist/dist/assets/mindmap-definition-YRQLILUH-DmrFp1JV.js +68 -0
  171. package/web-dist/dist/assets/pieDiagram-SKSYHLDU-DICPv0I1.js +30 -0
  172. package/web-dist/dist/assets/quadrantDiagram-337W2JSQ-4ZQkWCL2.js +7 -0
  173. package/web-dist/dist/assets/requirementDiagram-Z7DCOOCP-xuxQgvoc.js +73 -0
  174. package/web-dist/dist/assets/sankeyDiagram-WA2Y5GQK-fZCbCQr0.js +10 -0
  175. package/web-dist/dist/assets/sequenceDiagram-2WXFIKYE-BpvPwC4U.js +145 -0
  176. package/web-dist/dist/assets/stateDiagram-RAJIS63D-CtazoD_k.js +1 -0
  177. package/web-dist/dist/assets/stateDiagram-v2-FVOUBMTO-C8JhD5ad.js +1 -0
  178. package/web-dist/dist/assets/timeline-definition-YZTLITO2-TOninkTE.js +61 -0
  179. package/web-dist/dist/assets/treemap-KZPCXAKY-DN7nCe4Y.js +162 -0
  180. package/web-dist/dist/assets/vennDiagram-LZ73GAT5-Cu5kB4rI.js +34 -0
  181. package/web-dist/dist/assets/xychartDiagram-JWTSCODW-CKRZxJIX.js +7 -0
  182. package/web-dist/dist/index.html +2 -2
  183. package/web-dist/index.html +2 -2
  184. package/web-dist/assets/index-IGBNINhu.js +0 -819
  185. package/web-dist/dist/assets/index-IGBNINhu.js +0 -819
@@ -0,0 +1,218 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { createServer } from "node:net";
5
+ // ── Detection helpers ────────────────────────────────────────────────
6
+ export function detectPackageManager(workspaceRoot) {
7
+ if (existsSync(join(workspaceRoot, "bun.lockb")))
8
+ return "bun";
9
+ if (existsSync(join(workspaceRoot, "pnpm-lock.yaml")))
10
+ return "pnpm";
11
+ return "npm";
12
+ }
13
+ export function loadPackageJson(workspaceRoot) {
14
+ const file = join(workspaceRoot, "package.json");
15
+ if (!existsSync(file))
16
+ return null;
17
+ try {
18
+ return JSON.parse(readFileSync(file, "utf8"));
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function detectFramework(workspaceRoot, hint) {
25
+ if (hint) {
26
+ const lower = hint.toLowerCase();
27
+ const pm = detectPackageManager(workspaceRoot);
28
+ if (lower === "vite")
29
+ return { name: "vite", devCommand: `${pm} exec vite`, likelyPort: 5173 };
30
+ if (lower === "next" || lower === "nextjs")
31
+ return { name: "next", devCommand: `${pm} exec next dev`, likelyPort: 3000 };
32
+ if (lower === "nuxt" || lower === "nuxtjs")
33
+ return { name: "nuxt", devCommand: `${pm} exec nuxt dev`, likelyPort: 3000 };
34
+ if (lower === "remix")
35
+ return { name: "remix", devCommand: `${pm} run dev`, likelyPort: 3000 };
36
+ if (lower === "astro")
37
+ return { name: "astro", devCommand: `${pm} exec astro dev`, likelyPort: 4321 };
38
+ }
39
+ const pm = detectPackageManager(workspaceRoot);
40
+ const pkg = loadPackageJson(workspaceRoot);
41
+ const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };
42
+ // Config-file detection (works even without deps in package.json)
43
+ if (existsSync(join(workspaceRoot, "vite.config.ts")) || existsSync(join(workspaceRoot, "vite.config.js"))) {
44
+ return { name: "vite", devCommand: `${pm} exec vite`, likelyPort: 5173 };
45
+ }
46
+ if (existsSync(join(workspaceRoot, "next.config.ts")) || existsSync(join(workspaceRoot, "next.config.js")) || existsSync(join(workspaceRoot, "next.config.mjs"))) {
47
+ return { name: "next", devCommand: `${pm} exec next dev`, likelyPort: 3000 };
48
+ }
49
+ if (existsSync(join(workspaceRoot, "nuxt.config.ts")) || existsSync(join(workspaceRoot, "nuxt.config.js"))) {
50
+ return { name: "nuxt", devCommand: `${pm} exec nuxt dev`, likelyPort: 3000 };
51
+ }
52
+ if (existsSync(join(workspaceRoot, "astro.config.mjs")) || existsSync(join(workspaceRoot, "astro.config.ts"))) {
53
+ return { name: "astro", devCommand: `${pm} exec astro dev`, likelyPort: 4321 };
54
+ }
55
+ // Dependency detection
56
+ if ("vite" in deps)
57
+ return { name: "vite", devCommand: `${pm} exec vite`, likelyPort: 5173 };
58
+ if ("next" in deps)
59
+ return { name: "next", devCommand: `${pm} exec next dev`, likelyPort: 3000 };
60
+ if ("nuxt" in deps)
61
+ return { name: "nuxt", devCommand: `${pm} exec nuxt dev`, likelyPort: 3000 };
62
+ if ("astro" in deps)
63
+ return { name: "astro", devCommand: `${pm} exec astro dev`, likelyPort: 4321 };
64
+ if ("@remix-run/dev" in deps)
65
+ return { name: "remix", devCommand: `${pm} run dev`, likelyPort: 3000 };
66
+ return null;
67
+ }
68
+ export function detectPreviewCommand(workspaceRoot, requestedCommand, port, frameworkHint) {
69
+ if (requestedCommand?.trim())
70
+ return requestedCommand.trim();
71
+ const framework = detectFramework(workspaceRoot, frameworkHint);
72
+ const pm = detectPackageManager(workspaceRoot);
73
+ if (framework) {
74
+ switch (framework.name) {
75
+ case "vite":
76
+ return `${pm} exec vite --host 127.0.0.1 --port ${port}`;
77
+ case "next":
78
+ return `${pm} exec next dev --hostname 127.0.0.1 --port ${port}`;
79
+ case "nuxt":
80
+ return `${pm} exec nuxt dev --host 127.0.0.1 --port ${port}`;
81
+ case "astro":
82
+ return `${pm} exec astro dev --host 127.0.0.1 --port ${port}`;
83
+ default:
84
+ return `${pm} run dev`;
85
+ }
86
+ }
87
+ const pkg = loadPackageJson(workspaceRoot);
88
+ if (!pkg) {
89
+ throw new Error("No package.json found and no preview command was provided.");
90
+ }
91
+ const scripts = (pkg.scripts ?? {});
92
+ if (scripts.preview)
93
+ return `${pm} run preview -- --host 127.0.0.1 --port ${port}`;
94
+ if (scripts.dev)
95
+ return `${pm} run dev`;
96
+ throw new Error("Unable to detect a preview command. Provide one explicitly.");
97
+ }
98
+ export async function allocatePort(preferred) {
99
+ if (preferred && preferred > 0)
100
+ return preferred;
101
+ return new Promise((resolve, reject) => {
102
+ const server = createServer();
103
+ server.listen(0, "127.0.0.1", () => {
104
+ const address = server.address();
105
+ if (!address || typeof address === "string") {
106
+ server.close(() => reject(new Error("Failed to allocate preview port")));
107
+ return;
108
+ }
109
+ const port = address.port;
110
+ server.close((err) => (err ? reject(err) : resolve(port)));
111
+ });
112
+ server.on("error", reject);
113
+ });
114
+ }
115
+ export async function waitForHttp(url, timeoutMs = 45_000) {
116
+ const started = Date.now();
117
+ while (Date.now() - started < timeoutMs) {
118
+ try {
119
+ const response = await fetch(url, { signal: AbortSignal.timeout(3000) });
120
+ if (response.ok || response.status < 500)
121
+ return;
122
+ }
123
+ catch {
124
+ // retry
125
+ }
126
+ await new Promise((resolve) => setTimeout(resolve, 1000));
127
+ }
128
+ throw new Error(`Preview server did not become ready at ${url} within ${timeoutMs}ms`);
129
+ }
130
+ function normalizeTargetUrl(target, port) {
131
+ const trimmed = target.trim();
132
+ if (!trimmed)
133
+ return `http://127.0.0.1:${port}/`;
134
+ if (/^\d+$/.test(trimmed)) {
135
+ return `http://127.0.0.1:${Number.parseInt(trimmed, 10)}/`;
136
+ }
137
+ const withScheme = /^[a-z]+:\/\//i.test(trimmed) ? trimmed : `http://${trimmed}`;
138
+ try {
139
+ const url = new URL(withScheme);
140
+ const host = url.hostname.toLowerCase();
141
+ if (!["127.0.0.1", "localhost", "0.0.0.0", "::1", "[::1]"].includes(host)) {
142
+ return `http://127.0.0.1:${port}/`;
143
+ }
144
+ return url.toString();
145
+ }
146
+ catch {
147
+ return `http://127.0.0.1:${port}/`;
148
+ }
149
+ }
150
+ // ── LocalPreviewRunner ───────────────────────────────────────────────
151
+ export class LocalPreviewRunner {
152
+ mode = "local";
153
+ async start(input, onLog) {
154
+ const port = await allocatePort(input.port);
155
+ const command = detectPreviewCommand(input.workspaceRoot, input.command ?? null, port, input.frameworkHint);
156
+ const url = normalizeTargetUrl(input.target ?? "", port);
157
+ onLog("system", `Running: ${command} (port ${port})`);
158
+ const child = spawn(command, {
159
+ cwd: input.workspaceRoot,
160
+ env: {
161
+ ...process.env,
162
+ PORT: String(port),
163
+ HOST: "127.0.0.1",
164
+ HOSTNAME: "127.0.0.1",
165
+ BROWSER: "none",
166
+ },
167
+ shell: true,
168
+ stdio: "pipe",
169
+ });
170
+ child.stdout.setEncoding("utf8");
171
+ child.stderr.setEncoding("utf8");
172
+ child.stdout.on("data", (chunk) => onLog("stdout", chunk));
173
+ child.stderr.on("data", (chunk) => onLog("stderr", chunk));
174
+ child.on("error", (error) => onLog("stderr", error.message));
175
+ try {
176
+ await waitForHttp(url);
177
+ }
178
+ catch (err) {
179
+ // Kill the child process so it doesn't leak
180
+ if (!child.killed)
181
+ child.kill("SIGTERM");
182
+ throw err;
183
+ }
184
+ return {
185
+ process: child,
186
+ port,
187
+ command,
188
+ url,
189
+ mode: "local",
190
+ processId: child.pid,
191
+ };
192
+ }
193
+ async stop(result) {
194
+ if (result.process && !result.process.killed) {
195
+ result.process.kill("SIGTERM");
196
+ }
197
+ }
198
+ }
199
+ // ── DockerPreviewRunner (stub for Phase 2) ───────────────────────────
200
+ export class DockerPreviewRunner {
201
+ mode = "docker";
202
+ async start(_input, onLog) {
203
+ onLog("system", "Docker preview runner is not yet implemented. Use local runner.");
204
+ throw new Error("Docker preview runner is not available in V1. Falling back to local runner.");
205
+ }
206
+ async stop(_result) {
207
+ // Docker cleanup will go here in Phase 2
208
+ }
209
+ }
210
+ // ── Runner factory with fallback ─────────────────────────────────────
211
+ export function createPreviewRunner(preferDocker = false) {
212
+ if (preferDocker) {
213
+ // Phase 2: attempt DockerPreviewRunner, fallback to local
214
+ // For now, always use local
215
+ }
216
+ return new LocalPreviewRunner();
217
+ }
218
+ //# sourceMappingURL=preview-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-runner.js","sourceRoot":"","sources":["../../src/services/preview-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { SurfaceRegistry } from "../surfaces/registry.js";
2
+ import { type BrowserRuntimeEvent } from "../surfaces/browser.js";
3
+ export type PreviewStatus = "starting" | "ready" | "error" | "stopped";
4
+ export type PreviewMode = "local" | "docker" | "url";
5
+ export interface PreviewLogEntry {
6
+ id: number;
7
+ stream: "stdout" | "stderr" | "system";
8
+ text: string;
9
+ timestamp: string;
10
+ }
11
+ export interface PreviewSession {
12
+ id: string;
13
+ sessionId: string;
14
+ workspaceRoot: string | null;
15
+ mode: PreviewMode;
16
+ status: PreviewStatus;
17
+ target: string | null;
18
+ command: string | null;
19
+ port: number | null;
20
+ url: string | null;
21
+ browserId: string | null;
22
+ processId: number | null;
23
+ containerId: string | null;
24
+ logs: PreviewLogEntry[];
25
+ browserEvents: BrowserRuntimeEvent[];
26
+ lastError: string | null;
27
+ createdAt: string;
28
+ updatedAt: string;
29
+ }
30
+ export interface StartPreviewInput {
31
+ sessionId: string;
32
+ workspaceRoot?: string | null;
33
+ target?: string | null;
34
+ command?: string | null;
35
+ port?: number | null;
36
+ frameworkHint?: string | null;
37
+ }
38
+ export declare class PreviewService {
39
+ private readonly surfaceRegistry;
40
+ private readonly sessions;
41
+ private nextLogId;
42
+ private readonly runner;
43
+ constructor(surfaceRegistry: SurfaceRegistry);
44
+ start(input: StartPreviewInput): Promise<PreviewSession>;
45
+ restart(sessionId: string): Promise<PreviewSession | null>;
46
+ stop(sessionId: string): Promise<boolean>;
47
+ get(sessionId: string): PreviewSession | null;
48
+ getLogs(sessionId: string, sinceId?: number): PreviewLogEntry[];
49
+ list(): PreviewSession[];
50
+ screenshot(sessionId: string): Promise<string | null>;
51
+ snapshot(sessionId: string): Promise<string | null>;
52
+ inspect(sessionId: string): Promise<{
53
+ status: PreviewStatus;
54
+ url: string | null;
55
+ browserEvents: BrowserRuntimeEvent[];
56
+ logs: PreviewLogEntry[];
57
+ screenshot: string | null;
58
+ } | null>;
59
+ stopAll(): Promise<void>;
60
+ private ensureBrowser;
61
+ private readBrowserEvents;
62
+ private appendLog;
63
+ private toPublicSession;
64
+ }
65
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/services/preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ import { BrowserSurface } from "../surfaces/browser.js";
2
+ import { createPreviewRunner, } from "./preview-runner.js";
3
+ const MAX_PREVIEW_LOGS = 400;
4
+ function nowIso() {
5
+ return new Date().toISOString();
6
+ }
7
+ function pushBounded(items, next, max) {
8
+ items.push(next);
9
+ if (items.length > max)
10
+ items.splice(0, items.length - max);
11
+ }
12
+ function normalizeTargetUrl(target) {
13
+ const trimmed = target.trim();
14
+ if (!trimmed)
15
+ return null;
16
+ if (/^\d+$/.test(trimmed)) {
17
+ return `http://127.0.0.1:${Number.parseInt(trimmed, 10)}/`;
18
+ }
19
+ const withScheme = /^[a-z]+:\/\//i.test(trimmed) ? trimmed : `http://${trimmed}`;
20
+ try {
21
+ const url = new URL(withScheme);
22
+ const host = url.hostname.toLowerCase();
23
+ if (!["127.0.0.1", "localhost", "0.0.0.0", "::1", "[::1]"].includes(host))
24
+ return null;
25
+ return url.toString();
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export class PreviewService {
32
+ surfaceRegistry;
33
+ sessions = new Map();
34
+ nextLogId = 1;
35
+ runner;
36
+ constructor(surfaceRegistry) {
37
+ this.surfaceRegistry = surfaceRegistry;
38
+ this.runner = createPreviewRunner(false);
39
+ }
40
+ async start(input) {
41
+ if (!input.sessionId)
42
+ throw new Error("sessionId is required");
43
+ await this.stop(input.sessionId);
44
+ const createdAt = nowIso();
45
+ const isLocal = Boolean(input.command?.trim() || input.workspaceRoot?.trim());
46
+ const session = {
47
+ id: `preview-${input.sessionId}`,
48
+ sessionId: input.sessionId,
49
+ workspaceRoot: input.workspaceRoot?.trim() || null,
50
+ mode: isLocal ? this.runner.mode : "url",
51
+ status: "starting",
52
+ target: input.target?.trim() || null,
53
+ command: null,
54
+ port: null,
55
+ url: null,
56
+ browserId: `preview-browser-${input.sessionId}`,
57
+ processId: null,
58
+ containerId: null,
59
+ logs: [],
60
+ browserEvents: [],
61
+ lastError: null,
62
+ createdAt,
63
+ updatedAt: createdAt,
64
+ process: null,
65
+ runnerResult: null,
66
+ };
67
+ this.sessions.set(input.sessionId, session);
68
+ this.appendLog(session, "system", "Starting preview session");
69
+ try {
70
+ if (session.mode !== "url") {
71
+ if (!session.workspaceRoot) {
72
+ throw new Error("workspaceRoot is required for managed project previews");
73
+ }
74
+ const result = await this.runner.start({
75
+ workspaceRoot: session.workspaceRoot,
76
+ command: input.command?.trim() || null,
77
+ port: input.port,
78
+ target: input.target?.trim() || null,
79
+ frameworkHint: input.frameworkHint?.trim() || null,
80
+ }, (stream, text) => this.appendLog(session, stream, text));
81
+ session.runnerResult = result;
82
+ session.process = result.process;
83
+ session.port = result.port;
84
+ session.command = result.command;
85
+ session.url = result.url;
86
+ session.processId = result.processId ?? null;
87
+ session.containerId = result.containerId ?? null;
88
+ // Listen for process exit
89
+ if (result.process) {
90
+ result.process.on("exit", (code, signal) => {
91
+ if (session.status === "stopped")
92
+ return;
93
+ session.updatedAt = nowIso();
94
+ session.status = "error";
95
+ const message = `Preview process exited (code=${code ?? "null"}, signal=${signal ?? "null"})`;
96
+ session.lastError = message;
97
+ this.appendLog(session, "stderr", message);
98
+ });
99
+ }
100
+ }
101
+ else {
102
+ session.url = normalizeTargetUrl(input.target ?? "");
103
+ if (!session.url) {
104
+ throw new Error("A loopback target URL or port is required");
105
+ }
106
+ }
107
+ await this.ensureBrowser(session);
108
+ session.status = "ready";
109
+ session.updatedAt = nowIso();
110
+ this.appendLog(session, "system", `Preview ready at ${session.url}`);
111
+ return this.toPublicSession(session);
112
+ }
113
+ catch (error) {
114
+ session.status = "error";
115
+ session.lastError = error instanceof Error ? error.message : "Preview start failed";
116
+ session.updatedAt = nowIso();
117
+ this.appendLog(session, "stderr", session.lastError);
118
+ return this.toPublicSession(session);
119
+ }
120
+ }
121
+ async restart(sessionId) {
122
+ const existing = this.sessions.get(sessionId);
123
+ if (!existing)
124
+ return null;
125
+ return this.start({
126
+ sessionId,
127
+ workspaceRoot: existing.workspaceRoot,
128
+ target: existing.target,
129
+ command: existing.command,
130
+ port: existing.port,
131
+ });
132
+ }
133
+ async stop(sessionId) {
134
+ const session = this.sessions.get(sessionId);
135
+ if (!session)
136
+ return false;
137
+ if (session.runnerResult) {
138
+ await this.runner.stop(session.runnerResult).catch(() => { });
139
+ }
140
+ else if (session.process && !session.process.killed) {
141
+ session.process.kill("SIGTERM");
142
+ }
143
+ if (session.browserId) {
144
+ await this.surfaceRegistry.stopSurface(session.browserId, "preview-stop").catch(() => { });
145
+ }
146
+ session.status = "stopped";
147
+ session.updatedAt = nowIso();
148
+ this.appendLog(session, "system", "Preview stopped");
149
+ this.sessions.delete(sessionId);
150
+ return true;
151
+ }
152
+ get(sessionId) {
153
+ const session = this.sessions.get(sessionId);
154
+ if (!session)
155
+ return null;
156
+ session.browserEvents = this.readBrowserEvents(session);
157
+ return this.toPublicSession(session);
158
+ }
159
+ getLogs(sessionId, sinceId = 0) {
160
+ const session = this.sessions.get(sessionId);
161
+ if (!session)
162
+ return [];
163
+ return session.logs.filter((entry) => entry.id > sinceId);
164
+ }
165
+ list() {
166
+ return [...this.sessions.values()].map((s) => this.get(s.sessionId)).filter(Boolean);
167
+ }
168
+ async screenshot(sessionId) {
169
+ const session = this.sessions.get(sessionId);
170
+ if (!session?.browserId)
171
+ return null;
172
+ const surface = this.surfaceRegistry.getSurface(session.browserId);
173
+ if (!surface || surface.type !== "browser" || surface.state !== "running")
174
+ return null;
175
+ return surface.screenshot();
176
+ }
177
+ async snapshot(sessionId) {
178
+ const session = this.sessions.get(sessionId);
179
+ if (!session?.browserId)
180
+ return null;
181
+ const surface = this.surfaceRegistry.getSurface(session.browserId);
182
+ if (!surface || surface.type !== "browser" || surface.state !== "running")
183
+ return null;
184
+ const browser = surface;
185
+ return browser.describe();
186
+ }
187
+ async inspect(sessionId) {
188
+ const session = this.sessions.get(sessionId);
189
+ if (!session)
190
+ return null;
191
+ const events = this.readBrowserEvents(session);
192
+ const screenshotBase64 = await this.screenshot(sessionId).catch(() => null);
193
+ return {
194
+ status: session.status,
195
+ url: session.url,
196
+ browserEvents: events,
197
+ logs: [...session.logs],
198
+ screenshot: screenshotBase64,
199
+ };
200
+ }
201
+ async stopAll() {
202
+ const sessionIds = [...this.sessions.keys()];
203
+ for (const sessionId of sessionIds) {
204
+ await this.stop(sessionId);
205
+ }
206
+ }
207
+ async ensureBrowser(session) {
208
+ const browserId = session.browserId;
209
+ await this.surfaceRegistry.stopSurface(browserId, "preview-refresh").catch(() => { });
210
+ const started = await this.surfaceRegistry.startSurface("browser", browserId, {
211
+ sessionId: session.sessionId,
212
+ workspaceRoot: session.workspaceRoot ?? process.cwd(),
213
+ });
214
+ if (started.type !== "browser") {
215
+ throw new Error("Preview browser surface failed to start");
216
+ }
217
+ const browser = started;
218
+ await browser.navigate(session.url);
219
+ session.browserEvents = browser.getEvents();
220
+ }
221
+ readBrowserEvents(session) {
222
+ if (!session.browserId)
223
+ return [];
224
+ const surface = this.surfaceRegistry.getSurface(session.browserId);
225
+ if (!surface || surface.type !== "browser" || surface.state !== "running")
226
+ return session.browserEvents;
227
+ return surface.getEvents();
228
+ }
229
+ appendLog(session, stream, text) {
230
+ const normalized = text.replace(/\r/g, "").split("\n").map((line) => line.trimEnd()).filter(Boolean);
231
+ if (normalized.length === 0)
232
+ return;
233
+ for (const line of normalized) {
234
+ pushBounded(session.logs, {
235
+ id: this.nextLogId++,
236
+ stream,
237
+ text: line,
238
+ timestamp: nowIso(),
239
+ }, MAX_PREVIEW_LOGS);
240
+ }
241
+ session.updatedAt = nowIso();
242
+ }
243
+ toPublicSession(session) {
244
+ return {
245
+ id: session.id,
246
+ sessionId: session.sessionId,
247
+ workspaceRoot: session.workspaceRoot,
248
+ mode: session.mode,
249
+ status: session.status,
250
+ target: session.target,
251
+ command: session.command,
252
+ port: session.port,
253
+ url: session.url,
254
+ browserId: session.browserId,
255
+ processId: session.processId,
256
+ containerId: session.containerId,
257
+ logs: [...session.logs],
258
+ browserEvents: [...session.browserEvents],
259
+ lastError: session.lastError,
260
+ createdAt: session.createdAt,
261
+ updatedAt: session.updatedAt,
262
+ };
263
+ }
264
+ }
265
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/services/preview.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,16 @@ export interface BrowserPageSnapshot {
11
11
  text: string;
12
12
  elements: BrowserInteractiveElement[];
13
13
  }
14
+ export interface BrowserRuntimeEvent {
15
+ id: number;
16
+ timestamp: string;
17
+ type: "console" | "pageerror" | "requestfailed" | "response";
18
+ level?: string;
19
+ text?: string;
20
+ url?: string;
21
+ method?: string;
22
+ status?: number;
23
+ }
14
24
  export interface BrowserDriver {
15
25
  navigate(url: string, signal?: AbortSignal): Promise<void>;
16
26
  click(selector: string, signal?: AbortSignal): Promise<void>;
@@ -20,6 +30,7 @@ export interface BrowserDriver {
20
30
  waitFor(selector: string, timeoutMs: number, signal?: AbortSignal): Promise<void>;
21
31
  screenshot(path?: string, signal?: AbortSignal): Promise<string>;
22
32
  snapshot(signal?: AbortSignal): Promise<BrowserPageSnapshot>;
33
+ getEvents(): BrowserRuntimeEvent[];
23
34
  close(): Promise<void>;
24
35
  }
25
36
  export interface BrowserSurfaceOptions {
@@ -52,6 +63,7 @@ export declare class BrowserSurface implements Surface {
52
63
  select(selector: string, value: string, signal?: AbortSignal): Promise<void>;
53
64
  waitFor(selector: string, timeoutMs: number, signal?: AbortSignal): Promise<void>;
54
65
  screenshot(path?: string, signal?: AbortSignal): Promise<string>;
66
+ getEvents(): BrowserRuntimeEvent[];
55
67
  private captureSnapshotMeta;
56
68
  private requireDriver;
57
69
  private _setState;
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/surfaces/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/surfaces/browser.ts"],"names":[],"mappings":"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"}