@superblocksteam/sdk 2.0.114 → 2.0.115-next.1

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.
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Helpers to classify Vite / esbuild stderr and emit logs that are easy to facet in Datadog
3
+ * (stable tokens: sdk_dev_server_vite_error, category=module_resolve, unresolved_specifier=...).
4
+ */
5
+ /** Maximum characters of raw Vite/esbuild output stored on the error meta stack field. */
6
+ export const VITE_ERROR_RAW_LOG_MAX_CHARS = 12_000;
7
+ function quoteFacetValue(value) {
8
+ if (/^[A-Za-z0-9@._:/-]+$/.test(value)) {
9
+ return value;
10
+ }
11
+ return JSON.stringify(value);
12
+ }
13
+ /**
14
+ * Best-effort parse of Vite/esbuild multi-line error text (optimizeDeps, build, etc.).
15
+ */
16
+ export function diagnoseViteBuildLogMessage(msg) {
17
+ const resolveMatch = msg.match(/Could not resolve ['"]([^'"]+)['"]/);
18
+ if (resolveMatch?.[1]) {
19
+ return {
20
+ category: "module_resolve",
21
+ unresolvedSpecifier: resolveMatch[1],
22
+ };
23
+ }
24
+ if (/\boptimizeDeps\b|pre-bundl/i.test(msg)) {
25
+ return { category: "optimize_deps" };
26
+ }
27
+ return { category: "unknown" };
28
+ }
29
+ export function formatViteDevServerStartedLog(params) {
30
+ return `sdk_dev_server_vite_ready sdk_version=${quoteFacetValue(params.sdkVersion)} vite_root=${quoteFacetValue(params.viteRootBasename)}`;
31
+ }
32
+ export function formatViteBuildErrorLogSummary(params) {
33
+ const { diagnostic, sdkVersion, viteRootBasename } = params;
34
+ const parts = [
35
+ "sdk_dev_server_vite_error",
36
+ `sdk_version=${quoteFacetValue(sdkVersion)}`,
37
+ `vite_root=${quoteFacetValue(viteRootBasename)}`,
38
+ `category=${diagnostic.category}`,
39
+ ];
40
+ if (diagnostic.unresolvedSpecifier) {
41
+ parts.push(`unresolved_specifier=${quoteFacetValue(diagnostic.unresolvedSpecifier)}`);
42
+ }
43
+ return parts.join(" ");
44
+ }
45
+ export function viteErrorKindForDiagnostic(diagnostic) {
46
+ switch (diagnostic.category) {
47
+ case "module_resolve":
48
+ return "ViteModuleResolveError";
49
+ case "optimize_deps":
50
+ return "ViteOptimizeDepsError";
51
+ case "unknown":
52
+ return "ViteBuildError";
53
+ }
54
+ throw new Error(`Unhandled Vite build diagnostic category: ${String(diagnostic.category)}`);
55
+ }
56
+ export function truncateViteRawLog(msg) {
57
+ if (msg.length <= VITE_ERROR_RAW_LOG_MAX_CHARS) {
58
+ return msg;
59
+ }
60
+ return `${msg.slice(0, VITE_ERROR_RAW_LOG_MAX_CHARS)}\n...(truncated)`;
61
+ }
62
+ function defaultBuildSummary(params) {
63
+ return formatViteBuildErrorLogSummary({
64
+ diagnostic: { category: "unknown" },
65
+ sdkVersion: params.sdkVersion,
66
+ viteRootBasename: params.viteRootBasename,
67
+ });
68
+ }
69
+ function diagnosticsFailureMeta(error, rawMessage) {
70
+ return {
71
+ error: {
72
+ kind: "ViteDiagnosticsError",
73
+ message: error instanceof Error ? error.message : "unknown",
74
+ stack: truncateViteRawLog(rawMessage),
75
+ },
76
+ };
77
+ }
78
+ export function buildViteBuildErrorLog(params, overrides) {
79
+ const deps = {
80
+ diagnose: diagnoseViteBuildLogMessage,
81
+ errorKind: viteErrorKindForDiagnostic,
82
+ formatSummary: formatViteBuildErrorLogSummary,
83
+ truncate: truncateViteRawLog,
84
+ ...overrides,
85
+ };
86
+ try {
87
+ const diagnostic = deps.diagnose(params.rawMessage);
88
+ return {
89
+ error: {
90
+ kind: deps.errorKind(diagnostic),
91
+ message: diagnostic.category === "module_resolve"
92
+ ? `Could not resolve: ${diagnostic.unresolvedSpecifier}`
93
+ : "Vite or esbuild reported an error",
94
+ stack: deps.truncate(params.rawMessage),
95
+ },
96
+ message: deps.formatSummary({
97
+ diagnostic,
98
+ sdkVersion: params.sdkVersion,
99
+ viteRootBasename: params.viteRootBasename,
100
+ }),
101
+ };
102
+ }
103
+ catch {
104
+ // Keep the final fallback independent from injected helpers so a helper bug
105
+ // cannot prevent us from returning some structured error payload at all.
106
+ return {
107
+ error: {
108
+ kind: "ViteBuildError",
109
+ message: "Vite or esbuild reported an error",
110
+ stack: truncateViteRawLog(params.rawMessage),
111
+ },
112
+ message: defaultBuildSummary(params),
113
+ };
114
+ }
115
+ }
116
+ export function logViteBuildError(logger, params, overrides) {
117
+ const build = overrides?.build ?? buildViteBuildErrorLog;
118
+ try {
119
+ const viteErrorLog = build(params);
120
+ logger.error(viteErrorLog.message, {
121
+ error: viteErrorLog.error,
122
+ });
123
+ }
124
+ catch (error) {
125
+ try {
126
+ logger.error(params.rawMessage, diagnosticsFailureMeta(error, params.rawMessage));
127
+ }
128
+ catch {
129
+ // Prevent exceptions from propagating into Vite's logger internals.
130
+ }
131
+ }
132
+ }
133
+ //# sourceMappingURL=vite-dev-server-diagnostics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-dev-server-diagnostics.mjs","sourceRoot":"","sources":["../../src/dev-utils/vite-dev-server-diagnostics.mts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"AAgDA,UAAU,SAAS;IACjB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACpD;AAiDD,wBAAgB,SAAS,CACvB,cAAc,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,GAChD,MAAM,CAWR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAgBtD"}
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"AA6DA,UAAU,SAAS;IACjB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACpD;AAwDD,wBAAgB,SAAS,CACvB,cAAc,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,GAChD,MAAM,CAWR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAgBtD"}
@@ -1,15 +1,21 @@
1
1
  import { SeverityNumber } from "@opentelemetry/api-logs";
2
2
  import { createLogger, format, transports } from "winston";
3
+ import { sanitizeLogError, sanitizeLogMessage, } from "@superblocksteam/telemetry";
3
4
  import { getLogger as getTracedLogger } from "./index.js";
4
5
  import { safeStringify } from "./safe-stringify.js";
5
6
  const activeTransports = [];
6
7
  if (process.env.SUPERBLOCKS_IS_CSB === "true") {
7
- // TODO(alex): Revisit this for cloud-prem if we want logger to write to stdout
8
+ // info to stdout for cluster log shippers / kubectl logs;
9
+ // debug stays in /tmp/dev-server.log for on-pod triage
8
10
  activeTransports.push(new transports.File({
9
- format: format.json(),
11
+ format: format.combine(format.timestamp(), format.json()),
10
12
  filename: `/tmp/dev-server.log`,
11
13
  level: "debug",
12
14
  }));
15
+ activeTransports.push(new transports.Console({
16
+ format: format.combine(format.timestamp(), format.json()),
17
+ level: process.env.SUPERBLOCKS_SDK_LOG_LEVEL ?? "info",
18
+ }));
13
19
  }
14
20
  else {
15
21
  // having no transport increases memory usage
@@ -30,6 +36,7 @@ const winstonLogger = createLogger({
30
36
  level: "debug",
31
37
  exitOnError: false,
32
38
  format: format.json(),
39
+ defaultMeta: { process: "child" },
33
40
  transports: activeTransports,
34
41
  });
35
42
  function formatMessages(messages) {
@@ -37,7 +44,7 @@ function formatMessages(messages) {
37
44
  }
38
45
  const logger = Object.freeze({
39
46
  debug: (...messages) => {
40
- const body = formatMessages(messages);
47
+ const body = sanitizeLogMessage(formatMessages(messages));
41
48
  getTracedLogger().emit({
42
49
  severityNumber: SeverityNumber.DEBUG,
43
50
  severityText: "DEBUG",
@@ -46,7 +53,7 @@ const logger = Object.freeze({
46
53
  winstonLogger.debug(body);
47
54
  },
48
55
  info: (...messages) => {
49
- const body = formatMessages(messages);
56
+ const body = sanitizeLogMessage(formatMessages(messages));
50
57
  getTracedLogger().emit({
51
58
  severityNumber: SeverityNumber.INFO,
52
59
  severityText: "INFO",
@@ -55,7 +62,7 @@ const logger = Object.freeze({
55
62
  winstonLogger.info(body);
56
63
  },
57
64
  warn: (...messages) => {
58
- const body = formatMessages(messages);
65
+ const body = sanitizeLogMessage(formatMessages(messages));
59
66
  getTracedLogger().emit({
60
67
  severityNumber: SeverityNumber.WARN,
61
68
  severityText: "WARN",
@@ -64,17 +71,22 @@ const logger = Object.freeze({
64
71
  winstonLogger.warn(body);
65
72
  },
66
73
  error: (message, meta) => {
74
+ const safeMessage = sanitizeLogMessage(message);
75
+ const safeError = meta?.error
76
+ ? (({ kind, message, stack }) => ({ kind, message, stack }))(sanitizeLogError(meta.error))
77
+ : undefined;
78
+ const safeMeta = safeError ? { error: safeError } : undefined;
67
79
  getTracedLogger().emit({
68
80
  severityNumber: SeverityNumber.ERROR,
69
81
  severityText: "ERROR",
70
- body: message,
71
- attributes: meta,
82
+ body: safeMessage,
83
+ attributes: safeMeta,
72
84
  });
73
- if (meta) {
74
- winstonLogger.error(message, { error: meta.error });
85
+ if (safeError) {
86
+ winstonLogger.error(safeMessage, { error: safeError });
75
87
  }
76
88
  else {
77
- winstonLogger.error(message);
89
+ winstonLogger.error(safeMessage);
78
90
  }
79
91
  },
80
92
  });
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logging.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ const { emitMock, winstonErrorMock, winstonLoggerMock, sanitizeLogMessageMock, sanitizeLogErrorMock, } = vi.hoisted(() => {
3
+ const emitMock = vi.fn();
4
+ const winstonErrorMock = vi.fn();
5
+ const winstonLoggerMock = {
6
+ debug: vi.fn(),
7
+ info: vi.fn(),
8
+ warn: vi.fn(),
9
+ error: winstonErrorMock,
10
+ };
11
+ const sanitizeLogMessageMock = vi.fn((message) => `sanitized-message:${message}`);
12
+ const sanitizeLogErrorMock = vi.fn((error) => ({
13
+ ...error,
14
+ message: `sanitized-error:${error.message}`,
15
+ stack: error.stack ? `sanitized-error:${error.stack}` : undefined,
16
+ }));
17
+ return {
18
+ emitMock,
19
+ winstonErrorMock,
20
+ winstonLoggerMock,
21
+ sanitizeLogMessageMock,
22
+ sanitizeLogErrorMock,
23
+ };
24
+ });
25
+ vi.mock("@superblocksteam/telemetry", () => ({
26
+ sanitizeLogMessage: sanitizeLogMessageMock,
27
+ sanitizeLogError: sanitizeLogErrorMock,
28
+ }));
29
+ vi.mock("./index.js", () => ({
30
+ getLogger: vi.fn(() => ({
31
+ emit: emitMock,
32
+ })),
33
+ }));
34
+ vi.mock("winston", () => ({
35
+ createLogger: vi.fn(() => winstonLoggerMock),
36
+ format: {
37
+ combine: vi.fn(() => ({})),
38
+ timestamp: vi.fn(() => ({})),
39
+ json: vi.fn(() => ({})),
40
+ printf: vi.fn(() => ({})),
41
+ colorize: vi.fn(() => ({})),
42
+ },
43
+ transports: {
44
+ File: class {
45
+ constructor() { }
46
+ },
47
+ Console: class {
48
+ constructor() { }
49
+ },
50
+ },
51
+ }));
52
+ import { getLogger } from "./logging.js";
53
+ describe("telemetry logger error sanitization", () => {
54
+ beforeEach(() => {
55
+ vi.clearAllMocks();
56
+ });
57
+ it.each(["debug", "info", "warn"])("sanitizes %s-level messages before emit and winston", (level) => {
58
+ const logger = getLogger();
59
+ logger[level]("api_key=secret");
60
+ expect(sanitizeLogMessageMock).toHaveBeenCalledWith("api_key=secret");
61
+ });
62
+ it("sanitizes error meta for traced emit and winston output", () => {
63
+ const logger = getLogger();
64
+ const meta = {
65
+ error: {
66
+ kind: "RuntimeError",
67
+ message: "token=super-secret-token",
68
+ stack: "Error: token=super-secret-token",
69
+ },
70
+ };
71
+ logger.error("api_key=super-secret-key", meta);
72
+ expect(sanitizeLogMessageMock).toHaveBeenCalledWith("api_key=super-secret-key");
73
+ expect(sanitizeLogErrorMock).toHaveBeenCalledWith(meta.error);
74
+ expect(emitMock).toHaveBeenCalledWith(expect.objectContaining({
75
+ body: "sanitized-message:api_key=super-secret-key",
76
+ attributes: {
77
+ error: {
78
+ kind: "RuntimeError",
79
+ message: "sanitized-error:token=super-secret-token",
80
+ stack: "sanitized-error:Error: token=super-secret-token",
81
+ },
82
+ },
83
+ }));
84
+ expect(winstonErrorMock).toHaveBeenCalledWith("sanitized-message:api_key=super-secret-key", {
85
+ error: {
86
+ kind: "RuntimeError",
87
+ message: "sanitized-error:token=super-secret-token",
88
+ stack: "sanitized-error:Error: token=super-secret-token",
89
+ },
90
+ });
91
+ });
92
+ it("does not sanitize or emit error attributes when meta is missing", () => {
93
+ const logger = getLogger();
94
+ logger.error("plain failure");
95
+ expect(sanitizeLogMessageMock).toHaveBeenCalledWith("plain failure");
96
+ expect(sanitizeLogErrorMock).not.toHaveBeenCalled();
97
+ expect(emitMock).toHaveBeenCalledWith(expect.objectContaining({
98
+ body: "sanitized-message:plain failure",
99
+ attributes: undefined,
100
+ }));
101
+ expect(winstonErrorMock).toHaveBeenCalledWith("sanitized-message:plain failure");
102
+ });
103
+ });
104
+ //# sourceMappingURL=logging.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.test.js","sourceRoot":"","sources":["../../src/telemetry/logging.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superblocksteam/sdk",
3
- "version": "2.0.114",
3
+ "version": "2.0.115-next.1",
4
4
  "description": "Superblocks JS SDK",
5
5
  "homepage": "https://www.superblocks.com",
6
6
  "license": "Superblocks Community Software License",
@@ -16,7 +16,7 @@
16
16
  "@babel/parser": "^7.25.8",
17
17
  "@babel/plugin-proposal-decorators": "^7.28.0",
18
18
  "@babel/plugin-transform-typescript": "7.28.0",
19
- "@opentelemetry/api": "^1.9.0",
19
+ "@opentelemetry/api": "^1.9.1",
20
20
  "@opentelemetry/api-logs": "^0.203.0",
21
21
  "@opentelemetry/context-async-hooks": "^2.0.1",
22
22
  "@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
@@ -48,11 +48,11 @@
48
48
  "vite-tsconfig-paths": "^6.0.4",
49
49
  "winston": "^3.17.0",
50
50
  "yaml": "^2.7.1",
51
- "@superblocksteam/library-shared": "2.0.114",
52
- "@superblocksteam/shared": "0.9584.9",
53
- "@superblocksteam/telemetry": "2.0.114",
54
- "@superblocksteam/util": "2.0.114",
55
- "@superblocksteam/vite-plugin-file-sync": "2.0.114"
51
+ "@superblocksteam/library-shared": "2.0.115-next.1",
52
+ "@superblocksteam/shared": "0.9585.0",
53
+ "@superblocksteam/telemetry": "2.0.115-next.1",
54
+ "@superblocksteam/util": "2.0.115-next.1",
55
+ "@superblocksteam/vite-plugin-file-sync": "2.0.115-next.1"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@eslint/js": "^9.39.2",
@@ -603,6 +603,100 @@ export async function dev(options: {
603
603
  applicationId: applicationConfig.id,
604
604
  workDir: cwd,
605
605
  });
606
+
607
+ // In CSB mode, schedule a background retry loop. The app's
608
+ // git config may not be persisted yet at claim time (e.g. git
609
+ // was connected moments before the CSB was assigned). Without
610
+ // this, the CSB runs its entire lifetime without git — meaning
611
+ // changes are only in DBFS and are lost if the CSB recycles.
612
+ if (lockType === LockType.CSB) {
613
+ const GIT_RETRY_DELAY_MS = 30_000;
614
+ const GIT_RETRY_MAX_ATTEMPTS = 10;
615
+ const scheduleRetry = (attempt: number): void => {
616
+ if (attempt > GIT_RETRY_MAX_ATTEMPTS) {
617
+ logger.info(
618
+ "[git] background bootstrap retry exhausted, giving up",
619
+ {
620
+ gitCategory: "setup",
621
+ gitOperation: "background-retry",
622
+ gitOutcome: "exhausted",
623
+ gitAttempt: attempt - 1,
624
+ applicationId: applicationConfig.id,
625
+ },
626
+ );
627
+ return;
628
+ }
629
+ const timer = setTimeout(() => {
630
+ void (async () => {
631
+ if (gitService) return;
632
+ try {
633
+ const svc = await bootstrapGitService({
634
+ sdk,
635
+ applicationId: applicationConfig.id,
636
+ cwd,
637
+ logger,
638
+ userName: gitUserName,
639
+ userEmail: gitUserEmail,
640
+ superblocksBaseUrl:
641
+ tokenConfig.superblocksBaseUrl,
642
+ });
643
+ if (!svc) {
644
+ scheduleRetry(attempt + 1);
645
+ return;
646
+ }
647
+
648
+ gitService = svc;
649
+
650
+ try {
651
+ await fetchAndEnsureLiveBranch(
652
+ svc,
653
+ "Git background retry fetch failed",
654
+ );
655
+ } catch {
656
+ // non-fatal
657
+ }
658
+
659
+ activeDbfsBranchName =
660
+ await ensureRuntimeDbfsBranchConsistency({
661
+ sdk,
662
+ applicationConfig,
663
+ logger,
664
+ lockService,
665
+ syncService,
666
+ currentBranchName: activeDbfsBranchName,
667
+ });
668
+
669
+ logger.info(
670
+ "[git] background bootstrap retry succeeded",
671
+ {
672
+ gitCategory: "setup",
673
+ gitOperation: "background-retry",
674
+ gitOutcome: "success",
675
+ gitAttempt: attempt,
676
+ applicationId: applicationConfig.id,
677
+ },
678
+ );
679
+ } catch (err) {
680
+ logger.warn(
681
+ "[git] background bootstrap retry failed",
682
+ {
683
+ gitCategory: "setup",
684
+ gitOperation: "background-retry",
685
+ gitOutcome: "failed",
686
+ gitAttempt: attempt,
687
+ applicationId: applicationConfig.id,
688
+ ...getGitErrorFields(err),
689
+ },
690
+ );
691
+ scheduleRetry(attempt + 1);
692
+ }
693
+ })();
694
+ }, GIT_RETRY_DELAY_MS);
695
+ timer.unref();
696
+ };
697
+ scheduleRetry(1);
698
+ }
699
+
606
700
  gitSpan.end();
607
701
  return;
608
702
  }
@@ -1230,10 +1324,23 @@ async function ensureLiveBranchCheckedOutAfterFetch(
1230
1324
  // If remote live branch exists, initialize/switch local live branch from it.
1231
1325
  // This handles fresh repos where HEAD is unborn before first fetch.
1232
1326
  if (await canResolveRef(git, `origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`)) {
1233
- await git.checkoutOrCreate(
1234
- SUPERBLOCKS_LIVE_GIT_BRANCH,
1235
- `origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`,
1236
- );
1327
+ try {
1328
+ await git.checkoutOrCreate(
1329
+ SUPERBLOCKS_LIVE_GIT_BRANCH,
1330
+ `origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`,
1331
+ );
1332
+ } catch {
1333
+ // Pre-warmed CSBs download DBFS files before git is set up, leaving
1334
+ // untracked working tree files that collide with the branch contents.
1335
+ // Force-checkout is safe here — the files are identical.
1336
+ await git.raw([
1337
+ "checkout",
1338
+ "-f",
1339
+ "-B",
1340
+ SUPERBLOCKS_LIVE_GIT_BRANCH,
1341
+ `origin/${SUPERBLOCKS_LIVE_GIT_BRANCH}`,
1342
+ ]);
1343
+ }
1237
1344
  return;
1238
1345
  }
1239
1346
 
@@ -48,6 +48,10 @@ import {
48
48
  customComponentsPlugin,
49
49
  isCustomComponentsEnabled,
50
50
  } from "./custom-build.mjs";
51
+ import {
52
+ formatViteDevServerStartedLog,
53
+ logViteBuildError,
54
+ } from "./vite-dev-server-diagnostics.mjs";
51
55
  import { buildManifestStubPlugin } from "./vite-plugin-build-manifest-stub.mjs";
52
56
  import { ddRumPlugin } from "./vite-plugin-dd-rum.mjs";
53
57
 
@@ -833,7 +837,11 @@ async function startVite({
833
837
  logger.warn(msg);
834
838
  };
835
839
  viteLogger.error = (msg: string) => {
836
- logger.error(msg);
840
+ logViteBuildError(logger, {
841
+ rawMessage: msg,
842
+ sdkVersion: pkg.version,
843
+ viteRootBasename: path.basename(root),
844
+ });
837
845
  };
838
846
 
839
847
  viteLogger.clearScreen = () => {};
@@ -954,7 +962,12 @@ async function startVite({
954
962
 
955
963
  const routeIndex = (app._router as IRouter).stack.length;
956
964
  app.use(viteServer.middlewares);
957
- logger.info("Dev server created and middleware attached successfully");
965
+ logger.info(
966
+ `${formatViteDevServerStartedLog({
967
+ sdkVersion: pkg.version,
968
+ viteRootBasename: path.basename(root),
969
+ })} Dev server created and middleware attached successfully`,
970
+ );
958
971
 
959
972
  return {
960
973
  viteServer,