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
@@ -0,0 +1,827 @@
1
+ import { buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork } from "./fastkv.mjs";
2
+ import { getNetworkIdForAccount } from "./network.mjs";
3
+ import { createPlugin, z } from "./sdk.mjs";
4
+ import { buildRuntimePluginsForConfig, getHostDevelopmentPort, getProjectRoot, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath } from "./config.mjs";
5
+ import { bosContract } from "./contract.mjs";
6
+ import { syncApiContractBridge } from "./api-contract.mjs";
7
+ import { buildRuntimeConfig, detectLocalPackages, prepareDevelopmentRuntimeConfig } from "./app.mjs";
8
+ import { copyFilteredFiles, personalizeConfig, readTemplatekeep, resolveSourceDir, runBunInstall } from "./cli/init.mjs";
9
+ import { promptInitOptions } from "./cli/prompts.mjs";
10
+ import { startApp } from "./dev-session.mjs";
11
+ import { addFunctionCallAccessKey, ensureNearCli, executeTransaction } from "./near-cli.mjs";
12
+ import { syncAndGenerateSharedUi } from "./shared.mjs";
13
+ import { run } from "./utils/run.mjs";
14
+ import { readFileSync, writeFileSync } from "node:fs";
15
+ import { basename, join, resolve } from "node:path";
16
+ import { Effect } from "effect";
17
+
18
+ //#region src/plugin.ts
19
+ const DEFAULT_DEV_CONFIG = {
20
+ host: "local",
21
+ ui: "local",
22
+ api: "local",
23
+ ssr: false
24
+ };
25
+ const buildCommands = {
26
+ host: {
27
+ cmd: "bun",
28
+ args: ["run", "build"]
29
+ },
30
+ ui: {
31
+ cmd: "bun",
32
+ args: ["run", "build"]
33
+ },
34
+ api: {
35
+ cmd: "bun",
36
+ args: ["run", "build"]
37
+ }
38
+ };
39
+ const PUBLISH_FUNCTION_NAMES = ["__fastdata_kv"];
40
+ function parseSourceMode(value, defaultValue) {
41
+ if (value === "local" || value === "remote") return value;
42
+ return defaultValue;
43
+ }
44
+ function buildAppConfig(options) {
45
+ return {
46
+ host: parseSourceMode(options.host, DEFAULT_DEV_CONFIG.host),
47
+ ui: parseSourceMode(options.ui, DEFAULT_DEV_CONFIG.ui),
48
+ api: parseSourceMode(options.api, DEFAULT_DEV_CONFIG.api),
49
+ proxy: options.proxy,
50
+ ssr: options.ssr ?? DEFAULT_DEV_CONFIG.ssr
51
+ };
52
+ }
53
+ function buildDescription(config) {
54
+ if (config.host === "local" && config.ui === "local" && config.api === "local" && !config.proxy) return "Full Local Development";
55
+ const parts = [];
56
+ parts.push(config.host === "remote" ? "Remote Host" : "Local Host");
57
+ if (config.ui === "remote") parts.push("Remote UI");
58
+ if (config.proxy) parts.push("Proxy API → Production");
59
+ else if (config.api === "remote") parts.push("Remote API");
60
+ return parts.join(" + ");
61
+ }
62
+ function buildConfigResult(bosConfig) {
63
+ const packages = bosConfig ? Object.keys(bosConfig.app) : [];
64
+ return {
65
+ config: bosConfig,
66
+ packages,
67
+ remotes: packages.filter((name) => name !== "host")
68
+ };
69
+ }
70
+ function resolveWorkspaceTarget(key, bosConfig, runtimeConfig, configDir) {
71
+ if (bosConfig?.app && key in bosConfig.app) return {
72
+ key,
73
+ kind: "app",
74
+ path: `${configDir}/${key}`
75
+ };
76
+ const pluginPath = (runtimeConfig?.plugins?.[key])?.localPath ?? resolveLocalDevelopmentPath(bosConfig?.plugins?.[key]?.development, configDir);
77
+ if (pluginPath) return {
78
+ key,
79
+ kind: "plugin",
80
+ path: pluginPath
81
+ };
82
+ return null;
83
+ }
84
+ function determineProcesses(config, localPackages, runtimeConfig) {
85
+ const processes = [];
86
+ if (config.ssr && config.ui === "local") processes.push("ui-ssr");
87
+ if (config.ui === "local") processes.push("ui");
88
+ if (config.api === "local" && !config.proxy) processes.push("api");
89
+ for (const pkg of localPackages) if (pkg.startsWith("plugin:")) {
90
+ const pluginId = pkg.slice(7);
91
+ if (runtimeConfig?.plugins?.[pluginId]?.source === "local") processes.push(pkg);
92
+ }
93
+ processes.push("host");
94
+ return processes;
95
+ }
96
+ function isValidProxyUrl(url) {
97
+ try {
98
+ const parsed = new URL(url);
99
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
100
+ } catch {
101
+ return false;
102
+ }
103
+ }
104
+ function resolveProxyUrl(bosConfig) {
105
+ if (!bosConfig) return null;
106
+ const apiConfig = bosConfig.app.api;
107
+ if (!apiConfig) return null;
108
+ if (apiConfig.proxy && isValidProxyUrl(apiConfig.proxy)) return apiConfig.proxy;
109
+ if (apiConfig.production && isValidProxyUrl(apiConfig.production)) return apiConfig.production;
110
+ return null;
111
+ }
112
+ function sanitizePluginKey(value) {
113
+ return value.replace(/[^A-Za-z0-9/_-]/g, "-").replace(/\/+/g, "/").split("/").filter(Boolean).map((segment) => segment.replace(/[^A-Za-z0-9_-]/g, "-")).join("/").replace(/^\/+|\/+$/g, "");
114
+ }
115
+ function defaultPluginKey(source) {
116
+ const normalized = source.replace(/^local:/, "").replace(/\/$/, "");
117
+ if (source.startsWith("local:")) return sanitizePluginKey(basename(normalized)) || "plugin";
118
+ try {
119
+ const url = new URL(source);
120
+ return sanitizePluginKey(basename(url.pathname) || url.hostname) || "plugin";
121
+ } catch {
122
+ return sanitizePluginKey(source) || "plugin";
123
+ }
124
+ }
125
+ function pluginLocalPath(configDir, attachment) {
126
+ const source = attachment.development ?? attachment.production;
127
+ if (!source?.startsWith("local:")) return null;
128
+ return join(configDir, source.slice(6));
129
+ }
130
+ async function saveBosConfig(configDir, config) {
131
+ const filePath = join(configDir, "bos.config.json");
132
+ const next = `${JSON.stringify(config, null, 2)}\n`;
133
+ try {
134
+ if (readFileSync(filePath, "utf8") === next) return;
135
+ } catch {}
136
+ writeFileSync(filePath, next);
137
+ }
138
+ function listPluginAttachments(config) {
139
+ return Object.entries(config?.plugins ?? {}).map(([key, attachment]) => ({
140
+ key,
141
+ development: attachment.development,
142
+ production: attachment.production,
143
+ localPath: attachment.development?.startsWith("local:") ? attachment.development.slice(6) : void 0,
144
+ source: attachment.development?.startsWith("local:") ? "local" : "remote"
145
+ })).sort((a, b) => a.key.localeCompare(b.key));
146
+ }
147
+ async function refreshApiContractBridge(configDir) {
148
+ const refreshed = await loadConfig({
149
+ cwd: configDir,
150
+ env: "development"
151
+ });
152
+ if (!refreshed) return;
153
+ await syncApiContractBridge({
154
+ configDir,
155
+ runtimeConfig: refreshed.runtime,
156
+ apiBaseUrl: refreshed.runtime.api.url
157
+ });
158
+ }
159
+ function extractPublishedUrl(output) {
160
+ const match = output.match(/https?:\/\/[^\s"'<>]+/g);
161
+ if (!match || match.length === 0) return null;
162
+ return match[match.length - 1] ?? null;
163
+ }
164
+ async function buildEnvVars(config, bosConfig) {
165
+ const env = {
166
+ HOST_SOURCE: config.host,
167
+ UI_SOURCE: config.ui,
168
+ API_SOURCE: config.api
169
+ };
170
+ if (config.host === "remote") {
171
+ const remoteUrl = bosConfig?.app.host.production;
172
+ if (remoteUrl) env.HOST_REMOTE_URL = remoteUrl;
173
+ }
174
+ if (config.ui === "remote") {
175
+ const remoteUrl = bosConfig?.app.ui.production;
176
+ if (remoteUrl) env.UI_REMOTE_URL = remoteUrl;
177
+ }
178
+ if (config.api === "remote") {
179
+ const remoteUrl = bosConfig?.app.api.production;
180
+ if (remoteUrl) env.API_REMOTE_URL = remoteUrl;
181
+ }
182
+ if (config.proxy && bosConfig) {
183
+ const proxyUrl = resolveProxyUrl(bosConfig);
184
+ if (proxyUrl) env.API_PROXY = proxyUrl;
185
+ }
186
+ return env;
187
+ }
188
+ async function buildEveryPluginQuietly(cwd) {
189
+ const packageDir = `${cwd}/packages/every-plugin`;
190
+ if (!await Bun.file(`${packageDir}/package.json`).exists()) return;
191
+ const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;
192
+ if (await Bun.file(distPath).exists()) return;
193
+ const result = await run("bun", [
194
+ "run",
195
+ "--cwd",
196
+ "packages/every-plugin",
197
+ "build"
198
+ ], {
199
+ cwd,
200
+ capture: true
201
+ });
202
+ if (result.exitCode === 0) {
203
+ console.log("[build:ssr] build succeeded");
204
+ return;
205
+ }
206
+ if (result.stdout.trim()) process.stdout.write(result.stdout);
207
+ if (result.stderr.trim()) process.stderr.write(result.stderr);
208
+ throw new Error(`bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`);
209
+ }
210
+ async function buildEverythingDevQuietly(cwd) {
211
+ const packageDir = `${cwd}/packages/everything-dev`;
212
+ if (!await Bun.file(`${packageDir}/package.json`).exists()) return;
213
+ const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;
214
+ if (await Bun.file(distPath).exists()) return;
215
+ const result = await run("bun", [
216
+ "run",
217
+ "--cwd",
218
+ "packages/everything-dev",
219
+ "build"
220
+ ], {
221
+ cwd,
222
+ capture: true
223
+ });
224
+ if (result.exitCode === 0) {
225
+ console.log("[everything-dev] build succeeded");
226
+ return;
227
+ }
228
+ if (result.stdout.trim()) process.stdout.write(result.stdout);
229
+ if (result.stderr.trim()) process.stderr.write(result.stderr);
230
+ throw new Error(`bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`);
231
+ }
232
+ async function fetchPublishedConfig(accountId, gatewayId) {
233
+ try {
234
+ return await fetchBosConfigFromFastKv(`bos://${accountId}/${gatewayId}`);
235
+ } catch {
236
+ return null;
237
+ }
238
+ }
239
+ function selectWorkspaceTargets(packages, bosConfig) {
240
+ const allPackages = [...Object.keys(bosConfig?.app ?? {}), ...Object.keys(bosConfig?.plugins ?? {})];
241
+ if (packages === "all") return allPackages;
242
+ return packages.split(",").map((pkg) => pkg.trim()).filter((pkg) => allPackages.includes(pkg));
243
+ }
244
+ async function buildWorkspaceTargets(opts) {
245
+ const existing = [];
246
+ const skipped = [];
247
+ for (const target of opts.targets) {
248
+ const resolved = resolveWorkspaceTarget(target, opts.bosConfig, opts.runtimeConfig, opts.configDir);
249
+ if (!resolved) {
250
+ skipped.push(target);
251
+ continue;
252
+ }
253
+ if (await Bun.file(`${resolved.path}/package.json`).exists()) existing.push(resolved);
254
+ else skipped.push(target);
255
+ }
256
+ if (existing.length === 0) return {
257
+ built: [],
258
+ skipped
259
+ };
260
+ if ((await syncAndGenerateSharedUi({
261
+ configDir: opts.configDir,
262
+ hostMode: "local",
263
+ bosConfig: opts.bosConfig ?? void 0
264
+ })).catalogChanged) await run("bun", ["install"], { cwd: opts.configDir });
265
+ if (existing.some((entry) => entry.key === "api")) await buildEveryPluginQuietly(opts.configDir);
266
+ await buildEverythingDevQuietly(opts.configDir);
267
+ const env = {
268
+ ...process.env,
269
+ NODE_ENV: opts.deploy ? "production" : "development"
270
+ };
271
+ if (opts.deploy) env.DEPLOY = "true";
272
+ else delete env.DEPLOY;
273
+ const orderedExisting = opts.deploy ? [
274
+ ...existing.filter((entry) => entry.kind === "app" && entry.key !== "host"),
275
+ ...existing.filter((entry) => entry.kind === "plugin"),
276
+ ...existing.filter((entry) => entry.kind === "app" && entry.key === "host")
277
+ ] : existing;
278
+ const built = [];
279
+ for (const resolved of orderedExisting) {
280
+ const pkgJson = JSON.parse(await Bun.file(`${resolved.path}/package.json`).text());
281
+ const buildConfig = opts.deploy && pkgJson.scripts?.deploy ? {
282
+ cmd: "bun",
283
+ args: ["run", "deploy"]
284
+ } : buildCommands[resolved.key] ?? {
285
+ cmd: "bun",
286
+ args: ["run", "build"]
287
+ };
288
+ await run(buildConfig.cmd, buildConfig.args, {
289
+ cwd: resolved.path,
290
+ env
291
+ });
292
+ built.push(resolved.key);
293
+ }
294
+ return {
295
+ built,
296
+ skipped
297
+ };
298
+ }
299
+ var plugin_default = createPlugin({
300
+ variables: z.object({ configPath: z.string().optional() }),
301
+ secrets: z.object({}),
302
+ contract: bosContract,
303
+ initialize: (config) => Effect.promise(async () => {
304
+ const configResult = await loadConfig({ path: config.variables.configPath });
305
+ return {
306
+ bosConfig: configResult?.config ?? null,
307
+ runtimeConfig: configResult?.runtime ?? null,
308
+ configDir: getProjectRoot()
309
+ };
310
+ }),
311
+ shutdown: () => Effect.void,
312
+ createRouter: (deps, builder) => ({
313
+ config: builder.config.handler(async () => buildConfigResult(deps.bosConfig)),
314
+ pluginAdd: builder.pluginAdd.handler(async ({ input }) => {
315
+ if (!deps.bosConfig) return {
316
+ status: "error",
317
+ key: "",
318
+ error: "No bos.config.json found"
319
+ };
320
+ const key = sanitizePluginKey(input.as ?? defaultPluginKey(input.source));
321
+ const existing = deps.bosConfig.plugins?.[key];
322
+ const nextPlugins = { ...deps.bosConfig.plugins ?? {} };
323
+ nextPlugins[key] = input.source.startsWith("local:") ? {
324
+ ...existing ?? {},
325
+ development: input.source,
326
+ production: input.production ?? existing?.production
327
+ } : {
328
+ ...existing ?? {},
329
+ production: input.production ?? input.source
330
+ };
331
+ deps.bosConfig = {
332
+ ...deps.bosConfig,
333
+ plugins: nextPlugins
334
+ };
335
+ await saveBosConfig(deps.configDir, deps.bosConfig);
336
+ await refreshApiContractBridge(deps.configDir);
337
+ return {
338
+ status: "added",
339
+ key,
340
+ development: deps.bosConfig.plugins?.[key]?.development,
341
+ production: deps.bosConfig.plugins?.[key]?.production
342
+ };
343
+ }),
344
+ pluginRemove: builder.pluginRemove.handler(async ({ input }) => {
345
+ if (!deps.bosConfig) return {
346
+ status: "error",
347
+ key: input.key,
348
+ error: "No bos.config.json found"
349
+ };
350
+ if (!deps.bosConfig.plugins?.[input.key]) return {
351
+ status: "error",
352
+ key: input.key,
353
+ error: `Plugin '${input.key}' is not configured`
354
+ };
355
+ const nextPlugins = { ...deps.bosConfig.plugins ?? {} };
356
+ delete nextPlugins[input.key];
357
+ deps.bosConfig = {
358
+ ...deps.bosConfig,
359
+ plugins: Object.keys(nextPlugins).length > 0 ? nextPlugins : void 0
360
+ };
361
+ await saveBosConfig(deps.configDir, deps.bosConfig);
362
+ await refreshApiContractBridge(deps.configDir);
363
+ return {
364
+ status: "removed",
365
+ key: input.key
366
+ };
367
+ }),
368
+ pluginList: builder.pluginList.handler(async () => {
369
+ return {
370
+ status: "listed",
371
+ plugins: listPluginAttachments(deps.bosConfig)
372
+ };
373
+ }),
374
+ pluginPublish: builder.pluginPublish.handler(async ({ input }) => {
375
+ if (!deps.bosConfig) return {
376
+ status: "error",
377
+ key: input.key,
378
+ error: "No bos.config.json found"
379
+ };
380
+ const attachment = deps.bosConfig.plugins?.[input.key];
381
+ if (!attachment) return {
382
+ status: "error",
383
+ key: input.key,
384
+ error: `Plugin '${input.key}' is not configured`
385
+ };
386
+ const localPath = pluginLocalPath(deps.configDir, attachment);
387
+ if (!localPath) return {
388
+ status: "error",
389
+ key: input.key,
390
+ error: `Plugin '${input.key}' does not have a local development path`
391
+ };
392
+ const pkgPath = join(localPath, "package.json");
393
+ if (!await Bun.file(pkgPath).exists()) return {
394
+ status: "error",
395
+ key: input.key,
396
+ error: `Missing package.json at ${localPath}`
397
+ };
398
+ const script = (await Bun.file(pkgPath).json()).scripts?.deploy ? "deploy" : "build";
399
+ const { stdout, stderr, exitCode } = await run("bun", ["run", script], {
400
+ cwd: localPath,
401
+ capture: true
402
+ });
403
+ if (exitCode !== 0) {
404
+ if (stdout.trim()) process.stdout.write(stdout);
405
+ if (stderr.trim()) process.stderr.write(stderr);
406
+ return {
407
+ status: "error",
408
+ key: input.key,
409
+ error: `Publish failed with exit code ${exitCode}`
410
+ };
411
+ }
412
+ if (stdout.trim()) process.stdout.write(stdout);
413
+ if (stderr.trim()) process.stderr.write(stderr);
414
+ const publishedUrl = extractPublishedUrl(`${stdout}\n${stderr}`);
415
+ if (publishedUrl) {
416
+ deps.bosConfig = {
417
+ ...deps.bosConfig,
418
+ plugins: {
419
+ ...deps.bosConfig.plugins ?? {},
420
+ [input.key]: {
421
+ ...deps.bosConfig.plugins?.[input.key] ?? {},
422
+ production: publishedUrl
423
+ }
424
+ }
425
+ };
426
+ await saveBosConfig(deps.configDir, deps.bosConfig);
427
+ await refreshApiContractBridge(deps.configDir);
428
+ }
429
+ return {
430
+ status: "published",
431
+ key: input.key,
432
+ path: localPath,
433
+ script,
434
+ production: publishedUrl ?? attachment.production
435
+ };
436
+ }),
437
+ dev: builder.dev.handler(async ({ input }) => {
438
+ const localPackages = detectLocalPackages(deps.bosConfig ?? void 0, deps.runtimeConfig ?? void 0);
439
+ const appConfig = buildAppConfig({
440
+ host: localPackages.includes("host") ? input.host : "remote",
441
+ ui: localPackages.includes("ui") ? input.ui : "remote",
442
+ api: localPackages.includes("api") ? input.api : "remote",
443
+ proxy: input.proxy,
444
+ ssr: input.ssr
445
+ });
446
+ if ((await syncAndGenerateSharedUi({
447
+ configDir: deps.configDir,
448
+ hostMode: appConfig.host,
449
+ bosConfig: deps.bosConfig ?? void 0
450
+ })).catalogChanged) await run("bun", ["install"], { cwd: deps.configDir });
451
+ if (appConfig.api === "local" && !appConfig.proxy || localPackages.some((pkg) => pkg.startsWith("plugin:"))) await buildEveryPluginQuietly(deps.configDir);
452
+ await buildEverythingDevQuietly(deps.configDir);
453
+ const refreshed = await loadConfig({ cwd: deps.configDir });
454
+ deps.bosConfig = refreshed?.config ?? deps.bosConfig;
455
+ deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;
456
+ if (!deps.bosConfig) return {
457
+ status: "error",
458
+ description: "No bos.config.json found",
459
+ processes: []
460
+ };
461
+ if (appConfig.proxy && !resolveProxyUrl(deps.bosConfig)) return {
462
+ status: "error",
463
+ description: "No valid proxy URL configured in bos.config.json",
464
+ processes: []
465
+ };
466
+ const processes = determineProcesses(appConfig, detectLocalPackages(deps.bosConfig ?? void 0, deps.runtimeConfig ?? void 0), deps.runtimeConfig);
467
+ const env = await buildEnvVars(appConfig, deps.bosConfig);
468
+ const hostPort = input.port ?? getHostDevelopmentPort(deps.bosConfig.app.host.development);
469
+ const runtimeConfig = await prepareDevelopmentRuntimeConfig(buildRuntimeConfig(deps.bosConfig, {
470
+ uiSource: appConfig.ui,
471
+ apiSource: appConfig.api,
472
+ hostUrl: `http://localhost:${hostPort}`,
473
+ proxy: env.API_PROXY,
474
+ env: "development",
475
+ plugins: deps.runtimeConfig?.plugins
476
+ }), {
477
+ hostPort,
478
+ ssr: appConfig.ssr
479
+ });
480
+ await syncApiContractBridge({
481
+ configDir: deps.configDir,
482
+ runtimeConfig,
483
+ apiBaseUrl: runtimeConfig.api.url
484
+ });
485
+ const orchestrator = {
486
+ packages: processes,
487
+ env,
488
+ description: buildDescription(appConfig),
489
+ appConfig,
490
+ bosConfig: deps.bosConfig,
491
+ runtimeConfig,
492
+ port: parsePort(runtimeConfig.hostUrl),
493
+ interactive: input.interactive
494
+ };
495
+ startApp(orchestrator);
496
+ return {
497
+ status: "started",
498
+ description: orchestrator.description,
499
+ processes
500
+ };
501
+ }),
502
+ start: builder.start.handler(async ({ input }) => {
503
+ let remoteConfig = null;
504
+ if (input.account && input.domain) {
505
+ remoteConfig = await fetchPublishedConfig(input.account, input.domain);
506
+ if (!remoteConfig) return {
507
+ status: "error",
508
+ url: ""
509
+ };
510
+ }
511
+ const config = remoteConfig || deps.bosConfig;
512
+ if (!config) return {
513
+ status: "error",
514
+ url: ""
515
+ };
516
+ const port = input.port ?? getHostDevelopmentPort(config.app.host.development);
517
+ const appConfig = {
518
+ host: "remote",
519
+ ui: "remote",
520
+ api: "remote"
521
+ };
522
+ const env = await buildEnvVars(appConfig, config);
523
+ const isStaging = input.env === "staging";
524
+ const runtimePlugins = remoteConfig ? await buildRuntimePluginsForConfig(config, deps.configDir, "production") : deps.runtimeConfig?.plugins;
525
+ const runtimeConfig = buildRuntimeConfig(config, {
526
+ uiSource: "remote",
527
+ apiSource: "remote",
528
+ hostUrl: `http://localhost:${port}`,
529
+ env: "production",
530
+ plugins: runtimePlugins
531
+ });
532
+ await syncApiContractBridge({
533
+ configDir: deps.configDir,
534
+ runtimeConfig,
535
+ apiBaseUrl: runtimeConfig.api.url
536
+ });
537
+ const stagingEnvVars = isStaging ? { GATEWAY_DOMAIN: config.staging?.domain ?? config.domain ?? "" } : {};
538
+ startApp({
539
+ packages: ["host"],
540
+ env: {
541
+ NODE_ENV: "production",
542
+ ...env,
543
+ ...stagingEnvVars
544
+ },
545
+ description: `${isStaging ? "Staging" : "Production"} Mode (${config.account})`,
546
+ appConfig,
547
+ bosConfig: config,
548
+ runtimeConfig,
549
+ port,
550
+ interactive: input.interactive,
551
+ noLogs: true
552
+ });
553
+ return {
554
+ status: "running",
555
+ url: `http://localhost:${port}`
556
+ };
557
+ }),
558
+ build: builder.build.handler(async ({ input }) => {
559
+ if (!deps.bosConfig) return {
560
+ status: "error",
561
+ built: [],
562
+ skipped: []
563
+ };
564
+ const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);
565
+ if (targets.length === 0) return {
566
+ status: "error",
567
+ built: [],
568
+ skipped: []
569
+ };
570
+ const runtimeConfig = buildRuntimeConfig(deps.bosConfig, {
571
+ uiSource: deps.bosConfig.app.ui?.development ? "local" : "remote",
572
+ apiSource: deps.bosConfig.app.api?.development ? "local" : "remote",
573
+ hostUrl: resolveDevelopmentHostUrl(deps.bosConfig.app.host.development),
574
+ env: "development",
575
+ plugins: deps.runtimeConfig?.plugins
576
+ });
577
+ await syncApiContractBridge({
578
+ configDir: deps.configDir,
579
+ runtimeConfig,
580
+ apiBaseUrl: runtimeConfig.api.url
581
+ });
582
+ const { built, skipped } = await buildWorkspaceTargets({
583
+ configDir: deps.configDir,
584
+ bosConfig: deps.bosConfig,
585
+ runtimeConfig,
586
+ targets,
587
+ deploy: input.deploy
588
+ });
589
+ if (built.length === 0) return {
590
+ status: "error",
591
+ built: [],
592
+ skipped
593
+ };
594
+ return {
595
+ status: "success",
596
+ built,
597
+ skipped,
598
+ deployed: input.deploy
599
+ };
600
+ }),
601
+ publish: builder.publish.handler(async ({ input }) => {
602
+ if (!deps.bosConfig) return {
603
+ status: "error",
604
+ registryUrl: "",
605
+ error: "No bos.config.json found"
606
+ };
607
+ const account = deps.bosConfig.account;
608
+ const gateway = deps.bosConfig.domain;
609
+ if (!gateway) return {
610
+ status: "error",
611
+ registryUrl: "",
612
+ error: "bos.config.json must define domain to publish"
613
+ };
614
+ const network = input.network ?? getNetworkIdForAccount(account);
615
+ const bosUrl = `bos://${account}/${gateway}`;
616
+ const registryUrl = buildRegistryConfigUrlForNetwork(network, account, gateway);
617
+ const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);
618
+ let publishConfig = deps.bosConfig;
619
+ let built;
620
+ let skipped;
621
+ if (input.dryRun) return {
622
+ status: "dry-run",
623
+ registryUrl,
624
+ built,
625
+ skipped
626
+ };
627
+ if (input.deploy) {
628
+ const result = await buildWorkspaceTargets({
629
+ configDir: deps.configDir,
630
+ bosConfig: deps.bosConfig,
631
+ runtimeConfig: deps.runtimeConfig,
632
+ targets,
633
+ deploy: true
634
+ });
635
+ built = result.built;
636
+ skipped = result.skipped;
637
+ const refreshed = await loadConfig({ cwd: deps.configDir });
638
+ if (refreshed?.config) {
639
+ deps.bosConfig = refreshed.config;
640
+ deps.runtimeConfig = refreshed.runtime;
641
+ publishConfig = refreshed.config;
642
+ }
643
+ }
644
+ const payload = JSON.stringify({ [`apps/${account}/${gateway}/bos.config.json`]: JSON.stringify(publishConfig) });
645
+ const argsBase64 = Buffer.from(payload).toString("base64");
646
+ const privateKey = input.privateKey || process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;
647
+ try {
648
+ await Effect.runPromise(ensureNearCli);
649
+ let txHash;
650
+ try {
651
+ txHash = (await Effect.runPromise(executeTransaction({
652
+ account,
653
+ contract: getRegistryNamespaceForNetwork(network),
654
+ method: "__fastdata_kv",
655
+ argsBase64,
656
+ network,
657
+ privateKey,
658
+ gas: "300Tgas",
659
+ deposit: "0NEAR"
660
+ }))).txHash;
661
+ } catch (error) {
662
+ txHash = extractTransactionHash(error);
663
+ if (!txHash) throw error;
664
+ const verifiedConfig = await fetchBosConfigFromFastKv(bosUrl);
665
+ if (JSON.stringify(verifiedConfig) !== JSON.stringify(publishConfig)) throw error;
666
+ }
667
+ return {
668
+ status: "published",
669
+ registryUrl,
670
+ txHash,
671
+ built,
672
+ skipped
673
+ };
674
+ } catch (error) {
675
+ return {
676
+ status: "error",
677
+ registryUrl,
678
+ error: error instanceof Error ? error.message : "Unknown error",
679
+ built,
680
+ skipped
681
+ };
682
+ }
683
+ }),
684
+ keyPublish: builder.keyPublish.handler(async ({ input }) => {
685
+ if (!deps.bosConfig) return {
686
+ status: "error",
687
+ account: "",
688
+ network: "mainnet",
689
+ contract: "",
690
+ allowance: input.allowance,
691
+ functionNames: PUBLISH_FUNCTION_NAMES,
692
+ error: "No bos.config.json found"
693
+ };
694
+ const account = deps.bosConfig.account;
695
+ const network = getNetworkIdForAccount(account);
696
+ const contract = getRegistryNamespaceForAccount(account);
697
+ try {
698
+ await Effect.runPromise(ensureNearCli);
699
+ const keyPair = await addFunctionCallAccessKey({
700
+ account,
701
+ contract,
702
+ allowance: input.allowance,
703
+ functionNames: PUBLISH_FUNCTION_NAMES,
704
+ network
705
+ });
706
+ return {
707
+ status: "published",
708
+ account,
709
+ network,
710
+ contract,
711
+ allowance: input.allowance,
712
+ functionNames: PUBLISH_FUNCTION_NAMES,
713
+ publicKey: keyPair.publicKey,
714
+ privateKey: keyPair.privateKey
715
+ };
716
+ } catch (error) {
717
+ return {
718
+ status: "error",
719
+ account,
720
+ network,
721
+ contract,
722
+ allowance: input.allowance,
723
+ functionNames: PUBLISH_FUNCTION_NAMES,
724
+ error: error instanceof Error ? error.message : "Unknown error"
725
+ };
726
+ }
727
+ }),
728
+ init: builder.init.handler(async ({ input }) => {
729
+ try {
730
+ let account = input.account;
731
+ let gateway = input.gateway;
732
+ let destination = input.destination;
733
+ let name = input.name;
734
+ let domain = input.domain;
735
+ let withHost = input.withHost;
736
+ if (!account || !gateway) {
737
+ if (input.noInteractive) return {
738
+ status: "error",
739
+ destination: "",
740
+ parentAccount: account ?? "",
741
+ parentGateway: gateway ?? "",
742
+ name: input.name,
743
+ domain: input.domain,
744
+ extends: account && gateway ? `bos://${account}/${gateway}` : "",
745
+ filesCopied: 0,
746
+ error: "account and gateway are required (use --no-interactive to skip prompts and provide them as positional args)"
747
+ };
748
+ const prompted = await promptInitOptions({
749
+ account,
750
+ gateway,
751
+ destination,
752
+ name,
753
+ domain,
754
+ withHost
755
+ });
756
+ account = prompted.account;
757
+ gateway = prompted.gateway;
758
+ destination = prompted.destination;
759
+ name = prompted.name;
760
+ domain = prompted.domain;
761
+ withHost = prompted.withHost;
762
+ }
763
+ destination = destination || gateway;
764
+ const { sourceDir, cleanup } = await resolveSourceDir({
765
+ account,
766
+ gateway,
767
+ source: input.source
768
+ });
769
+ try {
770
+ const patterns = await readTemplatekeep(sourceDir);
771
+ if (patterns.length === 0) return {
772
+ status: "error",
773
+ destination,
774
+ parentAccount: account,
775
+ parentGateway: gateway,
776
+ name,
777
+ domain,
778
+ extends: `bos://${account}/${gateway}`,
779
+ filesCopied: 0,
780
+ error: "No .templatekeep found in template source"
781
+ };
782
+ const filesCopied = await copyFilteredFiles(sourceDir, destination, patterns, { withHost });
783
+ await personalizeConfig(destination, {
784
+ parentAccount: account,
785
+ parentGateway: gateway,
786
+ name: name || account,
787
+ domain: domain || gateway,
788
+ workspaceOpts: { sourceDir }
789
+ });
790
+ if (!input.noInstall) await runBunInstall(destination);
791
+ return {
792
+ status: "initialized",
793
+ destination: resolve(destination),
794
+ parentAccount: account,
795
+ parentGateway: gateway,
796
+ name,
797
+ domain,
798
+ extends: `bos://${account}/${gateway}`,
799
+ filesCopied
800
+ };
801
+ } finally {
802
+ await cleanup();
803
+ }
804
+ } catch (error) {
805
+ return {
806
+ status: "error",
807
+ destination: input.destination ?? input.gateway ?? "",
808
+ parentAccount: input.account ?? "",
809
+ parentGateway: input.gateway ?? "",
810
+ name: input.name,
811
+ domain: input.domain,
812
+ extends: input.account && input.gateway ? `bos://${input.account}/${input.gateway}` : "",
813
+ filesCopied: 0,
814
+ error: error instanceof Error ? error.message : "Unknown error"
815
+ };
816
+ }
817
+ })
818
+ })
819
+ });
820
+ function extractTransactionHash(error) {
821
+ const message = error instanceof Error ? error.message : String(error);
822
+ return (message.match(/Transaction ID:\s*([A-Za-z0-9]+)/i) || message.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/))?.[1];
823
+ }
824
+
825
+ //#endregion
826
+ export { plugin_default as default };
827
+ //# sourceMappingURL=plugin.mjs.map