everything-dev 1.44.0 → 1.45.0

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 (95) hide show
  1. package/dist/api-contract.cjs +26 -21
  2. package/dist/api-contract.cjs.map +1 -1
  3. package/dist/api-contract.mjs +27 -22
  4. package/dist/api-contract.mjs.map +1 -1
  5. package/dist/cli/catalog.cjs +2 -2
  6. package/dist/cli/catalog.cjs.map +1 -1
  7. package/dist/cli/catalog.mjs +2 -2
  8. package/dist/cli/catalog.mjs.map +1 -1
  9. package/dist/cli/infra.cjs +3 -0
  10. package/dist/cli/infra.cjs.map +1 -1
  11. package/dist/cli/infra.mjs +3 -0
  12. package/dist/cli/infra.mjs.map +1 -1
  13. package/dist/cli/init.cjs +5 -2
  14. package/dist/cli/init.cjs.map +1 -1
  15. package/dist/cli/init.d.cts +1 -1
  16. package/dist/cli/init.d.cts.map +1 -1
  17. package/dist/cli/init.d.mts +1 -1
  18. package/dist/cli/init.d.mts.map +1 -1
  19. package/dist/cli/init.mjs +5 -2
  20. package/dist/cli/init.mjs.map +1 -1
  21. package/dist/cli/status.cjs +8 -19
  22. package/dist/cli/status.cjs.map +1 -1
  23. package/dist/cli/status.mjs +8 -19
  24. package/dist/cli/status.mjs.map +1 -1
  25. package/dist/cli/sync.cjs +6 -0
  26. package/dist/cli/sync.cjs.map +1 -1
  27. package/dist/cli/sync.mjs +6 -0
  28. package/dist/cli/sync.mjs.map +1 -1
  29. package/dist/cli.cjs +43 -4
  30. package/dist/cli.cjs.map +1 -1
  31. package/dist/cli.mjs +43 -4
  32. package/dist/cli.mjs.map +1 -1
  33. package/dist/config.cjs +22 -11
  34. package/dist/config.cjs.map +1 -1
  35. package/dist/config.d.cts.map +1 -1
  36. package/dist/config.d.mts.map +1 -1
  37. package/dist/config.mjs +22 -11
  38. package/dist/config.mjs.map +1 -1
  39. package/dist/contract.cjs +22 -7
  40. package/dist/contract.cjs.map +1 -1
  41. package/dist/contract.d.cts +80 -7
  42. package/dist/contract.d.cts.map +1 -1
  43. package/dist/contract.d.mts +80 -7
  44. package/dist/contract.d.mts.map +1 -1
  45. package/dist/contract.meta.cjs +2 -0
  46. package/dist/contract.meta.cjs.map +1 -1
  47. package/dist/contract.meta.d.cts +6 -0
  48. package/dist/contract.meta.d.mts +6 -0
  49. package/dist/contract.meta.mjs +2 -0
  50. package/dist/contract.meta.mjs.map +1 -1
  51. package/dist/contract.mjs +22 -8
  52. package/dist/contract.mjs.map +1 -1
  53. package/dist/dev-session.cjs +3 -1
  54. package/dist/dev-session.cjs.map +1 -1
  55. package/dist/dev-session.mjs +3 -1
  56. package/dist/dev-session.mjs.map +1 -1
  57. package/dist/fastkv.cjs +2 -1
  58. package/dist/fastkv.cjs.map +1 -1
  59. package/dist/fastkv.mjs +2 -1
  60. package/dist/fastkv.mjs.map +1 -1
  61. package/dist/http-client.cjs +22 -2
  62. package/dist/http-client.cjs.map +1 -1
  63. package/dist/http-client.mjs +22 -2
  64. package/dist/http-client.mjs.map +1 -1
  65. package/dist/index.cjs +1 -0
  66. package/dist/index.d.cts +2 -2
  67. package/dist/index.d.mts +2 -2
  68. package/dist/index.mjs +2 -2
  69. package/dist/integrity.cjs +116 -0
  70. package/dist/integrity.cjs.map +1 -1
  71. package/dist/integrity.d.cts +21 -1
  72. package/dist/integrity.d.cts.map +1 -1
  73. package/dist/integrity.d.mts +21 -1
  74. package/dist/integrity.d.mts.map +1 -1
  75. package/dist/integrity.mjs +111 -1
  76. package/dist/integrity.mjs.map +1 -1
  77. package/dist/near-cli.cjs +12 -15
  78. package/dist/near-cli.cjs.map +1 -1
  79. package/dist/near-cli.mjs +12 -15
  80. package/dist/near-cli.mjs.map +1 -1
  81. package/dist/orchestrator.cjs +39 -23
  82. package/dist/orchestrator.cjs.map +1 -1
  83. package/dist/orchestrator.mjs +39 -23
  84. package/dist/orchestrator.mjs.map +1 -1
  85. package/dist/plugin.cjs +332 -108
  86. package/dist/plugin.cjs.map +1 -1
  87. package/dist/plugin.d.cts +32 -2
  88. package/dist/plugin.d.cts.map +1 -1
  89. package/dist/plugin.d.mts +32 -2
  90. package/dist/plugin.d.mts.map +1 -1
  91. package/dist/plugin.mjs +335 -111
  92. package/dist/plugin.mjs.map +1 -1
  93. package/dist/types.d.cts +2 -2
  94. package/dist/types.d.mts +2 -2
  95. package/package.json +1 -1
package/dist/plugin.cjs CHANGED
@@ -231,9 +231,9 @@ async function waitForPublishedConfig(opts) {
231
231
  const reason = lastError instanceof Error ? ` Last error: ${lastError.message}` : "";
232
232
  throw new Error(`Timed out waiting for publish confirmation at bos://${opts.account}/${opts.gateway}.${reason}`);
233
233
  }
234
- async function buildEveryPluginQuietly(cwd) {
234
+ async function buildEveryPluginQuietly(cwd, force = false) {
235
235
  if (!await fileExists(`${`${cwd}/packages/every-plugin`}/package.json`)) return;
236
- if (await fileExists(`${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`)) return;
236
+ if (await fileExists(`${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`) && !force) return;
237
237
  const result = await require_run.run("bun", [
238
238
  "run",
239
239
  "--cwd",
@@ -243,17 +243,14 @@ async function buildEveryPluginQuietly(cwd) {
243
243
  cwd,
244
244
  capture: true
245
245
  });
246
- if (result.exitCode === 0) {
247
- console.log("[build:ssr] build succeeded");
248
- return;
249
- }
246
+ if (result.exitCode === 0) return;
250
247
  if (result.stdout.trim()) node_process.default.stdout.write(result.stdout);
251
248
  if (result.stderr.trim()) node_process.default.stderr.write(result.stderr);
252
249
  throw new Error(`bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`);
253
250
  }
254
- async function buildEverythingDevQuietly(cwd) {
251
+ async function buildEverythingDevQuietly(cwd, force = false) {
255
252
  if (!await fileExists(`${`${cwd}/packages/everything-dev`}/package.json`)) return;
256
- if (await fileExists(`${cwd}/packages/everything-dev/dist/index.mjs`)) return;
253
+ if (await fileExists(`${cwd}/packages/everything-dev/dist/index.mjs`) && !force) return;
257
254
  const result = await require_run.run("bun", [
258
255
  "run",
259
256
  "--cwd",
@@ -263,10 +260,7 @@ async function buildEverythingDevQuietly(cwd) {
263
260
  cwd,
264
261
  capture: true
265
262
  });
266
- if (result.exitCode === 0) {
267
- console.log("[everything-dev] build succeeded");
268
- return;
269
- }
263
+ if (result.exitCode === 0) return;
270
264
  if (result.stdout.trim()) node_process.default.stdout.write(result.stdout);
271
265
  if (result.stderr.trim()) node_process.default.stderr.write(result.stderr);
272
266
  throw new Error(`bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`);
@@ -299,6 +293,141 @@ function selectWorkspaceTargets(packages, bosConfig) {
299
293
  if (packages === "all") return allPackages;
300
294
  return packages.split(",").map((pkg) => pkg.trim()).filter((pkg) => allPackages.includes(pkg));
301
295
  }
296
+ function padRight(str, len) {
297
+ return str.length >= len ? str : str + " ".repeat(len - str.length);
298
+ }
299
+ function formatDuration(ms) {
300
+ if (ms < 1e3) return `${ms}ms`;
301
+ return `${(ms / 1e3).toFixed(1)}s`;
302
+ }
303
+ async function runBuildAttempt(cmd, args, cwd, env, verbose, wsKey, resultBaseDir) {
304
+ if (verbose) try {
305
+ await require_run.run(cmd, args, {
306
+ cwd,
307
+ env,
308
+ capture: false
309
+ });
310
+ if (resultBaseDir) {
311
+ const results = require_integrity.readDeployResults((0, node_path.join)(resultBaseDir, wsKey));
312
+ if (results.length > 0) return {
313
+ success: true,
314
+ url: results[0]?.url,
315
+ exitCode: 0,
316
+ output: ""
317
+ };
318
+ }
319
+ return {
320
+ success: true,
321
+ exitCode: 0,
322
+ output: ""
323
+ };
324
+ } catch (err) {
325
+ return {
326
+ success: false,
327
+ error: err instanceof Error ? err.message : String(err),
328
+ exitCode: 1,
329
+ output: ""
330
+ };
331
+ }
332
+ const result = await require_run.run(cmd, args, {
333
+ cwd,
334
+ env,
335
+ capture: true
336
+ });
337
+ const stdout = result?.stdout ?? "";
338
+ const stderr = result?.stderr ?? "";
339
+ const exitCode = result?.exitCode ?? 0;
340
+ const output = `${stdout}\n${stderr}`;
341
+ if (exitCode !== 0) return {
342
+ success: false,
343
+ error: `Build failed (exit code ${exitCode})\n${output.trim().split("\n").slice(-5).join("\n")}`,
344
+ exitCode,
345
+ output
346
+ };
347
+ const zeMatch = output.match(/ZE\d+/);
348
+ if (zeMatch) return {
349
+ success: false,
350
+ error: `Zephyr upload failed (${zeMatch[0]})`,
351
+ exitCode: 0,
352
+ output
353
+ };
354
+ if (resultBaseDir) {
355
+ const results = require_integrity.readDeployResults((0, node_path.join)(resultBaseDir, wsKey));
356
+ if (results.length > 0) return {
357
+ success: true,
358
+ url: results[0]?.url,
359
+ exitCode: 0,
360
+ output
361
+ };
362
+ }
363
+ const deployMatch = output.match(/🚀.*Deployed:\s*(https?:\S+)/);
364
+ if (deployMatch) return {
365
+ success: true,
366
+ url: deployMatch[1],
367
+ exitCode: 0,
368
+ output
369
+ };
370
+ if (env.DEPLOY === "true") return {
371
+ success: false,
372
+ error: "No deploy URL found (Zephyr may have failed)",
373
+ exitCode: 0,
374
+ output
375
+ };
376
+ return {
377
+ success: true,
378
+ exitCode: 0,
379
+ output
380
+ };
381
+ }
382
+ async function buildOneWorkspace(ws, env, opts, resultBaseDir) {
383
+ const pkgJson = await readJsonFile(`${ws.path}/package.json`);
384
+ const buildConfig = opts.deploy && pkgJson.scripts?.deploy ? {
385
+ cmd: "bun",
386
+ args: ["run", "deploy"]
387
+ } : buildCommands[ws.key] ?? {
388
+ cmd: "bun",
389
+ args: ["run", "build"]
390
+ };
391
+ const wsEnv = { ...env };
392
+ if (resultBaseDir) wsEnv.BOS_DEPLOY_RESULT_DIR = (0, node_path.join)(resultBaseDir, ws.key);
393
+ const startTime = Date.now();
394
+ let attempt = await runBuildAttempt(buildConfig.cmd, buildConfig.args, ws.path, wsEnv, opts.verbose ?? false, ws.key, resultBaseDir);
395
+ let retried = false;
396
+ if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {
397
+ if (!opts.verbose) console.log(` ${require_theme.colors.yellow("↻")} ${padRight(ws.key, 28)} retrying...`);
398
+ if (resultBaseDir) {
399
+ const wsResultDir = (0, node_path.join)(resultBaseDir, ws.key);
400
+ if ((0, node_fs.existsSync)(wsResultDir)) (0, node_fs.rmSync)(wsResultDir, {
401
+ recursive: true,
402
+ force: true
403
+ });
404
+ }
405
+ retried = true;
406
+ attempt = await runBuildAttempt(buildConfig.cmd, buildConfig.args, ws.path, wsEnv, opts.verbose ?? false, ws.key, resultBaseDir);
407
+ }
408
+ const durationMs = Date.now() - startTime;
409
+ const result = {
410
+ key: ws.key,
411
+ kind: ws.kind,
412
+ success: attempt.success,
413
+ url: attempt.url,
414
+ error: attempt.error,
415
+ durationMs,
416
+ retried: retried ? true : void 0
417
+ };
418
+ if (!opts.verbose) {
419
+ const name = padRight(ws.key, 28);
420
+ if (result.success) {
421
+ const duration = formatDuration(durationMs);
422
+ const retryTag = retried ? " (retried)" : "";
423
+ console.log(` ${require_theme.colors.green(require_theme.icons.ok)} ${name} ${require_theme.colors.dim(duration + retryTag)}`);
424
+ } else {
425
+ const errorLine = (result.error ?? "Failed").split("\n")[0];
426
+ console.log(` ${require_theme.colors.error(require_theme.icons.err)} ${name} ${errorLine}`);
427
+ }
428
+ }
429
+ return result;
430
+ }
302
431
  async function buildWorkspaceTargets(opts) {
303
432
  const existing = [];
304
433
  const skipped = [];
@@ -321,26 +450,74 @@ async function buildWorkspaceTargets(opts) {
321
450
  bosConfig: opts.bosConfig ?? void 0,
322
451
  extendsChain: []
323
452
  })).catalogChanged) await require_run.run("bun", ["install"], { cwd: opts.configDir });
324
- if (existing.some((entry) => entry.key === "api")) await buildEveryPluginQuietly(opts.configDir);
325
- await buildEverythingDevQuietly(opts.configDir);
453
+ const shouldBuildPlugin = existing.some((entry) => entry.key === "api");
454
+ const forceRebuild = opts.deploy;
455
+ const buildTasks = [buildEverythingDevQuietly(opts.configDir, forceRebuild)];
456
+ if (shouldBuildPlugin) buildTasks.push(buildEveryPluginQuietly(opts.configDir, forceRebuild));
457
+ await Promise.all(buildTasks);
326
458
  const env = {
327
459
  ...node_process.default.env,
328
460
  NODE_ENV: opts.deploy ? "production" : "development"
329
461
  };
330
462
  if (opts.deploy) env.DEPLOY = "true";
331
463
  else delete env.DEPLOY;
464
+ const resultBaseDir = opts.deploy ? (0, node_path.join)(opts.configDir, ".bos", "deploy-results") : void 0;
465
+ if (resultBaseDir) require_integrity.cleanDeployResultDir(resultBaseDir);
466
+ const bosConfigPath = (0, node_path.join)(opts.configDir, "bos.config.json");
467
+ let configSnapshot;
468
+ if (opts.deploy && (0, node_fs.existsSync)(bosConfigPath)) configSnapshot = (0, node_fs.readFileSync)(bosConfigPath, "utf-8");
332
469
  const orderedExisting = opts.deploy ? [
333
470
  ...existing.filter((entry) => entry.kind === "app" && entry.key !== "host"),
334
471
  ...existing.filter((entry) => entry.kind === "plugin"),
335
472
  ...existing.filter((entry) => entry.kind === "app" && entry.key === "host")
336
473
  ] : existing;
474
+ const parallelGroup = opts.deploy ? orderedExisting.filter((e) => e.key !== "host") : orderedExisting;
475
+ const sequentialGroup = opts.deploy ? orderedExisting.filter((e) => e.key === "host") : [];
337
476
  const built = [];
338
- for (const resolved of orderedExisting) {
339
- const pkgJson = await readJsonFile(`${resolved.path}/package.json`);
340
- const buildConfig = opts.deploy && pkgJson.scripts?.deploy ? {
341
- cmd: "bun",
342
- args: ["run", "deploy"]
343
- } : buildCommands[resolved.key] ?? {
477
+ const deployResults = [];
478
+ if (opts.deploy && parallelGroup.length > 0) {
479
+ const total = parallelGroup.length + sequentialGroup.length;
480
+ console.log();
481
+ console.log(` Building ${total} workspace${total > 1 ? "s" : ""}...`);
482
+ console.log();
483
+ const results = await Promise.allSettled(parallelGroup.map((ws) => buildOneWorkspace(ws, env, opts, resultBaseDir)));
484
+ for (let i = 0; i < parallelGroup.length; i++) {
485
+ const ws = parallelGroup[i];
486
+ const result = results[i];
487
+ if (result.status === "fulfilled") {
488
+ if (result.value.success) built.push(ws.key);
489
+ deployResults.push(result.value);
490
+ } else deployResults.push({
491
+ key: ws.key,
492
+ kind: ws.kind,
493
+ success: false,
494
+ error: result.reason?.message ?? "Unknown error"
495
+ });
496
+ }
497
+ if (resultBaseDir && configSnapshot) {
498
+ const allResults = require_integrity.readAllDeployResults(resultBaseDir);
499
+ if (allResults.length > 0) {
500
+ const merged = require_integrity.applyDeployResults(JSON.parse(configSnapshot), allResults);
501
+ (0, node_fs.writeFileSync)(bosConfigPath, `${JSON.stringify(merged, null, 2)}\n`);
502
+ }
503
+ }
504
+ for (const ws of sequentialGroup) {
505
+ const result = await buildOneWorkspace(ws, env, opts, resultBaseDir);
506
+ if (result.success) built.push(ws.key);
507
+ deployResults.push(result);
508
+ }
509
+ if (resultBaseDir && (0, node_fs.existsSync)(bosConfigPath)) {
510
+ const allResults = require_integrity.readAllDeployResults(resultBaseDir);
511
+ const currentConfig = JSON.parse((0, node_fs.readFileSync)(bosConfigPath, "utf-8"));
512
+ const hostResults = allResults.filter((r) => r.urlField.startsWith("app.host"));
513
+ if (hostResults.length > 0) {
514
+ const merged = require_integrity.applyDeployResults(currentConfig, hostResults);
515
+ (0, node_fs.writeFileSync)(bosConfigPath, `${JSON.stringify(merged, null, 2)}\n`);
516
+ }
517
+ }
518
+ console.log();
519
+ } else for (const resolved of orderedExisting) {
520
+ const buildConfig = buildCommands[resolved.key] ?? {
344
521
  cmd: "bun",
345
522
  args: ["run", "build"]
346
523
  };
@@ -352,7 +529,8 @@ async function buildWorkspaceTargets(opts) {
352
529
  }
353
530
  return {
354
531
  built,
355
- skipped
532
+ skipped,
533
+ deployResults: opts.deploy ? deployResults : void 0
356
534
  };
357
535
  }
358
536
  var plugin_default = (0, every_plugin.createPlugin)({
@@ -525,12 +703,9 @@ var plugin_default = (0, every_plugin.createPlugin)({
525
703
  };
526
704
  }),
527
705
  dev: builder.dev.handler(async ({ input }) => {
706
+ const devTimings = [];
528
707
  require_infra.ensureEnvFile(deps.configDir);
529
708
  require_infra.loadProjectEnv(deps.configDir);
530
- pluginEvents.emit("progress", {
531
- phase: "config",
532
- status: "running"
533
- });
534
709
  const localPackages = require_app.detectLocalPackages(deps.bosConfig ?? void 0, deps.runtimeConfig ?? void 0);
535
710
  const hostSource = localPackages.includes("host") ? parseSourceMode(input.host, "local") : "remote";
536
711
  const uiSource = localPackages.includes("ui") ? parseSourceMode(input.ui, "local") : "remote";
@@ -538,61 +713,44 @@ var plugin_default = (0, every_plugin.createPlugin)({
538
713
  const authSource = localPackages.includes("auth") ? parseSourceMode(input.auth, "local") : "remote";
539
714
  const ssr = input.ssr ?? false;
540
715
  const proxy = input.proxy ?? false;
541
- if ((await require_shared_deps.syncResolvedSharedDeps({
716
+ const sharedSync = await timePhase(devTimings, "shared deps", () => require_shared_deps.syncResolvedSharedDeps({
542
717
  configDir: deps.configDir,
543
718
  hostMode: hostSource,
544
719
  bosConfig: deps.bosConfig ?? void 0,
545
720
  extendsChain: []
546
- })).catalogChanged) {
547
- pluginEvents.emit("progress", {
548
- phase: "install",
549
- status: "running"
550
- });
551
- await require_run.run("bun", ["install"], { cwd: deps.configDir });
552
- pluginEvents.emit("progress", {
553
- phase: "install",
554
- status: "done"
555
- });
556
- }
557
- if (apiSource === "local" && !proxy || localPackages.some((pkg) => pkg.startsWith("plugin:"))) {
558
- pluginEvents.emit("progress", {
559
- phase: "build plugin",
560
- status: "running"
561
- });
562
- await buildEveryPluginQuietly(deps.configDir);
563
- pluginEvents.emit("progress", {
564
- phase: "build plugin",
565
- status: "done"
566
- });
721
+ }));
722
+ let configMayHaveChanged = false;
723
+ if (sharedSync.catalogChanged) {
724
+ await timePhase(devTimings, "install", () => require_run.run("bun", ["install"], { cwd: deps.configDir }));
725
+ configMayHaveChanged = true;
567
726
  }
568
- pluginEvents.emit("progress", {
569
- phase: "build",
570
- status: "running"
571
- });
572
- await buildEverythingDevQuietly(deps.configDir);
573
- pluginEvents.emit("progress", {
574
- phase: "build",
575
- status: "done"
576
- });
577
- pluginEvents.emit("progress", {
578
- phase: "config",
579
- status: "done"
727
+ const shouldBuildPlugin = apiSource === "local" && !proxy || localPackages.some((pkg) => pkg.startsWith("plugin:"));
728
+ await timePhase(devTimings, "build", async () => {
729
+ const buildTasks = [buildEverythingDevQuietly(deps.configDir)];
730
+ if (shouldBuildPlugin) buildTasks.push(buildEveryPluginQuietly(deps.configDir));
731
+ await Promise.all(buildTasks);
580
732
  });
581
- const refreshed = await require_config.loadResolvedConfig({
582
- cwd: deps.configDir,
583
- remotePlugins: input.remotePlugins
584
- });
585
- deps.bosConfig = refreshed?.config ?? deps.bosConfig;
586
- deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;
733
+ let devExtendsChain;
734
+ if (configMayHaveChanged || input.remotePlugins?.length) {
735
+ const refreshed = await timePhase(devTimings, "resolve config", () => require_config.loadResolvedConfig({
736
+ cwd: deps.configDir,
737
+ remotePlugins: input.remotePlugins
738
+ }));
739
+ deps.bosConfig = refreshed?.config ?? deps.bosConfig;
740
+ deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;
741
+ devExtendsChain = refreshed?.source.extended;
742
+ }
587
743
  if (!deps.bosConfig) return {
588
744
  status: "error",
589
745
  description: "No bos.config.json found",
590
- processes: []
746
+ processes: [],
747
+ timings: devTimings
591
748
  };
592
749
  if (proxy && !resolveProxyUrl(deps.bosConfig)) return {
593
750
  status: "error",
594
751
  description: "No valid proxy URL configured in bos.config.json",
595
- processes: []
752
+ processes: [],
753
+ timings: devTimings
596
754
  };
597
755
  const hostPort = input.port ?? require_config.getHostDevelopmentPort(deps.bosConfig.app.host.development);
598
756
  require_config.suppressWarnings();
@@ -606,20 +764,18 @@ var plugin_default = (0, every_plugin.createPlugin)({
606
764
  });
607
765
  require_config.drainConfigWarnings();
608
766
  require_config.resumeWarnings();
609
- const runtimeConfig = await require_app.prepareDevelopmentRuntimeConfig(developmentRuntime, {
767
+ const runtimeConfig = await timePhase(devTimings, "ports", () => require_app.prepareDevelopmentRuntimeConfig(developmentRuntime, {
610
768
  hostPort,
611
769
  ssr
612
- });
770
+ }));
613
771
  require_infra.syncGeneratedInfra(deps.configDir, runtimeConfig);
614
- if (!(0, node_fs.existsSync)((0, node_path.join)(deps.configDir, ".env"))) {
615
- require_infra.ensureEnvFile(deps.configDir);
616
- require_infra.loadProjectEnv(deps.configDir);
617
- }
618
- await generateCodeArtifacts(deps.configDir, deps.bosConfig, {
772
+ require_infra.ensureEnvFile(deps.configDir);
773
+ require_infra.loadProjectEnv(deps.configDir);
774
+ await timePhase(devTimings, "generate artifacts", () => generateCodeArtifacts(deps.configDir, deps.bosConfig, {
619
775
  env: "development",
620
- extendsChain: refreshed?.source.extended,
776
+ extendsChain: devExtendsChain,
621
777
  runtimeConfig
622
- });
778
+ }));
623
779
  const services = require_service_descriptor.buildServiceDescriptorMap(runtimeConfig, {
624
780
  ssr,
625
781
  proxy
@@ -651,7 +807,8 @@ var plugin_default = (0, every_plugin.createPlugin)({
651
807
  return {
652
808
  status: "started",
653
809
  description: orchestrator.description,
654
- processes: packages
810
+ processes: packages,
811
+ timings: devTimings
655
812
  };
656
813
  }),
657
814
  start: builder.start.handler(async ({ input }) => {
@@ -712,10 +869,8 @@ var plugin_default = (0, every_plugin.createPlugin)({
712
869
  if (isStaging && config.staging?.domain) runtimeConfig.domain = config.staging.domain;
713
870
  if (isStaging) runtimeConfig.env = "staging";
714
871
  require_infra.syncGeneratedInfra(deps.configDir, runtimeConfig);
715
- if (!(0, node_fs.existsSync)((0, node_path.join)(deps.configDir, ".env"))) {
716
- require_infra.ensureEnvFile(deps.configDir);
717
- require_infra.loadProjectEnv(deps.configDir);
718
- }
872
+ require_infra.ensureEnvFile(deps.configDir);
873
+ require_infra.loadProjectEnv(deps.configDir);
719
874
  pluginEvents.emit("progress", {
720
875
  phase: "generate artifacts",
721
876
  status: "running"
@@ -847,6 +1002,7 @@ var plugin_default = (0, every_plugin.createPlugin)({
847
1002
  env: input.env,
848
1003
  build: input.deploy,
849
1004
  dryRun: input.dryRun,
1005
+ verbose: input.verbose,
850
1006
  packages: input.packages,
851
1007
  network: input.network,
852
1008
  privateKey: input.privateKey
@@ -864,7 +1020,8 @@ var plugin_default = (0, every_plugin.createPlugin)({
864
1020
  txHash: result.txHash,
865
1021
  error: result.error,
866
1022
  built: result.built,
867
- skipped: result.skipped
1023
+ skipped: result.skipped,
1024
+ deployResults: result.deployResults
868
1025
  };
869
1026
  }),
870
1027
  deploy: builder.deploy.handler(async ({ input }) => {
@@ -881,6 +1038,7 @@ var plugin_default = (0, every_plugin.createPlugin)({
881
1038
  env: input.env,
882
1039
  build: input.build,
883
1040
  dryRun: input.dryRun,
1041
+ verbose: input.verbose,
884
1042
  packages: input.packages,
885
1043
  network: input.network,
886
1044
  privateKey: input.privateKey
@@ -892,7 +1050,8 @@ var plugin_default = (0, every_plugin.createPlugin)({
892
1050
  built: result.built,
893
1051
  skipped: result.skipped,
894
1052
  redeployed: false,
895
- error: result.error
1053
+ error: result.error,
1054
+ deployResults: result.deployResults
896
1055
  };
897
1056
  if (result.status === "dry-run") return {
898
1057
  status: "dry-run",
@@ -922,6 +1081,7 @@ var plugin_default = (0, every_plugin.createPlugin)({
922
1081
  built: result.built,
923
1082
  skipped: result.skipped,
924
1083
  redeployed: false,
1084
+ deployResults: result.deployResults,
925
1085
  error: "Config published but Railway redeploy failed: ci.railway.service is not configured in bos.config.json"
926
1086
  };
927
1087
  }
@@ -952,6 +1112,7 @@ var plugin_default = (0, every_plugin.createPlugin)({
952
1112
  skipped: result.skipped,
953
1113
  redeployed: false,
954
1114
  service,
1115
+ deployResults: result.deployResults,
955
1116
  error: `Config published but ${railError}`
956
1117
  };
957
1118
  }
@@ -966,7 +1127,8 @@ var plugin_default = (0, every_plugin.createPlugin)({
966
1127
  built: result.built,
967
1128
  skipped: result.skipped,
968
1129
  redeployed,
969
- service
1130
+ service,
1131
+ deployResults: result.deployResults
970
1132
  };
971
1133
  }),
972
1134
  keyPublish: builder.keyPublish.handler(async ({ input }) => {
@@ -1043,6 +1205,17 @@ var plugin_default = (0, every_plugin.createPlugin)({
1043
1205
  overrides = overrides?.length ? overrides : ["ui", "api"];
1044
1206
  if (overrides.includes("plugins") && plugins === void 0) plugins = parentPluginKeys;
1045
1207
  plugins = plugins ?? [];
1208
+ const pluginDirMap = {};
1209
+ if (parentConfig?.plugins) for (const plugin of plugins) {
1210
+ const entry = parentConfig.plugins?.[plugin];
1211
+ if (entry && typeof entry === "object") {
1212
+ const dev = entry.development;
1213
+ if (typeof dev === "string") {
1214
+ const match = dev.match(/^local:plugins\/(.+)$/);
1215
+ if (match?.[1] && match[1] !== plugin) pluginDirMap[plugin] = match[1];
1216
+ }
1217
+ }
1218
+ }
1046
1219
  directory = directory || domain || extendsGateway;
1047
1220
  const targetDir = (0, node_path.resolve)(directory);
1048
1221
  const extendsRef = `bos://${extendsAccount}/${extendsGateway}`;
@@ -1100,7 +1273,7 @@ var plugin_default = (0, every_plugin.createPlugin)({
1100
1273
  staging: parentConfig?.staging
1101
1274
  }));
1102
1275
  } else {
1103
- const patterns = require_cli_init.buildInitPatterns(overrides, plugins);
1276
+ const patterns = require_cli_init.buildInitPatterns(overrides, plugins, pluginDirMap);
1104
1277
  filesCopied = await timePhase(timings, "copy files", () => require_cli_init.copyFilteredFiles(sourceDir, targetDir, patterns, {
1105
1278
  overrides,
1106
1279
  plugins
@@ -1388,13 +1561,28 @@ async function publishToFastKv(input) {
1388
1561
  const targets = selectWorkspaceTargets(input.packages, bosConfig);
1389
1562
  let built;
1390
1563
  let skipped;
1564
+ let deployResults;
1391
1565
  if (dryRun) return {
1392
1566
  status: "dry-run",
1393
1567
  registryUrl,
1394
1568
  built,
1395
1569
  skipped
1396
1570
  };
1571
+ const privateKey = input.privateKey || node_process.default.env.NEAR_PRIVATE_KEY || node_process.default.env.BOS_NEAR_PRIVATE_KEY;
1572
+ let signingMode;
1573
+ try {
1574
+ signingMode = require_near_cli.resolveNearSigningMode(privateKey);
1575
+ } catch (error) {
1576
+ return {
1577
+ status: "error",
1578
+ registryUrl,
1579
+ error: error instanceof Error ? error.message : "Unknown error"
1580
+ };
1581
+ }
1397
1582
  if (input.build) {
1583
+ console.log(" Ensuring NEAR CLI...");
1584
+ await effect.Effect.runPromise(require_near_cli.ensureNearCli);
1585
+ console.log(" NEAR CLI ready");
1398
1586
  await generateCodeArtifacts(configDir, bosConfig, {
1399
1587
  env: "production",
1400
1588
  runtimeConfig: runtimeConfig ?? void 0
@@ -1404,16 +1592,45 @@ async function publishToFastKv(input) {
1404
1592
  bosConfig,
1405
1593
  runtimeConfig,
1406
1594
  targets,
1407
- deploy: true
1595
+ deploy: true,
1596
+ verbose: input.verbose
1408
1597
  });
1409
1598
  built = result.built;
1410
1599
  skipped = result.skipped;
1600
+ deployResults = result.deployResults;
1601
+ if (deployResults) {
1602
+ const failures = deployResults.filter((r) => !r.success);
1603
+ if (failures.length > 0) {
1604
+ const total = deployResults.length;
1605
+ console.log();
1606
+ console.log(require_theme.colors.error(` ${require_theme.icons.err} Deploy failed — ${failures.length} of ${total} workspace${total > 1 ? "s" : ""} failed`));
1607
+ console.log();
1608
+ for (const f of failures) {
1609
+ const errorLine = (f.error ?? "Failed").split("\n")[0];
1610
+ console.log(` ${require_theme.colors.error(require_theme.icons.err)} ${padRight(f.key, 28)} ${errorLine}`);
1611
+ }
1612
+ console.log();
1613
+ if (!input.verbose) {
1614
+ console.log(require_theme.colors.dim(" Run with --verbose for full build output."));
1615
+ console.log();
1616
+ }
1617
+ return {
1618
+ status: "error",
1619
+ registryUrl,
1620
+ built,
1621
+ skipped,
1622
+ deployResults,
1623
+ error: `${failures.length} of ${total} workspaces failed to deploy`
1624
+ };
1625
+ }
1626
+ }
1411
1627
  const refreshed = await require_config.loadResolvedConfig({ cwd: configDir });
1412
1628
  if (!refreshed?.config) return {
1413
1629
  status: "error",
1414
1630
  registryUrl,
1415
1631
  built,
1416
1632
  skipped,
1633
+ deployResults,
1417
1634
  error: "Failed to reload bos.config.json after build"
1418
1635
  };
1419
1636
  bosConfig = refreshed.config;
@@ -1427,28 +1644,14 @@ async function publishToFastKv(input) {
1427
1644
  const registryEntries = { [`apps/${account}/${gateway}/bos.config.json`]: JSON.stringify(publishPayload) };
1428
1645
  const payload = JSON.stringify(registryEntries);
1429
1646
  const argsBase64 = Buffer.from(payload).toString("base64");
1430
- const privateKey = input.privateKey || node_process.default.env.NEAR_PRIVATE_KEY || node_process.default.env.BOS_NEAR_PRIVATE_KEY;
1431
- let signingMode;
1432
- try {
1433
- signingMode = require_near_cli.resolveNearSigningMode(privateKey);
1434
- } catch (error) {
1435
- return {
1436
- status: "error",
1437
- registryUrl,
1438
- error: error instanceof Error ? error.message : "Unknown error"
1439
- };
1440
- }
1441
1647
  console.log();
1442
1648
  console.log(" Publishing to:");
1443
1649
  console.log(` ${require_theme.colors.cyan(registryUrl)}`);
1444
1650
  try {
1445
- console.log(" Ensuring NEAR CLI...");
1446
- await effect.Effect.runPromise(require_near_cli.ensureNearCli);
1447
- console.log(" NEAR CLI ready");
1448
1651
  let txHash;
1449
1652
  console.log(` Submitting transaction on ${network}...`);
1450
1653
  try {
1451
- txHash = (await effect.Effect.runPromise(require_near_cli.executeTransaction({
1654
+ const tx = await effect.Effect.runPromise(require_near_cli.executeTransaction({
1452
1655
  account,
1453
1656
  contract: require_fastkv.getRegistryNamespaceForNetwork(network),
1454
1657
  method: "__fastdata_kv",
@@ -1456,12 +1659,25 @@ async function publishToFastKv(input) {
1456
1659
  network,
1457
1660
  privateKey: signingMode._tag === "privateKey" ? signingMode.privateKey : void 0,
1458
1661
  gas: "300Tgas",
1459
- deposit: "0NEAR"
1460
- }, signingMode))).txHash;
1461
- if (txHash) console.log(` Transaction submitted: ${require_theme.colors.dim(txHash)}`);
1662
+ deposit: "0NEAR",
1663
+ verbose: input.verbose
1664
+ }, signingMode));
1665
+ txHash = tx.txHash;
1666
+ if (txHash && !tx.output?.includes("CodeDoesNotExist")) console.log(` Transaction submitted: ${require_theme.colors.dim(txHash)}`);
1462
1667
  } catch (error) {
1463
- txHash = extractTransactionHash(error);
1464
- if (!txHash) throw error;
1668
+ console.log(require_theme.colors.dim(" Transaction reported an error — verifying publish..."));
1669
+ try {
1670
+ await waitForPublishedConfig({
1671
+ account,
1672
+ gateway,
1673
+ publishConfig: publishPayload,
1674
+ timeoutMs: 3e4,
1675
+ intervalMs: 2e3
1676
+ });
1677
+ txHash = extractTransactionHash(error);
1678
+ } catch {
1679
+ throw error;
1680
+ }
1465
1681
  }
1466
1682
  console.log(" Waiting for publish confirmation...");
1467
1683
  await waitForPublishedConfig({
@@ -1475,18 +1691,26 @@ async function publishToFastKv(input) {
1475
1691
  txHash,
1476
1692
  built,
1477
1693
  skipped,
1694
+ deployResults,
1478
1695
  publishConfig: publishPayload
1479
1696
  };
1480
1697
  } catch (error) {
1481
1698
  return {
1482
1699
  status: "error",
1483
1700
  registryUrl,
1484
- error: error instanceof Error ? error.message : "Unknown error",
1701
+ error: formatNearError(error),
1485
1702
  built,
1486
- skipped
1703
+ skipped,
1704
+ deployResults
1487
1705
  };
1488
1706
  }
1489
1707
  }
1708
+ function formatNearError(error) {
1709
+ const message = error instanceof Error ? error.message : String(error);
1710
+ if (message.includes("exceeded gas") || message.includes("GasLimitExceeded")) return `Transaction exceeded gas limit.\n Original: ${message}`;
1711
+ if (message.includes("timeout") || message.includes("Timeout")) return `Transaction timed out. Check NEAR network status.\n Original: ${message}`;
1712
+ return message;
1713
+ }
1490
1714
  function extractTransactionHash(error) {
1491
1715
  return (error instanceof Error ? error.message : String(error)).match(/Transaction ID:\s*([A-Za-z0-9]+)/i)?.[1];
1492
1716
  }