@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/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jamie Oswald
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# @once-agent/sdk
|
|
2
|
+
|
|
3
|
+
Make side-effecting AI agent tools safe to retry.
|
|
4
|
+
|
|
5
|
+
Once helps prevent duplicate payments, bookings, messages and other consequential actions when a request outcome is ambiguous.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
npm install @once-agent/sdk
|
|
10
|
+
|
|
11
|
+
## Configure
|
|
12
|
+
|
|
13
|
+
Set ONCE_API_KEY in your environment.
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
import { Once } from "@once-agent/sdk";
|
|
18
|
+
|
|
19
|
+
const once = new Once();
|
|
20
|
+
|
|
21
|
+
const operationId = Once.id("refund", "order_123");
|
|
22
|
+
|
|
23
|
+
const result = await once.execute({
|
|
24
|
+
operationId,
|
|
25
|
+
provider: "http_v1",
|
|
26
|
+
action: {
|
|
27
|
+
method: "POST",
|
|
28
|
+
path: "/refund",
|
|
29
|
+
body: { order_id: "123" }
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
console.log(result);
|
|
34
|
+
|
|
35
|
+
## Check truth
|
|
36
|
+
|
|
37
|
+
const truth = await once.truth(operationId);
|
|
38
|
+
console.log(truth.ledger_state);
|
|
39
|
+
|
|
40
|
+
## Safety model
|
|
41
|
+
|
|
42
|
+
Once does not claim universal exactly-once execution.
|
|
43
|
+
Guarantees depend on the provider adapter and authoritative provider truth.
|
package/dist/apply.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ApplyResult = {
|
|
2
|
+
callsiteRef: string;
|
|
3
|
+
file: string;
|
|
4
|
+
backupPath: string;
|
|
5
|
+
sourceSha256: string;
|
|
6
|
+
appliedSha256: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function applyProtectionPlan(requestedPath: string): Promise<ApplyResult>;
|
|
9
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAiDA,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAuYF,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,CA4VtB"}
|
package/dist/apply.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { buildHttpWritePatchV1 } from "./transformers/http-patch-plan-v1.js";
|
|
5
|
+
function sha256(value) {
|
|
6
|
+
return createHash("sha256")
|
|
7
|
+
.update(value.replace(/\r\n/g, "\n"), "utf8")
|
|
8
|
+
.digest("hex");
|
|
9
|
+
}
|
|
10
|
+
function escapeRegExp(value) {
|
|
11
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
12
|
+
}
|
|
13
|
+
function extractAwaitFetchStatement(source, findingLine) {
|
|
14
|
+
const normalized = source.replace(/\r\n/g, "\n");
|
|
15
|
+
const lines = normalized.split("\n");
|
|
16
|
+
const target = Math.max(0, Math.min(lines.length - 1, findingLine - 1));
|
|
17
|
+
let startLine = -1;
|
|
18
|
+
for (let i = target; i >= Math.max(0, target - 12); i--) {
|
|
19
|
+
if (/\bawait\s+fetch\s*\(/.test(lines[i])) {
|
|
20
|
+
startLine = i;
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (startLine < 0) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
let lineOffset = 0;
|
|
28
|
+
for (let i = 0; i < startLine; i++) {
|
|
29
|
+
lineOffset +=
|
|
30
|
+
lines[i].length + 1;
|
|
31
|
+
}
|
|
32
|
+
const fragment = normalized.slice(lineOffset);
|
|
33
|
+
const awaitMatch = fragment.match(/\bawait\s+fetch\s*\(/);
|
|
34
|
+
if (!awaitMatch ||
|
|
35
|
+
awaitMatch.index === undefined) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const statementStart = awaitMatch.index;
|
|
39
|
+
const openParen = fragment.indexOf("(", statementStart);
|
|
40
|
+
if (openParen < 0) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
let depth = 0;
|
|
44
|
+
let quote = null;
|
|
45
|
+
let escaped = false;
|
|
46
|
+
let closeParen = -1;
|
|
47
|
+
for (let i = openParen; i < fragment.length; i++) {
|
|
48
|
+
const char = fragment[i];
|
|
49
|
+
if (quote) {
|
|
50
|
+
if (escaped) {
|
|
51
|
+
escaped = false;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (char === "\\") {
|
|
55
|
+
escaped = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (char === quote) {
|
|
59
|
+
quote = null;
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (char === "`") {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (char === "'" ||
|
|
67
|
+
char === '"') {
|
|
68
|
+
quote = char;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (char === "(") {
|
|
72
|
+
depth++;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (char === ")") {
|
|
76
|
+
depth--;
|
|
77
|
+
if (depth === 0) {
|
|
78
|
+
closeParen = i;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (closeParen < 0) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
let end = closeParen + 1;
|
|
87
|
+
while (end < fragment.length &&
|
|
88
|
+
/\s/.test(fragment[end])) {
|
|
89
|
+
end++;
|
|
90
|
+
}
|
|
91
|
+
if (fragment[end] === ";") {
|
|
92
|
+
end++;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
statement: fragment
|
|
96
|
+
.slice(statementStart, end)
|
|
97
|
+
.trim(),
|
|
98
|
+
startOffset: lineOffset +
|
|
99
|
+
statementStart
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function extractFunctionSource(source, functionName, statementStart) {
|
|
103
|
+
const normalized = source.replace(/\r\n/g, "\n");
|
|
104
|
+
const before = normalized.slice(0, statementStart);
|
|
105
|
+
const pattern = new RegExp(String.raw `(?:export\s+)?(?:async\s+)?function\s+${escapeRegExp(functionName)}\s*\(`, "g");
|
|
106
|
+
let lastIndex = -1;
|
|
107
|
+
for (const match of before.matchAll(pattern)) {
|
|
108
|
+
if (match.index !== undefined) {
|
|
109
|
+
lastIndex =
|
|
110
|
+
match.index;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (lastIndex < 0) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return normalized.slice(lastIndex, Math.min(normalized.length, statementStart + 1));
|
|
117
|
+
}
|
|
118
|
+
async function readJson(file) {
|
|
119
|
+
const raw = await fs.readFile(file, "utf8");
|
|
120
|
+
return JSON.parse(raw.replace(/^\uFEFF/, ""));
|
|
121
|
+
}
|
|
122
|
+
async function verifyTypeScript(source, fileName) {
|
|
123
|
+
const ts = await import("typescript");
|
|
124
|
+
const result = ts.transpileModule(source, {
|
|
125
|
+
fileName,
|
|
126
|
+
reportDiagnostics: true,
|
|
127
|
+
compilerOptions: {
|
|
128
|
+
target: ts.ScriptTarget.ES2022,
|
|
129
|
+
module: ts.ModuleKind.ESNext
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
const errors = (result.diagnostics ??
|
|
133
|
+
[]).filter(diagnostic => diagnostic.category ===
|
|
134
|
+
ts.DiagnosticCategory.Error);
|
|
135
|
+
if (errors.length > 0) {
|
|
136
|
+
const message = errors
|
|
137
|
+
.map(diagnostic => ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"))
|
|
138
|
+
.join("\n");
|
|
139
|
+
throw new Error("TypeScript verification failed:\n" +
|
|
140
|
+
message);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export async function applyProtectionPlan(requestedPath) {
|
|
144
|
+
const root = path.resolve(requestedPath);
|
|
145
|
+
const onceDirectory = path.join(root, ".once");
|
|
146
|
+
const plan = await readJson(path.join(onceDirectory, "protect-plan.json"));
|
|
147
|
+
const config = await readJson(path.join(onceDirectory, "config.json"));
|
|
148
|
+
const manifest = await readJson(path.join(onceDirectory, "provider-capabilities.json"));
|
|
149
|
+
const provider = config.provider?.name?.trim();
|
|
150
|
+
if (!provider) {
|
|
151
|
+
throw new Error("Configured provider missing.");
|
|
152
|
+
}
|
|
153
|
+
if (plan.provider !== provider) {
|
|
154
|
+
throw new Error("Protect plan provider no longer matches configuration.");
|
|
155
|
+
}
|
|
156
|
+
if (manifest.schema_version !== 1 ||
|
|
157
|
+
manifest.provider !== provider) {
|
|
158
|
+
throw new Error("Provider capability manifest no longer matches configuration.");
|
|
159
|
+
}
|
|
160
|
+
const capability = manifest.capabilities?.some(item => item.category ===
|
|
161
|
+
"HTTP_WRITE" &&
|
|
162
|
+
item.action_type ===
|
|
163
|
+
"http_write_v1");
|
|
164
|
+
if (!capability) {
|
|
165
|
+
throw new Error("Required http_write_v1 capability is no longer declared.");
|
|
166
|
+
}
|
|
167
|
+
const patchable = plan.candidates.filter(candidate => candidate.automation_status ===
|
|
168
|
+
"PATCHABLE" &&
|
|
169
|
+
candidate.auto_apply_eligible ===
|
|
170
|
+
true);
|
|
171
|
+
if (patchable.length !== 1) {
|
|
172
|
+
throw new Error(`--apply requires exactly one PATCHABLE candidate; found ${patchable.length}.`);
|
|
173
|
+
}
|
|
174
|
+
const candidate = patchable[0];
|
|
175
|
+
if (candidate.category !==
|
|
176
|
+
"HTTP_WRITE" ||
|
|
177
|
+
candidate.transformer_id !==
|
|
178
|
+
"ts_fetch_post_void_v1" ||
|
|
179
|
+
candidate.patch_plan_id !==
|
|
180
|
+
"ts_fetch_post_void_patch_v1") {
|
|
181
|
+
throw new Error("Candidate is outside the supported v1.0 apply contract.");
|
|
182
|
+
}
|
|
183
|
+
if (!candidate.function_name ||
|
|
184
|
+
!candidate.source_sha256 ||
|
|
185
|
+
!candidate.proposed_source_sha256) {
|
|
186
|
+
throw new Error("Protect plan is missing required patch metadata.");
|
|
187
|
+
}
|
|
188
|
+
const sourcePath = path.resolve(root, candidate.file);
|
|
189
|
+
const relative = path.relative(root, sourcePath);
|
|
190
|
+
if (relative.startsWith("..") ||
|
|
191
|
+
path.isAbsolute(relative)) {
|
|
192
|
+
throw new Error("Candidate source path escaped the project root.");
|
|
193
|
+
}
|
|
194
|
+
const originalSource = await fs.readFile(sourcePath, "utf8");
|
|
195
|
+
if (sha256(originalSource) !==
|
|
196
|
+
candidate.source_sha256) {
|
|
197
|
+
throw new Error("Source changed after Protect planning. Refusing stale patch.");
|
|
198
|
+
}
|
|
199
|
+
const extracted = extractAwaitFetchStatement(originalSource, candidate.line);
|
|
200
|
+
if (!extracted) {
|
|
201
|
+
throw new Error("Could not re-identify the exact protected operation.");
|
|
202
|
+
}
|
|
203
|
+
const functionSource = extractFunctionSource(originalSource, candidate.function_name, extracted.startOffset);
|
|
204
|
+
if (!functionSource) {
|
|
205
|
+
throw new Error("Could not re-identify the surrounding function.");
|
|
206
|
+
}
|
|
207
|
+
const patch = buildHttpWritePatchV1({
|
|
208
|
+
source: originalSource,
|
|
209
|
+
statement: extracted.statement,
|
|
210
|
+
functionSource,
|
|
211
|
+
provider
|
|
212
|
+
});
|
|
213
|
+
if (!patch.eligible) {
|
|
214
|
+
throw new Error("Patch no longer satisfies transformer contract: " +
|
|
215
|
+
patch.reason);
|
|
216
|
+
}
|
|
217
|
+
if (patch.proposedSourceSha256 !==
|
|
218
|
+
candidate.proposed_source_sha256) {
|
|
219
|
+
throw new Error("Recomputed proposed-source fingerprint differs from Protect plan.");
|
|
220
|
+
}
|
|
221
|
+
await verifyTypeScript(patch.proposedSource, sourcePath);
|
|
222
|
+
const backupDirectory = path.join(onceDirectory, "backups", candidate.callsite_ref);
|
|
223
|
+
await fs.mkdir(backupDirectory, {
|
|
224
|
+
recursive: true
|
|
225
|
+
});
|
|
226
|
+
const stamp = new Date()
|
|
227
|
+
.toISOString()
|
|
228
|
+
.replace(/[:.]/g, "-");
|
|
229
|
+
const backupPath = path.join(backupDirectory, `${stamp}-${path.basename(sourcePath)}.bak`);
|
|
230
|
+
await fs.writeFile(backupPath, originalSource, "utf8");
|
|
231
|
+
const temporaryPath = path.join(path.dirname(sourcePath), `.once-${process.pid}-${Date.now()}-${path.basename(sourcePath)}.tmp`);
|
|
232
|
+
let replaced = false;
|
|
233
|
+
try {
|
|
234
|
+
await fs.writeFile(temporaryPath, patch.proposedSource, {
|
|
235
|
+
encoding: "utf8",
|
|
236
|
+
flag: "wx"
|
|
237
|
+
});
|
|
238
|
+
await fs.rename(temporaryPath, sourcePath);
|
|
239
|
+
replaced =
|
|
240
|
+
true;
|
|
241
|
+
const applied = await fs.readFile(sourcePath, "utf8");
|
|
242
|
+
if (sha256(applied) !==
|
|
243
|
+
patch.proposedSourceSha256) {
|
|
244
|
+
throw new Error("Applied source fingerprint differs from planned source.");
|
|
245
|
+
}
|
|
246
|
+
await verifyTypeScript(applied, sourcePath);
|
|
247
|
+
return {
|
|
248
|
+
callsiteRef: candidate.callsite_ref,
|
|
249
|
+
file: candidate.file,
|
|
250
|
+
backupPath,
|
|
251
|
+
sourceSha256: patch.sourceSha256,
|
|
252
|
+
appliedSha256: patch.proposedSourceSha256
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
await fs.rm(temporaryPath, {
|
|
257
|
+
force: true
|
|
258
|
+
});
|
|
259
|
+
if (replaced) {
|
|
260
|
+
await fs.writeFile(sourcePath, originalSource, "utf8");
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { Once, OnceError } from "./index.js";
|
|
4
|
+
import { runScan } from "./scan.js";
|
|
5
|
+
import { runSetup } from "./setup.js";
|
|
6
|
+
import { runProtect } from "./protect.js";
|
|
7
|
+
import { applyProtectionPlan } from "./apply.js";
|
|
8
|
+
async function runDoctor() {
|
|
9
|
+
console.log("");
|
|
10
|
+
console.log("Once Doctor");
|
|
11
|
+
console.log("-----------");
|
|
12
|
+
if (!process.env.ONCE_API_KEY) {
|
|
13
|
+
console.log("✗ ONCE_API_KEY is not set");
|
|
14
|
+
console.log("");
|
|
15
|
+
console.log("Set ONCE_API_KEY and run again.");
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log("✓ ONCE_API_KEY found");
|
|
20
|
+
try {
|
|
21
|
+
const once = new Once();
|
|
22
|
+
const operationId = "doctor-" +
|
|
23
|
+
randomUUID()
|
|
24
|
+
.replaceAll("-", "");
|
|
25
|
+
const truth = await once.truth(operationId);
|
|
26
|
+
console.log("✓ Once API reachable");
|
|
27
|
+
console.log("✓ API key accepted");
|
|
28
|
+
console.log("✓ Truth endpoint working");
|
|
29
|
+
if (truth.ledger_state !==
|
|
30
|
+
"ABSENT" ||
|
|
31
|
+
truth.side_effects !== 0) {
|
|
32
|
+
console.log("✗ Unexpected doctor probe result");
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.log("✓ Safety probe passed");
|
|
37
|
+
console.log("");
|
|
38
|
+
console.log("Once is ready.");
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof
|
|
42
|
+
OnceError) {
|
|
43
|
+
console.log(`✗ Once error: ${error.code ?? "unknown"}`);
|
|
44
|
+
if (error.status) {
|
|
45
|
+
console.log(` HTTP ${error.status}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log("✗ Unexpected error");
|
|
50
|
+
console.error(error);
|
|
51
|
+
}
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function printHelp() {
|
|
56
|
+
console.log("");
|
|
57
|
+
console.log("Once");
|
|
58
|
+
console.log("----");
|
|
59
|
+
console.log("");
|
|
60
|
+
console.log("Commands:");
|
|
61
|
+
console.log(" once protect [directory]");
|
|
62
|
+
console.log(" Review candidate operations for Once protection.");
|
|
63
|
+
console.log(" Use --all to include all confidence levels.");
|
|
64
|
+
console.log(" Use --write-plan to save .once/protect-plan.json.");
|
|
65
|
+
console.log(" Use --patch to generate .once/protect-preview.diff.");
|
|
66
|
+
console.log(" Use --snippets to generate per-callsite integration guidance.");
|
|
67
|
+
console.log(" Use --apply to transactionally apply exactly one PATCHABLE candidate.");
|
|
68
|
+
console.log("");
|
|
69
|
+
console.log(" once setup [directory]");
|
|
70
|
+
console.log(" Detect, configure and install Once.");
|
|
71
|
+
console.log(" Use --plan to preview without changes.");
|
|
72
|
+
console.log("");
|
|
73
|
+
console.log(" once scan [directory]");
|
|
74
|
+
console.log(" Find likely consequential operations locally.");
|
|
75
|
+
console.log("");
|
|
76
|
+
console.log(" once doctor");
|
|
77
|
+
console.log(" Verify your Once connection.");
|
|
78
|
+
console.log("");
|
|
79
|
+
console.log("Examples:");
|
|
80
|
+
console.log(" once protect .");
|
|
81
|
+
console.log(" once protect . --all --write-plan");
|
|
82
|
+
console.log(" once protect . --all --patch");
|
|
83
|
+
console.log(" once protect . --apply");
|
|
84
|
+
console.log(" once setup .");
|
|
85
|
+
console.log(" once scan .");
|
|
86
|
+
console.log(" once doctor");
|
|
87
|
+
}
|
|
88
|
+
async function main() {
|
|
89
|
+
const args = process.argv.slice(2);
|
|
90
|
+
const command = (args.shift() ??
|
|
91
|
+
"doctor").toLowerCase();
|
|
92
|
+
switch (command) {
|
|
93
|
+
case "doctor":
|
|
94
|
+
await runDoctor();
|
|
95
|
+
return;
|
|
96
|
+
case "scan": {
|
|
97
|
+
const noEstimate = args.includes("--no-estimate");
|
|
98
|
+
const requestedPath = args.find(value => !value.startsWith("--")) ?? ".";
|
|
99
|
+
await runScan(requestedPath, !noEstimate);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
case "protect": {
|
|
103
|
+
const includeAll = args.includes("--all");
|
|
104
|
+
const writePlan = args.includes("--write-plan");
|
|
105
|
+
const writePatch = args.includes("--patch");
|
|
106
|
+
const writeSnippets = args.includes("--snippets");
|
|
107
|
+
const apply = args.includes("--apply");
|
|
108
|
+
const requestedPath = args.find(value => !value.startsWith("--")) ?? ".";
|
|
109
|
+
await runProtect(requestedPath, {
|
|
110
|
+
includeAll: apply
|
|
111
|
+
? true
|
|
112
|
+
: includeAll,
|
|
113
|
+
writePlan: apply
|
|
114
|
+
? true
|
|
115
|
+
: writePlan,
|
|
116
|
+
writePatch,
|
|
117
|
+
writeSnippets
|
|
118
|
+
});
|
|
119
|
+
if (apply) {
|
|
120
|
+
console.log("");
|
|
121
|
+
console.log("APPLYING PROTECTION");
|
|
122
|
+
console.log("-------------------");
|
|
123
|
+
let result;
|
|
124
|
+
try {
|
|
125
|
+
result =
|
|
126
|
+
await applyProtectionPlan(requestedPath);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
const message = String(error instanceof Error
|
|
130
|
+
? error.message
|
|
131
|
+
: error);
|
|
132
|
+
/*
|
|
133
|
+
* runProtect currently does not persist a plan
|
|
134
|
+
* when zero candidates are selected.
|
|
135
|
+
*
|
|
136
|
+
* Because this apply path has just run Protect
|
|
137
|
+
* successfully with writePlan=true, a missing
|
|
138
|
+
* protect-plan here means there were zero
|
|
139
|
+
* selected candidates.
|
|
140
|
+
*/
|
|
141
|
+
if (message.includes("protect-plan.json") &&
|
|
142
|
+
message.includes("ENOENT")) {
|
|
143
|
+
throw new Error("--apply requires exactly one PATCHABLE candidate; found 0.");
|
|
144
|
+
}
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
console.log(`Applied: ${result.file}`);
|
|
148
|
+
console.log(`Backup: ${result.backupPath}`);
|
|
149
|
+
console.log("TypeScript verification: PASS");
|
|
150
|
+
console.log("ONCE PROTECTION APPLIED");
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
case "setup": {
|
|
155
|
+
const autoConfirm = args.includes("--yes");
|
|
156
|
+
const planOnly = args.includes("--plan");
|
|
157
|
+
const skipInstall = args.includes("--skip-install");
|
|
158
|
+
const requestedPath = args.find(value => !value.startsWith("--")) ?? ".";
|
|
159
|
+
await runSetup(requestedPath, {
|
|
160
|
+
autoConfirm,
|
|
161
|
+
planOnly,
|
|
162
|
+
skipInstall
|
|
163
|
+
});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
case "help":
|
|
167
|
+
case "--help":
|
|
168
|
+
case "-h":
|
|
169
|
+
printHelp();
|
|
170
|
+
return;
|
|
171
|
+
default:
|
|
172
|
+
console.log(`Unknown command: ${command}`);
|
|
173
|
+
printHelp();
|
|
174
|
+
process.exitCode = 1;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
await main();
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error("");
|
|
182
|
+
console.error("Once command failed.");
|
|
183
|
+
if (error instanceof Error) {
|
|
184
|
+
console.error(error.message);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.error(error);
|
|
188
|
+
}
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export type OnceProvider = "blind_test" | "http_v1" | "stripe_v1" | (string & {});
|
|
2
|
+
export interface OnceOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
networkRetries?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ExecuteInput {
|
|
9
|
+
operationId: string;
|
|
10
|
+
provider: OnceProvider;
|
|
11
|
+
action: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface ExecuteResponse {
|
|
14
|
+
operation_id: string;
|
|
15
|
+
result: string;
|
|
16
|
+
state: string;
|
|
17
|
+
ledger_state?: string;
|
|
18
|
+
attempts?: number;
|
|
19
|
+
side_effects?: number;
|
|
20
|
+
provider_executed?: boolean;
|
|
21
|
+
provider_executed_at?: string | null;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface TruthResponse {
|
|
25
|
+
operation_id: string;
|
|
26
|
+
attempts?: number;
|
|
27
|
+
ledger_state: string;
|
|
28
|
+
state?: string;
|
|
29
|
+
side_effects?: number;
|
|
30
|
+
provider_executed?: boolean;
|
|
31
|
+
provider_executed_at?: string | null;
|
|
32
|
+
first_attempt_at?: string | null;
|
|
33
|
+
last_attempt_at?: string | null;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
export declare class OnceError extends Error {
|
|
37
|
+
readonly status?: number;
|
|
38
|
+
readonly code?: string;
|
|
39
|
+
readonly body?: unknown;
|
|
40
|
+
readonly retryAfter?: number;
|
|
41
|
+
constructor(message: string, options?: {
|
|
42
|
+
status?: number;
|
|
43
|
+
code?: string;
|
|
44
|
+
body?: unknown;
|
|
45
|
+
retryAfter?: number;
|
|
46
|
+
cause?: unknown;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export declare class OnceTimeoutError extends OnceError {
|
|
50
|
+
constructor(message?: string, cause?: unknown);
|
|
51
|
+
}
|
|
52
|
+
export declare class OnceNetworkError extends OnceError {
|
|
53
|
+
constructor(message?: string, cause?: unknown);
|
|
54
|
+
}
|
|
55
|
+
export declare class Once {
|
|
56
|
+
readonly apiKey: string;
|
|
57
|
+
readonly baseUrl: string;
|
|
58
|
+
readonly timeoutMs: number;
|
|
59
|
+
readonly networkRetries: number;
|
|
60
|
+
constructor(options?: OnceOptions);
|
|
61
|
+
/**
|
|
62
|
+
* Generate a deterministic Once operation ID.
|
|
63
|
+
*
|
|
64
|
+
* Same inputs => same ID.
|
|
65
|
+
*
|
|
66
|
+
* Example:
|
|
67
|
+
* Once.id("refund", "order_123")
|
|
68
|
+
*/
|
|
69
|
+
static id(...parts: Array<string | number>): string;
|
|
70
|
+
id(...parts: Array<string | number>): string;
|
|
71
|
+
execute(input: ExecuteInput): Promise<ExecuteResponse>;
|
|
72
|
+
truth(operationId: string): Promise<TruthResponse>;
|
|
73
|
+
private request;
|
|
74
|
+
}
|
|
75
|
+
export default Once;
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|