@once-agent/sdk 0.1.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/LICENSE +21 -0
- package/README.md +43 -0
- package/dist/apply.d.ts +9 -0
- package/dist/apply.d.ts.map +1 -0
- package/dist/apply.js +265 -0
- package/dist/apply.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +191 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +240 -0
- package/dist/index.js.map +1 -0
- package/dist/protect.d.ts +8 -0
- package/dist/protect.d.ts.map +1 -0
- package/dist/protect.js +563 -0
- package/dist/protect.js.map +1 -0
- package/dist/scan.d.ts +18 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +632 -0
- package/dist/scan.js.map +1 -0
- package/dist/setup.d.ts +8 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +558 -0
- package/dist/setup.js.map +1 -0
- package/dist/transformers/http-patch-plan-v1.d.ts +23 -0
- package/dist/transformers/http-patch-plan-v1.d.ts.map +1 -0
- package/dist/transformers/http-patch-plan-v1.js +149 -0
- package/dist/transformers/http-patch-plan-v1.js.map +1 -0
- package/dist/transformers/http-write-v1.d.ts +23 -0
- package/dist/transformers/http-write-v1.d.ts.map +1 -0
- package/dist/transformers/http-write-v1.js +134 -0
- package/dist/transformers/http-write-v1.js.map +1 -0
- package/dist/transformers/once-binding-v1.d.ts +17 -0
- package/dist/transformers/once-binding-v1.d.ts.map +1 -0
- package/dist/transformers/once-binding-v1.js +134 -0
- package/dist/transformers/once-binding-v1.js.map +1 -0
- package/package.json +56 -0
package/dist/protect.js
ADDED
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { collectSourceFiles, scanFile } from "./scan.js";
|
|
5
|
+
import { transformHttpWriteV1 } from "./transformers/http-write-v1.js";
|
|
6
|
+
import { buildHttpWritePatchV1 } from "./transformers/http-patch-plan-v1.js";
|
|
7
|
+
async function readCapabilityManifest(root, provider) {
|
|
8
|
+
if (!provider) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const raw = await fs.readFile(path.join(root, ".once", "provider-capabilities.json"), "utf8");
|
|
13
|
+
const manifest = JSON.parse(raw.replace(/^\uFEFF/, ""));
|
|
14
|
+
if (manifest.schema_version !== 1 ||
|
|
15
|
+
manifest.provider !== provider ||
|
|
16
|
+
!Array.isArray(manifest.capabilities)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return manifest;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function readProvider(root) {
|
|
26
|
+
try {
|
|
27
|
+
const raw = await fs.readFile(path.join(root, ".once", "config.json"), "utf8");
|
|
28
|
+
const config = JSON.parse(raw);
|
|
29
|
+
const name = config.provider?.name;
|
|
30
|
+
if (typeof name === "string" &&
|
|
31
|
+
name.trim()) {
|
|
32
|
+
return name.trim();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Setup may not have been run yet.
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function confidenceRank(confidence) {
|
|
41
|
+
switch (confidence) {
|
|
42
|
+
case "HIGH":
|
|
43
|
+
return 0;
|
|
44
|
+
case "MEDIUM":
|
|
45
|
+
return 1;
|
|
46
|
+
case "LOW":
|
|
47
|
+
return 2;
|
|
48
|
+
default:
|
|
49
|
+
return 3;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function callsiteRef(finding) {
|
|
53
|
+
const identity = [
|
|
54
|
+
finding.file,
|
|
55
|
+
finding.line,
|
|
56
|
+
finding.functionName ?? "",
|
|
57
|
+
finding.category
|
|
58
|
+
].join(":");
|
|
59
|
+
return ("cs_" +
|
|
60
|
+
createHash("sha256")
|
|
61
|
+
.update(identity)
|
|
62
|
+
.digest("hex")
|
|
63
|
+
.slice(0, 16));
|
|
64
|
+
}
|
|
65
|
+
function automationForCategory(category, manifest) {
|
|
66
|
+
const declaredCapability = manifest?.capabilities.find(capability => capability.category ===
|
|
67
|
+
category);
|
|
68
|
+
if (declaredCapability) {
|
|
69
|
+
return {
|
|
70
|
+
status: "PROVIDER_CAPABILITY_DECLARED",
|
|
71
|
+
reason: `Provider declares capability ${declaredCapability.action_type} for ${category}, but no source transformer has yet been proven safe for automatic application.`
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
switch (category) {
|
|
75
|
+
case "HTTP_WRITE":
|
|
76
|
+
case "HTTP_DELETE":
|
|
77
|
+
return {
|
|
78
|
+
status: "PROVIDER_MAPPING_REQUIRED",
|
|
79
|
+
reason: "HTTP side effect detected, but Once must verify that the configured provider reproduces the exact original request semantics before source rewriting."
|
|
80
|
+
};
|
|
81
|
+
case "PAYMENT":
|
|
82
|
+
case "MESSAGING":
|
|
83
|
+
case "BOOKING":
|
|
84
|
+
case "DATABASE":
|
|
85
|
+
case "STORAGE":
|
|
86
|
+
case "QUEUE":
|
|
87
|
+
case "PUBLISH":
|
|
88
|
+
return {
|
|
89
|
+
status: "ADAPTER_REQUIRED",
|
|
90
|
+
reason: "This operation requires an adapter or capability definition that preserves the original side-effect semantics."
|
|
91
|
+
};
|
|
92
|
+
default:
|
|
93
|
+
return {
|
|
94
|
+
status: "MANUAL_REVIEW",
|
|
95
|
+
reason: "Once detected a consequential operation but does not currently have a safe automatic transformation model for it."
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function toCandidate(finding, manifest) {
|
|
100
|
+
const automation = automationForCategory(finding.category, manifest);
|
|
101
|
+
return {
|
|
102
|
+
callsite_ref: callsiteRef(finding),
|
|
103
|
+
file: finding.file,
|
|
104
|
+
line: finding.line,
|
|
105
|
+
function_name: finding.functionName ??
|
|
106
|
+
null,
|
|
107
|
+
confidence: finding.confidence,
|
|
108
|
+
category: finding.category,
|
|
109
|
+
reason: finding.reason,
|
|
110
|
+
automation_status: automation.status,
|
|
111
|
+
automation_reason: automation.reason,
|
|
112
|
+
auto_apply_eligible: false,
|
|
113
|
+
runtime_operation_id_rule: "Use one stable operationId per real-world action. Retries of that same action must reuse it."
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function relativeImportForFile(file) {
|
|
117
|
+
const depth = file
|
|
118
|
+
.replaceAll("\\", "/")
|
|
119
|
+
.split("/")
|
|
120
|
+
.length - 1;
|
|
121
|
+
return ("../".repeat(Math.max(0, depth)) +
|
|
122
|
+
".once/runtime.js");
|
|
123
|
+
}
|
|
124
|
+
function safeFileName(candidate) {
|
|
125
|
+
const base = candidate.file
|
|
126
|
+
.replaceAll("\\", "/")
|
|
127
|
+
.replace(/[^A-Za-z0-9._-]+/g, "_");
|
|
128
|
+
return (`${candidate.callsite_ref}-${base}-${candidate.line}.txt`);
|
|
129
|
+
}
|
|
130
|
+
function buildIntegrationSnippet(candidate, provider) {
|
|
131
|
+
const providerName = provider ??
|
|
132
|
+
"YOUR_PROVIDER";
|
|
133
|
+
return [
|
|
134
|
+
`Once protection candidate`,
|
|
135
|
+
`=========================`,
|
|
136
|
+
``,
|
|
137
|
+
`Callsite: ${candidate.file}:${candidate.line}`,
|
|
138
|
+
`Reference: ${candidate.callsite_ref}`,
|
|
139
|
+
`Confidence: ${candidate.confidence}`,
|
|
140
|
+
`Category: ${candidate.category}`,
|
|
141
|
+
`Automation: ${candidate.automation_status}`,
|
|
142
|
+
`Auto-apply eligible: ${candidate.auto_apply_eligible
|
|
143
|
+
? "yes"
|
|
144
|
+
: "no"}`,
|
|
145
|
+
`Automation reason: ${candidate.automation_reason}`,
|
|
146
|
+
``,
|
|
147
|
+
`IMPORTANT`,
|
|
148
|
+
`---------`,
|
|
149
|
+
`This is integration guidance, not an automatic source rewrite.`,
|
|
150
|
+
`Preserve the original operation semantics.`,
|
|
151
|
+
`Use one stable operationId for each real-world action.`,
|
|
152
|
+
`Retries of that same action must reuse the same operationId.`,
|
|
153
|
+
``,
|
|
154
|
+
`Configured provider: ${providerName}`,
|
|
155
|
+
``,
|
|
156
|
+
`TypeScript shape`,
|
|
157
|
+
`----------------`,
|
|
158
|
+
``,
|
|
159
|
+
`const result = await once.execute({`,
|
|
160
|
+
` operationId,`,
|
|
161
|
+
` provider: "${providerName}",`,
|
|
162
|
+
` action: {`,
|
|
163
|
+
` type: "DEFINE_PROVIDER_ACTION",`,
|
|
164
|
+
` // Include only the fields your provider requires.`,
|
|
165
|
+
` }`,
|
|
166
|
+
`});`,
|
|
167
|
+
``,
|
|
168
|
+
`Do not replace the original call until the configured`,
|
|
169
|
+
`provider is capable of performing this exact side effect.`,
|
|
170
|
+
``
|
|
171
|
+
].join("\n");
|
|
172
|
+
}
|
|
173
|
+
function buildPatchPreview(candidate, provider) {
|
|
174
|
+
const normalized = candidate.file
|
|
175
|
+
.replaceAll("\\", "/");
|
|
176
|
+
const importPath = relativeImportForFile(normalized);
|
|
177
|
+
const providerValue = provider ??
|
|
178
|
+
"YOUR_PROVIDER";
|
|
179
|
+
return [
|
|
180
|
+
`--- a/${normalized}`,
|
|
181
|
+
`+++ b/${normalized}`,
|
|
182
|
+
`@@ around line ${candidate.line} @@`,
|
|
183
|
+
`+ // Once protection candidate: ${candidate.callsite_ref}`,
|
|
184
|
+
`+ // Provider: ${providerValue}`,
|
|
185
|
+
`+ // Runtime operationId must be stable for the real-world action.`,
|
|
186
|
+
`+ // Automation: ${candidate.automation_status}`,
|
|
187
|
+
`+ // Auto-apply eligible: ${candidate.auto_apply_eligible
|
|
188
|
+
? "yes"
|
|
189
|
+
: "no"}`,
|
|
190
|
+
`+ // Suggested Once helper: ${importPath}`,
|
|
191
|
+
` [existing consequential call remains unchanged in preview]`,
|
|
192
|
+
""
|
|
193
|
+
].join("\n");
|
|
194
|
+
}
|
|
195
|
+
function escapeRegExp(value) {
|
|
196
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
197
|
+
}
|
|
198
|
+
function extractAwaitFetchStatement(source, findingLine) {
|
|
199
|
+
const normalized = source.replace(/\r\n/g, "\n");
|
|
200
|
+
const lines = normalized.split("\n");
|
|
201
|
+
const target = Math.max(0, Math.min(lines.length - 1, findingLine - 1));
|
|
202
|
+
/*
|
|
203
|
+
* Scanner line numbers can point at the method:
|
|
204
|
+
* line inside a multiline fetch call rather than
|
|
205
|
+
* the `await fetch(` line itself.
|
|
206
|
+
*/
|
|
207
|
+
let startLine = -1;
|
|
208
|
+
for (let i = target; i >= Math.max(0, target - 12); i--) {
|
|
209
|
+
if (/\bawait\s+fetch\s*\(/.test(lines[i])) {
|
|
210
|
+
startLine = i;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (startLine < 0) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
let lineOffset = 0;
|
|
218
|
+
for (let i = 0; i < startLine; i++) {
|
|
219
|
+
lineOffset +=
|
|
220
|
+
lines[i].length + 1;
|
|
221
|
+
}
|
|
222
|
+
const fragment = normalized.slice(lineOffset);
|
|
223
|
+
const awaitMatch = fragment.match(/\bawait\s+fetch\s*\(/);
|
|
224
|
+
if (!awaitMatch ||
|
|
225
|
+
awaitMatch.index === undefined) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
const statementStart = awaitMatch.index;
|
|
229
|
+
const openParen = fragment.indexOf("(", statementStart);
|
|
230
|
+
if (openParen < 0) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
let depth = 0;
|
|
234
|
+
let quote = null;
|
|
235
|
+
let escaped = false;
|
|
236
|
+
let closeParen = -1;
|
|
237
|
+
for (let i = openParen; i < fragment.length; i++) {
|
|
238
|
+
const char = fragment[i];
|
|
239
|
+
if (quote) {
|
|
240
|
+
if (escaped) {
|
|
241
|
+
escaped = false;
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (char === "\\") {
|
|
245
|
+
escaped = true;
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (char === quote) {
|
|
249
|
+
quote = null;
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (char === "`") {
|
|
254
|
+
/*
|
|
255
|
+
* Template literals are outside the proven
|
|
256
|
+
* transformer model. Fail closed.
|
|
257
|
+
*/
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
if (char === "'" ||
|
|
261
|
+
char === '"') {
|
|
262
|
+
quote = char;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (char === "(") {
|
|
266
|
+
depth++;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (char === ")") {
|
|
270
|
+
depth--;
|
|
271
|
+
if (depth === 0) {
|
|
272
|
+
closeParen = i;
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (closeParen < 0) {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
let end = closeParen + 1;
|
|
281
|
+
while (end < fragment.length &&
|
|
282
|
+
/\s/.test(fragment[end])) {
|
|
283
|
+
end++;
|
|
284
|
+
}
|
|
285
|
+
if (fragment[end] === ";") {
|
|
286
|
+
end++;
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
statement: fragment
|
|
290
|
+
.slice(statementStart, end)
|
|
291
|
+
.trim(),
|
|
292
|
+
startOffset: lineOffset +
|
|
293
|
+
statementStart
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function extractFunctionDeclarationSource(source, functionName, statementStart) {
|
|
297
|
+
const normalized = source.replace(/\r\n/g, "\n");
|
|
298
|
+
const before = normalized.slice(0, statementStart);
|
|
299
|
+
const pattern = new RegExp(String.raw `(?:export\s+)?(?:async\s+)?function\s+${escapeRegExp(functionName)}\s*\(`, "g");
|
|
300
|
+
let lastIndex = -1;
|
|
301
|
+
for (const match of before.matchAll(pattern)) {
|
|
302
|
+
if (match.index !== undefined) {
|
|
303
|
+
lastIndex =
|
|
304
|
+
match.index;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (lastIndex < 0) {
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
/*
|
|
311
|
+
* The transformer currently needs only the
|
|
312
|
+
* function parameter declaration to verify that
|
|
313
|
+
* operationId already exists.
|
|
314
|
+
*/
|
|
315
|
+
return normalized.slice(lastIndex, Math.min(normalized.length, statementStart + 1));
|
|
316
|
+
}
|
|
317
|
+
async function applyTransformerClassification(root, finding, candidate, provider, manifest) {
|
|
318
|
+
if (!provider ||
|
|
319
|
+
candidate.automation_status !==
|
|
320
|
+
"PROVIDER_CAPABILITY_DECLARED" ||
|
|
321
|
+
finding.category !==
|
|
322
|
+
"HTTP_WRITE") {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const capability = manifest?.capabilities.find(item => item.category ===
|
|
326
|
+
"HTTP_WRITE" &&
|
|
327
|
+
item.action_type ===
|
|
328
|
+
"http_write_v1");
|
|
329
|
+
if (!capability) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (!/\.(?:ts|tsx|mts|cts)$/i.test(finding.file)) {
|
|
333
|
+
candidate.transformer_reason =
|
|
334
|
+
"The proven HTTP transformer currently supports TypeScript source only.";
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const sourcePath = path.resolve(root, finding.file);
|
|
338
|
+
const relative = path.relative(root, sourcePath);
|
|
339
|
+
if (relative.startsWith("..") ||
|
|
340
|
+
path.isAbsolute(relative)) {
|
|
341
|
+
candidate.transformer_reason =
|
|
342
|
+
"Source path escaped the project root.";
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
let source;
|
|
346
|
+
try {
|
|
347
|
+
source =
|
|
348
|
+
await fs.readFile(sourcePath, "utf8");
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
candidate.transformer_reason =
|
|
352
|
+
"Source file could not be read.";
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const extracted = extractAwaitFetchStatement(source, finding.line);
|
|
356
|
+
if (!extracted) {
|
|
357
|
+
candidate.transformer_reason =
|
|
358
|
+
"No exact supported await fetch statement could be extracted.";
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
if (!finding.functionName) {
|
|
362
|
+
candidate.transformer_reason =
|
|
363
|
+
"The supported transformer requires a named function containing the operation.";
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const functionSource = extractFunctionDeclarationSource(source, finding.functionName, extracted.startOffset);
|
|
367
|
+
if (!functionSource) {
|
|
368
|
+
candidate.transformer_reason =
|
|
369
|
+
"The surrounding supported function declaration could not be identified.";
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const result = transformHttpWriteV1({
|
|
373
|
+
statement: extracted.statement,
|
|
374
|
+
functionSource,
|
|
375
|
+
provider
|
|
376
|
+
});
|
|
377
|
+
if (!result.eligible) {
|
|
378
|
+
candidate.transformer_reason =
|
|
379
|
+
result.reason;
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
candidate.automation_status =
|
|
383
|
+
"TRANSFORMER_MATCHED";
|
|
384
|
+
candidate.automation_reason =
|
|
385
|
+
"The exact source pattern was accepted by the proven ts_fetch_post_void_v1 transformer. Full source-patch planning is now being validated.";
|
|
386
|
+
candidate.transformer_id =
|
|
387
|
+
result.transformer;
|
|
388
|
+
candidate.transformer_reason =
|
|
389
|
+
"Exact transformer contract matched.";
|
|
390
|
+
candidate.binding_required =
|
|
391
|
+
result.requiresOnceBinding;
|
|
392
|
+
const patchPlan = buildHttpWritePatchV1({
|
|
393
|
+
source,
|
|
394
|
+
statement: extracted.statement,
|
|
395
|
+
functionSource,
|
|
396
|
+
provider
|
|
397
|
+
});
|
|
398
|
+
if (!patchPlan.eligible) {
|
|
399
|
+
candidate.transformer_reason =
|
|
400
|
+
`Transformer matched, but complete patch planning failed closed: ${patchPlan.reason}`;
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
candidate.automation_status =
|
|
404
|
+
"PATCHABLE";
|
|
405
|
+
candidate.automation_reason =
|
|
406
|
+
"Scanner match, provider capability, transformer contract, call-site Once binding and deterministic full-source patch planning all succeeded.";
|
|
407
|
+
candidate.auto_apply_eligible =
|
|
408
|
+
true;
|
|
409
|
+
candidate.binding_required =
|
|
410
|
+
false;
|
|
411
|
+
candidate.binding_strategy =
|
|
412
|
+
patchPlan.bindingStrategy;
|
|
413
|
+
candidate.patch_plan_id =
|
|
414
|
+
patchPlan.patchPlan;
|
|
415
|
+
candidate.source_sha256 =
|
|
416
|
+
patchPlan.sourceSha256;
|
|
417
|
+
candidate.proposed_source_sha256 =
|
|
418
|
+
patchPlan.proposedSourceSha256;
|
|
419
|
+
candidate.transformer_reason =
|
|
420
|
+
"Complete deterministic source patch successfully planned in memory.";
|
|
421
|
+
}
|
|
422
|
+
export async function runProtect(requestedPath, options = {}) {
|
|
423
|
+
const root = path.resolve(requestedPath);
|
|
424
|
+
const stat = await fs.stat(root);
|
|
425
|
+
if (!stat.isDirectory()) {
|
|
426
|
+
throw new Error("Protect target must be a directory.");
|
|
427
|
+
}
|
|
428
|
+
const provider = await readProvider(root);
|
|
429
|
+
const capabilityManifest = await readCapabilityManifest(root, provider);
|
|
430
|
+
const files = await collectSourceFiles(root);
|
|
431
|
+
const findings = [];
|
|
432
|
+
for (const file of files) {
|
|
433
|
+
findings.push(...await scanFile(root, file));
|
|
434
|
+
}
|
|
435
|
+
findings.sort((a, b) => confidenceRank(a.confidence) -
|
|
436
|
+
confidenceRank(b.confidence) ||
|
|
437
|
+
a.file.localeCompare(b.file) ||
|
|
438
|
+
a.line - b.line);
|
|
439
|
+
const selected = options.includeAll
|
|
440
|
+
? findings
|
|
441
|
+
: findings.filter(finding => finding.confidence ===
|
|
442
|
+
"HIGH");
|
|
443
|
+
const candidates = selected.map(finding => toCandidate(finding, capabilityManifest));
|
|
444
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
445
|
+
await applyTransformerClassification(root, selected[i], candidates[i], provider, capabilityManifest);
|
|
446
|
+
}
|
|
447
|
+
console.log("");
|
|
448
|
+
console.log("Once Protect");
|
|
449
|
+
console.log("============");
|
|
450
|
+
console.log("");
|
|
451
|
+
console.log(`Project: ${root}`);
|
|
452
|
+
console.log(`Provider: ${provider ??
|
|
453
|
+
"not configured"}`);
|
|
454
|
+
console.log(`Capability manifest: ${capabilityManifest
|
|
455
|
+
? "loaded"
|
|
456
|
+
: "not present"}`);
|
|
457
|
+
console.log("Mode: review plan");
|
|
458
|
+
console.log("Application source changes: none");
|
|
459
|
+
console.log("");
|
|
460
|
+
console.log("PROTECTION CANDIDATES");
|
|
461
|
+
console.log("---------------------");
|
|
462
|
+
if (candidates.length === 0) {
|
|
463
|
+
console.log("No candidates selected.");
|
|
464
|
+
if (!options.includeAll) {
|
|
465
|
+
console.log("Use --all to include MEDIUM and LOW-confidence findings.");
|
|
466
|
+
}
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
for (const candidate of candidates) {
|
|
470
|
+
console.log("");
|
|
471
|
+
console.log(`${candidate.confidence} ${candidate.file}:${candidate.line}`);
|
|
472
|
+
if (candidate.function_name) {
|
|
473
|
+
console.log(` Function: ${candidate.function_name}()`);
|
|
474
|
+
}
|
|
475
|
+
console.log(` Category: ${candidate.category}`);
|
|
476
|
+
console.log(` Callsite ref: ${candidate.callsite_ref}`);
|
|
477
|
+
console.log(` ${candidate.reason}`);
|
|
478
|
+
console.log(` Automation: ${candidate.automation_status}`);
|
|
479
|
+
console.log(` Auto-apply eligible: ${candidate.auto_apply_eligible
|
|
480
|
+
? "yes"
|
|
481
|
+
: "no"}`);
|
|
482
|
+
if (candidate.transformer_id) {
|
|
483
|
+
console.log(` Transformer: ${candidate.transformer_id}`);
|
|
484
|
+
console.log(` Once binding required: ${candidate.binding_required
|
|
485
|
+
? "yes"
|
|
486
|
+
: "no"}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
console.log("");
|
|
490
|
+
console.log("OPERATION ID RULE");
|
|
491
|
+
console.log("-----------------");
|
|
492
|
+
console.log("The callsite reference is NOT an operation ID.");
|
|
493
|
+
console.log("Each real-world action needs its own stable operationId.");
|
|
494
|
+
console.log("A retry of that same action must reuse the same operationId.");
|
|
495
|
+
if (provider) {
|
|
496
|
+
console.log("");
|
|
497
|
+
console.log(`Configured provider: ${provider}`);
|
|
498
|
+
}
|
|
499
|
+
const onceDirectory = path.join(root, ".once");
|
|
500
|
+
if (options.writePatch ||
|
|
501
|
+
options.writePlan ||
|
|
502
|
+
options.writeSnippets) {
|
|
503
|
+
await fs.mkdir(onceDirectory, {
|
|
504
|
+
recursive: true
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
if (options.writeSnippets) {
|
|
508
|
+
const snippetsDirectory = path.join(onceDirectory, "protect-snippets");
|
|
509
|
+
await fs.mkdir(snippetsDirectory, {
|
|
510
|
+
recursive: true
|
|
511
|
+
});
|
|
512
|
+
for (const candidate of candidates) {
|
|
513
|
+
const snippetPath = path.join(snippetsDirectory, safeFileName(candidate));
|
|
514
|
+
await fs.writeFile(snippetPath, buildIntegrationSnippet(candidate, provider), "utf8");
|
|
515
|
+
}
|
|
516
|
+
console.log("");
|
|
517
|
+
console.log("Integration snippets written:");
|
|
518
|
+
console.log(snippetsDirectory);
|
|
519
|
+
console.log(`${candidates.length} review snippet${candidates.length === 1
|
|
520
|
+
? ""
|
|
521
|
+
: "s"} generated.`);
|
|
522
|
+
console.log("Application source files were NOT modified.");
|
|
523
|
+
}
|
|
524
|
+
if (options.writePatch) {
|
|
525
|
+
const patchPath = path.join(onceDirectory, "protect-preview.diff");
|
|
526
|
+
const patchText = candidates
|
|
527
|
+
.map(candidate => buildPatchPreview(candidate, provider))
|
|
528
|
+
.join("\n");
|
|
529
|
+
await fs.writeFile(patchPath, patchText, "utf8");
|
|
530
|
+
console.log("");
|
|
531
|
+
console.log("Patch preview written:");
|
|
532
|
+
console.log(patchPath);
|
|
533
|
+
console.log("This is a review artifact only.");
|
|
534
|
+
console.log("Application source files were NOT modified.");
|
|
535
|
+
}
|
|
536
|
+
if (options.writePlan) {
|
|
537
|
+
const plan = {
|
|
538
|
+
schema_version: 1,
|
|
539
|
+
generated_at: new Date()
|
|
540
|
+
.toISOString(),
|
|
541
|
+
project: root,
|
|
542
|
+
provider,
|
|
543
|
+
source_modified: false,
|
|
544
|
+
candidates
|
|
545
|
+
};
|
|
546
|
+
const planPath = path.join(onceDirectory, "protect-plan.json");
|
|
547
|
+
await fs.writeFile(planPath, JSON.stringify(plan, null, 2) + "\n", "utf8");
|
|
548
|
+
console.log("");
|
|
549
|
+
console.log("Protection plan written:");
|
|
550
|
+
console.log(planPath);
|
|
551
|
+
console.log("No application source files were modified.");
|
|
552
|
+
}
|
|
553
|
+
if (!options.writePlan &&
|
|
554
|
+
!options.writePatch &&
|
|
555
|
+
!options.writeSnippets) {
|
|
556
|
+
console.log("");
|
|
557
|
+
console.log("Preview only.");
|
|
558
|
+
console.log("Use --write-plan to save the structured review plan.");
|
|
559
|
+
console.log("Use --patch to generate a reviewable diff artifact.");
|
|
560
|
+
console.log("Use --snippets to generate integration guidance per callsite.");
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=protect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protect.js","sourceRoot":"","sources":["../src/protect.ts"],"names":[],"mappings":"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"}
|
package/dist/scan.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type Confidence = "HIGH" | "MEDIUM" | "LOW";
|
|
2
|
+
export type Finding = {
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
functionName?: string;
|
|
6
|
+
confidence: Confidence;
|
|
7
|
+
category: string;
|
|
8
|
+
reason: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function detectProjectMetadata(root: string): Promise<{
|
|
11
|
+
languages: string[];
|
|
12
|
+
tooling: string[];
|
|
13
|
+
}>;
|
|
14
|
+
export declare function collectSourceFiles(root: string): Promise<string[]>;
|
|
15
|
+
export declare function scanFile(root: string, filePath: string): Promise<Finding[]>;
|
|
16
|
+
export declare function runScan(requestedPath: string, estimate?: boolean): Promise<void>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAQA,KAAK,UAAU,GACX,MAAM,GACN,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA8OF,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IACT,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CAuID;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,EAAE,CAAC,CA0GnB;AAqID,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,EAAE,CAAC,CAiOpB;AAsUD,wBAAsB,OAAO,CAC3B,aAAa,EAAE,MAAM,EACrB,QAAQ,UAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAiIf"}
|