everything-dev 0.3.3 → 1.3.3

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 (313) hide show
  1. package/README.md +64 -0
  2. package/cli.js +10 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  4. package/dist/api-contract.cjs +172 -0
  5. package/dist/api-contract.cjs.map +1 -0
  6. package/dist/api-contract.mjs +171 -0
  7. package/dist/api-contract.mjs.map +1 -0
  8. package/dist/api.cjs +124 -0
  9. package/dist/api.cjs.map +1 -0
  10. package/dist/api.d.cts +36 -0
  11. package/dist/api.d.cts.map +1 -0
  12. package/dist/api.d.mts +36 -0
  13. package/dist/api.d.mts.map +1 -0
  14. package/dist/api.mjs +119 -0
  15. package/dist/api.mjs.map +1 -0
  16. package/dist/app.cjs +156 -0
  17. package/dist/app.cjs.map +1 -0
  18. package/dist/app.mjs +153 -0
  19. package/dist/app.mjs.map +1 -0
  20. package/dist/cli/catalog.cjs +30 -0
  21. package/dist/cli/catalog.cjs.map +1 -0
  22. package/dist/cli/catalog.mjs +29 -0
  23. package/dist/cli/catalog.mjs.map +1 -0
  24. package/dist/cli/help.cjs +16 -0
  25. package/dist/cli/help.cjs.map +1 -0
  26. package/dist/cli/help.mjs +16 -0
  27. package/dist/cli/help.mjs.map +1 -0
  28. package/dist/cli/init.cjs +287 -0
  29. package/dist/cli/init.cjs.map +1 -0
  30. package/dist/cli/init.d.cts +36 -0
  31. package/dist/cli/init.d.cts.map +1 -0
  32. package/dist/cli/init.d.mts +36 -0
  33. package/dist/cli/init.d.mts.map +1 -0
  34. package/dist/cli/init.mjs +279 -0
  35. package/dist/cli/init.mjs.map +1 -0
  36. package/dist/cli/parse.cjs +96 -0
  37. package/dist/cli/parse.cjs.map +1 -0
  38. package/dist/cli/parse.mjs +95 -0
  39. package/dist/cli/parse.mjs.map +1 -0
  40. package/dist/cli/prompts.cjs +42 -0
  41. package/dist/cli/prompts.cjs.map +1 -0
  42. package/dist/cli/prompts.mjs +41 -0
  43. package/dist/cli/prompts.mjs.map +1 -0
  44. package/dist/cli.cjs +167 -0
  45. package/dist/cli.cjs.map +1 -0
  46. package/dist/cli.d.cts +1 -0
  47. package/dist/cli.d.mts +1 -0
  48. package/dist/cli.mjs +166 -0
  49. package/dist/cli.mjs.map +1 -0
  50. package/dist/components/dev-view.cjs +307 -0
  51. package/dist/components/dev-view.cjs.map +1 -0
  52. package/dist/components/dev-view.mjs +306 -0
  53. package/dist/components/dev-view.mjs.map +1 -0
  54. package/dist/components/streaming-view.cjs +146 -0
  55. package/dist/components/streaming-view.cjs.map +1 -0
  56. package/dist/components/streaming-view.mjs +144 -0
  57. package/dist/components/streaming-view.mjs.map +1 -0
  58. package/dist/config.cjs +280 -0
  59. package/dist/config.cjs.map +1 -0
  60. package/dist/config.d.cts +35 -0
  61. package/dist/config.d.cts.map +1 -0
  62. package/dist/config.d.mts +35 -0
  63. package/dist/config.d.mts.map +1 -0
  64. package/dist/config.mjs +266 -0
  65. package/dist/config.mjs.map +1 -0
  66. package/dist/contract.cjs +209 -0
  67. package/dist/contract.cjs.map +1 -0
  68. package/dist/contract.d.cts +490 -0
  69. package/dist/contract.d.cts.map +1 -0
  70. package/dist/contract.d.mts +490 -0
  71. package/dist/contract.d.mts.map +1 -0
  72. package/dist/contract.meta.cjs +104 -0
  73. package/dist/contract.meta.cjs.map +1 -0
  74. package/dist/contract.meta.d.cts +141 -0
  75. package/dist/contract.meta.d.cts.map +1 -0
  76. package/dist/contract.meta.d.mts +141 -0
  77. package/dist/contract.meta.d.mts.map +1 -0
  78. package/dist/contract.meta.mjs +102 -0
  79. package/dist/contract.meta.mjs.map +1 -0
  80. package/dist/contract.mjs +186 -0
  81. package/dist/contract.mjs.map +1 -0
  82. package/dist/dev-logs.cjs +53 -0
  83. package/dist/dev-logs.cjs.map +1 -0
  84. package/dist/dev-logs.mjs +51 -0
  85. package/dist/dev-logs.mjs.map +1 -0
  86. package/dist/dev-session.cjs +195 -0
  87. package/dist/dev-session.cjs.map +1 -0
  88. package/dist/dev-session.mjs +194 -0
  89. package/dist/dev-session.mjs.map +1 -0
  90. package/dist/fastkv.cjs +89 -0
  91. package/dist/fastkv.cjs.map +1 -0
  92. package/dist/fastkv.d.cts +11 -0
  93. package/dist/fastkv.d.cts.map +1 -0
  94. package/dist/fastkv.d.mts +11 -0
  95. package/dist/fastkv.d.mts.map +1 -0
  96. package/dist/fastkv.mjs +82 -0
  97. package/dist/fastkv.mjs.map +1 -0
  98. package/dist/federation.server.cjs +27 -0
  99. package/dist/federation.server.cjs.map +1 -0
  100. package/dist/federation.server.mjs +27 -0
  101. package/dist/federation.server.mjs.map +1 -0
  102. package/dist/host.cjs +367 -0
  103. package/dist/host.cjs.map +1 -0
  104. package/dist/host.d.cts +22 -0
  105. package/dist/host.d.cts.map +1 -0
  106. package/dist/host.d.mts +22 -0
  107. package/dist/host.d.mts.map +1 -0
  108. package/dist/host.mjs +364 -0
  109. package/dist/host.mjs.map +1 -0
  110. package/dist/index.cjs +122 -0
  111. package/dist/index.d.cts +7 -0
  112. package/dist/index.d.mts +7 -0
  113. package/dist/index.mjs +9 -0
  114. package/dist/integrity.cjs +39 -0
  115. package/dist/integrity.cjs.map +1 -0
  116. package/dist/integrity.d.cts +7 -0
  117. package/dist/integrity.d.cts.map +1 -0
  118. package/dist/integrity.d.mts +7 -0
  119. package/dist/integrity.d.mts.map +1 -0
  120. package/dist/integrity.mjs +35 -0
  121. package/dist/integrity.mjs.map +1 -0
  122. package/dist/internal/manifest-normalizer.cjs +140 -0
  123. package/dist/internal/manifest-normalizer.cjs.map +1 -0
  124. package/dist/internal/manifest-normalizer.mjs +138 -0
  125. package/dist/internal/manifest-normalizer.mjs.map +1 -0
  126. package/dist/mf.cjs +77 -0
  127. package/dist/mf.cjs.map +1 -0
  128. package/dist/mf.d.cts +19 -0
  129. package/dist/mf.d.cts.map +1 -0
  130. package/dist/mf.d.mts +19 -0
  131. package/dist/mf.d.mts.map +1 -0
  132. package/dist/mf.mjs +71 -0
  133. package/dist/mf.mjs.map +1 -0
  134. package/dist/near-cli.cjs +196 -0
  135. package/dist/near-cli.cjs.map +1 -0
  136. package/dist/near-cli.mjs +193 -0
  137. package/dist/near-cli.mjs.map +1 -0
  138. package/dist/network.cjs +9 -0
  139. package/dist/network.cjs.map +1 -0
  140. package/dist/network.mjs +8 -0
  141. package/dist/network.mjs.map +1 -0
  142. package/dist/orchestrator.cjs +441 -0
  143. package/dist/orchestrator.cjs.map +1 -0
  144. package/dist/orchestrator.d.cts +40 -0
  145. package/dist/orchestrator.d.cts.map +1 -0
  146. package/dist/orchestrator.d.mts +40 -0
  147. package/dist/orchestrator.d.mts.map +1 -0
  148. package/dist/orchestrator.mjs +436 -0
  149. package/dist/orchestrator.mjs.map +1 -0
  150. package/dist/plugin.cjs +830 -0
  151. package/dist/plugin.cjs.map +1 -0
  152. package/dist/plugin.d.cts +347 -0
  153. package/dist/plugin.d.cts.map +1 -0
  154. package/dist/plugin.d.mts +348 -0
  155. package/dist/plugin.d.mts.map +1 -0
  156. package/dist/plugin.mjs +827 -0
  157. package/dist/plugin.mjs.map +1 -0
  158. package/dist/process-registry.cjs +120 -0
  159. package/dist/process-registry.cjs.map +1 -0
  160. package/dist/process-registry.d.cts +25 -0
  161. package/dist/process-registry.d.cts.map +1 -0
  162. package/dist/process-registry.d.mts +25 -0
  163. package/dist/process-registry.d.mts.map +1 -0
  164. package/dist/process-registry.mjs +119 -0
  165. package/dist/process-registry.mjs.map +1 -0
  166. package/dist/sdk.cjs +61 -0
  167. package/dist/sdk.d.cts +5 -0
  168. package/dist/sdk.d.mts +5 -0
  169. package/dist/sdk.mjs +6 -0
  170. package/dist/shared.cjs +143 -0
  171. package/dist/shared.cjs.map +1 -0
  172. package/dist/shared.d.cts +33 -0
  173. package/dist/shared.d.cts.map +1 -0
  174. package/dist/shared.d.mts +33 -0
  175. package/dist/shared.d.mts.map +1 -0
  176. package/dist/shared.mjs +140 -0
  177. package/dist/shared.mjs.map +1 -0
  178. package/dist/types.cjs +160 -0
  179. package/dist/types.cjs.map +1 -0
  180. package/dist/types.d.cts +269 -0
  181. package/dist/types.d.cts.map +1 -0
  182. package/dist/types.d.mts +269 -0
  183. package/dist/types.d.mts.map +1 -0
  184. package/dist/types.mjs +144 -0
  185. package/dist/types.mjs.map +1 -0
  186. package/dist/ui/head.cjs +67 -0
  187. package/dist/ui/head.cjs.map +1 -0
  188. package/dist/ui/head.d.cts +19 -0
  189. package/dist/ui/head.d.cts.map +1 -0
  190. package/dist/ui/head.d.mts +19 -0
  191. package/dist/ui/head.d.mts.map +1 -0
  192. package/dist/ui/head.mjs +61 -0
  193. package/dist/ui/head.mjs.map +1 -0
  194. package/dist/ui/index.cjs +32 -0
  195. package/dist/ui/index.d.cts +7 -0
  196. package/dist/ui/index.d.mts +7 -0
  197. package/dist/ui/index.mjs +6 -0
  198. package/dist/ui/metadata.cjs +106 -0
  199. package/dist/ui/metadata.cjs.map +1 -0
  200. package/dist/ui/metadata.d.cts +35 -0
  201. package/dist/ui/metadata.d.cts.map +1 -0
  202. package/dist/ui/metadata.d.mts +35 -0
  203. package/dist/ui/metadata.d.mts.map +1 -0
  204. package/dist/ui/metadata.mjs +100 -0
  205. package/dist/ui/metadata.mjs.map +1 -0
  206. package/dist/ui/router.cjs +56 -0
  207. package/dist/ui/router.cjs.map +1 -0
  208. package/dist/ui/router.d.cts +11 -0
  209. package/dist/ui/router.d.cts.map +1 -0
  210. package/dist/ui/router.d.mts +11 -0
  211. package/dist/ui/router.d.mts.map +1 -0
  212. package/dist/ui/router.mjs +51 -0
  213. package/dist/ui/router.mjs.map +1 -0
  214. package/dist/ui/runtime.cjs +65 -0
  215. package/dist/ui/runtime.cjs.map +1 -0
  216. package/dist/ui/runtime.d.cts +29 -0
  217. package/dist/ui/runtime.d.cts.map +1 -0
  218. package/dist/ui/runtime.d.mts +29 -0
  219. package/dist/ui/runtime.d.mts.map +1 -0
  220. package/dist/ui/runtime.mjs +53 -0
  221. package/dist/ui/runtime.mjs.map +1 -0
  222. package/dist/ui/types.cjs +0 -0
  223. package/dist/ui/types.d.cts +52 -0
  224. package/dist/ui/types.d.cts.map +1 -0
  225. package/dist/ui/types.d.mts +52 -0
  226. package/dist/ui/types.d.mts.map +1 -0
  227. package/dist/ui/types.mjs +1 -0
  228. package/dist/utils/banner.cjs +24 -0
  229. package/dist/utils/banner.cjs.map +1 -0
  230. package/dist/utils/banner.mjs +23 -0
  231. package/dist/utils/banner.mjs.map +1 -0
  232. package/dist/utils/linkify.cjs +15 -0
  233. package/dist/utils/linkify.cjs.map +1 -0
  234. package/dist/utils/linkify.mjs +14 -0
  235. package/dist/utils/linkify.mjs.map +1 -0
  236. package/dist/utils/run.cjs +40 -0
  237. package/dist/utils/run.cjs.map +1 -0
  238. package/dist/utils/run.mjs +39 -0
  239. package/dist/utils/run.mjs.map +1 -0
  240. package/dist/utils/theme.cjs +44 -0
  241. package/dist/utils/theme.cjs.map +1 -0
  242. package/dist/utils/theme.mjs +37 -0
  243. package/dist/utils/theme.mjs.map +1 -0
  244. package/package.json +269 -80
  245. package/src/api-contract.ts +309 -0
  246. package/src/api.ts +181 -0
  247. package/src/app.ts +346 -0
  248. package/src/cli/catalog.ts +49 -0
  249. package/src/cli/help.ts +13 -0
  250. package/src/cli/init.ts +386 -0
  251. package/src/cli/parse.ts +130 -0
  252. package/src/cli/prompts.ts +64 -0
  253. package/src/cli.ts +203 -1507
  254. package/src/components/dev-view.tsx +307 -255
  255. package/src/components/streaming-view.ts +164 -128
  256. package/src/config.ts +462 -532
  257. package/src/contract.meta.ts +96 -0
  258. package/src/contract.ts +164 -561
  259. package/src/dev-logs.ts +85 -0
  260. package/src/dev-session.ts +318 -0
  261. package/src/fastkv.ts +153 -0
  262. package/src/federation.server.ts +43 -0
  263. package/src/host.ts +526 -0
  264. package/src/index.ts +6 -3
  265. package/src/integrity.ts +54 -0
  266. package/src/internal/manifest-normalizer.ts +251 -0
  267. package/src/mf.ts +105 -0
  268. package/src/near-cli.ts +284 -0
  269. package/src/network.ts +3 -0
  270. package/src/orchestrator.ts +648 -0
  271. package/src/plugin.ts +1130 -2311
  272. package/src/process-registry.ts +154 -0
  273. package/src/scripts/sync-api-contract.ts +24 -0
  274. package/src/sdk.ts +14 -0
  275. package/src/shared.ts +206 -0
  276. package/src/types.ts +152 -206
  277. package/src/ui/head.ts +34 -27
  278. package/src/ui/index.ts +3 -3
  279. package/src/ui/metadata.ts +95 -0
  280. package/src/ui/router.ts +22 -6
  281. package/src/ui/runtime.ts +55 -6
  282. package/src/ui/types.ts +24 -11
  283. package/src/utils/banner.ts +10 -6
  284. package/src/utils/run.ts +26 -27
  285. package/src/utils/theme.ts +3 -66
  286. package/src/components/monitor-view.tsx +0 -475
  287. package/src/components/status-view.tsx +0 -173
  288. package/src/lib/env.ts +0 -109
  289. package/src/lib/near-cli.ts +0 -289
  290. package/src/lib/nova.ts +0 -266
  291. package/src/lib/orchestrator.ts +0 -276
  292. package/src/lib/process-registry.ts +0 -166
  293. package/src/lib/process.ts +0 -550
  294. package/src/lib/resource-monitor/assertions.ts +0 -234
  295. package/src/lib/resource-monitor/command.ts +0 -283
  296. package/src/lib/resource-monitor/diff.ts +0 -157
  297. package/src/lib/resource-monitor/errors.ts +0 -127
  298. package/src/lib/resource-monitor/index.ts +0 -305
  299. package/src/lib/resource-monitor/platform/darwin.ts +0 -306
  300. package/src/lib/resource-monitor/platform/index.ts +0 -35
  301. package/src/lib/resource-monitor/platform/linux.ts +0 -332
  302. package/src/lib/resource-monitor/platform/windows.ts +0 -298
  303. package/src/lib/resource-monitor/snapshot.ts +0 -217
  304. package/src/lib/resource-monitor/types.ts +0 -74
  305. package/src/lib/session-recorder/errors.ts +0 -102
  306. package/src/lib/session-recorder/flows/login.ts +0 -210
  307. package/src/lib/session-recorder/index.ts +0 -361
  308. package/src/lib/session-recorder/playwright.ts +0 -257
  309. package/src/lib/session-recorder/report.ts +0 -353
  310. package/src/lib/session-recorder/server.ts +0 -268
  311. package/src/lib/session-recorder/types.ts +0 -115
  312. package/src/lib/sync.ts +0 -1
  313. package/src/ui/files.ts +0 -134
@@ -1,268 +0,0 @@
1
- import { type ChildProcessWithoutNullStreams, spawn } from "node:child_process";
2
- import { dirname, resolve } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import { Effect } from "effect";
5
- import { createSnapshotWithPlatform, runSilent } from "../resource-monitor";
6
- import { ServerNotReady, ServerStartFailed } from "./errors";
7
- import type { ServerHandle, ServerOrchestrator } from "./types";
8
-
9
- const __dirname = dirname(fileURLToPath(import.meta.url));
10
- const CLI_DIR = resolve(__dirname, "../../..");
11
-
12
- const sleep = (ms: number): Promise<void> =>
13
- new Promise((resolve) => setTimeout(resolve, ms));
14
-
15
- interface SpawnOptions {
16
- port?: number;
17
- account?: string;
18
- domain?: string;
19
- interactive?: boolean;
20
- }
21
-
22
- const createServerHandle = (
23
- proc: ReturnType<typeof spawn>,
24
- name: string,
25
- port: number,
26
- ): ServerHandle => {
27
- proc.stdout?.on("data", () => {});
28
- proc.stderr?.on("data", () => {});
29
-
30
- let exitHandled = false;
31
- let exitCode: number | null = null;
32
- const exitPromise = new Promise<number | null>((resolve) => {
33
- (proc as unknown as NodeJS.EventEmitter).on(
34
- "exit",
35
- (code: number | null) => {
36
- exitHandled = true;
37
- exitCode = code;
38
- resolve(code);
39
- },
40
- );
41
- });
42
-
43
- return {
44
- pid: proc.pid!,
45
- port,
46
- name,
47
- kill: async () => {
48
- proc.kill("SIGTERM");
49
- const killPromise = new Promise<void>((res) => {
50
- const timeout = setTimeout(() => {
51
- proc.kill("SIGKILL");
52
- res();
53
- }, 5000);
54
- if (exitHandled) {
55
- clearTimeout(timeout);
56
- res();
57
- } else {
58
- exitPromise.then(() => {
59
- clearTimeout(timeout);
60
- res();
61
- });
62
- }
63
- });
64
- await killPromise;
65
- },
66
- waitForExit: (timeoutMs = 10000): Promise<number | null> =>
67
- new Promise((res) => {
68
- const timeout = setTimeout(() => res(null), timeoutMs);
69
- if (exitHandled) {
70
- clearTimeout(timeout);
71
- res(exitCode);
72
- } else {
73
- exitPromise.then((code) => {
74
- clearTimeout(timeout);
75
- res(code);
76
- });
77
- }
78
- }),
79
- };
80
- };
81
-
82
- const spawnBosStart = (options: SpawnOptions = {}): ServerHandle => {
83
- const args = [
84
- "src/cli.ts",
85
- "start",
86
- "--account",
87
- options.account || "every.near",
88
- "--domain",
89
- options.domain || "everything.dev",
90
- ];
91
-
92
- if (!options.interactive) {
93
- args.push("--no-interactive");
94
- }
95
-
96
- if (options.port) {
97
- args.push("--port", String(options.port));
98
- }
99
-
100
- const proc = spawn("bun", args, {
101
- cwd: CLI_DIR,
102
- stdio: ["ignore", "pipe", "pipe"],
103
- detached: false,
104
- env: { ...process.env, NODE_ENV: "production" },
105
- });
106
-
107
- return createServerHandle(proc, "bos-start", options.port || 3000);
108
- };
109
-
110
- const spawnBosDev = (options: SpawnOptions = {}): ServerHandle => {
111
- const args = ["src/cli.ts", "dev"];
112
-
113
- if (!options.interactive) {
114
- args.push("--no-interactive");
115
- }
116
-
117
- if (options.port) {
118
- args.push("--port", String(options.port));
119
- }
120
-
121
- const proc = spawn("bun", args, {
122
- cwd: CLI_DIR,
123
- stdio: ["ignore", "pipe", "pipe"],
124
- detached: false,
125
- env: { ...process.env, NODE_ENV: "development" },
126
- });
127
-
128
- return createServerHandle(proc, "bos-dev", options.port || 3000);
129
- };
130
-
131
- const waitForPortBound = async (
132
- port: number,
133
- timeoutMs = 60000,
134
- ): Promise<boolean> => {
135
- const start = Date.now();
136
-
137
- while (Date.now() - start < timeoutMs) {
138
- try {
139
- const snapshot = await runSilent(
140
- createSnapshotWithPlatform({ ports: [port] }),
141
- );
142
- if (snapshot.ports[port]?.state === "LISTEN") {
143
- return true;
144
- }
145
- } catch {
146
- // ignore errors during polling
147
- }
148
- await sleep(500);
149
- }
150
-
151
- return false;
152
- };
153
-
154
- const waitForPortFree = async (
155
- port: number,
156
- timeoutMs = 15000,
157
- ): Promise<boolean> => {
158
- const start = Date.now();
159
-
160
- while (Date.now() - start < timeoutMs) {
161
- try {
162
- const snapshot = await runSilent(
163
- createSnapshotWithPlatform({ ports: [port] }),
164
- );
165
- if (snapshot.ports[port]?.state === "FREE") {
166
- return true;
167
- }
168
- } catch {
169
- // ignore errors during polling
170
- }
171
- await sleep(200);
172
- }
173
-
174
- return false;
175
- };
176
-
177
- export const startServers = (
178
- mode: "start" | "dev" = "start",
179
- options: SpawnOptions = {},
180
- ): Effect.Effect<ServerOrchestrator, ServerStartFailed | ServerNotReady> =>
181
- Effect.gen(function* () {
182
- const port = options.port || 3000;
183
-
184
- yield* Effect.logInfo(`Starting BOS in ${mode} mode on port ${port}`);
185
-
186
- const handle =
187
- mode === "dev" ? spawnBosDev(options) : spawnBosStart(options);
188
-
189
- const ready = yield* Effect.tryPromise({
190
- try: () => waitForPortBound(port, 90000),
191
- catch: (e) =>
192
- new ServerStartFailed({
193
- server: handle.name,
194
- port,
195
- reason: String(e),
196
- }),
197
- });
198
-
199
- if (!ready) {
200
- yield* Effect.promise(() => handle.kill());
201
- return yield* Effect.fail(
202
- new ServerNotReady({
203
- servers: [handle.name],
204
- timeoutMs: 90000,
205
- }),
206
- );
207
- }
208
-
209
- yield* Effect.logInfo(`Server ready on port ${port}`);
210
-
211
- const orchestrator: ServerOrchestrator = {
212
- handles: [handle],
213
- ports: [port],
214
- shutdown: async () => {
215
- console.log("Shutting down servers");
216
- await handle.kill();
217
- await waitForPortFree(port, 15000);
218
- console.log("Servers stopped");
219
- },
220
- waitForReady: async () => {
221
- return waitForPortBound(port, 30000);
222
- },
223
- };
224
-
225
- return orchestrator;
226
- });
227
-
228
- export const shutdownServers = (
229
- orchestrator: ServerOrchestrator,
230
- ): Effect.Effect<void> =>
231
- Effect.gen(function* () {
232
- yield* Effect.logInfo(
233
- `Shutting down ${orchestrator.handles.length} server(s)`,
234
- );
235
-
236
- for (const handle of orchestrator.handles) {
237
- yield* Effect.logDebug(`Killing ${handle.name} (PID ${handle.pid})`);
238
- yield* Effect.promise(() => handle.kill());
239
- }
240
-
241
- for (const port of orchestrator.ports) {
242
- yield* Effect.logDebug(`Waiting for port ${port} to be free`);
243
- const freed = yield* Effect.promise(() => waitForPortFree(port, 15000));
244
- if (!freed) {
245
- yield* Effect.logWarning(`Port ${port} still bound after shutdown`);
246
- }
247
- }
248
-
249
- yield* Effect.logInfo("All servers stopped");
250
- });
251
-
252
- export const checkPortsAvailable = (ports: number[]): Effect.Effect<boolean> =>
253
- Effect.gen(function* () {
254
- const snapshot = yield* Effect.promise(() =>
255
- runSilent(createSnapshotWithPlatform({ ports })),
256
- );
257
-
258
- for (const port of ports) {
259
- if (snapshot.ports[port]?.state !== "FREE") {
260
- yield* Effect.logWarning(`Port ${port} is already in use`);
261
- return false;
262
- }
263
- }
264
-
265
- return true;
266
- });
267
-
268
- export { waitForPortBound, waitForPortFree };
@@ -1,115 +0,0 @@
1
- import type { Snapshot } from "../resource-monitor";
2
-
3
- export interface SessionConfig {
4
- ports: number[];
5
- snapshotIntervalMs: number;
6
- headless: boolean;
7
- baseUrl: string;
8
- timeout: number;
9
- outputPath?: string;
10
- devMode?: "local" | "remote";
11
- }
12
-
13
- export interface BrowserMetrics {
14
- jsHeapUsedSize: number;
15
- jsHeapTotalSize: number;
16
- documents: number;
17
- frames: number;
18
- jsEventListeners: number;
19
- nodes: number;
20
- layoutCount: number;
21
- recalcStyleCount: number;
22
- scriptDuration: number;
23
- taskDuration: number;
24
- }
25
-
26
- export type SessionEventType =
27
- | "baseline"
28
- | "interval"
29
- | "pageload"
30
- | "navigation"
31
- | "click"
32
- | "popup_open"
33
- | "popup_close"
34
- | "auth_start"
35
- | "auth_complete"
36
- | "auth_failed"
37
- | "error"
38
- | "custom";
39
-
40
- export interface SessionEvent {
41
- id: string;
42
- timestamp: number;
43
- type: SessionEventType;
44
- label: string;
45
- snapshot: Snapshot;
46
- browserMetrics?: BrowserMetrics;
47
- url?: string;
48
- error?: string;
49
- metadata?: Record<string, unknown>;
50
- }
51
-
52
- export interface SessionSummary {
53
- totalMemoryDeltaMb: number;
54
- peakMemoryMb: number;
55
- averageMemoryMb: number;
56
- processesSpawned: number;
57
- processesKilled: number;
58
- orphanedProcesses: number;
59
- portsUsed: number[];
60
- portsLeaked: number;
61
- hasLeaks: boolean;
62
- eventCount: number;
63
- duration: number;
64
- browserMetricsSummary?: {
65
- peakJsHeapMb: number;
66
- averageJsHeapMb: number;
67
- totalLayoutCount: number;
68
- totalScriptDuration: number;
69
- };
70
- }
71
-
72
- export interface SessionReport {
73
- sessionId: string;
74
- config: SessionConfig;
75
- startTime: number;
76
- endTime: number;
77
- events: SessionEvent[];
78
- summary: SessionSummary;
79
- platform: NodeJS.Platform;
80
- nodeVersion: string;
81
- }
82
-
83
- export interface ServerHandle {
84
- pid: number;
85
- port: number;
86
- name: string;
87
- kill: () => Promise<void>;
88
- waitForExit: (timeoutMs?: number) => Promise<number | null>;
89
- }
90
-
91
- export interface ServerOrchestrator {
92
- handles: ServerHandle[];
93
- ports: number[];
94
- shutdown: () => Promise<void>;
95
- waitForReady: () => Promise<boolean>;
96
- }
97
-
98
- export type SessionFlow = (context: FlowContext) => Promise<void>;
99
-
100
- export interface FlowContext {
101
- page: unknown;
102
- context: unknown;
103
- recordEvent: (type: SessionEventType, label: string, metadata?: Record<string, unknown>) => Promise<void>;
104
- headless: boolean;
105
- baseUrl: string;
106
- }
107
-
108
- export const DEFAULT_SESSION_CONFIG: SessionConfig = {
109
- ports: [3000, 3002, 3014],
110
- snapshotIntervalMs: 2000,
111
- headless: true,
112
- baseUrl: "http://localhost:3000",
113
- timeout: 120000,
114
- devMode: "remote",
115
- };
package/src/lib/sync.ts DELETED
@@ -1 +0,0 @@
1
- export { syncFiles, type FileSyncOptions, type FileSyncResult } from "../ui/files";
package/src/ui/files.ts DELETED
@@ -1,134 +0,0 @@
1
- import { execa } from "execa";
2
- import { cp, mkdir, mkdtemp, rm } from "fs/promises";
3
- import { tmpdir } from "os";
4
- import { dirname, join } from "path";
5
-
6
- export interface FileSyncResult {
7
- package: string;
8
- files: string[];
9
- depsAdded?: string[];
10
- depsUpdated?: string[];
11
- }
12
-
13
- export interface FileSyncOptions {
14
- configDir: string;
15
- packages: string[];
16
- bosConfig: {
17
- app: Record<string, {
18
- template?: string;
19
- files?: string[];
20
- sync?: { dependencies?: boolean; devDependencies?: boolean };
21
- }>;
22
- };
23
- catalog?: Record<string, string>;
24
- force?: boolean;
25
- }
26
-
27
- export async function syncFiles(options: FileSyncOptions): Promise<FileSyncResult[]> {
28
- const { configDir, packages, bosConfig, catalog = {}, force } = options;
29
- const results: FileSyncResult[] = [];
30
-
31
- for (const pkg of packages) {
32
- const pkgDir = `${configDir}/${pkg}`;
33
- const pkgDirExists = await Bun.file(`${pkgDir}/package.json`).exists();
34
- if (!pkgDirExists) continue;
35
-
36
- const appConfig = bosConfig.app[pkg];
37
-
38
- if (!appConfig?.template || !appConfig?.files) {
39
- continue;
40
- }
41
-
42
- const tempDir = await mkdtemp(join(tmpdir(), `bos-files-${pkg}-`));
43
-
44
- try {
45
- await execa("npx", ["degit", appConfig.template, tempDir, "--force"], {
46
- stdio: "pipe",
47
- });
48
-
49
- const filesSynced: string[] = [];
50
- const depsAdded: string[] = [];
51
- const depsUpdated: string[] = [];
52
-
53
- for (const file of appConfig.files) {
54
- const srcPath = join(tempDir, file);
55
- const destPath = join(pkgDir, file);
56
-
57
- try {
58
- const destDir = dirname(destPath);
59
- await mkdir(destDir, { recursive: true });
60
- await cp(srcPath, destPath, { force: true, recursive: true });
61
- filesSynced.push(file);
62
- } catch {
63
- }
64
- }
65
-
66
- const syncConfig = appConfig.sync ?? { dependencies: true, devDependencies: true };
67
-
68
- if (syncConfig.dependencies !== false || syncConfig.devDependencies !== false) {
69
- const templatePkgPath = join(tempDir, "package.json");
70
- const localPkgPath = join(pkgDir, "package.json");
71
-
72
- try {
73
- const templatePkg = await Bun.file(templatePkgPath).json() as {
74
- dependencies?: Record<string, string>;
75
- devDependencies?: Record<string, string>;
76
- scripts?: Record<string, string>;
77
- };
78
- const localPkg = await Bun.file(localPkgPath).json() as {
79
- dependencies?: Record<string, string>;
80
- devDependencies?: Record<string, string>;
81
- scripts?: Record<string, string>;
82
- };
83
-
84
- if (syncConfig.dependencies !== false && templatePkg.dependencies) {
85
- if (!localPkg.dependencies) localPkg.dependencies = {};
86
- for (const [name, version] of Object.entries(templatePkg.dependencies)) {
87
- if (!(name in localPkg.dependencies)) {
88
- localPkg.dependencies[name] = name in catalog ? "catalog:" : version;
89
- depsAdded.push(name);
90
- } else if (localPkg.dependencies[name] !== "catalog:" && version !== localPkg.dependencies[name]) {
91
- localPkg.dependencies[name] = name in catalog ? "catalog:" : version;
92
- depsUpdated.push(name);
93
- }
94
- }
95
- }
96
-
97
- if (syncConfig.devDependencies !== false && templatePkg.devDependencies) {
98
- if (!localPkg.devDependencies) localPkg.devDependencies = {};
99
- for (const [name, version] of Object.entries(templatePkg.devDependencies)) {
100
- if (!(name in localPkg.devDependencies)) {
101
- localPkg.devDependencies[name] = name in catalog ? "catalog:" : version;
102
- depsAdded.push(name);
103
- } else if (localPkg.devDependencies[name] !== "catalog:" && version !== localPkg.devDependencies[name]) {
104
- localPkg.devDependencies[name] = name in catalog ? "catalog:" : version;
105
- depsUpdated.push(name);
106
- }
107
- }
108
- }
109
-
110
- if (templatePkg.scripts) {
111
- if (!localPkg.scripts) localPkg.scripts = {};
112
- for (const [name, script] of Object.entries(templatePkg.scripts)) {
113
- localPkg.scripts[name] = script;
114
- }
115
- }
116
-
117
- await Bun.write(localPkgPath, JSON.stringify(localPkg, null, 2));
118
- } catch {
119
- }
120
- }
121
-
122
- results.push({
123
- package: pkg,
124
- files: filesSynced,
125
- depsAdded: depsAdded.length > 0 ? depsAdded : undefined,
126
- depsUpdated: depsUpdated.length > 0 ? depsUpdated : undefined,
127
- });
128
- } finally {
129
- await rm(tempDir, { recursive: true, force: true });
130
- }
131
- }
132
-
133
- return results;
134
- }