@superblocksteam/sdk 2.0.141-next.0 → 2.0.141-next.2
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.
- package/.turbo/turbo-build.log +1 -1
- package/dist/cli-replacement/dependency-install-classifier.d.mts +2 -6
- package/dist/cli-replacement/dependency-install-classifier.d.mts.map +1 -1
- package/dist/cli-replacement/dependency-install-classifier.mjs +1 -1
- package/dist/cli-replacement/dependency-install-classifier.mjs.map +1 -1
- package/dist/cli-replacement/dev.d.mts.map +1 -1
- package/dist/cli-replacement/dev.mjs +74 -27
- package/dist/cli-replacement/dev.mjs.map +1 -1
- package/dist/cli-replacement/disk-space.d.mts +7 -19
- package/dist/cli-replacement/disk-space.d.mts.map +1 -1
- package/dist/cli-replacement/disk-space.mjs +2 -2
- package/dist/cli-replacement/disk-space.mjs.map +1 -1
- package/dist/cli-replacement/home-npmrc.d.mts +4 -3
- package/dist/cli-replacement/home-npmrc.d.mts.map +1 -1
- package/dist/cli-replacement/normalize-workspace-protocol.d.ts +1 -1
- package/dist/cli-replacement/normalize-workspace-protocol.d.ts.map +1 -1
- package/dist/cli-replacement/package-json-snapshot.d.mts +0 -1
- package/dist/cli-replacement/package-json-snapshot.d.mts.map +1 -1
- package/dist/cli-replacement/package-json-snapshot.mjs +1 -1
- package/dist/cli-replacement/package-json-snapshot.mjs.map +1 -1
- package/dist/cli-replacement/post-upgrade-lockfile-strip.d.mts +3 -2
- package/dist/cli-replacement/post-upgrade-lockfile-strip.d.mts.map +1 -1
- package/dist/cli-replacement/version-detection.d.ts +2 -1
- package/dist/cli-replacement/version-detection.d.ts.map +1 -1
- package/dist/client.d.ts +6 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/collect-sdk-apis.d.mts +4 -3
- package/dist/collect-sdk-apis.d.mts.map +1 -1
- package/dist/dev-utils/dedupe-async.d.ts +2 -1
- package/dist/dev-utils/dedupe-async.d.ts.map +1 -1
- package/dist/dev-utils/dev-server-metrics.d.mts +4 -3
- package/dist/dev-utils/dev-server-metrics.d.mts.map +1 -1
- package/dist/dev-utils/dev-server-metrics.mjs +3 -2
- package/dist/dev-utils/dev-server-metrics.mjs.map +1 -1
- package/dist/dev-utils/dev-server.d.mts +5 -1
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +12 -18
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/dev-utils/dev-server.optimize-deps.test.d.mts +2 -0
- package/dist/dev-utils/dev-server.optimize-deps.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server.optimize-deps.test.mjs +490 -0
- package/dist/dev-utils/dev-server.optimize-deps.test.mjs.map +1 -0
- package/dist/dev-utils/fatal-exit.d.mts +3 -2
- package/dist/dev-utils/fatal-exit.d.mts.map +1 -1
- package/dist/dev-utils/optimize-deps-config.d.mts +16 -0
- package/dist/dev-utils/optimize-deps-config.d.mts.map +1 -0
- package/dist/dev-utils/optimize-deps-config.mjs +95 -0
- package/dist/dev-utils/optimize-deps-config.mjs.map +1 -0
- package/dist/dev-utils/prepare-in-place-restart.d.mts +4 -3
- package/dist/dev-utils/prepare-in-place-restart.d.mts.map +1 -1
- package/dist/dev-utils/vite-dev-server-diagnostics.d.mts +1 -1
- package/dist/dev-utils/vite-dev-server-diagnostics.d.mts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/parse-sdk-registry.d.mts +2 -2
- package/dist/parse-sdk-registry.d.mts.map +1 -1
- package/dist/parse-sdk-registry.mjs.map +1 -1
- package/dist/sdk.d.ts +0 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +0 -1
- package/dist/sdk.js.map +1 -1
- package/dist/telemetry/attributes.d.ts +0 -1
- package/dist/telemetry/attributes.d.ts.map +1 -1
- package/dist/telemetry/attributes.js +0 -2
- package/dist/telemetry/attributes.js.map +1 -1
- package/dist/telemetry/local-obs.d.ts +0 -30
- package/dist/telemetry/local-obs.d.ts.map +1 -1
- package/dist/telemetry/local-obs.js +1 -1
- package/dist/telemetry/local-obs.js.map +1 -1
- package/dist/telemetry/logging.d.ts +2 -1
- package/dist/telemetry/logging.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/cli-replacement/dependency-install-classifier.mts +2 -2
- package/src/cli-replacement/dev.mts +118 -34
- package/src/cli-replacement/disk-space.mts +8 -9
- package/src/cli-replacement/home-npmrc.mts +3 -3
- package/src/cli-replacement/normalize-workspace-protocol.ts +1 -1
- package/src/cli-replacement/package-json-snapshot.mts +1 -1
- package/src/cli-replacement/post-upgrade-lockfile-strip.mts +2 -2
- package/src/cli-replacement/version-detection.ts +1 -1
- package/src/client.ts +6 -6
- package/src/collect-sdk-apis.mts +3 -3
- package/src/dev-utils/dedupe-async.ts +1 -1
- package/src/dev-utils/dev-server-metrics.mts +4 -2
- package/src/dev-utils/dev-server.mts +23 -17
- package/src/dev-utils/dev-server.optimize-deps.test.mts +671 -0
- package/src/dev-utils/fatal-exit.mts +2 -2
- package/src/dev-utils/optimize-deps-config.mts +96 -0
- package/src/dev-utils/prepare-in-place-restart.mts +3 -3
- package/src/dev-utils/vite-dev-server-diagnostics.mts +1 -1
- package/src/index.ts +0 -7
- package/src/parse-sdk-registry.mts +1 -2
- package/src/sdk.ts +0 -5
- package/src/telemetry/attributes.ts +0 -2
- package/src/telemetry/local-obs.ts +2 -2
- package/src/telemetry/logging.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
buildGithubSuperblocksSyncWorkflowFromBaseUrl,
|
|
18
18
|
ConflictError,
|
|
19
19
|
DEFAULT_NON_GIT_BRANCH,
|
|
20
|
+
isGitAuthErrorMessage,
|
|
20
21
|
isGitHubRemoteUrl,
|
|
21
22
|
SUPERBLOCKS_LIVE_GIT_BRANCH,
|
|
22
23
|
} from "@superblocksteam/shared";
|
|
@@ -1007,6 +1008,7 @@ export async function dev(options: {
|
|
|
1007
1008
|
|
|
1008
1009
|
const fsOperationQueue = new OperationQueue();
|
|
1009
1010
|
let activeDbfsBranchName = applicationConfig?.branchName ?? "main";
|
|
1011
|
+
let devStartupGitBootstrapAuthFailed = false;
|
|
1010
1012
|
let devStartupGitOutcome:
|
|
1011
1013
|
| "skipped_no_remote"
|
|
1012
1014
|
| "bootstrap_failed"
|
|
@@ -1286,6 +1288,8 @@ export async function dev(options: {
|
|
|
1286
1288
|
} catch (gitError) {
|
|
1287
1289
|
// Init/configure/ensureGitRepo failed — repo is not usable
|
|
1288
1290
|
devStartupGitOutcome = "bootstrap_failed";
|
|
1291
|
+
devStartupGitBootstrapAuthFailed =
|
|
1292
|
+
isGitAuthErrorMessage(gitError);
|
|
1289
1293
|
gitService = undefined;
|
|
1290
1294
|
logger.warn(
|
|
1291
1295
|
"[git] startup git setup failed, continuing without git",
|
|
@@ -1947,6 +1951,33 @@ export async function dev(options: {
|
|
|
1947
1951
|
}
|
|
1948
1952
|
};
|
|
1949
1953
|
|
|
1954
|
+
const refreshRuntimeGitCredentials = async (): Promise<
|
|
1955
|
+
GitService | undefined
|
|
1956
|
+
> => {
|
|
1957
|
+
const gitConfigSdk = sdk as unknown as GitConfigSdk;
|
|
1958
|
+
const gitConfig = await gitConfigSdk.getApplicationGitConfig(
|
|
1959
|
+
applicationConfig.id,
|
|
1960
|
+
);
|
|
1961
|
+
if (!gitConfig?.gitRemoteUrl) {
|
|
1962
|
+
return undefined;
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
if (gitService) {
|
|
1966
|
+
const refreshed = await refreshGitServiceCredentials({
|
|
1967
|
+
applicationId: applicationConfig.id,
|
|
1968
|
+
gitRemoteUrl: gitConfig.gitRemoteUrl,
|
|
1969
|
+
logger,
|
|
1970
|
+
sdk,
|
|
1971
|
+
service: gitService,
|
|
1972
|
+
userEmail: gitUserEmail,
|
|
1973
|
+
userName: gitUserName,
|
|
1974
|
+
});
|
|
1975
|
+
return refreshed ? gitService : undefined;
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
return activateRuntimeGitService();
|
|
1979
|
+
};
|
|
1980
|
+
|
|
1950
1981
|
const httpServer = await tracer.startActiveSpan(
|
|
1951
1982
|
"createDevServer",
|
|
1952
1983
|
async (span) => {
|
|
@@ -1958,10 +1989,13 @@ export async function dev(options: {
|
|
|
1958
1989
|
fsOperationQueue,
|
|
1959
1990
|
syncService: syncService,
|
|
1960
1991
|
lockService: lockService,
|
|
1992
|
+
tokenManager,
|
|
1961
1993
|
aiService: aiService,
|
|
1962
1994
|
gitService: gitService,
|
|
1995
|
+
gitBootstrapAuthFailed: devStartupGitBootstrapAuthFailed,
|
|
1963
1996
|
gitBootstrapFailed: devStartupGitOutcome === "bootstrap_failed",
|
|
1964
1997
|
activateGitService: activateRuntimeGitService,
|
|
1998
|
+
refreshGitCredentials: refreshRuntimeGitCredentials,
|
|
1965
1999
|
snapshotManager: snapshotManager,
|
|
1966
2000
|
logger: options.logger,
|
|
1967
2001
|
sdk,
|
|
@@ -2030,6 +2064,84 @@ export async function dev(options: {
|
|
|
2030
2064
|
// Git sync helpers
|
|
2031
2065
|
// ---------------------------------------------------------------------------
|
|
2032
2066
|
|
|
2067
|
+
interface GitConfigSdk {
|
|
2068
|
+
getApplicationGitConfig(applicationId: string): Promise<{
|
|
2069
|
+
gitRemoteUrl?: string;
|
|
2070
|
+
hasCredential?: boolean;
|
|
2071
|
+
} | null>;
|
|
2072
|
+
getGitFreshToken(
|
|
2073
|
+
host: string,
|
|
2074
|
+
applicationId: string,
|
|
2075
|
+
): Promise<{ username: string; token: string }>;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
async function fetchGitCredentials({
|
|
2079
|
+
applicationId,
|
|
2080
|
+
gitRemoteUrl,
|
|
2081
|
+
logger,
|
|
2082
|
+
sdk,
|
|
2083
|
+
}: {
|
|
2084
|
+
applicationId: string;
|
|
2085
|
+
gitRemoteUrl: string;
|
|
2086
|
+
logger: Logger;
|
|
2087
|
+
sdk: SuperblocksSdk;
|
|
2088
|
+
}): Promise<{ username: string; token: string } | undefined> {
|
|
2089
|
+
const gitConfigSdk = sdk as unknown as GitConfigSdk;
|
|
2090
|
+
|
|
2091
|
+
try {
|
|
2092
|
+
const host = new URL(gitRemoteUrl).hostname;
|
|
2093
|
+
const freshToken = await gitConfigSdk.getGitFreshToken(host, applicationId);
|
|
2094
|
+
return freshToken ?? undefined;
|
|
2095
|
+
} catch (error) {
|
|
2096
|
+
let gitRemoteHost: string | undefined;
|
|
2097
|
+
try {
|
|
2098
|
+
gitRemoteHost = new URL(gitRemoteUrl).hostname;
|
|
2099
|
+
} catch {
|
|
2100
|
+
// ignore invalid URL for logging only
|
|
2101
|
+
}
|
|
2102
|
+
logger.warn("[git] credential fetch failed, continuing without auth", {
|
|
2103
|
+
gitCategory: "setup",
|
|
2104
|
+
gitOperation: "fetch-credentials",
|
|
2105
|
+
gitOutcome: "failed",
|
|
2106
|
+
applicationId,
|
|
2107
|
+
gitRemoteHost,
|
|
2108
|
+
...getGitErrorFields(error),
|
|
2109
|
+
});
|
|
2110
|
+
return undefined;
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
|
|
2114
|
+
async function refreshGitServiceCredentials({
|
|
2115
|
+
applicationId,
|
|
2116
|
+
gitRemoteUrl,
|
|
2117
|
+
logger,
|
|
2118
|
+
sdk,
|
|
2119
|
+
service,
|
|
2120
|
+
userEmail,
|
|
2121
|
+
userName,
|
|
2122
|
+
}: {
|
|
2123
|
+
applicationId: string;
|
|
2124
|
+
gitRemoteUrl: string;
|
|
2125
|
+
logger: Logger;
|
|
2126
|
+
sdk: SuperblocksSdk;
|
|
2127
|
+
service: GitService;
|
|
2128
|
+
userEmail?: string;
|
|
2129
|
+
userName?: string;
|
|
2130
|
+
}): Promise<boolean> {
|
|
2131
|
+
const credentials = await fetchGitCredentials({
|
|
2132
|
+
applicationId,
|
|
2133
|
+
gitRemoteUrl,
|
|
2134
|
+
logger,
|
|
2135
|
+
sdk,
|
|
2136
|
+
});
|
|
2137
|
+
if (!credentials) {
|
|
2138
|
+
return false;
|
|
2139
|
+
}
|
|
2140
|
+
|
|
2141
|
+
await service.configure({ credentials, userEmail, userName });
|
|
2142
|
+
return true;
|
|
2143
|
+
}
|
|
2144
|
+
|
|
2033
2145
|
async function bootstrapGitService({
|
|
2034
2146
|
sdk,
|
|
2035
2147
|
applicationId,
|
|
@@ -2047,16 +2159,6 @@ async function bootstrapGitService({
|
|
|
2047
2159
|
userEmail?: string;
|
|
2048
2160
|
superblocksBaseUrl?: string;
|
|
2049
2161
|
}): Promise<GitService | undefined> {
|
|
2050
|
-
interface GitConfigSdk {
|
|
2051
|
-
getApplicationGitConfig(applicationId: string): Promise<{
|
|
2052
|
-
gitRemoteUrl?: string;
|
|
2053
|
-
hasCredential?: boolean;
|
|
2054
|
-
} | null>;
|
|
2055
|
-
getGitFreshToken(
|
|
2056
|
-
host: string,
|
|
2057
|
-
applicationId: string,
|
|
2058
|
-
): Promise<{ username: string; token: string }>;
|
|
2059
|
-
}
|
|
2060
2162
|
const gitConfigSdk = sdk as unknown as GitConfigSdk;
|
|
2061
2163
|
const gitConfig = await gitConfigSdk.getApplicationGitConfig(applicationId);
|
|
2062
2164
|
if (!gitConfig?.gitRemoteUrl) {
|
|
@@ -2064,32 +2166,14 @@ async function bootstrapGitService({
|
|
|
2064
2166
|
}
|
|
2065
2167
|
|
|
2066
2168
|
const service = createGitService(cwd);
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
if (gitConfig.hasCredential) {
|
|
2071
|
-
try {
|
|
2072
|
-
const host = new URL(gitConfig.gitRemoteUrl).hostname;
|
|
2073
|
-
gitRemoteHost = host;
|
|
2074
|
-
const freshToken = await gitConfigSdk.getGitFreshToken(
|
|
2075
|
-
host,
|
|
2169
|
+
const credentials = gitConfig.hasCredential
|
|
2170
|
+
? await fetchGitCredentials({
|
|
2076
2171
|
applicationId,
|
|
2077
|
-
);
|
|
2078
|
-
if (freshToken) {
|
|
2079
|
-
credentials = freshToken;
|
|
2080
|
-
}
|
|
2081
|
-
} catch (error) {
|
|
2082
|
-
logger.warn("[git] credential fetch failed, continuing without auth", {
|
|
2083
|
-
gitCategory: "setup",
|
|
2084
|
-
gitOperation: "fetch-credentials",
|
|
2085
|
-
gitOutcome: "failed",
|
|
2086
|
-
applicationId,
|
|
2087
|
-
gitRemoteHost,
|
|
2088
2172
|
gitRemoteUrl: gitConfig.gitRemoteUrl,
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2173
|
+
logger,
|
|
2174
|
+
sdk,
|
|
2175
|
+
})
|
|
2176
|
+
: undefined;
|
|
2093
2177
|
|
|
2094
2178
|
await service.configure({ credentials, userName, userEmail });
|
|
2095
2179
|
logger.info("[git] configure complete, proceeding to ensureGitRepo", {
|
|
@@ -3,12 +3,12 @@ import path from "node:path";
|
|
|
3
3
|
|
|
4
4
|
/** Minimal logger surface so this helper stays decoupled from the winston
|
|
5
5
|
* instance threaded through `dev.mts` (and trivially fakeable in tests). */
|
|
6
|
-
|
|
6
|
+
interface ReclaimLogger {
|
|
7
7
|
info: (message: string, meta?: unknown) => void;
|
|
8
8
|
warn: (message: string, meta?: unknown) => void;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
interface DiskSpace {
|
|
12
12
|
totalBytes: number;
|
|
13
13
|
freeBytes: number;
|
|
14
14
|
usedBytes: number;
|
|
@@ -21,12 +21,11 @@ export interface DiskSpace {
|
|
|
21
21
|
* `errno -28`, or the kernel string — match all three. Centralised here (the
|
|
22
22
|
* disk domain) so both the install classifier and the recovery escalation
|
|
23
23
|
* gate agree on what "still out of space" means. */
|
|
24
|
-
|
|
25
|
-
/\bENOSPC\b|no space left on device|\berrno -28\b/i;
|
|
24
|
+
const DISK_FULL_PATTERN = /\bENOSPC\b|no space left on device|\berrno -28\b/i;
|
|
26
25
|
|
|
27
26
|
/** The error shape `util.promisify(exec)` rejects with (stdout/stderr/message
|
|
28
27
|
* preserved separately). */
|
|
29
|
-
|
|
28
|
+
interface ExecLikeFailure {
|
|
30
29
|
stdout?: string;
|
|
31
30
|
stderr?: string;
|
|
32
31
|
message?: string;
|
|
@@ -66,7 +65,7 @@ export async function getDiskSpace(
|
|
|
66
65
|
* reclaim is composition-agnostic (delete whatever exists) precisely because
|
|
67
66
|
* it only ever touches throwaway build output. `node_modules` is deliberately
|
|
68
67
|
* excluded here and gated behind `includeNodeModules` (tier 2). */
|
|
69
|
-
|
|
68
|
+
const RECLAIMABLE_ARTIFACTS: readonly string[] = [
|
|
70
69
|
".turbo",
|
|
71
70
|
".vite",
|
|
72
71
|
"build",
|
|
@@ -75,7 +74,7 @@ export const RECLAIMABLE_ARTIFACTS: readonly string[] = [
|
|
|
75
74
|
"node_modules/.vite",
|
|
76
75
|
];
|
|
77
76
|
|
|
78
|
-
|
|
77
|
+
interface ReclaimResult {
|
|
79
78
|
/** Bytes reclaimed, measured as the increase in filesystem free space across
|
|
80
79
|
* the deletions (a `statfs` delta). O(1) — deliberately NOT a directory walk:
|
|
81
80
|
* sizing a real `node_modules` (50k–200k files) on an already-ENOSPC volume
|
|
@@ -85,7 +84,7 @@ export interface ReclaimResult {
|
|
|
85
84
|
removed: string[];
|
|
86
85
|
}
|
|
87
86
|
|
|
88
|
-
|
|
87
|
+
interface ReclaimOptions {
|
|
89
88
|
/** Also remove `node_modules` — the tier-2 lever. After an ENOSPC mid-
|
|
90
89
|
* install the tree is half-written anyway, so a clean reinstall is the
|
|
91
90
|
* correct recovery AND it collapses the "old tree + new tree" 2× peak that
|
|
@@ -142,7 +141,7 @@ export async function reclaimDiskSpace(
|
|
|
142
141
|
return { bytesFreed, removed };
|
|
143
142
|
}
|
|
144
143
|
|
|
145
|
-
|
|
144
|
+
interface DiskRecoveryResult {
|
|
146
145
|
recovered: boolean;
|
|
147
146
|
/** The error from the final failed install attempt, when recovery failed —
|
|
148
147
|
* so the caller can reclassify it for the most accurate surfaced error. */
|
|
@@ -108,7 +108,7 @@ export function superblocksNpmrcBackupPath(homeDir?: string): string {
|
|
|
108
108
|
* success from the dev-startup point of view (the writer is best-effort
|
|
109
109
|
* and never throws).
|
|
110
110
|
*/
|
|
111
|
-
|
|
111
|
+
type SyncHomeNpmrcOutcome =
|
|
112
112
|
/** Config is set and `~/.superblocks/npmrc` was created or rewritten. */
|
|
113
113
|
| "written"
|
|
114
114
|
/**
|
|
@@ -160,7 +160,7 @@ export type SyncHomeNpmrcOutcome =
|
|
|
160
160
|
/** The sync failed; the file is unchanged. Details in the warn log. */
|
|
161
161
|
| "error";
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
interface SyncHomeNpmrcResult {
|
|
164
164
|
outcome: SyncHomeNpmrcOutcome;
|
|
165
165
|
/** Absolute path that was inspected / mutated. */
|
|
166
166
|
path: string;
|
|
@@ -168,7 +168,7 @@ export interface SyncHomeNpmrcResult {
|
|
|
168
168
|
source?: NpmRegistryFetchResult["source"];
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
interface SyncHomeNpmrcDeps {
|
|
172
172
|
/**
|
|
173
173
|
* Pre-constructed client with the LD-flag check, JWT provider, and
|
|
174
174
|
* `refreshJwt` hook bound. We deliberately do not instantiate one
|
|
@@ -10,7 +10,7 @@ export const MANAGED_PACKAGE_DEPENDENCIES = [
|
|
|
10
10
|
SUPERBLOCKS_SDK_API_PACKAGE,
|
|
11
11
|
] as const;
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
const MANAGED_OVERRIDE_PACKAGES = ["zod"] as const;
|
|
14
14
|
|
|
15
15
|
export const PACKAGE_DEPENDENCY_FIELDS = [
|
|
16
16
|
"dependencies",
|
|
@@ -66,7 +66,7 @@ const CLI_PACKAGE_NAMES = new Set<string>([
|
|
|
66
66
|
* Injectable subset of `child_process.exec` so tests can stub the
|
|
67
67
|
* `which`/`where` lookup without spawning a real subprocess.
|
|
68
68
|
*/
|
|
69
|
-
|
|
69
|
+
type WhichRunner = (binary: string) => Promise<string>;
|
|
70
70
|
|
|
71
71
|
const defaultWhichRunner: WhichRunner = async (binary) => {
|
|
72
72
|
const cmd = process.platform === "win32" ? "where" : "which";
|
|
@@ -186,7 +186,7 @@ export async function findGlobalCliInstallDir(
|
|
|
186
186
|
return undefined;
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
interface StripUpgradedCliLockfilesOptions {
|
|
190
190
|
/**
|
|
191
191
|
* Pre-resolved install root. If omitted, `findGlobalCliInstallDir` is used.
|
|
192
192
|
* Tests pass this directly to avoid stubbing `which`.
|
|
@@ -23,7 +23,7 @@ const logger = getLogger();
|
|
|
23
23
|
/**
|
|
24
24
|
* Package version information returned by version detection.
|
|
25
25
|
*/
|
|
26
|
-
|
|
26
|
+
interface PackageVersionInfo {
|
|
27
27
|
/** Semantic version string (e.g., "2.0.0-next.1") */
|
|
28
28
|
version: string;
|
|
29
29
|
/** Optional package alias for ephemeral builds (e.g., "@superblocksteam/cli-ephemeral") */
|
package/src/client.ts
CHANGED
|
@@ -998,7 +998,7 @@ export async function fetchOrganizationSummary(
|
|
|
998
998
|
}
|
|
999
999
|
}
|
|
1000
1000
|
|
|
1001
|
-
|
|
1001
|
+
interface CreateApplicationParams {
|
|
1002
1002
|
cliVersion: string;
|
|
1003
1003
|
token: string;
|
|
1004
1004
|
superblocksBaseUrl: string;
|
|
@@ -2046,7 +2046,7 @@ export async function fetchAuditLogs({
|
|
|
2046
2046
|
}
|
|
2047
2047
|
}
|
|
2048
2048
|
|
|
2049
|
-
|
|
2049
|
+
interface AuditEventFilters {
|
|
2050
2050
|
timeStart: string;
|
|
2051
2051
|
timeEnd: string;
|
|
2052
2052
|
activityId?: number;
|
|
@@ -2062,12 +2062,12 @@ export interface AuditEventFilters {
|
|
|
2062
2062
|
status?: number;
|
|
2063
2063
|
}
|
|
2064
2064
|
|
|
2065
|
-
|
|
2065
|
+
interface AuditEventsResponse {
|
|
2066
2066
|
events: OCSFAuditEvent[];
|
|
2067
2067
|
next_cursor: string | null;
|
|
2068
2068
|
}
|
|
2069
2069
|
|
|
2070
|
-
|
|
2070
|
+
interface ChatHistoryMessage {
|
|
2071
2071
|
id: string;
|
|
2072
2072
|
created: string;
|
|
2073
2073
|
chatPayload: AiChatMessagePayload;
|
|
@@ -2798,13 +2798,13 @@ export interface UsageRecordRow {
|
|
|
2798
2798
|
source: string;
|
|
2799
2799
|
}
|
|
2800
2800
|
|
|
2801
|
-
|
|
2801
|
+
interface AgentUsageRow {
|
|
2802
2802
|
agentId: string;
|
|
2803
2803
|
name: string;
|
|
2804
2804
|
creditsUsed: number;
|
|
2805
2805
|
}
|
|
2806
2806
|
|
|
2807
|
-
|
|
2807
|
+
interface ApplicationUsageRow {
|
|
2808
2808
|
applicationId: string;
|
|
2809
2809
|
applicationName: string;
|
|
2810
2810
|
creditsUsed: number;
|
package/src/collect-sdk-apis.mts
CHANGED
|
@@ -6,15 +6,15 @@ import {
|
|
|
6
6
|
} from "./extract-api-integrations.mjs";
|
|
7
7
|
import { parseSdkRegistryWithExportNames } from "./parse-sdk-registry.mjs";
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
type SdkApiEntry = {
|
|
10
10
|
entryPoint: string;
|
|
11
11
|
exportName?: string;
|
|
12
12
|
integrations?: IntegrationInfo[];
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
type SdkApisResult = Record<string, SdkApiEntry>;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
type CollectSdkApisFs = {
|
|
18
18
|
pathExists: (p: string) => Promise<boolean>;
|
|
19
19
|
readFile: (p: string, encoding: "utf-8") => Promise<string>;
|
|
20
20
|
};
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// as `double free or corruption (fasttop)` from glibc and SIGABRT killing the
|
|
15
15
|
// process before it can exit cleanly.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
interface DedupeAsyncOptions<TArgs extends unknown[]> {
|
|
18
18
|
/**
|
|
19
19
|
* Optional callback invoked when a duplicate call is detected. The first
|
|
20
20
|
* caller's invocation runs normally; this fires for the 2nd, 3rd, …
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Records counters and histograms for the dev-server endpoints that the editor
|
|
5
5
|
* and SABS hit during a live-edit connection: `/_sb_health`, `/_sb_connect`,
|
|
6
|
-
* `/_sb_activate`, `/_sb_disconnect`, `/_sb_status`, `/_sb_activity`,
|
|
7
|
-
* WebSocket upgrades, Vite eager-init, and
|
|
6
|
+
* `/_sb_activate`, `/_sb_disconnect`, `/_sb_status`, `/_sb_activity`,
|
|
7
|
+
* `/_sb_update_token`, plus WebSocket upgrades, Vite eager-init, and
|
|
8
|
+
* warm-standby activation.
|
|
8
9
|
*
|
|
9
10
|
* Metrics are scoped to the dev-server's existing OTel pipeline. When telemetry
|
|
10
11
|
* has not yet initialized (warm-standby pre-activation), record calls are
|
|
@@ -138,6 +139,7 @@ export type DevServerEndpoint =
|
|
|
138
139
|
| "_sb_disconnect"
|
|
139
140
|
| "_sb_status"
|
|
140
141
|
| "_sb_activity"
|
|
142
|
+
| "_sb_update_token"
|
|
141
143
|
| "_sb_persist"
|
|
142
144
|
| "_sb_ready";
|
|
143
145
|
|
|
@@ -24,8 +24,11 @@ import {
|
|
|
24
24
|
JwtVerifier,
|
|
25
25
|
SUPERBLOCKS_LIVE_GIT_BRANCH,
|
|
26
26
|
} from "@superblocksteam/shared";
|
|
27
|
-
import {
|
|
28
|
-
|
|
27
|
+
import {
|
|
28
|
+
getLocalTokenWithUrlIfExists,
|
|
29
|
+
getSuperblocksResourceConfigIfExists,
|
|
30
|
+
type ITokenManager,
|
|
31
|
+
} from "@superblocksteam/util";
|
|
29
32
|
import {
|
|
30
33
|
type FileSyncPluginParams,
|
|
31
34
|
fileSyncVitePlugin,
|
|
@@ -71,6 +74,7 @@ import {
|
|
|
71
74
|
isRecoverableShutdownError,
|
|
72
75
|
parseIsWarm,
|
|
73
76
|
} from "./fatal-exit.mjs";
|
|
77
|
+
import { OPTIMIZE_DEPS_CONFIG } from "./optimize-deps-config.mjs";
|
|
74
78
|
import { prepareInPlaceRestart } from "./prepare-in-place-restart.mjs";
|
|
75
79
|
import {
|
|
76
80
|
formatViteDevServerStartedLog,
|
|
@@ -107,6 +111,8 @@ function endpointForUrl(
|
|
|
107
111
|
return "_sb_status";
|
|
108
112
|
case "/_sb_activity":
|
|
109
113
|
return "_sb_activity";
|
|
114
|
+
case "/_sb_update_token":
|
|
115
|
+
return "_sb_update_token";
|
|
110
116
|
case "/_sb_persist":
|
|
111
117
|
return "_sb_persist";
|
|
112
118
|
case "/_sb_ready":
|
|
@@ -151,21 +157,6 @@ function reactPlugin() {
|
|
|
151
157
|
});
|
|
152
158
|
}
|
|
153
159
|
|
|
154
|
-
/**
|
|
155
|
-
* Shared `optimizeDeps` config for both pre-warm and activation Vite servers.
|
|
156
|
-
*
|
|
157
|
-
* Vite includes the stringified `optimizeDeps` config in its dep cache hash,
|
|
158
|
-
* so both servers must use identical config or activation will discard the
|
|
159
|
-
* pre-warmed cache and re-run full dependency optimization.
|
|
160
|
-
*/
|
|
161
|
-
const OPTIMIZE_DEPS_CONFIG: UserConfig["optimizeDeps"] = {
|
|
162
|
-
esbuildOptions: {
|
|
163
|
-
supported: {
|
|
164
|
-
destructuring: true,
|
|
165
|
-
},
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
|
|
169
160
|
/**
|
|
170
161
|
* Vite `resolve` config shared by both the activation and pre-warm servers.
|
|
171
162
|
*
|
|
@@ -438,10 +429,13 @@ interface CreateDevServerOptions {
|
|
|
438
429
|
fsOperationQueue: OperationQueue;
|
|
439
430
|
syncService?: SyncService;
|
|
440
431
|
lockService?: LockService;
|
|
432
|
+
tokenManager?: ITokenManager;
|
|
441
433
|
aiService?: AiService;
|
|
442
434
|
gitService?: GitService;
|
|
435
|
+
gitBootstrapAuthFailed?: boolean;
|
|
443
436
|
gitBootstrapFailed?: boolean;
|
|
444
437
|
activateGitService?: () => Promise<GitService | undefined>;
|
|
438
|
+
refreshGitCredentials?: () => Promise<GitService | undefined>;
|
|
445
439
|
snapshotManager?: SnapshotManager;
|
|
446
440
|
/* For redirecting output, like when running outside of the CLI */
|
|
447
441
|
logger?: (...messages: unknown[]) => void;
|
|
@@ -571,10 +565,13 @@ export async function createDevServer({
|
|
|
571
565
|
fsOperationQueue,
|
|
572
566
|
syncService,
|
|
573
567
|
lockService,
|
|
568
|
+
tokenManager,
|
|
574
569
|
aiService,
|
|
575
570
|
gitService,
|
|
571
|
+
gitBootstrapAuthFailed,
|
|
576
572
|
gitBootstrapFailed,
|
|
577
573
|
activateGitService,
|
|
574
|
+
refreshGitCredentials,
|
|
578
575
|
snapshotManager,
|
|
579
576
|
logger: loggerOverride,
|
|
580
577
|
port,
|
|
@@ -1369,10 +1366,13 @@ export async function createDevServer({
|
|
|
1369
1366
|
fsOperationQueue,
|
|
1370
1367
|
syncService,
|
|
1371
1368
|
lockService,
|
|
1369
|
+
tokenManager,
|
|
1372
1370
|
aiService,
|
|
1373
1371
|
gitService,
|
|
1372
|
+
gitBootstrapAuthFailed,
|
|
1374
1373
|
gitBootstrapFailed,
|
|
1375
1374
|
activateGitService,
|
|
1375
|
+
refreshGitCredentials,
|
|
1376
1376
|
snapshotManager,
|
|
1377
1377
|
checkAuthorization,
|
|
1378
1378
|
logger: loggerOverride,
|
|
@@ -1443,10 +1443,13 @@ async function startVite({
|
|
|
1443
1443
|
fsOperationQueue,
|
|
1444
1444
|
syncService,
|
|
1445
1445
|
lockService,
|
|
1446
|
+
tokenManager,
|
|
1446
1447
|
aiService,
|
|
1447
1448
|
gitService,
|
|
1449
|
+
gitBootstrapAuthFailed,
|
|
1448
1450
|
gitBootstrapFailed,
|
|
1449
1451
|
activateGitService,
|
|
1452
|
+
refreshGitCredentials,
|
|
1450
1453
|
snapshotManager,
|
|
1451
1454
|
checkAuthorization,
|
|
1452
1455
|
logger: loggerOverride,
|
|
@@ -1532,10 +1535,13 @@ async function startVite({
|
|
|
1532
1535
|
fsOperationQueue,
|
|
1533
1536
|
syncService,
|
|
1534
1537
|
lockService,
|
|
1538
|
+
tokenManager,
|
|
1535
1539
|
aiService,
|
|
1536
1540
|
gitService,
|
|
1541
|
+
gitBootstrapAuthFailed,
|
|
1537
1542
|
gitBootstrapFailed,
|
|
1538
1543
|
activateGitService,
|
|
1544
|
+
refreshGitCredentials,
|
|
1539
1545
|
snapshotManager,
|
|
1540
1546
|
httpServer,
|
|
1541
1547
|
checkAuthorization,
|