@sxl-studio/bridge 1.7.2 → 1.8.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/README.md +342 -16
- package/dist/agent-recipes.d.ts +781 -11
- package/dist/agent-recipes.js +886 -13
- package/dist/agent-recipes.js.map +1 -1
- package/dist/agent-runbook.d.ts +50 -0
- package/dist/agent-runbook.js +243 -0
- package/dist/agent-runbook.js.map +1 -0
- package/dist/asset-upload.d.ts +63 -0
- package/dist/asset-upload.js +225 -0
- package/dist/asset-upload.js.map +1 -0
- package/dist/audit-store.d.ts +15 -0
- package/dist/audit-store.js +100 -0
- package/dist/audit-store.js.map +1 -0
- package/dist/audit.d.ts +4 -3
- package/dist/audit.js +37 -4
- package/dist/audit.js.map +1 -1
- package/dist/auth.d.ts +8 -1
- package/dist/auth.js +41 -1
- package/dist/auth.js.map +1 -1
- package/dist/bridge-agent-workflow-validation-cli.d.ts +2 -0
- package/dist/bridge-agent-workflow-validation-cli.js +68 -0
- package/dist/bridge-agent-workflow-validation-cli.js.map +1 -0
- package/dist/bridge-agent-workflow-validation.d.ts +42 -0
- package/dist/bridge-agent-workflow-validation.js +170 -0
- package/dist/bridge-agent-workflow-validation.js.map +1 -0
- package/dist/bridge-contract-audit.d.ts +45 -0
- package/dist/bridge-contract-audit.js +345 -0
- package/dist/bridge-contract-audit.js.map +1 -0
- package/dist/bridge-health-cli.d.ts +2 -0
- package/dist/bridge-health-cli.js +115 -0
- package/dist/bridge-health-cli.js.map +1 -0
- package/dist/bridge-health.d.ts +33 -0
- package/dist/bridge-health.js +594 -0
- package/dist/bridge-health.js.map +1 -0
- package/dist/bridge-live-validation-cli.d.ts +2 -0
- package/dist/bridge-live-validation-cli.js +114 -0
- package/dist/bridge-live-validation-cli.js.map +1 -0
- package/dist/bridge-live-validation.d.ts +39 -0
- package/dist/bridge-live-validation.js +1141 -0
- package/dist/bridge-live-validation.js.map +1 -0
- package/dist/bridge-performance-profile.d.ts +81 -0
- package/dist/bridge-performance-profile.js +227 -0
- package/dist/bridge-performance-profile.js.map +1 -0
- package/dist/bridge-readiness-cli.d.ts +30 -0
- package/dist/bridge-readiness-cli.js +242 -0
- package/dist/bridge-readiness-cli.js.map +1 -0
- package/dist/bridge-runtime-summary.d.ts +50 -0
- package/dist/bridge-runtime-summary.js +112 -0
- package/dist/bridge-runtime-summary.js.map +1 -0
- package/dist/bridge-workflow-smoke-cli.d.ts +2 -0
- package/dist/bridge-workflow-smoke-cli.js +126 -0
- package/dist/bridge-workflow-smoke-cli.js.map +1 -0
- package/dist/bridge-workflow-smoke.d.ts +39 -0
- package/dist/bridge-workflow-smoke.js +431 -0
- package/dist/bridge-workflow-smoke.js.map +1 -0
- package/dist/codeconnect-suggestions.d.ts +74 -0
- package/dist/codeconnect-suggestions.js +398 -0
- package/dist/codeconnect-suggestions.js.map +1 -0
- package/dist/codeconnect-template.d.ts +98 -0
- package/dist/codeconnect-template.js +280 -0
- package/dist/codeconnect-template.js.map +1 -0
- package/dist/command-queue.d.ts +11 -1
- package/dist/command-queue.js +200 -1
- package/dist/command-queue.js.map +1 -1
- package/dist/command-safety.d.ts +13 -0
- package/dist/command-safety.js +59 -0
- package/dist/command-safety.js.map +1 -0
- package/dist/enabled-library-search.d.ts +49 -0
- package/dist/enabled-library-search.js +151 -0
- package/dist/enabled-library-search.js.map +1 -0
- package/dist/figma-mcp-parity.d.ts +49 -0
- package/dist/figma-mcp-parity.js +368 -0
- package/dist/figma-mcp-parity.js.map +1 -0
- package/dist/figma-mcp-skills-parity.d.ts +61 -0
- package/dist/figma-mcp-skills-parity.js +434 -0
- package/dist/figma-mcp-skills-parity.js.map +1 -0
- package/dist/figma-rest-diagnostics.d.ts +50 -0
- package/dist/figma-rest-diagnostics.js +314 -0
- package/dist/figma-rest-diagnostics.js.map +1 -0
- package/dist/figma-rest.d.ts +27 -0
- package/dist/figma-rest.js +116 -0
- package/dist/figma-rest.js.map +1 -0
- package/dist/http-api.d.ts +16 -2
- package/dist/http-api.js +329 -17
- package/dist/http-api.js.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-factory.d.ts +6 -1
- package/dist/mcp-factory.js +23 -4
- package/dist/mcp-factory.js.map +1 -1
- package/dist/mcp-runtime-probe.d.ts +22 -0
- package/dist/mcp-runtime-probe.js +777 -0
- package/dist/mcp-runtime-probe.js.map +1 -0
- package/dist/mcp-server.d.ts +2 -1
- package/dist/mcp-server.js +2 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/sxl-mcp-instructions.js +99 -26
- package/dist/sxl-mcp-instructions.js.map +1 -1
- package/dist/tools/audit.d.ts +22 -6
- package/dist/tools/audit.js +49 -7
- package/dist/tools/audit.js.map +1 -1
- package/dist/tools/capability-matrix.d.ts +22 -0
- package/dist/tools/capability-matrix.js +38 -0
- package/dist/tools/capability-matrix.js.map +1 -0
- package/dist/tools/catalogue-bootstrap.d.ts +1 -0
- package/dist/tools/catalogue-bootstrap.js +665 -30
- package/dist/tools/catalogue-bootstrap.js.map +1 -1
- package/dist/tools/code-connect-context.d.ts +3 -0
- package/dist/tools/code-connect-context.js +319 -0
- package/dist/tools/code-connect-context.js.map +1 -0
- package/dist/tools/code-connect-template.d.ts +3 -0
- package/dist/tools/code-connect-template.js +111 -0
- package/dist/tools/code-connect-template.js.map +1 -0
- package/dist/tools/composition.js +15 -30
- package/dist/tools/composition.js.map +1 -1
- package/dist/tools/compositions-orchestration.d.ts +14 -14
- package/dist/tools/compositions-orchestration.js +2 -2
- package/dist/tools/compositions-orchestration.js.map +1 -1
- package/dist/tools/data.js +839 -27
- package/dist/tools/data.js.map +1 -1
- package/dist/tools/design-context.d.ts +3 -0
- package/dist/tools/design-context.js +197 -0
- package/dist/tools/design-context.js.map +1 -0
- package/dist/tools/destructive-confirmation.d.ts +10 -0
- package/dist/tools/destructive-confirmation.js +25 -0
- package/dist/tools/destructive-confirmation.js.map +1 -0
- package/dist/tools/diagnostics.js +76 -51
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/figma-mcp-design.d.ts +3 -0
- package/dist/tools/figma-mcp-design.js +377 -0
- package/dist/tools/figma-mcp-design.js.map +1 -0
- package/dist/tools/figma-nodes.js +57 -43
- package/dist/tools/figma-nodes.js.map +1 -1
- package/dist/tools/figma-rc-extended.js +23 -6
- package/dist/tools/figma-rc-extended.js.map +1 -1
- package/dist/tools/figma-rest.d.ts +39 -0
- package/dist/tools/figma-rest.js +279 -0
- package/dist/tools/figma-rest.js.map +1 -0
- package/dist/tools/git.js +11 -7
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/large-data.d.ts +14 -0
- package/dist/tools/large-data.js +189 -0
- package/dist/tools/large-data.js.map +1 -0
- package/dist/tools/meta.d.ts +6 -1
- package/dist/tools/meta.js +89 -11
- package/dist/tools/meta.js.map +1 -1
- package/dist/tools/metadata.d.ts +3 -0
- package/dist/tools/metadata.js +140 -0
- package/dist/tools/metadata.js.map +1 -0
- package/dist/tools/mockup.d.ts +15 -156
- package/dist/tools/mockup.js +54 -121
- package/dist/tools/mockup.js.map +1 -1
- package/dist/tools/orchestration.js +75 -47
- package/dist/tools/orchestration.js.map +1 -1
- package/dist/tools/prompts.d.ts +3 -0
- package/dist/tools/prompts.js +219 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/registry.d.ts +19 -1
- package/dist/tools/registry.js +4 -4
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/resources.d.ts +19 -2
- package/dist/tools/resources.js +149 -5
- package/dist/tools/resources.js.map +1 -1
- package/dist/tools/schema-contracts.d.ts +4763 -0
- package/dist/tools/schema-contracts.js +814 -0
- package/dist/tools/schema-contracts.js.map +1 -0
- package/dist/tools/screenshot.d.ts +3 -0
- package/dist/tools/screenshot.js +144 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/shared.d.ts +11 -1
- package/dist/tools/shared.js +55 -2
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/styles-orchestration.d.ts +2 -2
- package/dist/tools/styles-orchestration.js +13 -5
- package/dist/tools/styles-orchestration.js.map +1 -1
- package/dist/tools/styles.js +22 -8
- package/dist/tools/styles.js.map +1 -1
- package/dist/tools/tokens.d.ts +31 -692
- package/dist/tools/tokens.js +175 -135
- package/dist/tools/tokens.js.map +1 -1
- package/dist/tools/variable-defs.d.ts +3 -0
- package/dist/tools/variable-defs.js +338 -0
- package/dist/tools/variable-defs.js.map +1 -0
- package/dist/tools/variables-orchestration.js +13 -5
- package/dist/tools/variables-orchestration.js.map +1 -1
- package/dist/tools/variables.js +18 -15
- package/dist/tools/variables.js.map +1 -1
- package/dist/types.d.ts +53 -0
- package/dist/ultimate-readiness-audit.d.ts +37 -0
- package/dist/ultimate-readiness-audit.js +431 -0
- package/dist/ultimate-readiness-audit.js.map +1 -0
- package/dist/workflow-planner.d.ts +57 -0
- package/dist/workflow-planner.js +464 -0
- package/dist/workflow-planner.js.map +1 -0
- package/dist/workspace-blob-store.d.ts +6 -0
- package/dist/workspace-blob-store.js +9 -0
- package/dist/workspace-blob-store.js.map +1 -1
- package/dist/workspace-path-http.d.ts +24 -0
- package/dist/workspace-path-http.js +146 -0
- package/dist/workspace-path-http.js.map +1 -0
- package/dist/ws-server.js +16 -3
- package/dist/ws-server.js.map +1 -1
- package/package.json +21 -2
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
export const MAX_UPLOAD_ASSETS = 10;
|
|
3
|
+
export const MAX_UPLOAD_ASSET_BYTES = 10 * 1024 * 1024;
|
|
4
|
+
const SUPPORTED_CONTENT_TYPES = new Set([
|
|
5
|
+
"image/png",
|
|
6
|
+
"image/jpeg",
|
|
7
|
+
"image/jpg",
|
|
8
|
+
"image/gif",
|
|
9
|
+
"image/webp",
|
|
10
|
+
]);
|
|
11
|
+
const EXTENSION_TO_CONTENT_TYPE = {
|
|
12
|
+
".png": "image/png",
|
|
13
|
+
".jpg": "image/jpeg",
|
|
14
|
+
".jpeg": "image/jpeg",
|
|
15
|
+
".gif": "image/gif",
|
|
16
|
+
".webp": "image/webp",
|
|
17
|
+
};
|
|
18
|
+
function normalizeContentType(value) {
|
|
19
|
+
if (!value)
|
|
20
|
+
return null;
|
|
21
|
+
const normalized = value.split(";")[0]?.trim().toLowerCase() ?? "";
|
|
22
|
+
return normalized || null;
|
|
23
|
+
}
|
|
24
|
+
function inferContentTypeFromUrl(url) {
|
|
25
|
+
if (!url)
|
|
26
|
+
return null;
|
|
27
|
+
let pathname = "";
|
|
28
|
+
try {
|
|
29
|
+
pathname = new URL(url).pathname.toLowerCase();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
for (const [ext, contentType] of Object.entries(EXTENSION_TO_CONTENT_TYPE)) {
|
|
35
|
+
if (pathname.endsWith(ext))
|
|
36
|
+
return contentType;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function isSupportedContentType(contentType) {
|
|
41
|
+
return Boolean(contentType && SUPPORTED_CONTENT_TYPES.has(contentType));
|
|
42
|
+
}
|
|
43
|
+
function nameFromUrl(url, index) {
|
|
44
|
+
if (!url)
|
|
45
|
+
return `Image ${index + 1}`;
|
|
46
|
+
try {
|
|
47
|
+
const pathname = new URL(url).pathname;
|
|
48
|
+
const last = pathname.split("/").filter(Boolean).pop();
|
|
49
|
+
if (last)
|
|
50
|
+
return decodeURIComponent(last).slice(0, 120);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Fall through to stable fallback.
|
|
54
|
+
}
|
|
55
|
+
return `Image ${index + 1}`;
|
|
56
|
+
}
|
|
57
|
+
function parseDataBase64(input) {
|
|
58
|
+
const trimmed = input.trim();
|
|
59
|
+
const match = /^data:([^;]+);base64,(.+)$/is.exec(trimmed);
|
|
60
|
+
if (match) {
|
|
61
|
+
return {
|
|
62
|
+
contentType: normalizeContentType(match[1]),
|
|
63
|
+
base64: match[2].replace(/[\r\n\s]/g, ""),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return { contentType: null, base64: trimmed.replace(/[\r\n\s]/g, "") };
|
|
67
|
+
}
|
|
68
|
+
function encodeBytesToBase64(bytes) {
|
|
69
|
+
return Buffer.from(bytes).toString("base64");
|
|
70
|
+
}
|
|
71
|
+
function decodeBase64Bytes(input) {
|
|
72
|
+
return new Uint8Array(Buffer.from(input, "base64"));
|
|
73
|
+
}
|
|
74
|
+
function validateAssetCount(assets) {
|
|
75
|
+
if (assets.length === 0)
|
|
76
|
+
throw new Error("upload_assets requires at least one asset");
|
|
77
|
+
if (assets.length > MAX_UPLOAD_ASSETS) {
|
|
78
|
+
throw new Error(`upload_assets accepts at most ${MAX_UPLOAD_ASSETS} assets per call`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function validateUrl(url) {
|
|
82
|
+
let parsed;
|
|
83
|
+
try {
|
|
84
|
+
parsed = new URL(url);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new Error(`Invalid asset URL: ${url}`);
|
|
88
|
+
}
|
|
89
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
90
|
+
throw new Error(`Unsupported asset URL protocol: ${parsed.protocol}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function fetchAssetBytes(asset, options) {
|
|
94
|
+
if (asset.dataBase64) {
|
|
95
|
+
const parsed = parseDataBase64(asset.dataBase64);
|
|
96
|
+
const bytes = decodeBase64Bytes(parsed.base64);
|
|
97
|
+
return { bytes, contentType: normalizeContentType(asset.contentType) ?? parsed.contentType };
|
|
98
|
+
}
|
|
99
|
+
if (!asset.url) {
|
|
100
|
+
throw new Error("Each upload asset requires url or dataBase64");
|
|
101
|
+
}
|
|
102
|
+
validateUrl(asset.url);
|
|
103
|
+
const response = await options.fetchImpl(asset.url, {
|
|
104
|
+
method: "GET",
|
|
105
|
+
headers: { Accept: "image/png,image/jpeg,image/gif,image/webp" },
|
|
106
|
+
});
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
throw new Error(`Asset fetch failed for ${asset.url}: HTTP ${response.status}`);
|
|
109
|
+
}
|
|
110
|
+
const contentLengthRaw = response.headers.get("content-length");
|
|
111
|
+
const contentLength = contentLengthRaw ? Number.parseInt(contentLengthRaw, 10) : Number.NaN;
|
|
112
|
+
if (Number.isFinite(contentLength) && contentLength > options.maxBytes) {
|
|
113
|
+
throw new Error(`Asset ${asset.url} is ${contentLength} bytes; max is ${options.maxBytes}`);
|
|
114
|
+
}
|
|
115
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
116
|
+
return {
|
|
117
|
+
bytes,
|
|
118
|
+
contentType: normalizeContentType(asset.contentType)
|
|
119
|
+
?? normalizeContentType(response.headers.get("content-type"))
|
|
120
|
+
?? inferContentTypeFromUrl(asset.url),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function plannedTarget(args, asset, index) {
|
|
124
|
+
const width = asset.width ?? args.width ?? 320;
|
|
125
|
+
const height = asset.height ?? args.height ?? 200;
|
|
126
|
+
const gap = args.gap ?? 24;
|
|
127
|
+
const nodeId = asset.nodeId ?? args.targetNodeId ?? null;
|
|
128
|
+
return {
|
|
129
|
+
nodeId,
|
|
130
|
+
parentId: asset.parentId ?? args.parentId ?? null,
|
|
131
|
+
createsRectangle: !nodeId,
|
|
132
|
+
x: nodeId ? null : asset.x ?? (args.x ?? 0) + index * (width + gap),
|
|
133
|
+
y: nodeId ? null : asset.y ?? args.y ?? 0,
|
|
134
|
+
width: nodeId ? null : width,
|
|
135
|
+
height: nodeId ? null : height,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function payloadForAsset(args, asset, index, imageBase64) {
|
|
139
|
+
const target = plannedTarget(args, asset, index);
|
|
140
|
+
return {
|
|
141
|
+
nodeId: target.nodeId ?? undefined,
|
|
142
|
+
parentId: target.parentId ?? undefined,
|
|
143
|
+
x: target.x ?? undefined,
|
|
144
|
+
y: target.y ?? undefined,
|
|
145
|
+
width: target.width ?? undefined,
|
|
146
|
+
height: target.height ?? undefined,
|
|
147
|
+
cornerRadius: asset.cornerRadius,
|
|
148
|
+
name: asset.name ?? nameFromUrl(asset.url, index),
|
|
149
|
+
scaleMode: asset.scaleMode ?? args.scaleMode ?? "FILL",
|
|
150
|
+
imageBase64,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export async function prepareUploadAssets(args, options = {}) {
|
|
154
|
+
validateAssetCount(args.assets);
|
|
155
|
+
const dryRun = args.dryRun === true;
|
|
156
|
+
const fetchInDryRun = args.fetchInDryRun === true;
|
|
157
|
+
const maxBytes = Math.max(1, Math.min(args.maxBytes ?? MAX_UPLOAD_ASSET_BYTES, MAX_UPLOAD_ASSET_BYTES));
|
|
158
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
159
|
+
const assets = [];
|
|
160
|
+
for (let index = 0; index < args.assets.length; index += 1) {
|
|
161
|
+
const asset = args.assets[index];
|
|
162
|
+
if (!asset.url && !asset.dataBase64) {
|
|
163
|
+
throw new Error(`Asset ${index + 1} requires url or dataBase64`);
|
|
164
|
+
}
|
|
165
|
+
if (asset.url)
|
|
166
|
+
validateUrl(asset.url);
|
|
167
|
+
const shouldFetch = !dryRun || fetchInDryRun || Boolean(asset.dataBase64);
|
|
168
|
+
const target = plannedTarget(args, asset, index);
|
|
169
|
+
const name = asset.name ?? nameFromUrl(asset.url, index);
|
|
170
|
+
if (!shouldFetch) {
|
|
171
|
+
const contentType = normalizeContentType(asset.contentType) ?? inferContentTypeFromUrl(asset.url);
|
|
172
|
+
if (contentType && !isSupportedContentType(contentType)) {
|
|
173
|
+
throw new Error(`Unsupported asset content type for ${name}: ${contentType}`);
|
|
174
|
+
}
|
|
175
|
+
assets.push({
|
|
176
|
+
report: {
|
|
177
|
+
index,
|
|
178
|
+
name,
|
|
179
|
+
source: asset.url ? "url" : "dataBase64",
|
|
180
|
+
url: asset.url,
|
|
181
|
+
contentType,
|
|
182
|
+
byteLength: null,
|
|
183
|
+
target,
|
|
184
|
+
willFetch: true,
|
|
185
|
+
willCallPlugin: false,
|
|
186
|
+
},
|
|
187
|
+
payload: null,
|
|
188
|
+
});
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const { bytes, contentType: fetchedContentType } = await fetchAssetBytes(asset, { fetchImpl, maxBytes });
|
|
192
|
+
const contentType = fetchedContentType ?? inferContentTypeFromUrl(asset.url);
|
|
193
|
+
if (!isSupportedContentType(contentType)) {
|
|
194
|
+
throw new Error(`Unsupported asset content type for ${name}: ${contentType ?? "(unknown)"}`);
|
|
195
|
+
}
|
|
196
|
+
if (bytes.byteLength > maxBytes) {
|
|
197
|
+
throw new Error(`Asset ${name} is ${bytes.byteLength} bytes; max is ${maxBytes}`);
|
|
198
|
+
}
|
|
199
|
+
assets.push({
|
|
200
|
+
report: {
|
|
201
|
+
index,
|
|
202
|
+
name,
|
|
203
|
+
source: asset.url ? "url" : "dataBase64",
|
|
204
|
+
url: asset.url,
|
|
205
|
+
contentType,
|
|
206
|
+
byteLength: bytes.byteLength,
|
|
207
|
+
target,
|
|
208
|
+
willFetch: !asset.dataBase64,
|
|
209
|
+
willCallPlugin: !dryRun,
|
|
210
|
+
},
|
|
211
|
+
payload: dryRun ? null : payloadForAsset(args, asset, index, encodeBytesToBase64(bytes)),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
ok: true,
|
|
216
|
+
dryRun,
|
|
217
|
+
count: assets.length,
|
|
218
|
+
maxBytes,
|
|
219
|
+
assets,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export function uploadAssetReports(prepared) {
|
|
223
|
+
return prepared.assets.map((asset) => asset.report);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=asset-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-upload.js","sourceRoot":"","sources":["../src/asset-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disk-backed command audit log.
|
|
3
|
+
*
|
|
4
|
+
* Entries are JSONL and intentionally contain only sanitized command metadata:
|
|
5
|
+
* ids, commandType, status, duration, payload key names, and idempotency key.
|
|
6
|
+
* Payload values are never persisted here.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuditEntry } from "./audit.js";
|
|
9
|
+
export declare function getAuditLogRootDir(): string;
|
|
10
|
+
export declare function getAuditLogFilePath(rootDir?: string, date?: Date): string;
|
|
11
|
+
export declare function appendAuditEntry(entry: AuditEntry, rootDir?: string): Promise<void>;
|
|
12
|
+
export declare function readPersistedAuditSnapshot(options?: {
|
|
13
|
+
limit?: number;
|
|
14
|
+
rootDir?: string;
|
|
15
|
+
}): Promise<AuditEntry[]>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disk-backed command audit log.
|
|
3
|
+
*
|
|
4
|
+
* Entries are JSONL and intentionally contain only sanitized command metadata:
|
|
5
|
+
* ids, commandType, status, duration, payload key names, and idempotency key.
|
|
6
|
+
* Payload values are never persisted here.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import envPaths from "env-paths";
|
|
11
|
+
const AUDIT_SUBDIR = "audit";
|
|
12
|
+
const LOG_FILE_RE = /^audit-\d{4}-\d{2}-\d{2}\.jsonl$/;
|
|
13
|
+
const MAX_READ_LIMIT = 1_000;
|
|
14
|
+
function getRootFromEnv() {
|
|
15
|
+
const raw = process.env["SXL_BRIDGE_AUDIT_ROOT"];
|
|
16
|
+
if (!raw || raw.trim().length === 0)
|
|
17
|
+
return null;
|
|
18
|
+
return path.resolve(raw.trim());
|
|
19
|
+
}
|
|
20
|
+
export function getAuditLogRootDir() {
|
|
21
|
+
const override = getRootFromEnv();
|
|
22
|
+
if (override)
|
|
23
|
+
return override;
|
|
24
|
+
const paths = envPaths("sxl-studio-bridge", { suffix: "" });
|
|
25
|
+
return path.join(paths.cache, AUDIT_SUBDIR);
|
|
26
|
+
}
|
|
27
|
+
function dayKey(date) {
|
|
28
|
+
return date.toISOString().slice(0, 10);
|
|
29
|
+
}
|
|
30
|
+
export function getAuditLogFilePath(rootDir = getAuditLogRootDir(), date = new Date()) {
|
|
31
|
+
return path.join(rootDir, `audit-${dayKey(date)}.jsonl`);
|
|
32
|
+
}
|
|
33
|
+
function toPersistedEntry(entry) {
|
|
34
|
+
return {
|
|
35
|
+
schemaVersion: 1,
|
|
36
|
+
type: "sxl_bridge_command",
|
|
37
|
+
atIso: new Date(entry.at).toISOString(),
|
|
38
|
+
...entry,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function toAuditEntry(value) {
|
|
42
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
43
|
+
return null;
|
|
44
|
+
const entry = value;
|
|
45
|
+
if (typeof entry.at !== "number" ||
|
|
46
|
+
typeof entry.commandId !== "string" ||
|
|
47
|
+
typeof entry.commandType !== "string" ||
|
|
48
|
+
typeof entry.status !== "string" ||
|
|
49
|
+
!Array.isArray(entry.payloadKeys)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
at: entry.at,
|
|
54
|
+
commandId: entry.commandId,
|
|
55
|
+
commandType: entry.commandType,
|
|
56
|
+
status: entry.status,
|
|
57
|
+
durationMs: typeof entry.durationMs === "number" ? entry.durationMs : null,
|
|
58
|
+
error: typeof entry.error === "string" ? entry.error : null,
|
|
59
|
+
payloadKeys: entry.payloadKeys.filter((key) => typeof key === "string"),
|
|
60
|
+
idempotencyKey: typeof entry.idempotencyKey === "string" ? entry.idempotencyKey : null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function appendAuditEntry(entry, rootDir = getAuditLogRootDir()) {
|
|
64
|
+
const target = getAuditLogFilePath(rootDir, new Date(entry.at));
|
|
65
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
66
|
+
await fs.appendFile(target, `${JSON.stringify(toPersistedEntry(entry))}\n`, "utf8");
|
|
67
|
+
}
|
|
68
|
+
export async function readPersistedAuditSnapshot(options = {}) {
|
|
69
|
+
const rootDir = options.rootDir ?? getAuditLogRootDir();
|
|
70
|
+
const limit = Math.max(1, Math.min(options.limit ?? 50, MAX_READ_LIMIT));
|
|
71
|
+
let fileNames;
|
|
72
|
+
try {
|
|
73
|
+
fileNames = await fs.readdir(rootDir);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const err = error;
|
|
77
|
+
if (err.code === "ENOENT")
|
|
78
|
+
return [];
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
const entries = [];
|
|
82
|
+
for (const fileName of fileNames.filter((name) => LOG_FILE_RE.test(name)).sort().reverse()) {
|
|
83
|
+
const text = await fs.readFile(path.join(rootDir, fileName), "utf8");
|
|
84
|
+
const lines = text.split(/\r?\n/).filter((line) => line.trim().length > 0);
|
|
85
|
+
for (const line of lines.reverse()) {
|
|
86
|
+
try {
|
|
87
|
+
const parsed = toAuditEntry(JSON.parse(line));
|
|
88
|
+
if (parsed)
|
|
89
|
+
entries.push(parsed);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Ignore malformed lines; a partial append should not make diagnostics unusable.
|
|
93
|
+
}
|
|
94
|
+
if (entries.length >= limit)
|
|
95
|
+
return entries;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return entries;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=audit-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Audit ring buffer for Bridge commands.
|
|
2
|
+
* Audit ring buffer + persisted JSONL log for Bridge commands.
|
|
3
3
|
*
|
|
4
4
|
* Every command dispatched via POST /api/command is recorded with its
|
|
5
5
|
* commandType, status, duration and a short payload-keys preview (no values
|
|
6
|
-
* — to avoid leaking secrets). GET /api/log returns the most recent entries
|
|
7
|
-
*
|
|
6
|
+
* — to avoid leaking secrets). GET /api/log returns the most recent entries
|
|
7
|
+
* from memory by default, or disk when `source=disk`.
|
|
8
8
|
*/
|
|
9
9
|
import type { CommandResult } from "./types.js";
|
|
10
10
|
export type AuditEntry = {
|
|
@@ -19,3 +19,4 @@ export type AuditEntry = {
|
|
|
19
19
|
};
|
|
20
20
|
export declare function recordAudit(entry: AuditEntry): void;
|
|
21
21
|
export declare function getAuditSnapshot(limit?: number): AuditEntry[];
|
|
22
|
+
export declare function flushAuditPersistenceForTests(): Promise<void>;
|
package/dist/audit.js
CHANGED
|
@@ -1,24 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Audit ring buffer for Bridge commands.
|
|
2
|
+
* Audit ring buffer + persisted JSONL log for Bridge commands.
|
|
3
3
|
*
|
|
4
4
|
* Every command dispatched via POST /api/command is recorded with its
|
|
5
5
|
* commandType, status, duration and a short payload-keys preview (no values
|
|
6
|
-
* — to avoid leaking secrets). GET /api/log returns the most recent entries
|
|
7
|
-
*
|
|
6
|
+
* — to avoid leaking secrets). GET /api/log returns the most recent entries
|
|
7
|
+
* from memory by default, or disk when `source=disk`.
|
|
8
8
|
*/
|
|
9
|
+
import { appendAuditEntry } from "./audit-store.js";
|
|
9
10
|
const BUFFER_SIZE = 200;
|
|
10
11
|
const buffer = [];
|
|
12
|
+
const pendingPersistence = new Set();
|
|
13
|
+
function isDiskAuditDisabled() {
|
|
14
|
+
return process.env["SXL_BRIDGE_AUDIT_DISABLE_DISK"] === "true";
|
|
15
|
+
}
|
|
16
|
+
function persistAuditEntry(entry) {
|
|
17
|
+
if (isDiskAuditDisabled())
|
|
18
|
+
return;
|
|
19
|
+
const pending = appendAuditEntry(entry)
|
|
20
|
+
.catch((error) => {
|
|
21
|
+
// Persistence must never break the command path.
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
console.error(`[Audit] failed to persist audit entry: ${String(error)}`);
|
|
24
|
+
})
|
|
25
|
+
.finally(() => {
|
|
26
|
+
pendingPersistence.delete(pending);
|
|
27
|
+
});
|
|
28
|
+
pendingPersistence.add(pending);
|
|
29
|
+
}
|
|
11
30
|
export function recordAudit(entry) {
|
|
12
31
|
buffer.push(entry);
|
|
13
32
|
if (buffer.length > BUFFER_SIZE) {
|
|
14
33
|
buffer.splice(0, buffer.length - BUFFER_SIZE);
|
|
15
34
|
}
|
|
35
|
+
persistAuditEntry(entry);
|
|
16
36
|
// Structured log line for operators tailing the console.
|
|
17
37
|
// eslint-disable-next-line no-console
|
|
18
|
-
console.error(`[Audit] ${
|
|
38
|
+
console.error(`[Audit] ${JSON.stringify({
|
|
39
|
+
type: "sxl_bridge_command",
|
|
40
|
+
at: new Date(entry.at).toISOString(),
|
|
41
|
+
commandId: entry.commandId,
|
|
42
|
+
commandType: entry.commandType,
|
|
43
|
+
status: entry.status,
|
|
44
|
+
durationMs: entry.durationMs,
|
|
45
|
+
error: entry.error,
|
|
46
|
+
payloadKeys: entry.payloadKeys,
|
|
47
|
+
idempotencyKey: entry.idempotencyKey,
|
|
48
|
+
})}`);
|
|
19
49
|
}
|
|
20
50
|
export function getAuditSnapshot(limit = 50) {
|
|
21
51
|
const clamped = Math.max(1, Math.min(limit, BUFFER_SIZE));
|
|
22
52
|
return buffer.slice(-clamped).reverse();
|
|
23
53
|
}
|
|
54
|
+
export async function flushAuditPersistenceForTests() {
|
|
55
|
+
await Promise.all(Array.from(pendingPersistence));
|
|
56
|
+
}
|
|
24
57
|
//# sourceMappingURL=audit.js.map
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAcpD,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,MAAM,GAAiB,EAAE,CAAC;AAChC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAiB,CAAC;AAEpD,SAAS,mBAAmB;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,KAAK,MAAM,CAAC;AACjE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAiB;IAC1C,IAAI,mBAAmB,EAAE;QAAE,OAAO;IAClC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC;SACpC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,iDAAiD;QACjD,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC;SACD,OAAO,CAAC,GAAG,EAAE;QACZ,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACL,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,IAAI,MAAM,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IAChD,CAAC;IACD,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzB,yDAAyD;IACzD,sCAAsC;IACtC,OAAO,CAAC,KAAK,CACX,WAAW,IAAI,CAAC,SAAS,CAAC;QACxB,IAAI,EAAE,oBAAoB;QAC1B,EAAE,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC,EAAE,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAK,GAAG,EAAE;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Activated when BRIDGE_AUTH_TOKEN env var is set. Requests must then carry
|
|
5
5
|
* `Authorization: Bearer <token>` (case-insensitive header name, case-sensitive token).
|
|
6
|
-
* Applies to
|
|
6
|
+
* Applies to REST /api/*, MCP Streamable HTTP at /mcp, and plugin WebSocket.
|
|
7
7
|
*
|
|
8
8
|
* Disabled by default to preserve zero-config "run and connect Cursor" UX.
|
|
9
9
|
*/
|
|
@@ -15,4 +15,11 @@ export declare function checkAuth(req: IncomingMessage): {
|
|
|
15
15
|
ok: false;
|
|
16
16
|
reason: string;
|
|
17
17
|
};
|
|
18
|
+
export declare function sanitizeWebSocketAuthLogPath(reqUrl: string | undefined): string;
|
|
19
|
+
export declare function checkWebSocketAuth(req: IncomingMessage): {
|
|
20
|
+
ok: true;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
reason: string;
|
|
24
|
+
};
|
|
18
25
|
export declare function isAuthEnabled(): boolean;
|
package/dist/auth.js
CHANGED
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Activated when BRIDGE_AUTH_TOKEN env var is set. Requests must then carry
|
|
5
5
|
* `Authorization: Bearer <token>` (case-insensitive header name, case-sensitive token).
|
|
6
|
-
* Applies to
|
|
6
|
+
* Applies to REST /api/*, MCP Streamable HTTP at /mcp, and plugin WebSocket.
|
|
7
7
|
*
|
|
8
8
|
* Disabled by default to preserve zero-config "run and connect Cursor" UX.
|
|
9
9
|
*/
|
|
10
|
+
const WEB_SOCKET_AUTH_QUERY_KEYS = new Set(["bridgeauthtoken", "token"]);
|
|
10
11
|
export function getBridgeAuthToken() {
|
|
11
12
|
const raw = process.env["BRIDGE_AUTH_TOKEN"];
|
|
12
13
|
if (!raw)
|
|
@@ -33,6 +34,45 @@ export function checkAuth(req) {
|
|
|
33
34
|
}
|
|
34
35
|
return { ok: true };
|
|
35
36
|
}
|
|
37
|
+
export function sanitizeWebSocketAuthLogPath(reqUrl) {
|
|
38
|
+
const source = reqUrl && reqUrl.trim().length > 0 ? reqUrl : "/";
|
|
39
|
+
try {
|
|
40
|
+
const url = new URL(source, "ws://127.0.0.1");
|
|
41
|
+
for (const key of Array.from(url.searchParams.keys())) {
|
|
42
|
+
if (WEB_SOCKET_AUTH_QUERY_KEYS.has(key.toLowerCase())) {
|
|
43
|
+
url.searchParams.set(key, "REDACTED");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return `${url.pathname}${url.search}${url.hash}` || "/";
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return "/";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function checkWebSocketAuth(req) {
|
|
53
|
+
const token = getBridgeAuthToken();
|
|
54
|
+
if (!token)
|
|
55
|
+
return { ok: true };
|
|
56
|
+
const headerResult = checkAuth(req);
|
|
57
|
+
if (headerResult.ok)
|
|
58
|
+
return headerResult;
|
|
59
|
+
const reqUrl = req.url ?? "/";
|
|
60
|
+
let provided = null;
|
|
61
|
+
try {
|
|
62
|
+
const url = new URL(reqUrl, "ws://127.0.0.1");
|
|
63
|
+
provided = url.searchParams.get("bridgeAuthToken") ?? url.searchParams.get("token");
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
provided = null;
|
|
67
|
+
}
|
|
68
|
+
if (!provided) {
|
|
69
|
+
return { ok: false, reason: "Missing WebSocket auth token" };
|
|
70
|
+
}
|
|
71
|
+
if (provided !== token) {
|
|
72
|
+
return { ok: false, reason: "Invalid WebSocket auth token" };
|
|
73
|
+
}
|
|
74
|
+
return { ok: true };
|
|
75
|
+
}
|
|
36
76
|
export function isAuthEnabled() {
|
|
37
77
|
return getBridgeAuthToken() !== null;
|
|
38
78
|
}
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAoB;IAC5C,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAChC,MAAM,MAAM,GACT,GAAG,CAAC,OAAO,CAAC,eAAe,CAAwB;QACnD,GAAG,CAAC,OAAO,CAAC,eAAe,CAAmC,CAAC;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,kBAAkB,EAAE,KAAK,IAAI,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { runAgentWorkflowValidation, } from "./bridge-agent-workflow-validation.js";
|
|
4
|
+
function usage() {
|
|
5
|
+
return [
|
|
6
|
+
"Usage: sxl-bridge-agent [--json]",
|
|
7
|
+
"",
|
|
8
|
+
"Runs local agent workflow validation for route_intent, plan_workflow, and preview_workflow.",
|
|
9
|
+
"No running Bridge server or Figma Remote Connect session is required.",
|
|
10
|
+
].join("\n");
|
|
11
|
+
}
|
|
12
|
+
function parseArgs(argv) {
|
|
13
|
+
const args = { json: false };
|
|
14
|
+
for (const arg of argv) {
|
|
15
|
+
if (arg === "--help" || arg === "-h") {
|
|
16
|
+
console.log(usage());
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
19
|
+
if (arg === "--json") {
|
|
20
|
+
args.json = true;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
24
|
+
}
|
|
25
|
+
return args;
|
|
26
|
+
}
|
|
27
|
+
function renderText(report) {
|
|
28
|
+
const lines = [];
|
|
29
|
+
lines.push(`SXL Bridge agent workflow validation: ${report.status.toUpperCase()}`);
|
|
30
|
+
lines.push(`Version: ${report.bridgeVersion}`);
|
|
31
|
+
lines.push(`Scenarios: ${report.scenarioCount}`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
for (const step of report.steps) {
|
|
34
|
+
const commits = step.commitTools.length > 0 ? ` commits=${step.commitTools.join(",")}` : "";
|
|
35
|
+
lines.push(`- ${step.status.toUpperCase()} ${step.id} -> ${step.recipeId}${commits}`);
|
|
36
|
+
}
|
|
37
|
+
if (report.findings.length > 0) {
|
|
38
|
+
lines.push("");
|
|
39
|
+
lines.push("Findings:");
|
|
40
|
+
for (const finding of report.findings) {
|
|
41
|
+
const scenario = finding.scenarioId ? ` ${finding.scenarioId}` : "";
|
|
42
|
+
const tool = finding.toolName ? ` [${finding.toolName}]` : "";
|
|
43
|
+
lines.push(`- ${finding.severity.toUpperCase()} ${finding.code}${scenario}${tool}: ${finding.message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return lines.join("\n");
|
|
47
|
+
}
|
|
48
|
+
export async function runAgentWorkflowValidationCli(argv = process.argv.slice(2)) {
|
|
49
|
+
const args = parseArgs(argv);
|
|
50
|
+
const report = runAgentWorkflowValidation();
|
|
51
|
+
if (args.json) {
|
|
52
|
+
console.log(JSON.stringify(report, null, 2));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(renderText(report));
|
|
56
|
+
}
|
|
57
|
+
process.exit(report.ok ? 0 : 1);
|
|
58
|
+
}
|
|
59
|
+
const isCliEntry = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
60
|
+
if (isCliEntry) {
|
|
61
|
+
runAgentWorkflowValidationCli().catch((error) => {
|
|
62
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
63
|
+
console.error("");
|
|
64
|
+
console.error(usage());
|
|
65
|
+
process.exit(2);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=bridge-agent-workflow-validation-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-agent-workflow-validation-cli.js","sourceRoot":"","sources":["../src/bridge-agent-workflow-validation-cli.ts"],"names":[],"mappings":"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"}
|