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,550 +0,0 @@
1
- import { Deferred, Effect, Fiber, Ref } from "every-plugin/effect";
2
- import type { ProcessStatus } from "../components/dev-view";
3
- import {
4
- type BosConfig,
5
- getProjectRoot,
6
- parsePort,
7
- type RemoteConfig,
8
- type SourceMode,
9
- } from "../config";
10
- import type { RuntimeConfig } from "../types";
11
-
12
- export interface DevProcess {
13
- name: string;
14
- command: string;
15
- args: string[];
16
- cwd: string;
17
- env?: Record<string, string>;
18
- port: number;
19
- readyPatterns: RegExp[];
20
- errorPatterns: RegExp[];
21
- }
22
-
23
- interface ProcessConfigBase {
24
- name: string;
25
- command: string;
26
- args: string[];
27
- cwd: string;
28
- readyPatterns: RegExp[];
29
- errorPatterns: RegExp[];
30
- }
31
-
32
- const processConfigBases: Record<string, ProcessConfigBase> = {
33
- host: {
34
- name: "host",
35
- command: "bun",
36
- args: ["run", "dev"],
37
- cwd: "host",
38
- readyPatterns: [/Host (dev|production) server running at/i],
39
- errorPatterns: [/error:/i, /failed/i, /exception/i],
40
- },
41
- ui: {
42
- name: "ui",
43
- command: "bun",
44
- args: ["run", "dev"],
45
- cwd: "ui",
46
- readyPatterns: [/ready in/i, /compiled.*successfully/i, /➜.*local:/i],
47
- errorPatterns: [/error/i, /failed to compile/i],
48
- },
49
- "ui-ssr": {
50
- name: "ui-ssr",
51
- command: "bun",
52
- args: ["run", "build:ssr", "--watch"],
53
- cwd: "ui",
54
- readyPatterns: [/compiled.*successfully/i, /built in/i],
55
- errorPatterns: [/error/i, /failed/i],
56
- },
57
- api: {
58
- name: "api",
59
- command: "bun",
60
- args: ["run", "dev"],
61
- cwd: "api",
62
- readyPatterns: [/Plugin dev server ready/i, /listening/i, /started/i],
63
- errorPatterns: [/error/i, /failed/i],
64
- },
65
- };
66
-
67
- export const getProcessConfig = (
68
- pkg: string,
69
- env?: Record<string, string>,
70
- portOverride?: number,
71
- bosConfig?: BosConfig,
72
- ): DevProcess | null => {
73
- const base = processConfigBases[pkg];
74
- if (!base) return null;
75
-
76
- // Use config if provided, otherwise defaults
77
- let port: number;
78
- if (pkg === "host") {
79
- port =
80
- portOverride ??
81
- (bosConfig ? parsePort(bosConfig.app.host.development) : 3000);
82
- } else if (pkg === "ui") {
83
- port = bosConfig?.app?.ui
84
- ? parsePort((bosConfig.app.ui as RemoteConfig).development)
85
- : 3002;
86
- } else if (pkg === "ui-ssr") {
87
- // SSR build watcher doesn't need a port (build process, not server)
88
- port = 0;
89
- } else if (pkg === "api") {
90
- port = bosConfig?.app?.api
91
- ? parsePort((bosConfig.app.api as RemoteConfig).development)
92
- : 3014;
93
- } else {
94
- port = 0;
95
- }
96
-
97
- // Set BUILD_TARGET for SSR build process
98
- const processEnv =
99
- pkg === "ui-ssr" ? { ...env, BUILD_TARGET: "server" } : env;
100
-
101
- return { ...base, port, env: processEnv };
102
- };
103
-
104
- export interface ProcessCallbacks {
105
- onStatus: (name: string, status: ProcessStatus, message?: string) => void;
106
- onLog: (name: string, line: string, isError?: boolean) => void;
107
- }
108
-
109
- export interface ProcessHandle {
110
- name: string;
111
- pid: number | undefined;
112
- kill: () => Promise<void>;
113
- waitForReady: Effect.Effect<void>;
114
- waitForExit: Effect.Effect<unknown, unknown>;
115
- }
116
-
117
- const detectStatus = (
118
- line: string,
119
- config: DevProcess,
120
- ): { status: ProcessStatus; isError: boolean } | null => {
121
- for (const pattern of config.errorPatterns) {
122
- if (pattern.test(line)) {
123
- return { status: "error", isError: true };
124
- }
125
- }
126
- for (const pattern of config.readyPatterns) {
127
- if (pattern.test(line)) {
128
- return { status: "ready", isError: false };
129
- }
130
- }
131
- return null;
132
- };
133
-
134
- const killProcessTree = (pid: number) =>
135
- Effect.gen(function* () {
136
- const killSignal = (signal: NodeJS.Signals) =>
137
- Effect.try({
138
- try: () => {
139
- process.kill(-pid, signal);
140
- },
141
- catch: () => null,
142
- }).pipe(Effect.ignore);
143
-
144
- const killDirect = (signal: NodeJS.Signals) =>
145
- Effect.try({
146
- try: () => {
147
- process.kill(pid, signal);
148
- },
149
- catch: () => null,
150
- }).pipe(Effect.ignore);
151
-
152
- const isRunning = () =>
153
- Effect.try({
154
- try: () => {
155
- process.kill(pid, 0);
156
- return true;
157
- },
158
- catch: () => false,
159
- });
160
-
161
- yield* killSignal("SIGTERM");
162
- yield* killDirect("SIGTERM");
163
-
164
- yield* Effect.sleep("200 millis");
165
-
166
- const stillRunning = yield* isRunning();
167
- if (stillRunning) {
168
- yield* killSignal("SIGKILL");
169
- yield* killDirect("SIGKILL");
170
- yield* Effect.sleep("100 millis");
171
- }
172
- });
173
-
174
- export function buildRuntimeConfig(
175
- bosConfig: BosConfig,
176
- options: {
177
- uiSource: SourceMode;
178
- apiSource: SourceMode;
179
- hostUrl: string;
180
- proxy?: string;
181
- env?: "development" | "production";
182
- },
183
- ): RuntimeConfig {
184
- const uiConfig = bosConfig.app.ui as RemoteConfig;
185
- const apiConfig = bosConfig.app.api as RemoteConfig;
186
-
187
- return {
188
- env: options.env ?? "development",
189
- account: bosConfig.account,
190
- hostUrl: options.hostUrl,
191
- shared: (bosConfig as { shared?: { ui?: Record<string, unknown> } })
192
- .shared as RuntimeConfig["shared"],
193
- ui: {
194
- name: uiConfig.name,
195
- url:
196
- options.uiSource === "remote"
197
- ? uiConfig.production
198
- : uiConfig.development,
199
- entry: `${
200
- options.uiSource === "remote"
201
- ? uiConfig.production
202
- : uiConfig.development
203
- }/remoteEntry.js`,
204
- source: options.uiSource,
205
- ssrUrl: uiConfig.ssr,
206
- },
207
- api: {
208
- name: apiConfig.name,
209
- url:
210
- options.apiSource === "remote"
211
- ? apiConfig.production
212
- : apiConfig.development,
213
- entry: `${
214
- options.apiSource === "remote"
215
- ? apiConfig.production
216
- : apiConfig.development
217
- }/remoteEntry.js`,
218
- source: options.apiSource,
219
- proxy: options.proxy,
220
- variables: apiConfig.variables,
221
- secrets: apiConfig.secrets,
222
- },
223
- };
224
- }
225
-
226
- export const spawnDevProcess = (
227
- config: DevProcess,
228
- callbacks: ProcessCallbacks,
229
- runtimeConfig?: RuntimeConfig,
230
- ) =>
231
- Effect.gen(function* () {
232
- let configDir: string;
233
- try {
234
- configDir = getProjectRoot();
235
- } catch {
236
- configDir = process.cwd();
237
- }
238
- const fullCwd = `${configDir}/${config.cwd}`;
239
- const readyDeferred = yield* Deferred.make<void>();
240
- const statusRef = yield* Ref.make<ProcessStatus>("starting");
241
-
242
- callbacks.onStatus(config.name, "starting");
243
-
244
- const envVars: Record<string, string> = {
245
- ...(process.env as Record<string, string>),
246
- ...config.env,
247
- FORCE_COLOR: "1",
248
- ...(config.port > 0 ? { PORT: String(config.port) } : {}),
249
- };
250
-
251
- if (runtimeConfig && config.name === "host") {
252
- envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);
253
- }
254
-
255
- // Spawn process using Bun.spawn (replaces @effect/platform Command)
256
- const proc = Bun.spawn({
257
- cmd: [config.command, ...config.args],
258
- cwd: fullCwd,
259
- env: envVars,
260
- stdio: ["inherit", "pipe", "pipe"],
261
- });
262
-
263
- const handleLine = (line: string, isStderr: boolean) =>
264
- Effect.gen(function* () {
265
- if (!line.trim()) return;
266
-
267
- callbacks.onLog(config.name, line, isStderr);
268
-
269
- const currentStatus = yield* Ref.get(statusRef);
270
- if (currentStatus === "ready") return;
271
-
272
- const detected = detectStatus(line, config);
273
- if (detected) {
274
- yield* Ref.set(statusRef, detected.status);
275
- callbacks.onStatus(config.name, detected.status);
276
- if (detected.status === "ready") {
277
- yield* Deferred.succeed(readyDeferred, undefined);
278
- }
279
- }
280
- });
281
-
282
- // Read stdout and stderr using raw stream readers (replaces Effect Stream)
283
- const decoder = new TextDecoder();
284
-
285
- const stdoutFiber = yield* Effect.fork(
286
- Effect.async<void>((resume) => {
287
- if (!proc.stdout) {
288
- resume(Effect.void);
289
- return;
290
- }
291
- const reader = proc.stdout.getReader();
292
- let buffer = "";
293
-
294
- const pump = (): Promise<void> =>
295
- reader.read().then(({ done, value }) => {
296
- if (done) {
297
- if (buffer) {
298
- Effect.runSync(handleLine(buffer, false));
299
- }
300
- return;
301
- }
302
- buffer += decoder.decode(value, { stream: true });
303
- const lines = buffer.split("\n");
304
- buffer = lines.pop() ?? "";
305
- for (const line of lines) {
306
- Effect.runSync(handleLine(line, false));
307
- }
308
- return pump();
309
- });
310
-
311
- pump().then(() => resume(Effect.void));
312
- }),
313
- );
314
-
315
- const stderrFiber = yield* Effect.fork(
316
- Effect.async<void>((resume) => {
317
- if (!proc.stderr) {
318
- resume(Effect.void);
319
- return;
320
- }
321
- const reader = proc.stderr.getReader();
322
- let buffer = "";
323
-
324
- const pump = (): Promise<void> =>
325
- reader.read().then(({ done, value }) => {
326
- if (done) {
327
- if (buffer) {
328
- Effect.runSync(handleLine(buffer, true));
329
- }
330
- return;
331
- }
332
- buffer += decoder.decode(value, { stream: true });
333
- const lines = buffer.split("\n");
334
- buffer = lines.pop() ?? "";
335
- for (const line of lines) {
336
- Effect.runSync(handleLine(line, true));
337
- }
338
- return pump();
339
- });
340
-
341
- pump().then(() => resume(Effect.void));
342
- }),
343
- );
344
-
345
- const handle: ProcessHandle = {
346
- name: config.name,
347
- pid: proc.pid,
348
- kill: async () => {
349
- const pid = proc.pid;
350
- if (pid) {
351
- await Effect.runPromise(killProcessTree(pid));
352
- } else {
353
- proc.kill("SIGTERM");
354
- await new Promise((r) => setTimeout(r, 100));
355
- try {
356
- proc.kill("SIGKILL");
357
- } catch {}
358
- }
359
- },
360
- waitForReady: Deferred.await(readyDeferred),
361
- waitForExit: Effect.gen(function* () {
362
- yield* Fiber.joinAll([stdoutFiber, stderrFiber]);
363
- return yield* Effect.promise(() => proc.exited);
364
- }),
365
- };
366
-
367
- return handle;
368
- });
369
-
370
- interface ServerHandle {
371
- ready: Promise<void>;
372
- shutdown: () => Promise<void>;
373
- }
374
-
375
- interface ServerInput {
376
- config: RuntimeConfig;
377
- }
378
-
379
- const patchConsole = (
380
- name: string,
381
- callbacks: ProcessCallbacks,
382
- ): (() => void) => {
383
- const originalLog = console.log;
384
- const originalError = console.error;
385
- const originalWarn = console.warn;
386
- const originalInfo = console.info;
387
-
388
- const formatArgs = (args: unknown[]): string => {
389
- return args
390
- .map((arg) =>
391
- typeof arg === "object" ? JSON.stringify(arg, null, 2) : String(arg),
392
- )
393
- .join(" ");
394
- };
395
-
396
- console.log = (...args: unknown[]) => {
397
- callbacks.onLog(name, formatArgs(args), false);
398
- };
399
-
400
- console.error = (...args: unknown[]) => {
401
- callbacks.onLog(name, formatArgs(args), true);
402
- };
403
-
404
- console.warn = (...args: unknown[]) => {
405
- callbacks.onLog(name, formatArgs(args), false);
406
- };
407
-
408
- console.info = (...args: unknown[]) => {
409
- callbacks.onLog(name, formatArgs(args), false);
410
- };
411
-
412
- return () => {
413
- console.log = originalLog;
414
- console.error = originalError;
415
- console.warn = originalWarn;
416
- console.info = originalInfo;
417
- };
418
- };
419
-
420
- export const spawnRemoteHost = (
421
- config: DevProcess,
422
- callbacks: ProcessCallbacks,
423
- runtimeConfig: RuntimeConfig,
424
- ) =>
425
- Effect.gen(function* () {
426
- const remoteUrl = config.env?.HOST_REMOTE_URL;
427
-
428
- if (!remoteUrl) {
429
- return yield* Effect.fail(
430
- new Error("HOST_REMOTE_URL not provided for remote host"),
431
- );
432
- }
433
-
434
- if (config.env) {
435
- for (const [key, value] of Object.entries(config.env)) {
436
- process.env[key] = value;
437
- }
438
- }
439
-
440
- callbacks.onStatus(config.name, "starting");
441
-
442
- callbacks.onLog(config.name, `Remote: ${remoteUrl}`);
443
-
444
- const restoreConsole = patchConsole(config.name, callbacks);
445
-
446
- callbacks.onLog(config.name, "Loading Module Federation runtime...");
447
-
448
- const mfRuntime = yield* Effect.tryPromise({
449
- try: () => import("@module-federation/enhanced/runtime"),
450
- catch: (e) => new Error(`Failed to load MF runtime: ${e}`),
451
- });
452
-
453
- const mfCore = yield* Effect.tryPromise({
454
- try: () => import("@module-federation/runtime-core"),
455
- catch: (e) => new Error(`Failed to load MF core: ${e}`),
456
- });
457
-
458
- let mf = mfRuntime.getInstance();
459
- if (!mf) {
460
- mf = mfRuntime.createInstance({ name: "cli-host", remotes: [] });
461
- mfCore.setGlobalFederationInstance(mf);
462
- }
463
-
464
- const remoteEntryUrl = remoteUrl.endsWith("/remoteEntry.js")
465
- ? remoteUrl
466
- : `${remoteUrl}/remoteEntry.js`;
467
-
468
- mf.registerRemotes([{ name: "host", entry: remoteEntryUrl }]);
469
-
470
- callbacks.onLog(config.name, `Loading host from ${remoteEntryUrl}...`);
471
-
472
- const hostModule = yield* Effect.tryPromise({
473
- try: () =>
474
- mf.loadRemote<{ runServer: (input: ServerInput) => ServerHandle }>(
475
- "host/Server",
476
- ),
477
- catch: (e) => new Error(`Failed to load host module: ${e}`),
478
- });
479
-
480
- if (!hostModule?.runServer) {
481
- return yield* Effect.fail(
482
- new Error("Host module does not export runServer function"),
483
- );
484
- }
485
-
486
- callbacks.onLog(config.name, "Starting server...");
487
- const serverHandle = hostModule.runServer({ config: runtimeConfig });
488
-
489
- yield* Effect.tryPromise({
490
- try: () => serverHandle.ready,
491
- catch: (e) => new Error(`Server failed to start: ${e}`),
492
- });
493
-
494
- callbacks.onStatus(config.name, "ready");
495
-
496
- const handle: ProcessHandle = {
497
- name: config.name,
498
- pid: process.pid,
499
- kill: async () => {
500
- callbacks.onLog(config.name, "Shutting down remote host...");
501
- restoreConsole();
502
- await serverHandle.shutdown();
503
- },
504
- waitForReady: Effect.void,
505
- waitForExit: Effect.never,
506
- };
507
-
508
- return handle;
509
- });
510
-
511
- export const makeDevProcess = (
512
- pkg: string,
513
- env: Record<string, string> | undefined,
514
- callbacks: ProcessCallbacks,
515
- portOverride?: number,
516
- bosConfig?: BosConfig,
517
- ) =>
518
- Effect.gen(function* () {
519
- const config = getProcessConfig(pkg, env, portOverride);
520
- if (!config) {
521
- return yield* Effect.fail(new Error(`Unknown package: ${pkg}`));
522
- }
523
-
524
- if (pkg === "host" && bosConfig) {
525
- const uiSource = (env?.UI_SOURCE as SourceMode) ?? "local";
526
- const apiSource = (env?.API_SOURCE as SourceMode) ?? "local";
527
- const apiProxy = env?.API_PROXY;
528
-
529
- let hostUrl = `http://localhost:${config.port}`;
530
- if (process.env.HOST_URL) {
531
- hostUrl = process.env.HOST_URL;
532
- }
533
-
534
- const runtimeConfig = buildRuntimeConfig(bosConfig, {
535
- uiSource,
536
- apiSource,
537
- hostUrl,
538
- proxy: apiProxy,
539
- env: "development",
540
- });
541
-
542
- if (env?.HOST_SOURCE === "remote") {
543
- return yield* spawnRemoteHost(config, callbacks, runtimeConfig);
544
- }
545
-
546
- return yield* spawnDevProcess(config, callbacks, runtimeConfig);
547
- }
548
-
549
- return yield* spawnDevProcess(config, callbacks);
550
- });