@once-agent/sdk 0.1.4 → 0.1.5
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 +62 -3
- package/dist/cli.js +13 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +245 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/decision.d.ts +39 -0
- package/dist/runtime/decision.d.ts.map +1 -0
- package/dist/runtime/decision.js +102 -0
- package/dist/runtime/decision.js.map +1 -0
- package/dist/runtime/fetch-interceptor.d.ts +66 -0
- package/dist/runtime/fetch-interceptor.d.ts.map +1 -0
- package/dist/runtime/fetch-interceptor.js +151 -0
- package/dist/runtime/fetch-interceptor.js.map +1 -0
- package/dist/runtime/identity.d.ts +23 -0
- package/dist/runtime/identity.d.ts.map +1 -0
- package/dist/runtime/identity.js +191 -0
- package/dist/runtime/identity.js.map +1 -0
- package/dist/runtime/pipeline.d.ts +25 -0
- package/dist/runtime/pipeline.d.ts.map +1 -0
- package/dist/runtime/pipeline.js +121 -0
- package/dist/runtime/pipeline.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +101 -8
- package/dist/setup.js.map +1 -1
- package/dist-cjs/index.js +255 -2
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/runtime/decision.js +105 -0
- package/dist-cjs/runtime/decision.js.map +1 -0
- package/dist-cjs/runtime/fetch-interceptor.js +157 -0
- package/dist-cjs/runtime/fetch-interceptor.js.map +1 -0
- package/dist-cjs/runtime/identity.js +194 -0
- package/dist-cjs/runtime/identity.js.map +1 -0
- package/dist-cjs/runtime/pipeline.js +124 -0
- package/dist-cjs/runtime/pipeline.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveHttpOperationIdentity = resolveHttpOperationIdentity;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const BODY_FIELDS = [
|
|
6
|
+
{
|
|
7
|
+
key: "once_operation_id",
|
|
8
|
+
source: "body:once_operation_id"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: "onceOperationId",
|
|
12
|
+
source: "body:onceOperationId"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
key: "operation_id",
|
|
16
|
+
source: "body:operation_id"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
key: "operationId",
|
|
20
|
+
source: "body:operationId"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: "idempotency_key",
|
|
24
|
+
source: "body:idempotency_key"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: "idempotencyKey",
|
|
28
|
+
source: "body:idempotencyKey"
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
function clean(value) {
|
|
32
|
+
if (typeof value !== "string") {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const result = value.trim();
|
|
36
|
+
return result.length > 0
|
|
37
|
+
? result
|
|
38
|
+
: null;
|
|
39
|
+
}
|
|
40
|
+
function normalizeMethod(value) {
|
|
41
|
+
return String(value || "")
|
|
42
|
+
.trim()
|
|
43
|
+
.toUpperCase();
|
|
44
|
+
}
|
|
45
|
+
function normalizeUrl(value) {
|
|
46
|
+
try {
|
|
47
|
+
const url = new URL(value);
|
|
48
|
+
if (url.protocol !== "https:" &&
|
|
49
|
+
url.protocol !== "http:") {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
url.hash = "";
|
|
53
|
+
const params = Array.from(url.searchParams.entries()).sort(([ak, av], [bk, bv]) => ak.localeCompare(bk) ||
|
|
54
|
+
av.localeCompare(bv));
|
|
55
|
+
url.search = "";
|
|
56
|
+
for (const [key, item] of params) {
|
|
57
|
+
url.searchParams.append(key, item);
|
|
58
|
+
}
|
|
59
|
+
return url.toString();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function headerValue(headers, wanted) {
|
|
66
|
+
if (!headers) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
70
|
+
if (key.toLowerCase() !==
|
|
71
|
+
wanted.toLowerCase()) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (Array.isArray(value)) {
|
|
75
|
+
const valid = value
|
|
76
|
+
.map(clean)
|
|
77
|
+
.filter((item) => item !== null);
|
|
78
|
+
return valid.length === 1
|
|
79
|
+
? valid[0]
|
|
80
|
+
: null;
|
|
81
|
+
}
|
|
82
|
+
return clean(value);
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function bodyObject(body) {
|
|
87
|
+
if (body === null ||
|
|
88
|
+
body === undefined) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (typeof body === "string") {
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(body);
|
|
94
|
+
if (parsed &&
|
|
95
|
+
typeof parsed === "object" &&
|
|
96
|
+
!Array.isArray(parsed)) {
|
|
97
|
+
return parsed;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (typeof body === "object" &&
|
|
106
|
+
!Array.isArray(body)) {
|
|
107
|
+
return body;
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function candidates(input) {
|
|
112
|
+
const result = [];
|
|
113
|
+
const explicit = clean(input.operationId);
|
|
114
|
+
if (explicit) {
|
|
115
|
+
result.push({
|
|
116
|
+
source: "explicit",
|
|
117
|
+
value: explicit
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const normalHeader = headerValue(input.headers, "idempotency-key");
|
|
121
|
+
if (normalHeader) {
|
|
122
|
+
result.push({
|
|
123
|
+
source: "header:idempotency-key",
|
|
124
|
+
value: normalHeader
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const alternateHeader = headerValue(input.headers, "x-idempotency-key");
|
|
128
|
+
if (alternateHeader) {
|
|
129
|
+
result.push({
|
|
130
|
+
source: "header:x-idempotency-key",
|
|
131
|
+
value: alternateHeader
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const body = bodyObject(input.body);
|
|
135
|
+
if (body) {
|
|
136
|
+
for (const field of BODY_FIELDS) {
|
|
137
|
+
const value = clean(body[field.key]);
|
|
138
|
+
if (value) {
|
|
139
|
+
result.push({
|
|
140
|
+
source: field.source,
|
|
141
|
+
value
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
function buildOperationId(method, url, identity) {
|
|
149
|
+
const hash = (0, node_crypto_1.createHash)("sha256");
|
|
150
|
+
hash.update("once-runtime-http-id-v1\u0000", "utf8");
|
|
151
|
+
for (const value of [method, url, identity]) {
|
|
152
|
+
const bytes = Buffer.from(value, "utf8");
|
|
153
|
+
const length = Buffer.allocUnsafe(4);
|
|
154
|
+
length.writeUInt32BE(bytes.length, 0);
|
|
155
|
+
hash.update(length);
|
|
156
|
+
hash.update(bytes);
|
|
157
|
+
}
|
|
158
|
+
return ("http:" +
|
|
159
|
+
hash
|
|
160
|
+
.digest("hex")
|
|
161
|
+
.slice(0, 32));
|
|
162
|
+
}
|
|
163
|
+
function resolveHttpOperationIdentity(input) {
|
|
164
|
+
const method = normalizeMethod(input.method);
|
|
165
|
+
const url = normalizeUrl(input.url);
|
|
166
|
+
if (!url) {
|
|
167
|
+
return {
|
|
168
|
+
status: "REQUIRED",
|
|
169
|
+
reason: "A valid HTTP(S) destination is required."
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const found = candidates(input);
|
|
173
|
+
if (found.length === 0) {
|
|
174
|
+
return {
|
|
175
|
+
status: "REQUIRED",
|
|
176
|
+
reason: "No trustworthy stable identity carrier was found. Runtime refuses to guess."
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const values = Array.from(new Set(found.map(item => item.value)));
|
|
180
|
+
if (values.length !== 1) {
|
|
181
|
+
return {
|
|
182
|
+
status: "CONFLICT",
|
|
183
|
+
sources: found.map(item => item.source),
|
|
184
|
+
reason: "Stable identity carriers disagree. Runtime refuses ambiguous identity."
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
status: "FOUND",
|
|
189
|
+
operationId: buildOperationId(method, url, values[0]),
|
|
190
|
+
source: found[0].source,
|
|
191
|
+
reason: "Stable identity found and deterministically bound to this HTTP operation."
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/runtime/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareHttpExecution = prepareHttpExecution;
|
|
4
|
+
const decision_js_1 = require("./decision.js");
|
|
5
|
+
const identity_js_1 = require("./identity.js");
|
|
6
|
+
function prepareHttpExecution(request) {
|
|
7
|
+
const identity = (0, identity_js_1.resolveHttpOperationIdentity)({
|
|
8
|
+
method: request.method,
|
|
9
|
+
url: request.url,
|
|
10
|
+
operationId: request.operationId,
|
|
11
|
+
headers: request.headers,
|
|
12
|
+
body: request.body
|
|
13
|
+
});
|
|
14
|
+
const resolvedOperationId = identity.status === "FOUND"
|
|
15
|
+
? identity.operationId
|
|
16
|
+
: undefined;
|
|
17
|
+
const gate = (0, decision_js_1.decideHttpExecution)({
|
|
18
|
+
surface: "http",
|
|
19
|
+
method: request.method,
|
|
20
|
+
url: request.url,
|
|
21
|
+
provider: request.provider,
|
|
22
|
+
operationId: resolvedOperationId
|
|
23
|
+
});
|
|
24
|
+
/*
|
|
25
|
+
* Safe reads pass normally and do not require
|
|
26
|
+
* stable operation identity.
|
|
27
|
+
*/
|
|
28
|
+
if (gate.decision === "PASS") {
|
|
29
|
+
return {
|
|
30
|
+
decision: gate.decision,
|
|
31
|
+
code: gate.code,
|
|
32
|
+
consequential: gate.consequential,
|
|
33
|
+
method: gate.method,
|
|
34
|
+
reason: gate.reason,
|
|
35
|
+
identityStatus: identity.status
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/*
|
|
39
|
+
* Structural failures take precedence.
|
|
40
|
+
*/
|
|
41
|
+
if (gate.code === "INVALID_URL" ||
|
|
42
|
+
gate.code === "UNSUPPORTED_PROTOCOL" ||
|
|
43
|
+
gate.code === "UNSUPPORTED_HTTP_METHOD") {
|
|
44
|
+
return {
|
|
45
|
+
decision: gate.decision,
|
|
46
|
+
code: gate.code,
|
|
47
|
+
consequential: gate.consequential,
|
|
48
|
+
method: gate.method,
|
|
49
|
+
reason: gate.reason,
|
|
50
|
+
identityStatus: identity.status
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/*
|
|
54
|
+
* Never choose between conflicting identities.
|
|
55
|
+
*/
|
|
56
|
+
if (identity.status === "CONFLICT") {
|
|
57
|
+
return {
|
|
58
|
+
decision: "BLOCK",
|
|
59
|
+
code: "IDENTITY_CONFLICT",
|
|
60
|
+
consequential: true,
|
|
61
|
+
method: gate.method,
|
|
62
|
+
reason: identity.reason,
|
|
63
|
+
identityStatus: identity.status
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/*
|
|
67
|
+
* Provider is required for protected execution.
|
|
68
|
+
*/
|
|
69
|
+
if (gate.code === "MISSING_PROVIDER") {
|
|
70
|
+
return {
|
|
71
|
+
decision: "BLOCK",
|
|
72
|
+
code: "MISSING_PROVIDER",
|
|
73
|
+
consequential: true,
|
|
74
|
+
method: gate.method,
|
|
75
|
+
reason: gate.reason,
|
|
76
|
+
identityStatus: identity.status,
|
|
77
|
+
...(identity.status === "FOUND"
|
|
78
|
+
? {
|
|
79
|
+
operationId: identity.operationId,
|
|
80
|
+
identitySource: identity.source
|
|
81
|
+
}
|
|
82
|
+
: {})
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/*
|
|
86
|
+
* Consequential writes without trustworthy
|
|
87
|
+
* stable identity fail closed.
|
|
88
|
+
*/
|
|
89
|
+
if (identity.status === "REQUIRED") {
|
|
90
|
+
return {
|
|
91
|
+
decision: "BLOCK",
|
|
92
|
+
code: "IDENTITY_REQUIRED",
|
|
93
|
+
consequential: true,
|
|
94
|
+
method: gate.method,
|
|
95
|
+
reason: identity.reason,
|
|
96
|
+
identityStatus: identity.status
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/*
|
|
100
|
+
* FOUND identity + provider must result in
|
|
101
|
+
* protected execution.
|
|
102
|
+
*/
|
|
103
|
+
if (gate.decision !== "PROTECT") {
|
|
104
|
+
return {
|
|
105
|
+
decision: "BLOCK",
|
|
106
|
+
code: gate.code,
|
|
107
|
+
consequential: true,
|
|
108
|
+
method: gate.method,
|
|
109
|
+
reason: "Runtime reached an unexpected execution state and failed closed.",
|
|
110
|
+
identityStatus: identity.status
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
decision: "PROTECT",
|
|
115
|
+
code: gate.code,
|
|
116
|
+
consequential: true,
|
|
117
|
+
method: gate.method,
|
|
118
|
+
reason: gate.reason,
|
|
119
|
+
operationId: identity.operationId,
|
|
120
|
+
identitySource: identity.source,
|
|
121
|
+
identityStatus: identity.status
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/runtime/pipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@once-agent/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Execution safety for side-effecting AI agent tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"typecheck": "tsc --noEmit",
|
|
23
23
|
"benchmark:scan": "npm run build && node ./scripts/scan-benchmark.mjs",
|
|
24
24
|
"test:contract": "npm run build && tsc --noEmit --target ES2022 --module NodeNext --moduleResolution NodeNext --strict --types node ./scripts/sdk-contract-types.ts && node ./scripts/sdk-contract-runtime.mjs",
|
|
25
|
-
"test:release": "npm run benchmark:scan && npm run test:scanner-declarations && npm run test:contract && npm run test:protect && npm run test:capabilities && npm run test:transformer && npm run test:binding && npm run test:patch-planner && npm run test:transformer-protect && npm run test:apply && npm run test:id-conformance && npm run test:consumer && npm run test:activation && npm run test:package",
|
|
25
|
+
"test:release": "npm run benchmark:scan && npm run test:scanner-declarations && npm run test:contract && npm run test:protect && npm run test:capabilities && npm run test:transformer && npm run test:binding && npm run test:patch-planner && npm run test:transformer-protect && npm run test:apply && npm run test:id-conformance && npm run test:consumer && npm run test:activation && npm run test:package && npm run test:runtime-setup",
|
|
26
26
|
"test:protect": "npm run build && node ./scripts/protect-regression.mjs",
|
|
27
27
|
"test:capabilities": "npm run build && node ./scripts/capability-regression.mjs",
|
|
28
28
|
"test:transformer": "npm run build && node ./scripts/http-transformer-regression.mjs",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"test:id-conformance": "npm run build && node ./scripts/id-conformance-regression.mjs",
|
|
37
37
|
"build:esm": "tsc -p tsconfig.json",
|
|
38
38
|
"build:cjs": "tsc -p tsconfig.cjs.json && node ./scripts/write-cjs-package.mjs",
|
|
39
|
+
"test:runtime-setup": "npm run build && node ./scripts/runtime-setup-regression.mjs",
|
|
39
40
|
"test:activation": "npm run build && node ./scripts/activation-regression.mjs"
|
|
40
41
|
},
|
|
41
42
|
"keywords": [
|