@superblocksteam/vite-plugin-file-sync 2.0.149 → 2.0.150-next.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.
- package/dist/ai-service/agent/prompts/api-prompts.js +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +38 -10
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js +20 -4
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
- package/dist/ai-service/agent/subagents/testing/prompt-builder.js +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.d.ts +6 -0
- package/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.js +130 -26
- package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.js +2 -2
- package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +131 -31
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.d.ts +2 -2
- package/dist/ai-service/agent/tools/build-delete-file.js +3 -3
- package/dist/ai-service/agent/tools/build-delete-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.d.ts +41 -21
- package/dist/ai-service/agent/tools/build-install-packages.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.js +299 -20
- package/dist/ai-service/agent/tools/build-install-packages.js.map +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.js +2 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.js.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts +161 -24
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.js +312 -55
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.js.map +1 -1
- package/dist/ai-service/agent/tools/get-logs.d.ts +2 -2
- package/dist/ai-service/agent/tools/report-security-findings.d.ts +3 -3
- package/dist/ai-service/agent/tools.d.ts +10 -11
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +38 -19
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +9 -8
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.js +1 -1
- package/dist/ai-service/agent/tools2/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/index.js +2 -3
- package/dist/ai-service/agent/tools2/tools/index.js.map +1 -1
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts +22 -0
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts.map +1 -1
- package/dist/ai-service/app-interface/npm-package-lookup.js +111 -0
- package/dist/ai-service/app-interface/npm-package-lookup.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +71 -3
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +575 -23
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/app-interface/vulnerability-gate.d.ts +83 -0
- package/dist/ai-service/app-interface/vulnerability-gate.d.ts.map +1 -0
- package/dist/ai-service/app-interface/vulnerability-gate.js +543 -0
- package/dist/ai-service/app-interface/vulnerability-gate.js.map +1 -0
- package/dist/ai-service/dev-database-client.d.ts +14 -4
- package/dist/ai-service/dev-database-client.d.ts.map +1 -1
- package/dist/ai-service/dev-database-client.js +1 -24
- package/dist/ai-service/dev-database-client.js.map +1 -1
- package/dist/ai-service/features.d.ts +5 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +5 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +2 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +30 -7
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +3 -0
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +2 -0
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/managed-native-db-availability.d.ts +62 -0
- package/dist/ai-service/managed-native-db-availability.d.ts.map +1 -0
- package/dist/ai-service/managed-native-db-availability.js +37 -0
- package/dist/ai-service/managed-native-db-availability.js.map +1 -0
- package/dist/ai-service/security/vulnerability-triage.d.ts +90 -0
- package/dist/ai-service/security/vulnerability-triage.d.ts.map +1 -0
- package/dist/ai-service/security/vulnerability-triage.js +113 -0
- package/dist/ai-service/security/vulnerability-triage.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +13 -0
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +9 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +4 -0
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js +2 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts +11 -0
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js +51 -4
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js.map +1 -1
- package/dist/ai-service/tasks/factory.d.ts +2 -0
- package/dist/ai-service/tasks/factory.d.ts.map +1 -1
- package/dist/ai-service/tasks/factory.js +7 -0
- package/dist/ai-service/tasks/factory.js.map +1 -1
- package/dist/ai-service/types.d.ts +57 -3
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js +20 -0
- package/dist/ai-service/types.js.map +1 -1
- package/dist/migration/restructure.js +1 -1
- package/dist/migration-templates/app-fullstack/client/pages/{Page1 → Home}/index.tsx +1 -1
- package/dist/migration-templates/app-fullstack/client/router.tsx +1 -1
- package/dist/migration-templates/app-fullstack/package.json +2 -2
- package/dist/npm/apply-package-json-substitutions.d.ts +19 -0
- package/dist/npm/apply-package-json-substitutions.d.ts.map +1 -0
- package/dist/npm/apply-package-json-substitutions.js +108 -0
- package/dist/npm/apply-package-json-substitutions.js.map +1 -0
- package/dist/policy-gate-callback-mapper.d.ts +1 -1
- package/dist/policy-gate-callback-mapper.d.ts.map +1 -1
- package/dist/policy-gate-callback-mapper.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
import { metrics } from "@opentelemetry/api";
|
|
2
|
+
import semver from "semver";
|
|
3
|
+
import { getLogger } from "../../util/logger.js";
|
|
4
|
+
import { NpmInstallBlocked } from "../types.js";
|
|
5
|
+
const EMPTY_REMEDIATION = { substitutions: [] };
|
|
6
|
+
function emitGateDecision(decision, mode) {
|
|
7
|
+
metrics
|
|
8
|
+
.getMeter("superblocks.clark.pkg_security")
|
|
9
|
+
.createCounter("superblocks.clark.pkg_security.gate_decision", {
|
|
10
|
+
description: "Clark package security gate decisions",
|
|
11
|
+
})
|
|
12
|
+
.add(1, {
|
|
13
|
+
decision,
|
|
14
|
+
mode: mode === "specific" ? "agent_install" : "declared_deps",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function applyPackageSubstitutions(packages, substitutions) {
|
|
18
|
+
if (substitutions.length === 0)
|
|
19
|
+
return packages;
|
|
20
|
+
const byName = new Map(substitutions.map((entry) => [entry.name, entry.toVersion]));
|
|
21
|
+
return packages.map((pkg) => {
|
|
22
|
+
const toVersion = byName.get(pkg.name);
|
|
23
|
+
return toVersion !== undefined ? { ...pkg, version: toVersion } : pkg;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function suggestedSatisfiesRequested(suggested, requestedVersion) {
|
|
27
|
+
if (requestedVersion === undefined ||
|
|
28
|
+
requestedVersion === "" ||
|
|
29
|
+
requestedVersion === "latest" ||
|
|
30
|
+
requestedVersion === "*") {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return semver.satisfies(suggested, requestedVersion, {
|
|
35
|
+
includePrerelease: true,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Mode 1: must satisfy the request. Mode 2: same major is enough. */
|
|
43
|
+
function swapAllowed(args) {
|
|
44
|
+
const { declared, from, mode, suggested } = args;
|
|
45
|
+
if (suggestedSatisfiesRequested(suggested, declared))
|
|
46
|
+
return true;
|
|
47
|
+
return mode === "all" && semver.major(suggested) === semver.major(from);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Every vulnerability advisory on the package, because triage answers one
|
|
51
|
+
* advisory id at a time: collapsing to the first would let a verdict on that
|
|
52
|
+
* one clear the CVEs nobody evaluated. Falls back to a single generic entry so
|
|
53
|
+
* a result with no advisory row still produces a finding.
|
|
54
|
+
*/
|
|
55
|
+
function cveAdvisories(result) {
|
|
56
|
+
const vulnerabilities = result.advisories.filter((entry) => entry.kind === "vulnerability");
|
|
57
|
+
if (vulnerabilities.length === 0)
|
|
58
|
+
return [{ advisoryId: "cve" }];
|
|
59
|
+
return vulnerabilities.map((advisory) => ({
|
|
60
|
+
advisoryId: advisory.advisoryId,
|
|
61
|
+
...(advisory.details ? { details: advisory.details } : {}),
|
|
62
|
+
...(advisory.severity ? { severity: advisory.severity } : {}),
|
|
63
|
+
...(advisory.summary ? { summary: advisory.summary } : {}),
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
/** Advisory-level findings for packages whose swap failed post-substitution. */
|
|
67
|
+
function verifyFailureFindings(args) {
|
|
68
|
+
const { results, substitutions } = args;
|
|
69
|
+
return substitutions.flatMap((entry) => {
|
|
70
|
+
const result = results.find((candidate) => candidate.name === entry.name &&
|
|
71
|
+
candidate.version === entry.fromVersion);
|
|
72
|
+
const advisories = result ? cveAdvisories(result) : [{ advisoryId: "cve" }];
|
|
73
|
+
return advisories.map((advisory) => ({
|
|
74
|
+
name: entry.name,
|
|
75
|
+
suggestedVersion: entry.toVersion,
|
|
76
|
+
version: entry.fromVersion,
|
|
77
|
+
...advisory,
|
|
78
|
+
}));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function throwMalwareBlock(args) {
|
|
82
|
+
const { name, result, version } = args;
|
|
83
|
+
const advisory = result?.advisories.find((entry) => entry.kind === "malware");
|
|
84
|
+
const packageSpec = `${name}@${version}`;
|
|
85
|
+
throw new NpmInstallBlocked({
|
|
86
|
+
findings: [
|
|
87
|
+
{
|
|
88
|
+
advisoryId: advisory?.advisoryId ?? "malware",
|
|
89
|
+
kind: "malware",
|
|
90
|
+
package: packageSpec,
|
|
91
|
+
...(advisory?.severity ? { severity: advisory.severity } : {}),
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
packages: [packageSpec],
|
|
95
|
+
reason: "vulnerable_package",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function throwCveBlock(blocked) {
|
|
99
|
+
// One candidate per advisory, so a multi-CVE package repeats in `blocked`.
|
|
100
|
+
const packages = [
|
|
101
|
+
...new Set(blocked.map((pkg) => `${pkg.name}@${pkg.version}`)),
|
|
102
|
+
];
|
|
103
|
+
throw new NpmInstallBlocked({
|
|
104
|
+
findings: blocked.map((finding) => ({
|
|
105
|
+
advisoryId: finding.advisoryId,
|
|
106
|
+
...(finding.details ? { details: finding.details } : {}),
|
|
107
|
+
kind: "cve",
|
|
108
|
+
package: `${finding.name}@${finding.version}`,
|
|
109
|
+
...(finding.severity ? { severity: finding.severity } : {}),
|
|
110
|
+
...(finding.suggestedVersion
|
|
111
|
+
? { suggestedVersion: finding.suggestedVersion }
|
|
112
|
+
: {}),
|
|
113
|
+
...(finding.summary ? { summary: finding.summary } : {}),
|
|
114
|
+
})),
|
|
115
|
+
packages,
|
|
116
|
+
reason: "vulnerable_package",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function indexUnavailableFindings(packages) {
|
|
120
|
+
return packages.map((pkg) => ({
|
|
121
|
+
advisoryId: "index_unavailable",
|
|
122
|
+
kind: "index_unavailable",
|
|
123
|
+
package: pkg,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
function throwIndexUnavailable(args) {
|
|
127
|
+
const { capabilities, error, message, packages } = args;
|
|
128
|
+
if (capabilities && message !== undefined && error !== undefined) {
|
|
129
|
+
capabilities.onIndexUnavailable({ error, message });
|
|
130
|
+
}
|
|
131
|
+
throw new NpmInstallBlocked({
|
|
132
|
+
findings: indexUnavailableFindings(packages),
|
|
133
|
+
packages,
|
|
134
|
+
reason: "vulnerable_package",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function assertNoMalware(results) {
|
|
138
|
+
const malware = results.find((result) => result.hasMalware === true);
|
|
139
|
+
if (malware) {
|
|
140
|
+
throwMalwareBlock({
|
|
141
|
+
name: malware.name,
|
|
142
|
+
result: malware,
|
|
143
|
+
version: malware.version,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function remediateTopLevelCves(args) {
|
|
148
|
+
const { abortSignal, capabilities, cveUserOverride, mode, requestedByName, results, topLevel, } = args;
|
|
149
|
+
const resultByKey = new Map(results.map((result) => [`${result.name}@${result.version}`, result]));
|
|
150
|
+
const blocked = [];
|
|
151
|
+
const substitutions = [];
|
|
152
|
+
for (const top of topLevel) {
|
|
153
|
+
const result = resultByKey.get(`${top.name}@${top.version}`);
|
|
154
|
+
if (!result || result.remediatableStatus === "pass")
|
|
155
|
+
continue;
|
|
156
|
+
const advisories = cveAdvisories(result);
|
|
157
|
+
const blockEveryAdvisory = (suggestedVersion) => {
|
|
158
|
+
for (const advisory of advisories) {
|
|
159
|
+
blocked.push({
|
|
160
|
+
name: top.name,
|
|
161
|
+
version: top.version,
|
|
162
|
+
...(suggestedVersion ? { suggestedVersion } : {}),
|
|
163
|
+
...advisory,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
if (result.remediatableStatus === "block") {
|
|
168
|
+
blockEveryAdvisory();
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const suggested = result.suggestedVersion;
|
|
172
|
+
if (typeof suggested !== "string" ||
|
|
173
|
+
suggested.length === 0 ||
|
|
174
|
+
!semver.valid(suggested)) {
|
|
175
|
+
// No version to swap to means no in-place remediation, so treat it like
|
|
176
|
+
// `block` rather than installing the vulnerable pin: "remediatable" is a
|
|
177
|
+
// claim about a fix existing, not evidence that this one is safe.
|
|
178
|
+
blockEveryAdvisory();
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (!swapAllowed({
|
|
182
|
+
declared: requestedByName.get(top.name),
|
|
183
|
+
from: top.version,
|
|
184
|
+
mode,
|
|
185
|
+
suggested,
|
|
186
|
+
})) {
|
|
187
|
+
blockEveryAdvisory(suggested);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// A "fix" that pins the same vulnerable version is not a remediation —
|
|
191
|
+
// treat it as no safe in-place upgrade rather than silently installing.
|
|
192
|
+
if (suggested === top.version) {
|
|
193
|
+
blockEveryAdvisory(suggested);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
// Mode 2 skips dry-run; swapAllowed already gated the major.
|
|
197
|
+
if (mode === "specific") {
|
|
198
|
+
const verify = await capabilities.resolvePackageSpecs({
|
|
199
|
+
abortSignal,
|
|
200
|
+
specs: [`${top.name}@${suggested}`],
|
|
201
|
+
});
|
|
202
|
+
if (!verify.resolves) {
|
|
203
|
+
blockEveryAdvisory(suggested);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const suggestedResults = await capabilities.lookupPackages([
|
|
209
|
+
{ name: top.name, version: suggested },
|
|
210
|
+
]);
|
|
211
|
+
const suggestedResult = suggestedResults[0];
|
|
212
|
+
if (suggestedResult?.hasMalware === true) {
|
|
213
|
+
throwMalwareBlock({
|
|
214
|
+
name: top.name,
|
|
215
|
+
result: suggestedResult,
|
|
216
|
+
version: suggested,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (suggestedResult && suggestedResult.remediatableStatus !== "pass") {
|
|
220
|
+
blockEveryAdvisory(suggested);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (error instanceof NpmInstallBlocked)
|
|
226
|
+
throw error;
|
|
227
|
+
throwIndexUnavailable({
|
|
228
|
+
capabilities,
|
|
229
|
+
error,
|
|
230
|
+
message: "[pkg-security] vulnerability index unavailable validating suggested pin; failing closed for malware",
|
|
231
|
+
packages: [`${top.name}@${top.version}`],
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
getLogger().info("[pkg-security] cve silent swap", {
|
|
235
|
+
from: `${top.name}@${top.version}`,
|
|
236
|
+
to: suggested,
|
|
237
|
+
});
|
|
238
|
+
substitutions.push({
|
|
239
|
+
fromVersion: top.version,
|
|
240
|
+
name: top.name,
|
|
241
|
+
reason: "cve_swap",
|
|
242
|
+
toVersion: suggested,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const userOverridePackages = [];
|
|
246
|
+
const unapproved = blocked.filter((finding) => {
|
|
247
|
+
if (cveUserOverride?.packages.includes(finding.name) &&
|
|
248
|
+
cveUserOverride.reason.trim().length > 0) {
|
|
249
|
+
if (!userOverridePackages.includes(finding.name)) {
|
|
250
|
+
userOverridePackages.push(finding.name);
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
return true;
|
|
255
|
+
});
|
|
256
|
+
if (unapproved.length > 0 && mode === "specific") {
|
|
257
|
+
throwCveBlock(unapproved);
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
substitutions,
|
|
261
|
+
userOverridePackages,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
async function applyQuarantineHoldbacks(args) {
|
|
265
|
+
const { abortSignal, capabilities, cveSwappedNames, requestedByName, topLevel, } = args;
|
|
266
|
+
const pickHoldback = capabilities.pickQuarantineHoldback;
|
|
267
|
+
if (!pickHoldback)
|
|
268
|
+
return [];
|
|
269
|
+
const substitutions = [];
|
|
270
|
+
for (const top of topLevel) {
|
|
271
|
+
if (cveSwappedNames.has(top.name))
|
|
272
|
+
continue;
|
|
273
|
+
if (top.name.startsWith("@superblocksteam/"))
|
|
274
|
+
continue;
|
|
275
|
+
let holdback;
|
|
276
|
+
try {
|
|
277
|
+
holdback = await pickHoldback(top.name, top.version);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (holdback === undefined ||
|
|
283
|
+
holdback === top.version ||
|
|
284
|
+
!semver.valid(holdback) ||
|
|
285
|
+
semver.gt(holdback, top.version) ||
|
|
286
|
+
!suggestedSatisfiesRequested(holdback, requestedByName.get(top.name))) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const verify = await capabilities.resolvePackageSpecs({
|
|
290
|
+
abortSignal,
|
|
291
|
+
specs: [`${top.name}@${holdback}`],
|
|
292
|
+
});
|
|
293
|
+
if (!verify.resolves)
|
|
294
|
+
continue;
|
|
295
|
+
try {
|
|
296
|
+
const holdResults = await capabilities.lookupPackages([
|
|
297
|
+
{ name: top.name, version: holdback },
|
|
298
|
+
]);
|
|
299
|
+
const holdResult = holdResults[0];
|
|
300
|
+
if (holdResult?.hasMalware === true) {
|
|
301
|
+
throwMalwareBlock({
|
|
302
|
+
name: top.name,
|
|
303
|
+
result: holdResult,
|
|
304
|
+
version: holdback,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
if (holdResult && holdResult.remediatableStatus !== "pass")
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
if (error instanceof NpmInstallBlocked)
|
|
312
|
+
throw error;
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
getLogger().info("[pkg-security] quarantine holdback", {
|
|
316
|
+
from: `${top.name}@${top.version}`,
|
|
317
|
+
to: holdback,
|
|
318
|
+
});
|
|
319
|
+
substitutions.push({
|
|
320
|
+
fromVersion: top.version,
|
|
321
|
+
name: top.name,
|
|
322
|
+
reason: "quarantine",
|
|
323
|
+
toVersion: holdback,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
return substitutions;
|
|
327
|
+
}
|
|
328
|
+
/** Re-resolve after swaps; malware still throws. `resolves: false` is caller's call. */
|
|
329
|
+
async function verifySubstitutedTree(args) {
|
|
330
|
+
const { abortSignal, capabilities, packages, substitutions } = args;
|
|
331
|
+
const substituted = applyPackageSubstitutions(packages, substitutions);
|
|
332
|
+
const resolved = await capabilities.resolveInstallTree({
|
|
333
|
+
abortSignal,
|
|
334
|
+
mode: "specific",
|
|
335
|
+
packages: substituted,
|
|
336
|
+
});
|
|
337
|
+
if (!resolved.resolves)
|
|
338
|
+
return { resolves: false };
|
|
339
|
+
if (resolved.tree.length === 0)
|
|
340
|
+
return { resolves: true };
|
|
341
|
+
try {
|
|
342
|
+
assertNoMalware(await capabilities.lookupPackages(resolved.tree));
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
if (error instanceof NpmInstallBlocked)
|
|
346
|
+
throw error;
|
|
347
|
+
throwIndexUnavailable({
|
|
348
|
+
capabilities,
|
|
349
|
+
error,
|
|
350
|
+
message: "[pkg-security] vulnerability index unavailable after substitution; failing closed for malware",
|
|
351
|
+
packages: substituted.map((pkg) => pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
return { resolves: true };
|
|
355
|
+
}
|
|
356
|
+
/** Mode 2: drop swaps whose new pin cannot be malware-scanned; keep the declared version. */
|
|
357
|
+
async function keepVerifiedSubstitutions(args) {
|
|
358
|
+
const { abortSignal, capabilities, substitutions } = args;
|
|
359
|
+
const kept = [];
|
|
360
|
+
for (const entry of substitutions) {
|
|
361
|
+
const spec = `${entry.name}@${entry.toVersion}`;
|
|
362
|
+
const keepDeclared = (reason) => {
|
|
363
|
+
getLogger().warn("[pkg-security][mode2] keeping declared version; swap unverified", { reason, spec });
|
|
364
|
+
};
|
|
365
|
+
try {
|
|
366
|
+
const resolved = await capabilities.resolvePackageSpecs({
|
|
367
|
+
abortSignal,
|
|
368
|
+
specs: [spec],
|
|
369
|
+
});
|
|
370
|
+
if (!resolved.resolves) {
|
|
371
|
+
keepDeclared("substituted tree did not resolve");
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
const malware = (resolved.tree.length > 0
|
|
375
|
+
? await capabilities.lookupPackages(resolved.tree)
|
|
376
|
+
: []).find((result) => result.hasMalware === true);
|
|
377
|
+
if (malware) {
|
|
378
|
+
keepDeclared(`malware in substituted tree: ${malware.name}@${malware.version}`);
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
// Do not keep swapping after cancel; the caller still applies whatever
|
|
384
|
+
// this returns, so a swallowed abort would rewrite package.json.
|
|
385
|
+
if (abortSignal?.aborted ||
|
|
386
|
+
(error instanceof Error && error.name === "AbortError")) {
|
|
387
|
+
throw error;
|
|
388
|
+
}
|
|
389
|
+
// The npm/registry error text can carry credentials, so it stays out of
|
|
390
|
+
// the log line; the failing probe leaves its own npm debug log behind.
|
|
391
|
+
keepDeclared("substituted tree probe failed");
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
kept.push(entry);
|
|
395
|
+
}
|
|
396
|
+
return kept;
|
|
397
|
+
}
|
|
398
|
+
async function evaluateVulnerabilityGate(args) {
|
|
399
|
+
const { abortSignal, capabilities, cveUserOverride, mode, packages } = args;
|
|
400
|
+
const resolved = await capabilities.resolveInstallTree({
|
|
401
|
+
abortSignal,
|
|
402
|
+
mode,
|
|
403
|
+
packages,
|
|
404
|
+
});
|
|
405
|
+
if (resolved.tree.length === 0) {
|
|
406
|
+
// Successful empty = already satisfied. Failed empty = probe told us
|
|
407
|
+
// nothing; mode 1 fails closed so CVE triage cannot clear an unscanned
|
|
408
|
+
// install. Mode 2 keeps the lockfile as source of truth.
|
|
409
|
+
if (!resolved.resolves && mode === "specific" && packages?.length) {
|
|
410
|
+
throwIndexUnavailable({
|
|
411
|
+
packages: packages.map((pkg) => pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name),
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
emitGateDecision("pass", mode);
|
|
415
|
+
return EMPTY_REMEDIATION;
|
|
416
|
+
}
|
|
417
|
+
let results;
|
|
418
|
+
try {
|
|
419
|
+
results = await capabilities.lookupPackages(resolved.tree);
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
throwIndexUnavailable({
|
|
423
|
+
capabilities,
|
|
424
|
+
error,
|
|
425
|
+
message: "[pkg-security] vulnerability index unavailable; failing closed for malware",
|
|
426
|
+
packages: resolved.topLevel.map((pkg) => pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name),
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
assertNoMalware(results);
|
|
430
|
+
// A failed probe can disagree with the real install. Exact requested pins
|
|
431
|
+
// are still CVE-checked; anything we could not pin (ranges, tags, bare
|
|
432
|
+
// names) fails closed — a lockfile-only tree is not enough to vouch for
|
|
433
|
+
// the install about to run.
|
|
434
|
+
if (!resolved.resolves) {
|
|
435
|
+
if (mode !== "specific") {
|
|
436
|
+
emitGateDecision("pass", mode);
|
|
437
|
+
return EMPTY_REMEDIATION;
|
|
438
|
+
}
|
|
439
|
+
const unscanned = (packages ?? []).filter((pkg) => !resolved.topLevel.some((top) => top.name === pkg.name));
|
|
440
|
+
if (unscanned.length > 0 || resolved.topLevel.length === 0) {
|
|
441
|
+
throwIndexUnavailable({
|
|
442
|
+
packages: (unscanned.length > 0 ? unscanned : (packages ?? [])).map((pkg) => (pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name)),
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
const requestedByName = new Map((packages ?? []).map((pkg) => [pkg.name, pkg.version]));
|
|
447
|
+
const { substitutions: cveSwaps, userOverridePackages } = await remediateTopLevelCves({
|
|
448
|
+
abortSignal,
|
|
449
|
+
capabilities,
|
|
450
|
+
cveUserOverride,
|
|
451
|
+
mode,
|
|
452
|
+
requestedByName,
|
|
453
|
+
results,
|
|
454
|
+
topLevel: resolved.topLevel,
|
|
455
|
+
});
|
|
456
|
+
// Quarantine is Mode 1 only — Mode 2 must not silently roll declared deps back.
|
|
457
|
+
const quarantineSwaps = mode === "specific"
|
|
458
|
+
? await applyQuarantineHoldbacks({
|
|
459
|
+
abortSignal,
|
|
460
|
+
capabilities,
|
|
461
|
+
cveSwappedNames: new Set(cveSwaps.map((entry) => entry.name)),
|
|
462
|
+
requestedByName,
|
|
463
|
+
topLevel: resolved.topLevel,
|
|
464
|
+
})
|
|
465
|
+
: [];
|
|
466
|
+
let substitutions = mode === "specific"
|
|
467
|
+
? [...cveSwaps, ...quarantineSwaps]
|
|
468
|
+
: await keepVerifiedSubstitutions({
|
|
469
|
+
abortSignal,
|
|
470
|
+
capabilities,
|
|
471
|
+
substitutions: cveSwaps,
|
|
472
|
+
});
|
|
473
|
+
// Mode 1 verifies the swaps jointly; Mode 2 verified each pin on its own
|
|
474
|
+
// above, because its request is package.json rather than an argv of specs.
|
|
475
|
+
if (substitutions.length > 0 && mode === "specific") {
|
|
476
|
+
const verified = await verifySubstitutedTree({
|
|
477
|
+
abortSignal,
|
|
478
|
+
capabilities,
|
|
479
|
+
packages: packages ?? [],
|
|
480
|
+
substitutions,
|
|
481
|
+
});
|
|
482
|
+
if (!verified.resolves) {
|
|
483
|
+
// Quarantine is fail-open elsewhere; a joint peer conflict must not
|
|
484
|
+
// invent a CVE block for a clean holdback. Retry without quarantine,
|
|
485
|
+
// and only CVE-block real cve_swap entries.
|
|
486
|
+
const cveOnly = substitutions.filter((entry) => entry.reason === "cve_swap");
|
|
487
|
+
if (cveOnly.length === 0) {
|
|
488
|
+
substitutions = [];
|
|
489
|
+
}
|
|
490
|
+
else if (cveOnly.length < substitutions.length) {
|
|
491
|
+
const retry = await verifySubstitutedTree({
|
|
492
|
+
abortSignal,
|
|
493
|
+
capabilities,
|
|
494
|
+
packages: packages ?? [],
|
|
495
|
+
substitutions: cveOnly,
|
|
496
|
+
});
|
|
497
|
+
if (retry.resolves) {
|
|
498
|
+
substitutions = cveOnly;
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
throwCveBlock(verifyFailureFindings({ results, substitutions: cveOnly }));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
throwCveBlock(verifyFailureFindings({ results, substitutions: cveOnly }));
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
const decisions = new Set();
|
|
510
|
+
if (substitutions.some((item) => item.reason === "cve_swap")) {
|
|
511
|
+
decisions.add("swapped_cve");
|
|
512
|
+
}
|
|
513
|
+
if (substitutions.some((item) => item.reason === "quarantine")) {
|
|
514
|
+
decisions.add("quarantined");
|
|
515
|
+
}
|
|
516
|
+
if (userOverridePackages.length > 0)
|
|
517
|
+
decisions.add("user_override");
|
|
518
|
+
if (decisions.size === 0) {
|
|
519
|
+
emitGateDecision("pass", mode);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
for (const decision of decisions)
|
|
523
|
+
emitGateDecision(decision, mode);
|
|
524
|
+
}
|
|
525
|
+
return { substitutions, userOverridePackages };
|
|
526
|
+
}
|
|
527
|
+
export async function runVulnerabilityGate(args) {
|
|
528
|
+
try {
|
|
529
|
+
return await evaluateVulnerabilityGate(args);
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
if (error instanceof NpmInstallBlocked) {
|
|
533
|
+
const findings = error.findings?.filter((finding) => finding.advisoryId !== "index_unavailable");
|
|
534
|
+
if (findings?.length) {
|
|
535
|
+
emitGateDecision(findings.some((finding) => finding.kind === "malware")
|
|
536
|
+
? "blocked_malware"
|
|
537
|
+
: "blocked_cve", args.mode);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
throw error;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
//# sourceMappingURL=vulnerability-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vulnerability-gate.js","sourceRoot":"","sources":["../../../src/ai-service/app-interface/vulnerability-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
type MigrationState = "pending" | "migrated" | "failed";
|
|
1
|
+
import type { DatabaseRequirement, LifecycleDispatchPayload, LifecycleErrorCode, LifecycleMigrationState, LifecycleState } from "@superblocksteam/shared";
|
|
3
2
|
export type CreateDevDatabaseInput = {
|
|
4
3
|
applicationId: string;
|
|
5
4
|
requirement: Omit<DatabaseRequirement, "engine"> & Partial<Pick<DatabaseRequirement, "engine">>;
|
|
@@ -17,17 +16,28 @@ type EnvelopeFields = {
|
|
|
17
16
|
errorCode?: string;
|
|
18
17
|
errorMessage?: string;
|
|
19
18
|
};
|
|
19
|
+
/** Per-datatag outcome when ensure fans out across editor Environments tags. */
|
|
20
|
+
export type LifecycleTargetOutcome = {
|
|
21
|
+
bindingKey: string;
|
|
22
|
+
errorCode?: string;
|
|
23
|
+
errorMessage?: string;
|
|
24
|
+
lifecycleState?: LifecycleState;
|
|
25
|
+
migrationState?: LifecycleMigrationState;
|
|
26
|
+
ok: boolean;
|
|
27
|
+
profile: string;
|
|
28
|
+
requestId?: string;
|
|
29
|
+
};
|
|
20
30
|
export type CreateDevDatabaseResponse = EnvelopeFields & {
|
|
21
31
|
bindingKey: string;
|
|
22
32
|
connectionMetadata?: Record<string, string | number | boolean>;
|
|
23
|
-
credentialRefs?: Record<string, CredentialRef>;
|
|
24
33
|
dispatchPayload?: LifecycleDispatchPayload;
|
|
25
34
|
engine?: string;
|
|
26
35
|
integrationId?: string;
|
|
27
36
|
lifecycleState: LifecycleState;
|
|
28
37
|
logicalName?: string;
|
|
29
|
-
migrationState:
|
|
38
|
+
migrationState: LifecycleMigrationState;
|
|
30
39
|
requestId: string;
|
|
40
|
+
targets?: LifecycleTargetOutcome[];
|
|
31
41
|
};
|
|
32
42
|
export type LifecyclePreconditionFailure = EnvelopeFields & {
|
|
33
43
|
ok: false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-database-client.d.ts","sourceRoot":"","sources":["../../src/ai-service/dev-database-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"dev-database-client.d.ts","sourceRoot":"","sources":["../../src/ai-service/dev-database-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -166,30 +166,7 @@ function assertNoRawCredentialMaterial(value) {
|
|
|
166
166
|
}
|
|
167
167
|
for (const [key, entryValue] of Object.entries(value)) {
|
|
168
168
|
if (/credential[_-]?refs?/i.test(key)) {
|
|
169
|
-
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
if (/password|secret|token|private[_-]?key|dsn/i.test(key)) {
|
|
173
|
-
throw new Error("raw credential material is not allowed in createDevDb responses");
|
|
174
|
-
}
|
|
175
|
-
assertNoRawCredentialMaterial(entryValue);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
function assertCredentialRefsDoNotContainRawMaterial(value) {
|
|
179
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
180
|
-
throw new Error("raw credential material is not allowed in createDevDb responses");
|
|
181
|
-
}
|
|
182
|
-
for (const credentialRef of Object.values(value)) {
|
|
183
|
-
assertCredentialRefDoesNotContainRawMaterial(credentialRef);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
function assertCredentialRefDoesNotContainRawMaterial(value) {
|
|
187
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
188
|
-
throw new Error("raw credential material is not allowed in createDevDb responses");
|
|
189
|
-
}
|
|
190
|
-
for (const [key, entryValue] of Object.entries(value)) {
|
|
191
|
-
if (key === "field") {
|
|
192
|
-
continue;
|
|
169
|
+
throw new Error("application credential references are not supported in createDevDb responses");
|
|
193
170
|
}
|
|
194
171
|
if (/password|secret|token|private[_-]?key|dsn/i.test(key)) {
|
|
195
172
|
throw new Error("raw credential material is not allowed in createDevDb responses");
|