@atbash/sdk 0.10.13-dev.0 → 0.11.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 +202 -28
- package/NOTICE +10 -0
- package/README.md +172 -30
- package/THIRD-PARTY-NOTICES +10256 -0
- package/dist/browser.d.mts +695 -78
- package/dist/browser.mjs +1162 -635
- package/dist/index.d.mts +695 -78
- package/dist/index.d.ts +695 -78
- package/dist/index.js +2392 -41891
- package/dist/index.mjs +3205 -42740
- package/index.d.ts +56 -24
- package/index.js +177 -88
- package/package.json +18 -8
- package/dist/browser.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/browser.mjs
CHANGED
|
@@ -33,19 +33,11 @@ var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__
|
|
|
33
33
|
mod2
|
|
34
34
|
));
|
|
35
35
|
|
|
36
|
-
// <define:__ATBASH_CHROMIA_NODE_URLS__>
|
|
37
|
-
var define_ATBASH_CHROMIA_NODE_URLS_default;
|
|
38
|
-
var init_define_ATBASH_CHROMIA_NODE_URLS = __esm({
|
|
39
|
-
"<define:__ATBASH_CHROMIA_NODE_URLS__>"() {
|
|
40
|
-
define_ATBASH_CHROMIA_NODE_URLS_default = ["https://node0.testnet.chromia.com:7740", "https://node1.testnet.chromia.com:7740", "https://node3.testnet.chromia.com:7740"];
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
|
|
44
36
|
// <define:__ATBASH_PRIVATE_NODE_URLS__>
|
|
45
37
|
var define_ATBASH_PRIVATE_NODE_URLS_default;
|
|
46
38
|
var init_define_ATBASH_PRIVATE_NODE_URLS = __esm({
|
|
47
39
|
"<define:__ATBASH_PRIVATE_NODE_URLS__>"() {
|
|
48
|
-
define_ATBASH_PRIVATE_NODE_URLS_default = ["https://node0-pvn-testnet.dynamic.chromia.dev"];
|
|
40
|
+
define_ATBASH_PRIVATE_NODE_URLS_default = ["https://node0-pvn-testnet.dynamic.chromia.dev:7740", "https://node1-pvn-testnet.dynamic.chromia.dev:7740", "https://node2-pvn-testnet.dynamic.chromia.dev:7740"];
|
|
49
41
|
}
|
|
50
42
|
});
|
|
51
43
|
|
|
@@ -53,7 +45,6 @@ var init_define_ATBASH_PRIVATE_NODE_URLS = __esm({
|
|
|
53
45
|
var require_buffer = __commonJS({
|
|
54
46
|
"(disabled):node_modules/buffer/index.js"() {
|
|
55
47
|
"use strict";
|
|
56
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
57
48
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
58
49
|
}
|
|
59
50
|
});
|
|
@@ -62,7 +53,6 @@ var require_buffer = __commonJS({
|
|
|
62
53
|
var require_bn = __commonJS({
|
|
63
54
|
"node_modules/bn.js/lib/bn.js"(exports, module) {
|
|
64
55
|
"use strict";
|
|
65
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
66
56
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
67
57
|
(function(module2, exports2) {
|
|
68
58
|
"use strict";
|
|
@@ -2882,27 +2872,21 @@ var require_bn = __commonJS({
|
|
|
2882
2872
|
});
|
|
2883
2873
|
|
|
2884
2874
|
// src-ts/index.ts
|
|
2885
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
2886
2875
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
2887
2876
|
|
|
2888
2877
|
// src-ts/browser/native.ts
|
|
2889
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
2890
2878
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
2891
2879
|
|
|
2892
2880
|
// node_modules/@noble/curves/secp256k1.js
|
|
2893
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
2894
2881
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
2895
2882
|
|
|
2896
2883
|
// node_modules/@noble/hashes/sha2.js
|
|
2897
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
2898
2884
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
2899
2885
|
|
|
2900
2886
|
// node_modules/@noble/hashes/_md.js
|
|
2901
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
2902
2887
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
2903
2888
|
|
|
2904
2889
|
// node_modules/@noble/hashes/utils.js
|
|
2905
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
2906
2890
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
2907
2891
|
function isBytes(a) {
|
|
2908
2892
|
return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array" && "BYTES_PER_ELEMENT" in a && a.BYTES_PER_ELEMENT === 1;
|
|
@@ -3325,11 +3309,9 @@ var sha256 = /* @__PURE__ */ createHasher(
|
|
|
3325
3309
|
);
|
|
3326
3310
|
|
|
3327
3311
|
// node_modules/@noble/curves/abstract/curve.js
|
|
3328
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
3329
3312
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
3330
3313
|
|
|
3331
3314
|
// node_modules/@noble/curves/utils.js
|
|
3332
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
3333
3315
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
3334
3316
|
var abytes2 = (value, length, title) => abytes(value, length, title);
|
|
3335
3317
|
var anumber2 = anumber;
|
|
@@ -3483,7 +3465,6 @@ function validateObject(object, fields = {}, optFields = {}) {
|
|
|
3483
3465
|
}
|
|
3484
3466
|
|
|
3485
3467
|
// node_modules/@noble/curves/abstract/modular.js
|
|
3486
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
3487
3468
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
3488
3469
|
var _0n2 = /* @__PURE__ */ BigInt(0);
|
|
3489
3470
|
var _1n2 = /* @__PURE__ */ BigInt(1);
|
|
@@ -4133,11 +4114,9 @@ function createKeygen(randomSecretKey, getPublicKey) {
|
|
|
4133
4114
|
}
|
|
4134
4115
|
|
|
4135
4116
|
// node_modules/@noble/curves/abstract/weierstrass.js
|
|
4136
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
4137
4117
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
4138
4118
|
|
|
4139
4119
|
// node_modules/@noble/hashes/hmac.js
|
|
4140
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
4141
4120
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
4142
4121
|
var _HMAC = class {
|
|
4143
4122
|
oHash;
|
|
@@ -5170,7 +5149,6 @@ var Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {
|
|
|
5170
5149
|
var secp256k1 = /* @__PURE__ */ ecdsa(Pointk1, sha256);
|
|
5171
5150
|
|
|
5172
5151
|
// node_modules/postchain-client/built/esm/index.js
|
|
5173
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
5174
5152
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
5175
5153
|
var import_bn = __toESM(require_bn(), 1);
|
|
5176
5154
|
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
@@ -10054,8 +10032,8 @@ Reporter$3.prototype.wrapResult = function wrapResult(result) {
|
|
|
10054
10032
|
errors: state2.errors
|
|
10055
10033
|
};
|
|
10056
10034
|
};
|
|
10057
|
-
function ReporterError$1(
|
|
10058
|
-
this.path =
|
|
10035
|
+
function ReporterError$1(path3, msg) {
|
|
10036
|
+
this.path = path3;
|
|
10059
10037
|
this.rethrow(msg);
|
|
10060
10038
|
}
|
|
10061
10039
|
inherits$v(ReporterError$1, Error);
|
|
@@ -12126,7 +12104,7 @@ function requireBuffer_list() {
|
|
|
12126
12104
|
}
|
|
12127
12105
|
}, {
|
|
12128
12106
|
key: "join",
|
|
12129
|
-
value: function
|
|
12107
|
+
value: function join2(s2) {
|
|
12130
12108
|
if (this.length === 0) return "";
|
|
12131
12109
|
var p = this.head;
|
|
12132
12110
|
var ret = "" + p.data;
|
|
@@ -16208,7 +16186,7 @@ function requireBufferList() {
|
|
|
16208
16186
|
this.head = this.tail = null;
|
|
16209
16187
|
this.length = 0;
|
|
16210
16188
|
};
|
|
16211
|
-
BufferList2.prototype.join = function
|
|
16189
|
+
BufferList2.prototype.join = function join2(s2) {
|
|
16212
16190
|
if (this.length === 0) return "";
|
|
16213
16191
|
var p = this.head;
|
|
16214
16192
|
var ret = "" + p.data;
|
|
@@ -21769,23 +21747,23 @@ Splitter$1.prototype.flush = function() {
|
|
|
21769
21747
|
return Buffer$9.concat([this.cache, padBuff]);
|
|
21770
21748
|
};
|
|
21771
21749
|
function createCipheriv$1(suite, password, iv) {
|
|
21772
|
-
var
|
|
21773
|
-
if (!
|
|
21750
|
+
var config3 = MODES$1[suite.toLowerCase()];
|
|
21751
|
+
if (!config3) throw new TypeError("invalid suite type");
|
|
21774
21752
|
if (typeof password === "string") password = Buffer$9.from(password);
|
|
21775
|
-
if (password.length !==
|
|
21753
|
+
if (password.length !== config3.key / 8) throw new TypeError("invalid key length " + password.length);
|
|
21776
21754
|
if (typeof iv === "string") iv = Buffer$9.from(iv);
|
|
21777
|
-
if (
|
|
21778
|
-
if (
|
|
21779
|
-
return new StreamCipher$1(
|
|
21780
|
-
} else if (
|
|
21781
|
-
return new AuthCipher$1(
|
|
21755
|
+
if (config3.mode !== "GCM" && iv.length !== config3.iv) throw new TypeError("invalid iv length " + iv.length);
|
|
21756
|
+
if (config3.type === "stream") {
|
|
21757
|
+
return new StreamCipher$1(config3.module, password, iv);
|
|
21758
|
+
} else if (config3.type === "auth") {
|
|
21759
|
+
return new AuthCipher$1(config3.module, password, iv);
|
|
21782
21760
|
}
|
|
21783
|
-
return new Cipher(
|
|
21761
|
+
return new Cipher(config3.module, password, iv);
|
|
21784
21762
|
}
|
|
21785
21763
|
function createCipher$1(suite, password) {
|
|
21786
|
-
var
|
|
21787
|
-
if (!
|
|
21788
|
-
var keys2 = ebtk$2(password, false,
|
|
21764
|
+
var config3 = MODES$1[suite.toLowerCase()];
|
|
21765
|
+
if (!config3) throw new TypeError("invalid suite type");
|
|
21766
|
+
var keys2 = ebtk$2(password, false, config3.key, config3.iv);
|
|
21789
21767
|
return createCipheriv$1(suite, keys2.key, keys2.iv);
|
|
21790
21768
|
}
|
|
21791
21769
|
encrypter.createCipheriv = createCipheriv$1;
|
|
@@ -21873,23 +21851,23 @@ function unpad(last) {
|
|
|
21873
21851
|
return last.slice(0, 16 - padded);
|
|
21874
21852
|
}
|
|
21875
21853
|
function createDecipheriv$1(suite, password, iv) {
|
|
21876
|
-
var
|
|
21877
|
-
if (!
|
|
21854
|
+
var config3 = MODES[suite.toLowerCase()];
|
|
21855
|
+
if (!config3) throw new TypeError("invalid suite type");
|
|
21878
21856
|
if (typeof iv === "string") iv = Buffer$8.from(iv);
|
|
21879
|
-
if (
|
|
21857
|
+
if (config3.mode !== "GCM" && iv.length !== config3.iv) throw new TypeError("invalid iv length " + iv.length);
|
|
21880
21858
|
if (typeof password === "string") password = Buffer$8.from(password);
|
|
21881
|
-
if (password.length !==
|
|
21882
|
-
if (
|
|
21883
|
-
return new StreamCipher(
|
|
21884
|
-
} else if (
|
|
21885
|
-
return new AuthCipher(
|
|
21859
|
+
if (password.length !== config3.key / 8) throw new TypeError("invalid key length " + password.length);
|
|
21860
|
+
if (config3.type === "stream") {
|
|
21861
|
+
return new StreamCipher(config3.module, password, iv, true);
|
|
21862
|
+
} else if (config3.type === "auth") {
|
|
21863
|
+
return new AuthCipher(config3.module, password, iv, true);
|
|
21886
21864
|
}
|
|
21887
|
-
return new Decipher(
|
|
21865
|
+
return new Decipher(config3.module, password, iv);
|
|
21888
21866
|
}
|
|
21889
21867
|
function createDecipher$1(suite, password) {
|
|
21890
|
-
var
|
|
21891
|
-
if (!
|
|
21892
|
-
var keys2 = ebtk$1(password, false,
|
|
21868
|
+
var config3 = MODES[suite.toLowerCase()];
|
|
21869
|
+
if (!config3) throw new TypeError("invalid suite type");
|
|
21870
|
+
var keys2 = ebtk$1(password, false, config3.key, config3.iv);
|
|
21893
21871
|
return createDecipheriv$1(suite, keys2.key, keys2.iv);
|
|
21894
21872
|
}
|
|
21895
21873
|
decrypter.createDecipher = createDecipher$1;
|
|
@@ -30276,8 +30254,8 @@ Reporter.prototype.wrapResult = function wrapResult2(result) {
|
|
|
30276
30254
|
errors: state2.errors
|
|
30277
30255
|
};
|
|
30278
30256
|
};
|
|
30279
|
-
function ReporterError(
|
|
30280
|
-
this.path =
|
|
30257
|
+
function ReporterError(path3, msg) {
|
|
30258
|
+
this.path = path3;
|
|
30281
30259
|
this.rethrow(msg);
|
|
30282
30260
|
}
|
|
30283
30261
|
inherits(ReporterError, Error);
|
|
@@ -30372,7 +30350,7 @@ function requireBuffer() {
|
|
|
30372
30350
|
}
|
|
30373
30351
|
}
|
|
30374
30352
|
buffer.EncoderBuffer = EncoderBuffer2;
|
|
30375
|
-
EncoderBuffer2.prototype.join = function
|
|
30353
|
+
EncoderBuffer2.prototype.join = function join2(out, offset) {
|
|
30376
30354
|
if (!out)
|
|
30377
30355
|
out = new Buffer5(this.length);
|
|
30378
30356
|
if (!offset)
|
|
@@ -33307,8 +33285,8 @@ var parseUtil = {};
|
|
|
33307
33285
|
const errors_js_12 = errors$3;
|
|
33308
33286
|
const en_js_12 = __importDefault2(en);
|
|
33309
33287
|
const makeIssue = (params) => {
|
|
33310
|
-
const { data, path:
|
|
33311
|
-
const fullPath = [...
|
|
33288
|
+
const { data, path: path3, errorMaps, issueData } = params;
|
|
33289
|
+
const fullPath = [...path3, ...issueData.path || []];
|
|
33312
33290
|
const fullIssue = {
|
|
33313
33291
|
...issueData,
|
|
33314
33292
|
path: fullPath
|
|
@@ -33445,11 +33423,11 @@ var errorUtil_js_1 = errorUtil$1;
|
|
|
33445
33423
|
var parseUtil_js_1 = parseUtil;
|
|
33446
33424
|
var util_js_1 = util;
|
|
33447
33425
|
var ParseInputLazyPath = class {
|
|
33448
|
-
constructor(parent, value,
|
|
33426
|
+
constructor(parent, value, path3, key3) {
|
|
33449
33427
|
this._cachedPath = [];
|
|
33450
33428
|
this.parent = parent;
|
|
33451
33429
|
this.data = value;
|
|
33452
|
-
this._path =
|
|
33430
|
+
this._path = path3;
|
|
33453
33431
|
this._key = key3;
|
|
33454
33432
|
}
|
|
33455
33433
|
get path() {
|
|
@@ -40355,21 +40333,21 @@ function createTimeoutController(timeout) {
|
|
|
40355
40333
|
const timeoutId = setTimeout(() => controller.abort(timeoutError), timeout);
|
|
40356
40334
|
return { controller, timeoutId };
|
|
40357
40335
|
}
|
|
40358
|
-
function handleRequest(method,
|
|
40336
|
+
function handleRequest(method, path3, endpoint, timeout, postObject) {
|
|
40359
40337
|
return __awaiter$2(this, void 0, void 0, function* () {
|
|
40360
40338
|
if (method == enums_1$2.Method.GET) {
|
|
40361
|
-
return yield get(
|
|
40339
|
+
return yield get(path3, endpoint, timeout);
|
|
40362
40340
|
} else {
|
|
40363
|
-
return yield post(
|
|
40341
|
+
return yield post(path3, endpoint, timeout, postObject);
|
|
40364
40342
|
}
|
|
40365
40343
|
});
|
|
40366
40344
|
}
|
|
40367
|
-
function get(
|
|
40345
|
+
function get(path3, endpoint, timeout) {
|
|
40368
40346
|
return __awaiter$2(this, void 0, void 0, function* () {
|
|
40369
|
-
logger.debug(`GET URL ${new URL(
|
|
40347
|
+
logger.debug(`GET URL ${new URL(path3, endpoint).href}`);
|
|
40370
40348
|
try {
|
|
40371
40349
|
const { controller, timeoutId } = createTimeoutController(timeout);
|
|
40372
|
-
const response = yield fetch(new URL(
|
|
40350
|
+
const response = yield fetch(new URL(path3, endpoint).href, {
|
|
40373
40351
|
signal: controller === null || controller === void 0 ? void 0 : controller.signal
|
|
40374
40352
|
});
|
|
40375
40353
|
if (timeoutId)
|
|
@@ -40407,9 +40385,9 @@ function constructBufferResponseBody(response) {
|
|
|
40407
40385
|
return responseText ? responseText : response.statusText;
|
|
40408
40386
|
});
|
|
40409
40387
|
}
|
|
40410
|
-
function post(
|
|
40388
|
+
function post(path3, endpoint, timeout, requestBody) {
|
|
40411
40389
|
return __awaiter$2(this, void 0, void 0, function* () {
|
|
40412
|
-
logger.debug(`POST URL ${new URL(
|
|
40390
|
+
logger.debug(`POST URL ${new URL(path3, endpoint).href}`);
|
|
40413
40391
|
logger.debug(`POST body ${JSON.stringify(requestBody)}`);
|
|
40414
40392
|
if (buffer_1.Buffer.isBuffer(requestBody)) {
|
|
40415
40393
|
try {
|
|
@@ -40423,7 +40401,7 @@ function post(path4, endpoint, timeout, requestBody) {
|
|
|
40423
40401
|
},
|
|
40424
40402
|
signal: controller === null || controller === void 0 ? void 0 : controller.signal
|
|
40425
40403
|
};
|
|
40426
|
-
const response = yield fetch(new URL(
|
|
40404
|
+
const response = yield fetch(new URL(path3, endpoint).href, requestOptions);
|
|
40427
40405
|
if (timeoutId)
|
|
40428
40406
|
clearTimeout(timeoutId);
|
|
40429
40407
|
const transactionTimestamp = response.headers.get("X-Transaction-Timestamp");
|
|
@@ -40434,7 +40412,7 @@ function post(path4, endpoint, timeout, requestBody) {
|
|
|
40434
40412
|
} else {
|
|
40435
40413
|
try {
|
|
40436
40414
|
const { controller, timeoutId } = createTimeoutController(timeout);
|
|
40437
|
-
const response = yield fetch(new URL(
|
|
40415
|
+
const response = yield fetch(new URL(path3, endpoint).href, {
|
|
40438
40416
|
method: "post",
|
|
40439
40417
|
body: JSON.stringify(requestBody),
|
|
40440
40418
|
headers: {
|
|
@@ -40585,7 +40563,7 @@ function requireFailoverStrategies() {
|
|
|
40585
40563
|
exports.createTimeoutPromise = createTimeoutPromise;
|
|
40586
40564
|
const utils_12 = requireUtils$1();
|
|
40587
40565
|
const httpUtil_1 = httpUtil;
|
|
40588
|
-
const
|
|
40566
|
+
const logger3 = __importStar2(logger$3);
|
|
40589
40567
|
const http_utils_1 = httpUtils;
|
|
40590
40568
|
function getUnreachableDuration(statusCode, error4) {
|
|
40591
40569
|
if ((0, http_utils_1.isNetworkError)(error4)) {
|
|
@@ -40614,29 +40592,29 @@ function requireFailoverStrategies() {
|
|
|
40614
40592
|
}
|
|
40615
40593
|
}
|
|
40616
40594
|
function abortOnError(_a2) {
|
|
40617
|
-
return __awaiter2(this, arguments, void 0, function* ({ method, path:
|
|
40595
|
+
return __awaiter2(this, arguments, void 0, function* ({ method, path: path3, config: config3, postObject, timeoutOverride }) {
|
|
40618
40596
|
return yield retryRequest({
|
|
40619
40597
|
method,
|
|
40620
|
-
path:
|
|
40621
|
-
config:
|
|
40598
|
+
path: path3,
|
|
40599
|
+
config: config3,
|
|
40622
40600
|
postObject,
|
|
40623
40601
|
timeoutOverride,
|
|
40624
40602
|
useNextNodeOnError: false,
|
|
40625
|
-
recoveryThreshold:
|
|
40603
|
+
recoveryThreshold: config3.recoveryThreshold
|
|
40626
40604
|
// Use user config or let nodeManager use default
|
|
40627
40605
|
});
|
|
40628
40606
|
});
|
|
40629
40607
|
}
|
|
40630
40608
|
function tryNextOnError(_a2) {
|
|
40631
|
-
return __awaiter2(this, arguments, void 0, function* ({ method, path:
|
|
40609
|
+
return __awaiter2(this, arguments, void 0, function* ({ method, path: path3, config: config3, postObject, timeoutOverride }) {
|
|
40632
40610
|
return yield retryRequest({
|
|
40633
40611
|
method,
|
|
40634
|
-
path:
|
|
40635
|
-
config:
|
|
40612
|
+
path: path3,
|
|
40613
|
+
config: config3,
|
|
40636
40614
|
postObject,
|
|
40637
40615
|
timeoutOverride,
|
|
40638
40616
|
useNextNodeOnError: true,
|
|
40639
|
-
recoveryThreshold:
|
|
40617
|
+
recoveryThreshold: config3.recoveryThreshold
|
|
40640
40618
|
});
|
|
40641
40619
|
});
|
|
40642
40620
|
}
|
|
@@ -40647,18 +40625,18 @@ function requireFailoverStrategies() {
|
|
|
40647
40625
|
return endpointPoolLength - (endpointPoolLength - 1) / 3;
|
|
40648
40626
|
}
|
|
40649
40627
|
function queryMajority(_a2) {
|
|
40650
|
-
return __awaiter2(this, arguments, void 0, function* ({ method, path:
|
|
40628
|
+
return __awaiter2(this, arguments, void 0, function* ({ method, path: path3, config: config3, postObject, timeoutOverride }) {
|
|
40651
40629
|
var _b;
|
|
40652
|
-
const bftMajorityThreshold = calculateBftMajorityThreshold(
|
|
40653
|
-
const failureThreshold =
|
|
40654
|
-
const { nodeManager: nodeManager2 } =
|
|
40630
|
+
const bftMajorityThreshold = calculateBftMajorityThreshold(config3.endpointPool.length);
|
|
40631
|
+
const failureThreshold = config3.endpointPool.length - bftMajorityThreshold + 1;
|
|
40632
|
+
const { nodeManager: nodeManager2 } = config3;
|
|
40655
40633
|
const timeout = 15e3;
|
|
40656
|
-
const availableNodes = nodeManager2.getAvailableNodes((_b =
|
|
40634
|
+
const availableNodes = nodeManager2.getAvailableNodes((_b = config3.recoveryThreshold) !== null && _b !== void 0 ? _b : bftMajorityThreshold);
|
|
40657
40635
|
const outcomes = [];
|
|
40658
40636
|
const promises = availableNodes.map((node2) => __awaiter2(this, void 0, void 0, function* () {
|
|
40659
40637
|
try {
|
|
40660
|
-
const requestTimeout = timeoutOverride !== null && timeoutOverride !== void 0 ? timeoutOverride :
|
|
40661
|
-
const response = yield (0, httpUtil_1.handleRequest)(method,
|
|
40638
|
+
const requestTimeout = timeoutOverride !== null && timeoutOverride !== void 0 ? timeoutOverride : config3.responseTimeout;
|
|
40639
|
+
const response = yield (0, httpUtil_1.handleRequest)(method, path3, node2.url, requestTimeout, postObject);
|
|
40662
40640
|
const { statusCode } = response;
|
|
40663
40641
|
if (statusCode && (0, http_utils_1.isSuccessfulStatusCode)(statusCode)) {
|
|
40664
40642
|
outcomes.push({ type: "SUCCESS", result: response });
|
|
@@ -40686,7 +40664,7 @@ function requireFailoverStrategies() {
|
|
|
40686
40664
|
while (true) {
|
|
40687
40665
|
if (groupedSuccessfulResponses.maxNumberOfEqualResponses() >= bftMajorityThreshold) {
|
|
40688
40666
|
if (groupedSuccessfulResponses.numberOfDistinctResponses() > 1) {
|
|
40689
|
-
|
|
40667
|
+
logger3.warning(`Got disagreeing responses, but could still reach BFT majority`);
|
|
40690
40668
|
}
|
|
40691
40669
|
return groupedSuccessfulResponses.majorityResponse();
|
|
40692
40670
|
}
|
|
@@ -40697,7 +40675,7 @@ function requireFailoverStrategies() {
|
|
|
40697
40675
|
throw errorOutcomes[0].result;
|
|
40698
40676
|
}
|
|
40699
40677
|
}
|
|
40700
|
-
if (outcomes.length >=
|
|
40678
|
+
if (outcomes.length >= config3.endpointPool.length) {
|
|
40701
40679
|
throw new Error(exports.errorMessages.NO_CONSENSUS);
|
|
40702
40680
|
}
|
|
40703
40681
|
remainingPromises = yield racePromisesWithTimeout(remainingPromises, timeout);
|
|
@@ -40705,18 +40683,18 @@ function requireFailoverStrategies() {
|
|
|
40705
40683
|
});
|
|
40706
40684
|
}
|
|
40707
40685
|
function singleEndpoint(_a2) {
|
|
40708
|
-
return __awaiter2(this, arguments, void 0, function* ({ method, path:
|
|
40686
|
+
return __awaiter2(this, arguments, void 0, function* ({ method, path: path3, config: config3, postObject, timeoutOverride }) {
|
|
40709
40687
|
let statusCode = null;
|
|
40710
40688
|
let rspBody = null;
|
|
40711
40689
|
let error4 = null;
|
|
40712
40690
|
let transactionTimestamp = void 0;
|
|
40713
|
-
const endpoint =
|
|
40691
|
+
const endpoint = config3.nodeManager.getNode();
|
|
40714
40692
|
if (!endpoint) {
|
|
40715
40693
|
throw new Error("No nodes available after recovery attempt. Check node configuration.");
|
|
40716
40694
|
}
|
|
40717
|
-
for (let attempt = 0; attempt <
|
|
40718
|
-
const requestTimeout = timeoutOverride !== null && timeoutOverride !== void 0 ? timeoutOverride :
|
|
40719
|
-
const response = yield (0, httpUtil_1.handleRequest)(method,
|
|
40695
|
+
for (let attempt = 0; attempt < config3.attemptsPerEndpoint; attempt++) {
|
|
40696
|
+
const requestTimeout = timeoutOverride !== null && timeoutOverride !== void 0 ? timeoutOverride : config3.responseTimeout;
|
|
40697
|
+
const response = yield (0, httpUtil_1.handleRequest)(method, path3, endpoint.url, requestTimeout, postObject);
|
|
40720
40698
|
if (response) {
|
|
40721
40699
|
({ error: error4, statusCode, rspBody, transactionTimestamp } = response);
|
|
40722
40700
|
}
|
|
@@ -40724,25 +40702,25 @@ function requireFailoverStrategies() {
|
|
|
40724
40702
|
if (!isError4 && !error4) {
|
|
40725
40703
|
return { error: error4, statusCode, rspBody, transactionTimestamp };
|
|
40726
40704
|
}
|
|
40727
|
-
|
|
40728
|
-
yield (0, utils_12.sleep)(
|
|
40705
|
+
logger3.info(`${method} request failed on ${endpoint.url}. Attempt: ${attempt + 1} / ${config3.attemptsPerEndpoint}`);
|
|
40706
|
+
yield (0, utils_12.sleep)(config3.attemptInterval);
|
|
40729
40707
|
}
|
|
40730
40708
|
return { error: error4, statusCode, rspBody, transactionTimestamp };
|
|
40731
40709
|
});
|
|
40732
40710
|
}
|
|
40733
40711
|
function retryRequest(_a2) {
|
|
40734
|
-
return __awaiter2(this, arguments, void 0, function* ({ method, path:
|
|
40712
|
+
return __awaiter2(this, arguments, void 0, function* ({ method, path: path3, config: config3, postObject, useNextNodeOnError, recoveryThreshold, timeoutOverride }) {
|
|
40735
40713
|
var _b, _c, _d;
|
|
40736
40714
|
let statusCode = null;
|
|
40737
40715
|
let rspBody = null;
|
|
40738
40716
|
let error4 = null;
|
|
40739
40717
|
let transactionTimestamp = void 0;
|
|
40740
|
-
const { nodeManager: nodeManager2 } =
|
|
40718
|
+
const { nodeManager: nodeManager2 } = config3;
|
|
40741
40719
|
const availableNodes = nodeManager2.getAvailableNodes(recoveryThreshold);
|
|
40742
40720
|
for (const node2 of availableNodes) {
|
|
40743
|
-
for (let attempt = 0; attempt <
|
|
40744
|
-
const requestTimeout = timeoutOverride !== null && timeoutOverride !== void 0 ? timeoutOverride :
|
|
40745
|
-
const response = yield (0, httpUtil_1.handleRequest)(method,
|
|
40721
|
+
for (let attempt = 0; attempt < config3.attemptsPerEndpoint; attempt++) {
|
|
40722
|
+
const requestTimeout = timeoutOverride !== null && timeoutOverride !== void 0 ? timeoutOverride : config3.responseTimeout;
|
|
40723
|
+
const response = yield (0, httpUtil_1.handleRequest)(method, path3, node2.url, requestTimeout, postObject);
|
|
40746
40724
|
error4 = (_b = response === null || response === void 0 ? void 0 : response.error) !== null && _b !== void 0 ? _b : null;
|
|
40747
40725
|
statusCode = (_c = response === null || response === void 0 ? void 0 : response.statusCode) !== null && _c !== void 0 ? _c : null;
|
|
40748
40726
|
rspBody = (_d = response === null || response === void 0 ? void 0 : response.rspBody) !== null && _d !== void 0 ? _d : null;
|
|
@@ -40760,7 +40738,7 @@ function requireFailoverStrategies() {
|
|
|
40760
40738
|
if (isServerError) {
|
|
40761
40739
|
const duration = getUnreachableDuration(statusCode !== null && statusCode !== void 0 ? statusCode : void 0, response.error);
|
|
40762
40740
|
nodeManager2.makeNodeUnavailable(node2.url, duration);
|
|
40763
|
-
|
|
40741
|
+
logger3.info(`request failed with server error on ${node2.url} trying next node`);
|
|
40764
40742
|
break;
|
|
40765
40743
|
}
|
|
40766
40744
|
if (isClientError) {
|
|
@@ -40768,13 +40746,13 @@ function requireFailoverStrategies() {
|
|
|
40768
40746
|
return { error: error4, statusCode, rspBody, transactionTimestamp };
|
|
40769
40747
|
}
|
|
40770
40748
|
if (!nodeManager2.useStickyNode) {
|
|
40771
|
-
|
|
40749
|
+
logger3.info(`request failed client error on ${node2.url} trying next node`);
|
|
40772
40750
|
break;
|
|
40773
40751
|
}
|
|
40774
40752
|
}
|
|
40775
|
-
|
|
40776
|
-
if (
|
|
40777
|
-
yield (0, utils_12.sleep)(
|
|
40753
|
+
logger3.info(`${method} request failed on ${node2.url}. Attempt: ${attempt + 1} / ${config3.attemptsPerEndpoint}`);
|
|
40754
|
+
if (config3.attemptInterval > 0) {
|
|
40755
|
+
yield (0, utils_12.sleep)(config3.attemptInterval);
|
|
40778
40756
|
}
|
|
40779
40757
|
}
|
|
40780
40758
|
}
|
|
@@ -40885,21 +40863,21 @@ function requireRequestWithFailoverStrategy() {
|
|
|
40885
40863
|
const enums_12 = enums;
|
|
40886
40864
|
const failoverStrategies_1 = requireFailoverStrategies();
|
|
40887
40865
|
function requestWithFailoverStrategy$1(method_1, path_1, config_1, postObject_1) {
|
|
40888
|
-
return __awaiter2(this, arguments, void 0, function* (method,
|
|
40889
|
-
switch (
|
|
40866
|
+
return __awaiter2(this, arguments, void 0, function* (method, path3, config3, postObject, forceSingleEndpoint = false, timeoutOverride) {
|
|
40867
|
+
switch (config3.failoverStrategy) {
|
|
40890
40868
|
case enums_12.FailoverStrategy.AbortOnError:
|
|
40891
|
-
return yield (0, failoverStrategies_1.abortOnError)({ method, path:
|
|
40869
|
+
return yield (0, failoverStrategies_1.abortOnError)({ method, path: path3, config: config3, postObject, timeoutOverride });
|
|
40892
40870
|
case enums_12.FailoverStrategy.TryNextOnError:
|
|
40893
|
-
return yield (0, failoverStrategies_1.tryNextOnError)({ method, path:
|
|
40871
|
+
return yield (0, failoverStrategies_1.tryNextOnError)({ method, path: path3, config: config3, postObject, timeoutOverride });
|
|
40894
40872
|
case enums_12.FailoverStrategy.SingleEndpoint:
|
|
40895
|
-
return yield (0, failoverStrategies_1.singleEndpoint)({ method, path:
|
|
40873
|
+
return yield (0, failoverStrategies_1.singleEndpoint)({ method, path: path3, config: config3, postObject, timeoutOverride });
|
|
40896
40874
|
case enums_12.FailoverStrategy.QueryMajority:
|
|
40897
40875
|
if (forceSingleEndpoint) {
|
|
40898
|
-
return yield (0, failoverStrategies_1.singleEndpoint)({ method, path:
|
|
40876
|
+
return yield (0, failoverStrategies_1.singleEndpoint)({ method, path: path3, config: config3, postObject, timeoutOverride });
|
|
40899
40877
|
}
|
|
40900
|
-
return yield (0, failoverStrategies_1.queryMajority)({ method, path:
|
|
40878
|
+
return yield (0, failoverStrategies_1.queryMajority)({ method, path: path3, config: config3, postObject, timeoutOverride });
|
|
40901
40879
|
default:
|
|
40902
|
-
throw new Error(`Unsupported failover strategy: ${
|
|
40880
|
+
throw new Error(`Unsupported failover strategy: ${config3.failoverStrategy}`);
|
|
40903
40881
|
}
|
|
40904
40882
|
});
|
|
40905
40883
|
}
|
|
@@ -41001,7 +40979,7 @@ function requireUtils$1() {
|
|
|
41001
40979
|
exports.getBlockchainRidFromIid = getBlockchainRidFromIid;
|
|
41002
40980
|
exports.convertToPrintable = convertToPrintable;
|
|
41003
40981
|
const buffer_12 = buffer$3;
|
|
41004
|
-
const
|
|
40982
|
+
const logger3 = __importStar2(logger$3);
|
|
41005
40983
|
const errors_12 = errors;
|
|
41006
40984
|
const gtxTool = __importStar2(gtx$1);
|
|
41007
40985
|
const errors_2 = errors;
|
|
@@ -41068,11 +41046,11 @@ function requireUtils$1() {
|
|
|
41068
41046
|
return Object.assign(Object.assign(Object.assign({ endpointPool, nodeManager: nodeManager2 }, settings.blockedNodeUrlSubstrings !== void 0 ? { blockedNodeUrlSubstrings: settings.blockedNodeUrlSubstrings } : {}), settings.nodeUrlFilter !== void 0 ? { nodeUrlFilter: settings.nodeUrlFilter } : {}), { blockchainRid: blockchainRidToUse, merkleHashVersion: (_e = settings.merkleHashVersion) !== null && _e !== void 0 ? _e : constants_12.MERKLE_HASH_VERSIONS.UNSET, dappStatusPolling: setStatusPolling(settings.dappStatusPolling), clusterAnchoringStatusPolling: setStatusPolling(settings.clusterAnchoringStatusPolling), systemAnchoringStatusPolling: setStatusPolling(settings.systemAnchoringStatusPolling), retryTransactionPolling: setRetryTransactionPolling(settings.retryTransactionPolling), failoverStrategy: ((_f = settings.failOverConfig) === null || _f === void 0 ? void 0 : _f.strategy) || exports.defaultFailoverConfig.strategy, attemptsPerEndpoint: ((_g = settings.failOverConfig) === null || _g === void 0 ? void 0 : _g.attemptsPerEndpoint) || exports.defaultFailoverConfig.attemptsPerEndpoint, attemptInterval: ((_h = settings.failOverConfig) === null || _h === void 0 ? void 0 : _h.attemptInterval) || exports.defaultFailoverConfig.attemptInterval, unreachableDuration: ((_j = settings.failOverConfig) === null || _j === void 0 ? void 0 : _j.unreachableDuration) || exports.defaultFailoverConfig.unreachableDuration, directoryChainRid: settings.directoryChainRid || directoryChainRid, connectTimeout: settings.connectTimeout, responseTimeout: settings.responseTimeout });
|
|
41069
41047
|
});
|
|
41070
41048
|
}
|
|
41071
|
-
function getMerkleHashVersionFromDapp(
|
|
41049
|
+
function getMerkleHashVersionFromDapp(config3) {
|
|
41072
41050
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
41073
41051
|
var _a2;
|
|
41074
41052
|
try {
|
|
41075
|
-
const response = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/config/${
|
|
41053
|
+
const response = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/config/${config3.blockchainRid}/features`, config3, void 0, false, (_a2 = config3.connectTimeout) !== null && _a2 !== void 0 ? _a2 : config3.responseTimeout);
|
|
41076
41054
|
const validatedResponse = (0, merkleHash_1.validateMerkleHash)(response.rspBody);
|
|
41077
41055
|
return validatedResponse.merkle_hash_version;
|
|
41078
41056
|
} catch (error4) {
|
|
@@ -41084,7 +41062,7 @@ function requireUtils$1() {
|
|
|
41084
41062
|
function validTxRid(txRID) {
|
|
41085
41063
|
if (txRID.length != 32) {
|
|
41086
41064
|
const error4 = new errors_12.InvalidTxRidException(txRID);
|
|
41087
|
-
|
|
41065
|
+
logger3.error(error4.toString());
|
|
41088
41066
|
return false;
|
|
41089
41067
|
}
|
|
41090
41068
|
return true;
|
|
@@ -41487,7 +41465,7 @@ function requireUtils$1() {
|
|
|
41487
41465
|
function handleGetResponse(error4, statusCode, responseObject, callback) {
|
|
41488
41466
|
try {
|
|
41489
41467
|
const responseObjectPrintable = convertToPrintable(responseObject);
|
|
41490
|
-
|
|
41468
|
+
logger3.debug(`error: ${error4}, status code: ${statusCode}, response body: ${responseObjectPrintable}`);
|
|
41491
41469
|
if (error4) {
|
|
41492
41470
|
return callback(error4, null);
|
|
41493
41471
|
}
|
|
@@ -41497,16 +41475,16 @@ function requireUtils$1() {
|
|
|
41497
41475
|
return callback(null, responseObject);
|
|
41498
41476
|
} catch (error5) {
|
|
41499
41477
|
callback(error5, null);
|
|
41500
|
-
|
|
41478
|
+
logger3.error(`client.handleGetResponse(): Failed to call the callback function. ${error5}`);
|
|
41501
41479
|
}
|
|
41502
41480
|
}
|
|
41503
41481
|
function handlePostResponse(error4, statusCode, responseObject, callback) {
|
|
41504
41482
|
var _a2;
|
|
41505
41483
|
const responseObjectPrintable = convertToPrintable(responseObject);
|
|
41506
|
-
|
|
41484
|
+
logger3.debug(`error: ${error4}, status code: ${statusCode}, response body: ${responseObjectPrintable}`);
|
|
41507
41485
|
try {
|
|
41508
41486
|
if (error4) {
|
|
41509
|
-
|
|
41487
|
+
logger3.error(`In client post(). ${error4}`);
|
|
41510
41488
|
callback(error4, null);
|
|
41511
41489
|
} else if (!statusCode || !(0, http_utils_1.isSuccessfulStatusCode)(statusCode)) {
|
|
41512
41490
|
let errorMessage2 = `Unexpected status code from server. Code: ${statusCode}.`;
|
|
@@ -41514,21 +41492,21 @@ function requireUtils$1() {
|
|
|
41514
41492
|
if (responseObjectPrintable) {
|
|
41515
41493
|
errorMessage2 += ` Message: ${responseObjectPrintable}.`;
|
|
41516
41494
|
}
|
|
41517
|
-
|
|
41495
|
+
logger3.error(errorMessage2);
|
|
41518
41496
|
callback(new errors_12.UnexpectedStatusError(statusCode !== null && statusCode !== void 0 ? statusCode : 400, errorMessageInResponseBody || responseObjectPrintable), responseObject);
|
|
41519
41497
|
} else {
|
|
41520
|
-
|
|
41498
|
+
logger3.info(`Calling responseCallback with responseObject: ${responseObjectPrintable}`);
|
|
41521
41499
|
callback(null, responseObject);
|
|
41522
41500
|
}
|
|
41523
41501
|
} catch (error5) {
|
|
41524
|
-
|
|
41502
|
+
logger3.error(`client.handlePostResponse(): Failed to call callback function ${error5}`);
|
|
41525
41503
|
}
|
|
41526
41504
|
}
|
|
41527
41505
|
function getBlockchainRidFromIid(_a2) {
|
|
41528
41506
|
return __awaiter2(this, arguments, void 0, function* ({ endpointPool, chainId, failOverConfig = {}, nodeManager: nodeManager2, connectTimeout, responseTimeout }) {
|
|
41529
41507
|
var _b;
|
|
41530
41508
|
const mergedFailOverConfig = Object.assign(Object.assign({}, exports.defaultFailoverConfig), failOverConfig);
|
|
41531
|
-
const
|
|
41509
|
+
const config3 = {
|
|
41532
41510
|
endpointPool,
|
|
41533
41511
|
nodeManager: nodeManager2,
|
|
41534
41512
|
dappStatusPolling: setStatusPolling(),
|
|
@@ -41543,7 +41521,7 @@ function requireUtils$1() {
|
|
|
41543
41521
|
connectTimeout,
|
|
41544
41522
|
responseTimeout
|
|
41545
41523
|
};
|
|
41546
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/brid/iid_${chainId}`,
|
|
41524
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/brid/iid_${chainId}`, config3, void 0, false, (_b = config3.connectTimeout) !== null && _b !== void 0 ? _b : config3.responseTimeout);
|
|
41547
41525
|
const blockchainRid = (0, requests_1.isString)(rspBody);
|
|
41548
41526
|
if (!blockchainRid) {
|
|
41549
41527
|
throw error4;
|
|
@@ -42096,7 +42074,7 @@ var networkSettings = {};
|
|
|
42096
42074
|
const restNetworkSettingsValidationContext = RestNetworkSettingsSchema.safeParse(networkSettings2);
|
|
42097
42075
|
if ("error" in restNetworkSettingsValidationContext) {
|
|
42098
42076
|
const { error: { issues } = {} } = restNetworkSettingsValidationContext;
|
|
42099
|
-
const errorMessage2 = issues === null || issues === void 0 ? void 0 : issues.map(({ message, path:
|
|
42077
|
+
const errorMessage2 = issues === null || issues === void 0 ? void 0 : issues.map(({ message, path: path3 }) => `${path3[0]}: ${message}`).join(", ");
|
|
42100
42078
|
if (throwOnError) {
|
|
42101
42079
|
throw new Error(errorMessage2);
|
|
42102
42080
|
}
|
|
@@ -42259,7 +42237,7 @@ function requireBlockchainClient() {
|
|
|
42259
42237
|
const crypto_12 = requireCryptoBrowserify();
|
|
42260
42238
|
const cloneDeep_1$1 = __importDefault2(cloneDeep_1);
|
|
42261
42239
|
const IccfProofTxMaterialBuilder_1 = requireIccfProofTxMaterialBuilder();
|
|
42262
|
-
const
|
|
42240
|
+
const logger3 = __importStar2(logger$3);
|
|
42263
42241
|
const formatter_12 = formatter;
|
|
42264
42242
|
const serialization_12 = serialization$2;
|
|
42265
42243
|
const gtxTool = __importStar2(gtx$1);
|
|
@@ -42279,10 +42257,10 @@ function requireBlockchainClient() {
|
|
|
42279
42257
|
function createClient(settings) {
|
|
42280
42258
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42281
42259
|
(0, networkSettings_1.isNetworkSettingValid)(settings, { throwOnError: true });
|
|
42282
|
-
const
|
|
42283
|
-
|
|
42260
|
+
const config3 = yield (0, utils_12.getClientConfigFromSettings)(settings);
|
|
42261
|
+
config3.merkleHashVersion = yield getMerkleHashVersion(settings);
|
|
42284
42262
|
return {
|
|
42285
|
-
config:
|
|
42263
|
+
config: config3,
|
|
42286
42264
|
query(nameOrQueryObject, args, callback) {
|
|
42287
42265
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42288
42266
|
let _name, _args;
|
|
@@ -42293,7 +42271,7 @@ function requireBlockchainClient() {
|
|
|
42293
42271
|
_name = nameOrQueryObject === null || nameOrQueryObject === void 0 ? void 0 : nameOrQueryObject.name;
|
|
42294
42272
|
_args = nameOrQueryObject === null || nameOrQueryObject === void 0 ? void 0 : nameOrQueryObject.args;
|
|
42295
42273
|
}
|
|
42296
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.POST, `query_gtv/${
|
|
42274
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.POST, `query_gtv/${config3.blockchainRid}`, config3, (0, serialization_12.encodeValue)((0, formatter_12.toQueryObjectGTV)(_name, _args)));
|
|
42297
42275
|
return new Promise((resolve2, reject) => {
|
|
42298
42276
|
(0, utils_12.handlePostResponse)(error4, statusCode, (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
42299
42277
|
});
|
|
@@ -42301,10 +42279,10 @@ function requireBlockchainClient() {
|
|
|
42301
42279
|
},
|
|
42302
42280
|
signTransaction(transaction, signMethod2, callback) {
|
|
42303
42281
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42304
|
-
|
|
42305
|
-
const gtx2 = (0, utils_12.getGTXFromBufferOrTransactionOrOperation)(transaction,
|
|
42282
|
+
logger3.debug(`Signing transaction with ${!(0, utils_12.isKeyPair)(signMethod2) ? "signature provider containing " : ""}pubKey: ${(0, formatter_12.toString)(signMethod2.pubKey)}`);
|
|
42283
|
+
const gtx2 = (0, utils_12.getGTXFromBufferOrTransactionOrOperation)(transaction, config3.blockchainRid);
|
|
42306
42284
|
try {
|
|
42307
|
-
const signedTx = yield (0, utils_12.isKeyPair)(signMethod2) ? gtxTool.sign(gtx2, signMethod2.privKey,
|
|
42285
|
+
const signedTx = yield (0, utils_12.isKeyPair)(signMethod2) ? gtxTool.sign(gtx2, signMethod2.privKey, config3.merkleHashVersion, signMethod2.pubKey) : gtxTool.sign(gtx2, signMethod2, config3.merkleHashVersion);
|
|
42308
42286
|
const gtxBytes = (0, utils_12.getSerializedGTX)(signedTx);
|
|
42309
42287
|
if (typeof callback === "function") {
|
|
42310
42288
|
callback(null, gtxBytes);
|
|
@@ -42325,8 +42303,8 @@ function requireBlockchainClient() {
|
|
|
42325
42303
|
}
|
|
42326
42304
|
const promiEvent = new promiEvents_12.Web3PromiEvent((resolve2, reject) => __awaiter2(this, void 0, void 0, function* () {
|
|
42327
42305
|
let error4 = null;
|
|
42328
|
-
for (let i = 0; i <
|
|
42329
|
-
|
|
42306
|
+
for (let i = 0; i < config3.retryTransactionPolling.count; i++) {
|
|
42307
|
+
logger3.info(`sendTransactionWithRetries attempt ${i + 1} of ${config3.retryTransactionPolling.count}`);
|
|
42330
42308
|
const tmpPromiEvent = sendOnce().on(enums_12.TransactionEvent.ClusterAnchoringConfirmation, (receipt) => {
|
|
42331
42309
|
promiEvent.emit(enums_12.TransactionEvent.ClusterAnchoringConfirmation, receipt);
|
|
42332
42310
|
}).on(enums_12.TransactionEvent.SystemAnchoringConfirmation, (receipt) => {
|
|
@@ -42338,7 +42316,7 @@ function requireBlockchainClient() {
|
|
|
42338
42316
|
}).on(enums_12.TransactionEvent.DappConfirmed, (receipt) => {
|
|
42339
42317
|
promiEvent.emit(enums_12.TransactionEvent.DappConfirmed, receipt);
|
|
42340
42318
|
}).catch((tmpError) => {
|
|
42341
|
-
|
|
42319
|
+
logger3.warning(`sendTransactionWithRetries error on attempt ${i + 1} of ${config3.retryTransactionPolling.count}: ${tmpError}`);
|
|
42342
42320
|
promiEvent.emit(enums_12.TransactionEvent.Rejected, tmpError);
|
|
42343
42321
|
error4 = tmpError;
|
|
42344
42322
|
});
|
|
@@ -42347,7 +42325,7 @@ function requireBlockchainClient() {
|
|
|
42347
42325
|
resolve2(tmpReceipt);
|
|
42348
42326
|
return;
|
|
42349
42327
|
}
|
|
42350
|
-
yield (0, utils_12.sleep)(
|
|
42328
|
+
yield (0, utils_12.sleep)(config3.retryTransactionPolling.interval);
|
|
42351
42329
|
}
|
|
42352
42330
|
reject(error4);
|
|
42353
42331
|
}));
|
|
@@ -42357,13 +42335,13 @@ function requireBlockchainClient() {
|
|
|
42357
42335
|
const promiEvent = new promiEvents_12.Web3PromiEvent((resolve2, reject) => __awaiter2(this, void 0, void 0, function* () {
|
|
42358
42336
|
var _a2, _b;
|
|
42359
42337
|
try {
|
|
42360
|
-
const gtx2 = (0, utils_12.getGTXFromBufferOrTransactionOrOperation)(transaction,
|
|
42338
|
+
const gtx2 = (0, utils_12.getGTXFromBufferOrTransactionOrOperation)(transaction, config3.blockchainRid);
|
|
42361
42339
|
if (gtx2.signers.length !== ((_a2 = gtx2.signatures) === null || _a2 === void 0 ? void 0 : _a2.length)) {
|
|
42362
42340
|
reject(new errors_12.NumberOfSignersAndSignaturesException());
|
|
42363
42341
|
}
|
|
42364
42342
|
const gtxBytes = (0, utils_12.getSerializedGTX)(gtx2);
|
|
42365
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.POST, `tx/${
|
|
42366
|
-
const transactionRid = gtxTool.getDigestToSign(gtx2,
|
|
42343
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.POST, `tx/${config3.blockchainRid}`, config3, gtxBytes);
|
|
42344
|
+
const transactionRid = gtxTool.getDigestToSign(gtx2, config3.merkleHashVersion);
|
|
42367
42345
|
try {
|
|
42368
42346
|
yield (0, utils_12.handlePostResponsePromisified)(error4, statusCode, (0, requests_1.isRawGtv)(rspBody));
|
|
42369
42347
|
if (typeof callback === "function") {
|
|
@@ -42371,7 +42349,7 @@ function requireBlockchainClient() {
|
|
|
42371
42349
|
status: enums_12.ResponseStatus.Waiting,
|
|
42372
42350
|
statusCode,
|
|
42373
42351
|
transactionRid,
|
|
42374
|
-
node: (_b =
|
|
42352
|
+
node: (_b = config3.nodeManager.lastUsedNode) === null || _b === void 0 ? void 0 : _b.url
|
|
42375
42353
|
});
|
|
42376
42354
|
}
|
|
42377
42355
|
} catch (_error) {
|
|
@@ -42434,7 +42412,7 @@ function requireBlockchainClient() {
|
|
|
42434
42412
|
callback === null || callback === void 0 ? void 0 : callback(error5, null);
|
|
42435
42413
|
throw error5;
|
|
42436
42414
|
}
|
|
42437
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `tx/${
|
|
42415
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `tx/${config3.blockchainRid}/${(0, formatter_12.ensureString)(transactionRid)}`, config3);
|
|
42438
42416
|
const transaction = (0, requests_1.isTransaction)(rspBody);
|
|
42439
42417
|
return new Promise((resolve2, reject) => {
|
|
42440
42418
|
(0, utils_12.handleGetResponse)(error4, statusCode, statusCode === 200 && transaction ? (0, formatter_12.toBuffer)(transaction.tx) : (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
@@ -42449,7 +42427,7 @@ function requireBlockchainClient() {
|
|
|
42449
42427
|
callback === null || callback === void 0 ? void 0 : callback(error5, null);
|
|
42450
42428
|
throw error5;
|
|
42451
42429
|
}
|
|
42452
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `tx/${
|
|
42430
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `tx/${config3.blockchainRid}/${transactionRid.toString("hex")}/status`, config3);
|
|
42453
42431
|
return new Promise((resolve2, reject) => {
|
|
42454
42432
|
(0, utils_12.handleGetResponse)(error4, statusCode, (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, (result) => resolve2((0, transactionStatusReponse_1.validateTransactionStatusReponse)({
|
|
42455
42433
|
statusCode,
|
|
@@ -42472,7 +42450,7 @@ function requireBlockchainClient() {
|
|
|
42472
42450
|
const beforeTimeQueryParam = beforeTime ? `&before-time=${beforeTime.getTime()}` : "";
|
|
42473
42451
|
const afterTimeQueryParam = afterTime ? `&after-time=${afterTime.getTime()}` : "";
|
|
42474
42452
|
const signerQueryParam = signerPubKey ? `&signer=${signerPubKey}` : "";
|
|
42475
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `transactions/${
|
|
42453
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `transactions/${config3.blockchainRid}?limit=${limit}${beforeTimeQueryParam}${afterTimeQueryParam}${signerQueryParam}`, config3);
|
|
42476
42454
|
const transactionsInfoResponseArray = (0, requests_1.isTransactionInfoResponseArray)(rspBody);
|
|
42477
42455
|
const body = statusCode === 200 && transactionsInfoResponseArray ? transactionsInfoResponseArray.map(utils_12.formatTransactionInfoResponse) : rspBody;
|
|
42478
42456
|
return new Promise((resolve2, reject) => {
|
|
@@ -42488,7 +42466,7 @@ function requireBlockchainClient() {
|
|
|
42488
42466
|
callback === null || callback === void 0 ? void 0 : callback(error5, null);
|
|
42489
42467
|
throw error5;
|
|
42490
42468
|
}
|
|
42491
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `transactions/${
|
|
42469
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `transactions/${config3.blockchainRid}/${(0, formatter_12.ensureString)(transactionRid)}`, config3);
|
|
42492
42470
|
const transactionInfoResponse = (0, requests_1.isTransactionInfoResponse)(rspBody);
|
|
42493
42471
|
const body = statusCode === 200 && transactionInfoResponse ? (0, utils_12.formatTransactionInfoResponse)(transactionInfoResponse) : rspBody;
|
|
42494
42472
|
return new Promise((resolve2, reject) => {
|
|
@@ -42500,7 +42478,7 @@ function requireBlockchainClient() {
|
|
|
42500
42478
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42501
42479
|
const client = this;
|
|
42502
42480
|
const result = { status: enums_12.AnchoringStatus.NotAnchored };
|
|
42503
|
-
const clusterAnchoredTx = yield (0, utils_2.awaitGetAnchoringTransactionForBlockRid)(anchoringClient, (0, formatter_12.ensureBuffer)(client.config.blockchainRid), (0, formatter_12.ensureBuffer)(blockRid),
|
|
42481
|
+
const clusterAnchoredTx = yield (0, utils_2.awaitGetAnchoringTransactionForBlockRid)(anchoringClient, (0, formatter_12.ensureBuffer)(client.config.blockchainRid), (0, formatter_12.ensureBuffer)(blockRid), config3.clusterAnchoringStatusPolling);
|
|
42504
42482
|
if (!clusterAnchoredTx) {
|
|
42505
42483
|
return result;
|
|
42506
42484
|
}
|
|
@@ -42510,7 +42488,7 @@ function requireBlockchainClient() {
|
|
|
42510
42488
|
}
|
|
42511
42489
|
result.status = enums_12.AnchoringStatus.ClusterAnchored;
|
|
42512
42490
|
result.clusterAnchoredTx = anchoringTransactionValidation.data;
|
|
42513
|
-
const systemAnchoredTransaction = yield (0, utils_12.getSystemAnchoringTransaction)(
|
|
42491
|
+
const systemAnchoredTransaction = yield (0, utils_12.getSystemAnchoringTransaction)(config3.endpointPool, anchoringTransactionValidation.data.txRid, anchoringClient, systemAnchoringChainRid, config3.systemAnchoringStatusPolling, config3.merkleHashVersion, config3.blockedNodeUrlSubstrings, config3.nodeUrlFilter);
|
|
42514
42492
|
if (!systemAnchoredTransaction) {
|
|
42515
42493
|
return result;
|
|
42516
42494
|
}
|
|
@@ -42574,7 +42552,7 @@ function requireBlockchainClient() {
|
|
|
42574
42552
|
},
|
|
42575
42553
|
getTransactionCount(callback) {
|
|
42576
42554
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42577
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `transactions/${
|
|
42555
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `transactions/${config3.blockchainRid}/count`, config3, void 0, true);
|
|
42578
42556
|
const transactionsCount = (0, requests_1.isTransactionsCount)(rspBody);
|
|
42579
42557
|
return new Promise((resolve2, reject) => {
|
|
42580
42558
|
(0, utils_12.handleGetResponse)(error4, statusCode, statusCode === 200 ? transactionsCount === null || transactionsCount === void 0 ? void 0 : transactionsCount.transactionsCount : (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
@@ -42585,7 +42563,7 @@ function requireBlockchainClient() {
|
|
|
42585
42563
|
return __awaiter2(this, arguments, void 0, function* (blockIdentifier2, txs = false, callback) {
|
|
42586
42564
|
(0, blockIdentifier_1.isBlockIdentifierValid)(blockIdentifier2, { throwOnError: true });
|
|
42587
42565
|
const queryString = typeof blockIdentifier2 === "string" ? blockIdentifier2 : `height/${blockIdentifier2}`;
|
|
42588
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `blocks/${
|
|
42566
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `blocks/${config3.blockchainRid}/${queryString}?txs=${txs}`, config3);
|
|
42589
42567
|
const blockInfoResponse = (0, requests_1.isBlockInfoResponse)(rspBody);
|
|
42590
42568
|
return new Promise((resolve2, reject) => {
|
|
42591
42569
|
(0, utils_12.handleGetResponse)(error4, statusCode, statusCode === 200 && blockInfoResponse !== null && blockInfoResponse ? (0, utils_12.formatBlockInfoResponse)(blockInfoResponse) : (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
@@ -42595,7 +42573,7 @@ function requireBlockchainClient() {
|
|
|
42595
42573
|
getLatestBlock() {
|
|
42596
42574
|
return __awaiter2(this, arguments, void 0, function* (txs = false, callback) {
|
|
42597
42575
|
const shouldIncludeFullTransaction = txs ? `&txs=${txs}` : "";
|
|
42598
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `blocks/${
|
|
42576
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `blocks/${config3.blockchainRid}?limit=1${shouldIncludeFullTransaction}`, config3, void 0, true);
|
|
42599
42577
|
const indexOfLatestBlock = 0;
|
|
42600
42578
|
const blockInfoResponseArray = (0, requests_1.isBlockInfoResponseArray)(rspBody);
|
|
42601
42579
|
return new Promise((resolve2, reject) => {
|
|
@@ -42620,7 +42598,7 @@ function requireBlockchainClient() {
|
|
|
42620
42598
|
searchParams.append(key3, value.toString());
|
|
42621
42599
|
}
|
|
42622
42600
|
}
|
|
42623
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `blocks/${
|
|
42601
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `blocks/${config3.blockchainRid}?${searchParams}`, config3);
|
|
42624
42602
|
const blockInfoResponseArray = (0, requests_1.isBlockInfoResponseArray)(rspBody);
|
|
42625
42603
|
return new Promise((resolve2, reject) => {
|
|
42626
42604
|
(0, utils_12.handleGetResponse)(error4, statusCode, statusCode === 200 && blockInfoResponseArray ? blockInfoResponseArray.map(utils_12.formatBlockInfoResponse) : (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
@@ -42628,7 +42606,7 @@ function requireBlockchainClient() {
|
|
|
42628
42606
|
});
|
|
42629
42607
|
},
|
|
42630
42608
|
getClientNodeUrlPool() {
|
|
42631
|
-
return
|
|
42609
|
+
return config3.endpointPool.map((endpoint) => endpoint.url);
|
|
42632
42610
|
},
|
|
42633
42611
|
/**
|
|
42634
42612
|
* Retrieves a confirmation proof for a transaction with the specified sha256
|
|
@@ -42663,7 +42641,7 @@ function requireBlockchainClient() {
|
|
|
42663
42641
|
callback === null || callback === void 0 ? void 0 : callback(error5, null);
|
|
42664
42642
|
throw error5;
|
|
42665
42643
|
}
|
|
42666
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `tx/${
|
|
42644
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `tx/${config3.blockchainRid}/${(0, formatter_12.ensureString)(txRid2)}/confirmationProof`, config3);
|
|
42667
42645
|
const confirmationProof = {
|
|
42668
42646
|
merkleProofTree: "",
|
|
42669
42647
|
txIndex: 0
|
|
@@ -42727,13 +42705,13 @@ function requireBlockchainClient() {
|
|
|
42727
42705
|
callback === null || callback === void 0 ? void 0 : callback(error4, null);
|
|
42728
42706
|
throw error4;
|
|
42729
42707
|
}
|
|
42730
|
-
const systemAnchoringTransactionTransaction = yield (0, utils_12.getSystemAnchoringTransaction)(
|
|
42708
|
+
const systemAnchoringTransactionTransaction = yield (0, utils_12.getSystemAnchoringTransaction)(config3.endpointPool, anchoredTxRid, anchoringClient, systemAnchoringChainRid, config3.systemAnchoringStatusPolling, config3.merkleHashVersion, config3.blockedNodeUrlSubstrings, config3.nodeUrlFilter);
|
|
42731
42709
|
return systemAnchoringTransactionTransaction;
|
|
42732
42710
|
});
|
|
42733
42711
|
},
|
|
42734
42712
|
getWaitingTransactions(blockchainRid, callback) {
|
|
42735
42713
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42736
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/tx/${(0, formatter_12.ensureString)(blockchainRid)}/waiting`,
|
|
42714
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/tx/${(0, formatter_12.ensureString)(blockchainRid)}/waiting`, config3);
|
|
42737
42715
|
return new Promise((resolve2, reject) => {
|
|
42738
42716
|
(0, utils_12.handleGetResponse)(error4, statusCode, (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
42739
42717
|
});
|
|
@@ -42741,7 +42719,7 @@ function requireBlockchainClient() {
|
|
|
42741
42719
|
},
|
|
42742
42720
|
getWaitingTransaction(blockchainRid, txRid2, callback) {
|
|
42743
42721
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42744
|
-
const { error: error4, statusCode, rspBody, transactionTimestamp } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/tx/${(0, formatter_12.ensureString)(blockchainRid)}/waiting/${(0, formatter_12.ensureString)(txRid2)}`,
|
|
42722
|
+
const { error: error4, statusCode, rspBody, transactionTimestamp } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/tx/${(0, formatter_12.ensureString)(blockchainRid)}/waiting/${(0, formatter_12.ensureString)(txRid2)}`, config3);
|
|
42745
42723
|
const transaction = (0, requests_1.isTransaction)(rspBody);
|
|
42746
42724
|
const result = transaction ? (0, formatter_12.toBuffer)(transaction.tx) : (0, requests_1.isRawGtv)(rspBody);
|
|
42747
42725
|
return new Promise((resolve2, reject) => {
|
|
@@ -42754,7 +42732,7 @@ function requireBlockchainClient() {
|
|
|
42754
42732
|
},
|
|
42755
42733
|
getRejectedTransactions(blockchainRid, callback) {
|
|
42756
42734
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42757
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/tx/${(0, formatter_12.ensureString)(blockchainRid)}/rejected`,
|
|
42735
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/tx/${(0, formatter_12.ensureString)(blockchainRid)}/rejected`, config3);
|
|
42758
42736
|
const rejectedTransactionsArray = (0, requests_1.isRejectedTransactionResponseArray)(rspBody);
|
|
42759
42737
|
const validResponseBody = statusCode === 200 && rejectedTransactionsArray ? rejectedTransactionsArray.map((rejectedTransaction) => (0, utils_12.formatRejectedTransactionFromResponse)(rejectedTransaction)) : rspBody;
|
|
42760
42738
|
return new Promise((resolve2, reject) => {
|
|
@@ -42768,7 +42746,7 @@ function requireBlockchainClient() {
|
|
|
42768
42746
|
*/
|
|
42769
42747
|
getAppStructure(callback) {
|
|
42770
42748
|
return __awaiter2(this, void 0, void 0, function* () {
|
|
42771
|
-
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/query/${
|
|
42749
|
+
const { error: error4, statusCode, rspBody } = yield (0, requestWithFailoverStrategy_1.requestWithFailoverStrategy)(enums_12.Method.GET, `/query/${config3.blockchainRid}?type=rell.get_app_structure`, config3);
|
|
42772
42750
|
return new Promise((resolve2, reject) => {
|
|
42773
42751
|
(0, utils_12.handleGetResponse)(error4, statusCode, (0, requests_1.isRawGtv)(rspBody), (0, utils_12.callbackPromiseBuilder)(reject, resolve2, callback));
|
|
42774
42752
|
});
|
|
@@ -42781,7 +42759,7 @@ function requireBlockchainClient() {
|
|
|
42781
42759
|
if (settings2.merkleHashVersion !== void 0) {
|
|
42782
42760
|
merkleHashVersion = settings2.merkleHashVersion;
|
|
42783
42761
|
} else {
|
|
42784
|
-
merkleHashVersion = yield (0, utils_12.getMerkleHashVersionFromDapp)(
|
|
42762
|
+
merkleHashVersion = yield (0, utils_12.getMerkleHashVersionFromDapp)(config3);
|
|
42785
42763
|
}
|
|
42786
42764
|
return merkleHashVersion;
|
|
42787
42765
|
});
|
|
@@ -43073,11 +43051,11 @@ function requireDecodeTransactionToGtx() {
|
|
|
43073
43051
|
Object.defineProperty(decodeTransactionToGtx, "__esModule", { value: true });
|
|
43074
43052
|
decodeTransactionToGtx.decodeTransactionToGtx = decodeTransactionToGtx$1;
|
|
43075
43053
|
const gtxTool = __importStar2(gtx$1);
|
|
43076
|
-
const
|
|
43054
|
+
const logger3 = __importStar2(logger$3);
|
|
43077
43055
|
const dump_1 = requireDump();
|
|
43078
43056
|
function decodeTransactionToGtx$1(encodedTransaction) {
|
|
43079
43057
|
const gtx2 = gtxTool.deserialize(encodedTransaction);
|
|
43080
|
-
|
|
43058
|
+
logger3.debug(`Output from deserializing a raw transaction: ${(0, dump_1.dumpGtv)(gtx2)}`);
|
|
43081
43059
|
return gtx2;
|
|
43082
43060
|
}
|
|
43083
43061
|
return decodeTransactionToGtx;
|
|
@@ -43294,10 +43272,8 @@ var index = /* @__PURE__ */ getDefaultExportFromCjs(builtExports);
|
|
|
43294
43272
|
|
|
43295
43273
|
// src-ts/browser/native.ts
|
|
43296
43274
|
var { Buffer: Buffer3, gtx: pcgtx } = index;
|
|
43297
|
-
var ATBASH_ENDPOINT = "https://
|
|
43298
|
-
var
|
|
43299
|
-
var ATBASH_PRIVATE_BLOCKCHAIN_RID = "2603569AE8DC3F254323F719C8D4347BBA964E874E781291F8474236BE8B6493";
|
|
43300
|
-
var DEFAULT_CHROMIA_NODE_URLS_ARR = define_ATBASH_CHROMIA_NODE_URLS_default;
|
|
43275
|
+
var ATBASH_ENDPOINT = "https://atbash.ai";
|
|
43276
|
+
var ATBASH_PRIVATE_BLOCKCHAIN_RID = "39FFD3557D0296CB2C57FDC6A3B8C024E95639CF4964DA08141AC20C6344D408";
|
|
43301
43277
|
var DEFAULT_PRIVATE_NODE_URLS_ARR = define_ATBASH_PRIVATE_NODE_URLS_default;
|
|
43302
43278
|
var MERKLE_HASH_VERSION = 2;
|
|
43303
43279
|
function stripHex(s2) {
|
|
@@ -43449,12 +43425,21 @@ var native = {
|
|
|
43449
43425
|
deriveMemoryKey,
|
|
43450
43426
|
encryptMemoryContent,
|
|
43451
43427
|
decryptMemoryContent,
|
|
43452
|
-
DEFAULT_BLOCKCHAIN_RID: ATBASH_BLOCKCHAIN_RID,
|
|
43453
43428
|
DEFAULT_PRIVATE_BLOCKCHAIN_RID: ATBASH_PRIVATE_BLOCKCHAIN_RID,
|
|
43454
43429
|
DEFAULT_ENDPOINT: ATBASH_ENDPOINT,
|
|
43455
|
-
defaultChromiaNodeUrls: () => [...DEFAULT_CHROMIA_NODE_URLS_ARR],
|
|
43456
43430
|
defaultPrivateNodeUrls: () => [...DEFAULT_PRIVATE_NODE_URLS_ARR],
|
|
43457
43431
|
// Server-only surfaces — throw at runtime, keep types satisfied.
|
|
43432
|
+
// The memory signers are here and not with the other signing shims because
|
|
43433
|
+
// their args are encrypted by `encryptMemoryContent`, which this build does
|
|
43434
|
+
// not have: a browser could sign the transaction but never produce one worth
|
|
43435
|
+
// sending.
|
|
43436
|
+
signAddAgentMemory: stub("signAddAgentMemory"),
|
|
43437
|
+
signRollbackAgentMemory: stub("signRollbackAgentMemory"),
|
|
43438
|
+
extractMemoryEdits: stub("extractMemoryEdits"),
|
|
43439
|
+
applyMemoryEdits: stub("applyMemoryEdits"),
|
|
43440
|
+
memorySlotForPath: stub("memorySlotForPath"),
|
|
43441
|
+
isSafeMemorySlot: stub("isSafeMemorySlot"),
|
|
43442
|
+
defaultAgentHomeDirs: stub("defaultAgentHomeDirs"),
|
|
43458
43443
|
classifyMemoryWrite: stub("classifyMemoryWrite"),
|
|
43459
43444
|
classifyMemoryRead: stub("classifyMemoryRead"),
|
|
43460
43445
|
defaultMemoryWriteToolNames: stub("defaultMemoryWriteToolNames"),
|
|
@@ -43478,9 +43463,10 @@ var native = {
|
|
|
43478
43463
|
validateMemoryId: stub("validateMemoryId"),
|
|
43479
43464
|
validateRollbackReason: stub("validateRollbackReason"),
|
|
43480
43465
|
validateMemoryNonce: stub("validateMemoryNonce"),
|
|
43466
|
+
validateFilePath: stub("validateFilePath"),
|
|
43481
43467
|
buildGetActiveMemoryIdQuery: stub("buildGetActiveMemoryIdQuery"),
|
|
43482
|
-
|
|
43483
|
-
|
|
43468
|
+
buildGetRecentAgentMemoryQuery: stub("buildGetRecentAgentMemoryQuery"),
|
|
43469
|
+
buildGetActiveAgentMemoryQuery: stub("buildGetActiveAgentMemoryQuery"),
|
|
43484
43470
|
buildGetAgentMemoryHistoryQuery: stub("buildGetAgentMemoryHistoryQuery"),
|
|
43485
43471
|
buildGetAgentMemoryRollbackHistoryQuery: stub("buildGetAgentMemoryRollbackHistoryQuery"),
|
|
43486
43472
|
buildGetAgentMemoryByIdQuery: stub("buildGetAgentMemoryByIdQuery"),
|
|
@@ -43499,21 +43485,20 @@ var native = {
|
|
|
43499
43485
|
OP_ROLLBACK_AGENT_MEMORY: "rollback_agent_memory",
|
|
43500
43486
|
OP_LOG_ENCRYPTED_TOOL_CALL: "log_encrypted_tool_call",
|
|
43501
43487
|
QUERY_GET_ACTIVE_MEMORY_ID: "get_active_memory_id",
|
|
43502
|
-
|
|
43503
|
-
|
|
43488
|
+
QUERY_GET_RECENT_AGENT_MEMORY: "get_recent_agent_memory",
|
|
43489
|
+
QUERY_GET_ACTIVE_AGENT_MEMORY: "get_active_agent_memory",
|
|
43504
43490
|
QUERY_GET_AGENT_MEMORY_HISTORY: "get_agent_memory_history",
|
|
43505
43491
|
QUERY_GET_AGENT_MEMORY_BY_ID: "get_agent_memory_by_id",
|
|
43506
43492
|
QUERY_GET_AGENT_MEMORY_ROLLBACK_HISTORY: "get_agent_memory_rollback_history",
|
|
43507
43493
|
ARG_AGENT_PUBKEY: "agent_pubkey",
|
|
43508
|
-
ARG_ID: "id"
|
|
43494
|
+
ARG_ID: "id",
|
|
43495
|
+
ARG_FILE_PATH: "file_path"
|
|
43509
43496
|
};
|
|
43510
43497
|
|
|
43511
43498
|
// src-ts/client.ts
|
|
43512
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43513
43499
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43514
43500
|
|
|
43515
43501
|
// src-ts/random.ts
|
|
43516
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43517
43502
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43518
43503
|
function randomBytes4(size) {
|
|
43519
43504
|
const buf = new Uint8Array(size);
|
|
@@ -43529,45 +43514,62 @@ function randomHex(size) {
|
|
|
43529
43514
|
return hex;
|
|
43530
43515
|
}
|
|
43531
43516
|
|
|
43532
|
-
// src-ts/
|
|
43533
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43534
|
-
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43535
|
-
|
|
43536
|
-
// src-ts/constants.ts
|
|
43537
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43517
|
+
// src-ts/auth-bearer.ts
|
|
43538
43518
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43539
|
-
var
|
|
43540
|
-
var
|
|
43541
|
-
|
|
43542
|
-
|
|
43543
|
-
|
|
43519
|
+
var BEARER_TTL_MS = 4 * 60 * 1e3;
|
|
43520
|
+
var bearers = /* @__PURE__ */ new Map();
|
|
43521
|
+
function agentAuthBearer(auth, blockchainRid) {
|
|
43522
|
+
const key3 = `${auth.pubkey}:${blockchainRid}`;
|
|
43523
|
+
const now = Date.now();
|
|
43524
|
+
const cached = bearers.get(key3);
|
|
43525
|
+
if (cached && now - cached.issuedAt < BEARER_TTL_MS) return cached.hex;
|
|
43526
|
+
const hex = native.signLogToolCall(
|
|
43527
|
+
`auth-${now.toString(36)}-${randomHex(4)}`,
|
|
43528
|
+
`auth:${now}`,
|
|
43529
|
+
"",
|
|
43530
|
+
"auth-bearer",
|
|
43531
|
+
"",
|
|
43532
|
+
auth.privkey,
|
|
43533
|
+
blockchainRid
|
|
43534
|
+
);
|
|
43535
|
+
bearers.set(key3, { hex, issuedAt: now });
|
|
43536
|
+
return hex;
|
|
43537
|
+
}
|
|
43538
|
+
function agentAuthHeaders(auth, blockchainRid) {
|
|
43539
|
+
return { Authorization: `Bearer ${agentAuthBearer(auth, blockchainRid)}` };
|
|
43540
|
+
}
|
|
43544
43541
|
|
|
43545
43542
|
// src-ts/chain-config.ts
|
|
43543
|
+
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43546
43544
|
var DEFAULT_PRIVATE_NODE_URLS = Object.freeze(
|
|
43547
43545
|
native.defaultPrivateNodeUrls()
|
|
43548
43546
|
);
|
|
43549
43547
|
var DEFAULT_PRIVATE_BLOCKCHAIN_RID = native.DEFAULT_PRIVATE_BLOCKCHAIN_RID;
|
|
43550
|
-
var PUBLIC_CHAIN = {
|
|
43551
|
-
network: "public",
|
|
43552
|
-
blockchainRid: DEFAULT_BLOCKCHAIN_RID,
|
|
43553
|
-
nodeUrls: DEFAULT_CHROMIA_NODE_URLS
|
|
43554
|
-
};
|
|
43555
43548
|
var PRIVATE_CHAIN = {
|
|
43556
43549
|
network: "private",
|
|
43557
43550
|
blockchainRid: DEFAULT_PRIVATE_BLOCKCHAIN_RID,
|
|
43558
43551
|
nodeUrls: DEFAULT_PRIVATE_NODE_URLS
|
|
43559
43552
|
};
|
|
43553
|
+
function chainForNetwork(network) {
|
|
43554
|
+
if (network !== "private") {
|
|
43555
|
+
throw new Error(
|
|
43556
|
+
`network must be "private" (the public chain is retired), got ${JSON.stringify(network)}`
|
|
43557
|
+
);
|
|
43558
|
+
}
|
|
43559
|
+
return PRIVATE_CHAIN;
|
|
43560
|
+
}
|
|
43561
|
+
|
|
43562
|
+
// src-ts/constants.ts
|
|
43563
|
+
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43564
|
+
var DEFAULT_ENDPOINT = native.DEFAULT_ENDPOINT;
|
|
43560
43565
|
|
|
43561
43566
|
// src-ts/browser/encrypted-toolcall.ts
|
|
43562
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43563
43567
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43564
43568
|
|
|
43565
43569
|
// src-ts/browser/crypto-ecies.ts
|
|
43566
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43567
43570
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43568
43571
|
|
|
43569
43572
|
// node_modules/@noble/hashes/hkdf.js
|
|
43570
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43571
43573
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43572
43574
|
function extract(hash3, ikm, salt) {
|
|
43573
43575
|
ahash(hash3);
|
|
@@ -43609,15 +43611,12 @@ function expand2(hash3, prk, info2, length = 32) {
|
|
|
43609
43611
|
var hkdf = (hash3, ikm, salt, info2, length) => expand2(hash3, extract(hash3, ikm, salt), info2, length);
|
|
43610
43612
|
|
|
43611
43613
|
// node_modules/@noble/ciphers/aes.js
|
|
43612
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43613
43614
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43614
43615
|
|
|
43615
43616
|
// node_modules/@noble/ciphers/_polyval.js
|
|
43616
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43617
43617
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43618
43618
|
|
|
43619
43619
|
// node_modules/@noble/ciphers/utils.js
|
|
43620
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
43621
43620
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
43622
43621
|
function isBytes3(a) {
|
|
43623
43622
|
return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array" && "BYTES_PER_ELEMENT" in a && a.BYTES_PER_ELEMENT === 1;
|
|
@@ -44211,7 +44210,6 @@ function encryptedLength(plaintextByteLength) {
|
|
|
44211
44210
|
}
|
|
44212
44211
|
|
|
44213
44212
|
// src-ts/crypto/envelope.ts
|
|
44214
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44215
44213
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44216
44214
|
var PREFIX = "atb1";
|
|
44217
44215
|
var SEPARATOR = ".";
|
|
@@ -44345,7 +44343,6 @@ function signEncryptedToolCall(toolCallId, action, context, toolName, toolArgsJs
|
|
|
44345
44343
|
}
|
|
44346
44344
|
|
|
44347
44345
|
// src-ts/endpoint.ts
|
|
44348
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44349
44346
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44350
44347
|
function buildAllowedJudgeHosts() {
|
|
44351
44348
|
return /* @__PURE__ */ new Set([
|
|
@@ -44355,6 +44352,13 @@ function buildAllowedJudgeHosts() {
|
|
|
44355
44352
|
]);
|
|
44356
44353
|
}
|
|
44357
44354
|
var ALLOWED_JUDGE_HOSTS = buildAllowedJudgeHosts();
|
|
44355
|
+
function isAllowlistedJudgeHost(endpoint) {
|
|
44356
|
+
try {
|
|
44357
|
+
return ALLOWED_JUDGE_HOSTS.has(new URL(endpoint).hostname.toLowerCase());
|
|
44358
|
+
} catch {
|
|
44359
|
+
return false;
|
|
44360
|
+
}
|
|
44361
|
+
}
|
|
44358
44362
|
function validateJudgeEndpoint(judge) {
|
|
44359
44363
|
const policy = judge?.policy === "self-hosted" ? "self-hosted" : "default";
|
|
44360
44364
|
const candidate = judge?.endpoint?.trim() || DEFAULT_ENDPOINT;
|
|
@@ -44397,18 +44401,29 @@ function validateJudgeEndpoint(judge) {
|
|
|
44397
44401
|
}
|
|
44398
44402
|
|
|
44399
44403
|
// src-ts/errors.ts
|
|
44400
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44401
44404
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44402
44405
|
var AtbashAPIError = class extends Error {
|
|
44403
44406
|
/** HTTP status code (or 0 if the request never completed). */
|
|
44404
44407
|
status;
|
|
44405
44408
|
/** Raw response body text (may be empty). */
|
|
44406
44409
|
body;
|
|
44407
|
-
|
|
44408
|
-
|
|
44410
|
+
/**
|
|
44411
|
+
* Request path this status came from, e.g. `/api/v1/judge` — absent when the
|
|
44412
|
+
* request never reached a response (transport failures carry status 0).
|
|
44413
|
+
*
|
|
44414
|
+
* A status alone does not say what failed. Several routes answer one call, and
|
|
44415
|
+
* more than one of them can 404: a caller reading only `404` cannot tell "this
|
|
44416
|
+
* agent is not registered" from "the chain-routing lookup did not resolve", and
|
|
44417
|
+
* has to guess from the body's prose — which a 404 raised before any handler
|
|
44418
|
+
* ran does not carry. The path is the fact that settles it.
|
|
44419
|
+
*/
|
|
44420
|
+
path;
|
|
44421
|
+
constructor(status, body, statusText = "", endpoint = DEFAULT_ENDPOINT, path3) {
|
|
44422
|
+
super(enrich(status, body, statusText, endpoint, path3));
|
|
44409
44423
|
this.name = "AtbashAPIError";
|
|
44410
44424
|
this.status = status;
|
|
44411
44425
|
this.body = body;
|
|
44426
|
+
this.path = path3;
|
|
44412
44427
|
}
|
|
44413
44428
|
};
|
|
44414
44429
|
var SignatureVerificationError = class extends Error {
|
|
@@ -44417,9 +44432,18 @@ var SignatureVerificationError = class extends Error {
|
|
|
44417
44432
|
this.name = "SignatureVerificationError";
|
|
44418
44433
|
}
|
|
44419
44434
|
};
|
|
44420
|
-
|
|
44435
|
+
var JudgeRefusalError = class extends Error {
|
|
44436
|
+
constructor(message) {
|
|
44437
|
+
super(message);
|
|
44438
|
+
this.name = "JudgeRefusalError";
|
|
44439
|
+
}
|
|
44440
|
+
};
|
|
44441
|
+
function isRefusalStatus(status) {
|
|
44442
|
+
return status >= 400 && status < 500 && status !== 408;
|
|
44443
|
+
}
|
|
44444
|
+
function enrich(status, body, statusText, endpoint, path3) {
|
|
44421
44445
|
const dashboard = endpoint.replace(/\/+$/, "") || DEFAULT_ENDPOINT;
|
|
44422
|
-
let msg = `API error ${status}: ${body || statusText}`;
|
|
44446
|
+
let msg = `API error ${status}${path3 ? ` from ${path3}` : ""}: ${body || statusText}`;
|
|
44423
44447
|
const lowered = body.toLowerCase();
|
|
44424
44448
|
if (lowered.includes("agent not registered")) {
|
|
44425
44449
|
msg += `
|
|
@@ -44440,8 +44464,63 @@ function enrich(status, body, statusText, endpoint) {
|
|
|
44440
44464
|
return msg;
|
|
44441
44465
|
}
|
|
44442
44466
|
|
|
44467
|
+
// src-ts/jail-hold.ts
|
|
44468
|
+
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44469
|
+
var DEFAULTS = { ceilingMs: 3e4, pollMs: 1e3 };
|
|
44470
|
+
var holds = /* @__PURE__ */ new Map();
|
|
44471
|
+
var blockedAt = /* @__PURE__ */ new Map();
|
|
44472
|
+
var BLOCK_MEMORY_MS = 10 * 6e4;
|
|
44473
|
+
var config2 = { ...DEFAULTS };
|
|
44474
|
+
function isJailHeld(pubkey) {
|
|
44475
|
+
return holds.has(pubkey);
|
|
44476
|
+
}
|
|
44477
|
+
function recordBlock(pubkey) {
|
|
44478
|
+
const now = Date.now();
|
|
44479
|
+
for (const [key3, at] of blockedAt) if (now - at > BLOCK_MEMORY_MS) blockedAt.delete(key3);
|
|
44480
|
+
blockedAt.set(pubkey, now);
|
|
44481
|
+
}
|
|
44482
|
+
function blockedSince(pubkey, startedAt) {
|
|
44483
|
+
const at = blockedAt.get(pubkey);
|
|
44484
|
+
return at !== void 0 && startedAt <= at;
|
|
44485
|
+
}
|
|
44486
|
+
function holdJail(pubkey, confirmJailed, onGiveUp) {
|
|
44487
|
+
if (holds.has(pubkey)) return;
|
|
44488
|
+
const hold = { timer: null };
|
|
44489
|
+
holds.set(pubkey, hold);
|
|
44490
|
+
const deadline = Date.now() + config2.ceilingMs;
|
|
44491
|
+
const tick = async () => {
|
|
44492
|
+
if (holds.get(pubkey) !== hold) return;
|
|
44493
|
+
let jailed = false;
|
|
44494
|
+
try {
|
|
44495
|
+
jailed = await confirmJailed();
|
|
44496
|
+
} catch {
|
|
44497
|
+
}
|
|
44498
|
+
if (holds.get(pubkey) !== hold) return;
|
|
44499
|
+
if (jailed) {
|
|
44500
|
+
holds.delete(pubkey);
|
|
44501
|
+
return;
|
|
44502
|
+
}
|
|
44503
|
+
if (Date.now() >= deadline) {
|
|
44504
|
+
holds.delete(pubkey);
|
|
44505
|
+
onGiveUp?.();
|
|
44506
|
+
return;
|
|
44507
|
+
}
|
|
44508
|
+
const timer = setTimeout(() => void tick(), config2.pollMs);
|
|
44509
|
+
timer.unref?.();
|
|
44510
|
+
hold.timer = timer;
|
|
44511
|
+
};
|
|
44512
|
+
void tick();
|
|
44513
|
+
}
|
|
44514
|
+
function releaseJailHolds() {
|
|
44515
|
+
for (const hold of holds.values()) if (hold.timer) clearTimeout(hold.timer);
|
|
44516
|
+
holds.clear();
|
|
44517
|
+
blockedAt.clear();
|
|
44518
|
+
}
|
|
44519
|
+
function configureJailHold(next) {
|
|
44520
|
+
config2 = { ...DEFAULTS, ...next };
|
|
44521
|
+
}
|
|
44522
|
+
|
|
44443
44523
|
// src-ts/http/client.ts
|
|
44444
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44445
44524
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44446
44525
|
var HttpClient = class {
|
|
44447
44526
|
baseUrl;
|
|
@@ -44450,8 +44529,8 @@ var HttpClient = class {
|
|
|
44450
44529
|
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
44451
44530
|
this.timeoutMs = timeoutMs;
|
|
44452
44531
|
}
|
|
44453
|
-
buildUrl(
|
|
44454
|
-
const url = new URL(this.baseUrl +
|
|
44532
|
+
buildUrl(path3, query) {
|
|
44533
|
+
const url = new URL(this.baseUrl + path3);
|
|
44455
44534
|
if (query) {
|
|
44456
44535
|
for (const [k, v] of Object.entries(query)) {
|
|
44457
44536
|
if (v !== void 0 && v !== null && v !== "") {
|
|
@@ -44461,14 +44540,14 @@ var HttpClient = class {
|
|
|
44461
44540
|
}
|
|
44462
44541
|
return url.toString();
|
|
44463
44542
|
}
|
|
44464
|
-
async get(
|
|
44465
|
-
return this.fetch(this.buildUrl(
|
|
44543
|
+
async get(path3, query, headers) {
|
|
44544
|
+
return this.fetch(this.buildUrl(path3, query), {
|
|
44466
44545
|
method: "GET",
|
|
44467
44546
|
...headers && { headers }
|
|
44468
44547
|
});
|
|
44469
44548
|
}
|
|
44470
|
-
async post(
|
|
44471
|
-
return this.fetch(this.buildUrl(
|
|
44549
|
+
async post(path3, body, headers) {
|
|
44550
|
+
return this.fetch(this.buildUrl(path3), {
|
|
44472
44551
|
method: "POST",
|
|
44473
44552
|
headers: { "Content-Type": "application/json", ...headers },
|
|
44474
44553
|
body: JSON.stringify(body)
|
|
@@ -44511,6 +44590,13 @@ function classifyTransportError(err, url, method, timeoutMs) {
|
|
|
44511
44590
|
{ cause: err }
|
|
44512
44591
|
);
|
|
44513
44592
|
}
|
|
44593
|
+
if (code2 === "UND_ERR_CONNECT_TIMEOUT") {
|
|
44594
|
+
return new HttpTransportError(
|
|
44595
|
+
"timeout",
|
|
44596
|
+
`${method} ${url} could not establish a connection before the transport deadline \u2014 check the endpoint and network`,
|
|
44597
|
+
{ cause: err }
|
|
44598
|
+
);
|
|
44599
|
+
}
|
|
44514
44600
|
if (code2 === "ENOTFOUND" || code2 === "EAI_AGAIN") {
|
|
44515
44601
|
return new HttpTransportError(
|
|
44516
44602
|
"dns",
|
|
@@ -44540,7 +44626,6 @@ function classifyTransportError(err, url, method, timeoutMs) {
|
|
|
44540
44626
|
}
|
|
44541
44627
|
|
|
44542
44628
|
// src-ts/browser/keyLoader.ts
|
|
44543
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44544
44629
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44545
44630
|
var NOT_AVAILABLE = "keyLoader is not available in the browser bundle \u2014 pass `agentKey` explicitly to Atbash.fromConfig or use `new Atbash(privkey, opts)`.";
|
|
44546
44631
|
function resolveKeyPath(_input) {
|
|
@@ -44550,19 +44635,34 @@ function loadAgentFromFile(_keyPath) {
|
|
|
44550
44635
|
throw new Error(NOT_AVAILABLE);
|
|
44551
44636
|
}
|
|
44552
44637
|
|
|
44638
|
+
// src-ts/decision.ts
|
|
44639
|
+
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44640
|
+
|
|
44553
44641
|
// src-ts/normalize.ts
|
|
44554
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44555
44642
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44643
|
+
function wireText(raw2, fallback = "") {
|
|
44644
|
+
if (raw2 === null || raw2 === void 0) return fallback;
|
|
44645
|
+
if (typeof raw2 === "object" || typeof raw2 === "function") return fallback;
|
|
44646
|
+
return String(raw2);
|
|
44647
|
+
}
|
|
44648
|
+
function wireNumber(raw2, fallback = 0) {
|
|
44649
|
+
if (raw2 === null || raw2 === void 0) return fallback;
|
|
44650
|
+
if (typeof raw2 === "object" || typeof raw2 === "function") return fallback;
|
|
44651
|
+
return Number(raw2);
|
|
44652
|
+
}
|
|
44556
44653
|
function normalizeVerdict(raw2) {
|
|
44557
44654
|
if (raw2 === null || raw2 === void 0) return "No verdict";
|
|
44558
|
-
const v =
|
|
44655
|
+
const v = wireText(raw2).trim().toUpperCase();
|
|
44559
44656
|
if (v === "ALLOW" || v === "GREEN") return "ALLOW";
|
|
44560
44657
|
if (v === "HOLD" || v === "YELLOW") return "HOLD";
|
|
44561
44658
|
if (v === "BLOCK" || v === "RED") return "BLOCK";
|
|
44562
44659
|
return "HOLD";
|
|
44563
44660
|
}
|
|
44661
|
+
function normalizeActionType(raw2) {
|
|
44662
|
+
return typeof raw2 === "string" ? raw2.trim().toLowerCase() : "";
|
|
44663
|
+
}
|
|
44564
44664
|
function normalizeStatus(raw2) {
|
|
44565
|
-
const s2 =
|
|
44665
|
+
const s2 = wireText(raw2).toLowerCase();
|
|
44566
44666
|
if (s2 === "pending" || s2 === "answered" || s2 === "error") return s2;
|
|
44567
44667
|
return "error";
|
|
44568
44668
|
}
|
|
@@ -44577,8 +44677,134 @@ function pubkeyToHex(val) {
|
|
|
44577
44677
|
return "";
|
|
44578
44678
|
}
|
|
44579
44679
|
|
|
44680
|
+
// src-ts/decision.ts
|
|
44681
|
+
function isRecord(value) {
|
|
44682
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
44683
|
+
}
|
|
44684
|
+
function allowSignalsPermit(data) {
|
|
44685
|
+
const signals = [];
|
|
44686
|
+
if (Object.hasOwn(data, "allow")) signals.push(data.allow);
|
|
44687
|
+
if (isRecord(data.decision) && Object.hasOwn(data.decision, "allow")) {
|
|
44688
|
+
signals.push(data.decision.allow);
|
|
44689
|
+
}
|
|
44690
|
+
return signals.length === 0 || signals.every((value) => value === true);
|
|
44691
|
+
}
|
|
44692
|
+
function explicitRefusal(data) {
|
|
44693
|
+
let hold = false;
|
|
44694
|
+
for (const source of decisionSources(data)) {
|
|
44695
|
+
const verdict = verdictOf(source);
|
|
44696
|
+
if (verdict === "BLOCK" || verdict === "RED") return "BLOCK";
|
|
44697
|
+
if (verdict === "HOLD" || verdict === "YELLOW") hold = true;
|
|
44698
|
+
const actionType = actionTypeOf(source);
|
|
44699
|
+
if (actionType === "block") return "BLOCK";
|
|
44700
|
+
if (actionType === "hold_for_user_confirm") hold = true;
|
|
44701
|
+
}
|
|
44702
|
+
if (!allowSignalsPermit(data)) return "BLOCK";
|
|
44703
|
+
return hold ? "HOLD" : "";
|
|
44704
|
+
}
|
|
44705
|
+
function decisionSources(data) {
|
|
44706
|
+
return [data, isRecord(data.decision) ? data.decision : {}];
|
|
44707
|
+
}
|
|
44708
|
+
function verdictOf(source) {
|
|
44709
|
+
return typeof source.verdict === "string" ? source.verdict.trim().toUpperCase() : "";
|
|
44710
|
+
}
|
|
44711
|
+
function actionTypeRank(actionType) {
|
|
44712
|
+
if (actionType === "block") return 4;
|
|
44713
|
+
if (actionType === "hold_for_user_confirm") return 3;
|
|
44714
|
+
if (actionType === "") return 1;
|
|
44715
|
+
if (actionType === "allow") return 0;
|
|
44716
|
+
return 2;
|
|
44717
|
+
}
|
|
44718
|
+
function actionTypeOf(source) {
|
|
44719
|
+
let winner = "";
|
|
44720
|
+
for (const key3 of ["action_type", "actionType"]) {
|
|
44721
|
+
const raw2 = source[key3];
|
|
44722
|
+
if (raw2 === void 0 || raw2 === null) continue;
|
|
44723
|
+
const actionType = normalizeActionType(raw2);
|
|
44724
|
+
if (actionTypeRank(actionType) > actionTypeRank(winner)) winner = actionType;
|
|
44725
|
+
}
|
|
44726
|
+
return winner;
|
|
44727
|
+
}
|
|
44728
|
+
function wireActionType(data) {
|
|
44729
|
+
for (const source of decisionSources(data)) {
|
|
44730
|
+
const actionType = actionTypeOf(source);
|
|
44731
|
+
if (actionType !== "") return actionType;
|
|
44732
|
+
}
|
|
44733
|
+
return "";
|
|
44734
|
+
}
|
|
44735
|
+
function isAuditTier(data) {
|
|
44736
|
+
const absentVerdict = data.verdict === null || data.verdict === void 0;
|
|
44737
|
+
return absentVerdict && data.status === "logged";
|
|
44738
|
+
}
|
|
44739
|
+
function isAuditTierBody(data) {
|
|
44740
|
+
return isAuditTier(data);
|
|
44741
|
+
}
|
|
44742
|
+
function canonicalAllow(data) {
|
|
44743
|
+
if (explicitRefusal(data) !== "") return false;
|
|
44744
|
+
const actionType = wireActionType(data);
|
|
44745
|
+
if (actionType && actionType !== "allow") return false;
|
|
44746
|
+
if (isAuditTier(data)) return true;
|
|
44747
|
+
if (typeof data.verdict !== "string") return false;
|
|
44748
|
+
const verdict = data.verdict.trim().toUpperCase();
|
|
44749
|
+
return verdict === "ALLOW" || verdict === "GREEN";
|
|
44750
|
+
}
|
|
44751
|
+
|
|
44752
|
+
// src-ts/opentel/events.ts
|
|
44753
|
+
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44754
|
+
var SLOW_MS = 1500;
|
|
44755
|
+
var SUCCESS_SAMPLE_RATE = 10;
|
|
44756
|
+
var logger2 = null;
|
|
44757
|
+
var eventsEnabled = false;
|
|
44758
|
+
var sdkVersion = "";
|
|
44759
|
+
var eventSource = "sdk";
|
|
44760
|
+
var hashAgentKey = null;
|
|
44761
|
+
function eventsOptedOut() {
|
|
44762
|
+
const flag = process.env.ATBASH_TELEMETRY_EVENTS_DISABLED?.trim().toLowerCase();
|
|
44763
|
+
return Boolean(flag && ["1", "true", "yes", "on"].includes(flag));
|
|
44764
|
+
}
|
|
44765
|
+
var SOURCE_SHAPE = /^(?:sdk|cli|plugin:[a-z0-9][a-z0-9._-]{0,31})$/;
|
|
44766
|
+
function configureEvents(next, opts = {}) {
|
|
44767
|
+
logger2 = next;
|
|
44768
|
+
eventsEnabled = next !== null && !eventsOptedOut();
|
|
44769
|
+
if (opts.version) sdkVersion = opts.version;
|
|
44770
|
+
if (opts.source && SOURCE_SHAPE.test(opts.source)) eventSource = opts.source;
|
|
44771
|
+
hashAgentKey = opts.hashAgentKey ?? null;
|
|
44772
|
+
}
|
|
44773
|
+
function eventsAreOn() {
|
|
44774
|
+
return eventsEnabled && logger2 !== null;
|
|
44775
|
+
}
|
|
44776
|
+
function sampleRateFor(e) {
|
|
44777
|
+
if (e.status === "error") return 1;
|
|
44778
|
+
if (e.durationMs >= SLOW_MS) return 1;
|
|
44779
|
+
return Math.random() < 1 / SUCCESS_SAMPLE_RATE ? SUCCESS_SAMPLE_RATE : 0;
|
|
44780
|
+
}
|
|
44781
|
+
function recordEvent(e) {
|
|
44782
|
+
if (!eventsAreOn()) return;
|
|
44783
|
+
const sampleRate = sampleRateFor(e);
|
|
44784
|
+
if (sampleRate === 0) return;
|
|
44785
|
+
try {
|
|
44786
|
+
const attributes = {
|
|
44787
|
+
"function.name": e.functionName,
|
|
44788
|
+
"duration_ms": Math.round(e.durationMs),
|
|
44789
|
+
status: e.status,
|
|
44790
|
+
source: eventSource,
|
|
44791
|
+
// Honeycomb reweights counts and percentiles by this. It is per-event
|
|
44792
|
+
// because the sampling is biased by outcome and latency.
|
|
44793
|
+
sampleRate
|
|
44794
|
+
};
|
|
44795
|
+
if (sdkVersion) attributes["sdk.version"] = sdkVersion;
|
|
44796
|
+
if (e.agentPubkey && hashAgentKey) attributes["agent.hash"] = hashAgentKey(e.agentPubkey);
|
|
44797
|
+
if (e.chain) attributes["chain"] = e.chain;
|
|
44798
|
+
if (e.errorClass) attributes["error.class"] = e.errorClass;
|
|
44799
|
+
if (e.errorStatus !== void 0) attributes["error.status"] = e.errorStatus;
|
|
44800
|
+
if (e.errorPath) attributes["error.path"] = e.errorPath;
|
|
44801
|
+
if (e.outcome) attributes["outcome"] = e.outcome;
|
|
44802
|
+
logger2.emit({ body: e.functionName, attributes });
|
|
44803
|
+
} catch {
|
|
44804
|
+
}
|
|
44805
|
+
}
|
|
44806
|
+
|
|
44580
44807
|
// src-ts/browser/opentel/telemetry.ts
|
|
44581
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44582
44808
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44583
44809
|
function setupTelemetry(_config) {
|
|
44584
44810
|
}
|
|
@@ -44592,7 +44818,6 @@ async function shutdownTelemetry() {
|
|
|
44592
44818
|
}
|
|
44593
44819
|
|
|
44594
44820
|
// src-ts/browser/userConfig.ts
|
|
44595
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
44596
44821
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
44597
44822
|
var NOT_AVAILABLE2 = "userConfig file I/O is not available in the browser bundle.";
|
|
44598
44823
|
function getConfigDir() {
|
|
@@ -44610,11 +44835,46 @@ function saveUserConfig(_) {
|
|
|
44610
44835
|
function resolve(_key, flagValue) {
|
|
44611
44836
|
return flagValue ?? "";
|
|
44612
44837
|
}
|
|
44838
|
+
function forcedChainNetwork(flagValue) {
|
|
44839
|
+
return flagValue === "private" ? flagValue : void 0;
|
|
44840
|
+
}
|
|
44841
|
+
function agentKeyFromEnv() {
|
|
44842
|
+
return "";
|
|
44843
|
+
}
|
|
44844
|
+
function strandedAgentKey() {
|
|
44845
|
+
return "";
|
|
44846
|
+
}
|
|
44613
44847
|
|
|
44614
44848
|
// src-ts/client.ts
|
|
44849
|
+
var AGENT_NOT_REGISTERED = "Agent not registered. Onboard the agent at the dashboard before submitting actions.";
|
|
44615
44850
|
function generateToolCallId() {
|
|
44616
44851
|
return `tc-${Date.now()}-${randomHex(4)}`;
|
|
44617
44852
|
}
|
|
44853
|
+
function resolveConstructorChain(options) {
|
|
44854
|
+
if (options.chain) return options.chain;
|
|
44855
|
+
const hasNodeUrls = options.nodeUrls !== void 0;
|
|
44856
|
+
const hasBrid = options.blockchainRid !== void 0;
|
|
44857
|
+
if (hasNodeUrls !== hasBrid) {
|
|
44858
|
+
throw new Error(
|
|
44859
|
+
'nodeUrls and blockchainRid must be provided together \u2014 passing one without the other 404s every chain request. Prefer `chain: PRIVATE_CHAIN` or `network: "private"`.'
|
|
44860
|
+
);
|
|
44861
|
+
}
|
|
44862
|
+
if (hasNodeUrls && hasBrid) {
|
|
44863
|
+
return {
|
|
44864
|
+
network: "private",
|
|
44865
|
+
blockchainRid: options.blockchainRid,
|
|
44866
|
+
nodeUrls: options.nodeUrls
|
|
44867
|
+
};
|
|
44868
|
+
}
|
|
44869
|
+
return chainForNetwork(options.network ?? forcedChainNetwork() ?? "private");
|
|
44870
|
+
}
|
|
44871
|
+
function errorDetail(err) {
|
|
44872
|
+
if (!(err instanceof AtbashAPIError)) return {};
|
|
44873
|
+
return {
|
|
44874
|
+
errorStatus: err.status,
|
|
44875
|
+
...err.path ? { errorPath: err.path } : {}
|
|
44876
|
+
};
|
|
44877
|
+
}
|
|
44618
44878
|
var Atbash = class _Atbash {
|
|
44619
44879
|
auth;
|
|
44620
44880
|
endpoint;
|
|
@@ -44628,6 +44888,10 @@ var Atbash = class _Atbash {
|
|
|
44628
44888
|
orgEncryptionPubKey;
|
|
44629
44889
|
/** When true (default), `auditToolCall` denies on any error. */
|
|
44630
44890
|
failClosed;
|
|
44891
|
+
/** When true (default), an unenforced (audit-tier) answer is refused. */
|
|
44892
|
+
requireEnforcement;
|
|
44893
|
+
/** Overall deadline for one auditToolCall decision, in ms. */
|
|
44894
|
+
decisionTimeoutMs;
|
|
44631
44895
|
/** Org key learned from the last agent-exists check, for this agent only. */
|
|
44632
44896
|
_orgKeyFromChain = null;
|
|
44633
44897
|
debug;
|
|
@@ -44638,6 +44902,27 @@ var Atbash = class _Atbash {
|
|
|
44638
44902
|
* calls don't re-hit the dashboard. Cleared by `clearChainCache()`.
|
|
44639
44903
|
*/
|
|
44640
44904
|
_chainCache = /* @__PURE__ */ new Map();
|
|
44905
|
+
/**
|
|
44906
|
+
* The chain the constructor settled on. Used only where a lookup returns no
|
|
44907
|
+
* answer — see {@link resolveChainFromMap}.
|
|
44908
|
+
*/
|
|
44909
|
+
_defaultChain;
|
|
44910
|
+
/**
|
|
44911
|
+
* True when the caller named a chain outright — `chain`, `network`, or the
|
|
44912
|
+
* paired `blockchainRid` + `nodeUrls`.
|
|
44913
|
+
*
|
|
44914
|
+
* Such a client is never re-pointed: not by the migration switch, and not by
|
|
44915
|
+
* where an org turns out to live. Naming a chain is the caller saying "talk
|
|
44916
|
+
* to this one", and silently routing elsewhere would make the argument a
|
|
44917
|
+
* suggestion. A client that names nothing is the one that follows the org.
|
|
44918
|
+
*/
|
|
44919
|
+
_explicitChain;
|
|
44920
|
+
/**
|
|
44921
|
+
* The fleet-wide chain switch, read once at construction. `resolve()` hits
|
|
44922
|
+
* the config file on disk, so re-reading it per call would put a file read
|
|
44923
|
+
* on every judge.
|
|
44924
|
+
*/
|
|
44925
|
+
_forcedNetwork;
|
|
44641
44926
|
/**
|
|
44642
44927
|
* Short-TTL cache for `/api/ai/exists`. The `registered` field is
|
|
44643
44928
|
* monotonic (once true, stays true), so most calls in a burst re-fetch
|
|
@@ -44648,30 +44933,33 @@ var Atbash = class _Atbash {
|
|
|
44648
44933
|
*/
|
|
44649
44934
|
_agentExistsCache = null;
|
|
44650
44935
|
static AGENT_EXISTS_TTL_MS = 5e3;
|
|
44651
|
-
/**
|
|
44652
|
-
* Cached bearer token for risk-engine / insurance read calls. Built
|
|
44653
|
-
* lazily as a signed `log_tool_call` tx and refreshed every 4 min so
|
|
44654
|
-
* server-side replay protection windows never expire it mid-session.
|
|
44655
|
-
*/
|
|
44656
|
-
// Keyed by blockchainRid so bearers for the public and private chains can
|
|
44657
|
-
// coexist. The dashboard derives `authNetwork` from the BRID inside the
|
|
44658
|
-
// signed envelope, so a bearer signed for chain A cannot authenticate a
|
|
44659
|
-
// request routed to chain B — every chain the client talks to needs its own.
|
|
44660
|
-
_authBearers = /* @__PURE__ */ new Map();
|
|
44661
44936
|
/** Guards `logEnvironmentOnce` — hosts construct several clients. */
|
|
44662
44937
|
static environmentLogged = false;
|
|
44663
44938
|
constructor(privkey, options = {}) {
|
|
44664
44939
|
this.auth = native.loadAgent(privkey);
|
|
44665
|
-
|
|
44666
|
-
|
|
44667
|
-
|
|
44940
|
+
const validated = validateJudgeEndpoint(
|
|
44941
|
+
options.verifyPubKey ? {
|
|
44942
|
+
policy: "self-hosted",
|
|
44943
|
+
endpoint: options.endpoint ?? DEFAULT_ENDPOINT,
|
|
44944
|
+
verifyPubKey: options.verifyPubKey
|
|
44945
|
+
} : { endpoint: options.endpoint }
|
|
44946
|
+
);
|
|
44947
|
+
this.endpoint = validated.url;
|
|
44948
|
+
const resolvedChain = resolveConstructorChain(options);
|
|
44949
|
+
this.nodeUrls = [...resolvedChain.nodeUrls];
|
|
44950
|
+
this.blockchainRid = resolvedChain.blockchainRid;
|
|
44951
|
+
this._defaultChain = resolvedChain;
|
|
44952
|
+
this._explicitChain = options.chain !== void 0 || options.network !== void 0 || options.blockchainRid !== void 0 && options.nodeUrls !== void 0;
|
|
44953
|
+
this._forcedNetwork = forcedChainNetwork();
|
|
44668
44954
|
this.orgName = options.orgName;
|
|
44669
|
-
this.verifyPubKey =
|
|
44955
|
+
this.verifyPubKey = validated.verifyPubKey ?? void 0;
|
|
44670
44956
|
this.orgEncryptionPubKey = options.orgEncryptionPubKey;
|
|
44671
44957
|
this.failClosed = options.failClosed !== false;
|
|
44958
|
+
this.requireEnforcement = options.requireEnforcement !== false;
|
|
44959
|
+
this.decisionTimeoutMs = options.decisionTimeoutMs ?? DEFAULT_DECISION_TIMEOUT_MS;
|
|
44672
44960
|
this.debug = options.debug === true;
|
|
44673
44961
|
this.logger = options.logger ?? {};
|
|
44674
|
-
this.http = new HttpClient(this.endpoint, options.timeoutMs ??
|
|
44962
|
+
this.http = new HttpClient(this.endpoint, options.timeoutMs ?? 12e4);
|
|
44675
44963
|
this.logEnvironmentOnce();
|
|
44676
44964
|
if (this.endpoint !== DEFAULT_ENDPOINT) {
|
|
44677
44965
|
this.logger.warn?.("[atbash] running on non-default judge endpoint", {
|
|
@@ -44679,15 +44967,24 @@ var Atbash = class _Atbash {
|
|
|
44679
44967
|
verifying: this.verifyPubKey ? "with response-signature pubkey configured" : "without signature verification"
|
|
44680
44968
|
});
|
|
44681
44969
|
}
|
|
44682
|
-
|
|
44683
|
-
|
|
44684
|
-
|
|
44685
|
-
|
|
44686
|
-
|
|
44687
|
-
|
|
44688
|
-
|
|
44689
|
-
|
|
44690
|
-
|
|
44970
|
+
if (isAllowlistedJudgeHost(this.endpoint)) {
|
|
44971
|
+
try {
|
|
44972
|
+
setupTelemetry({
|
|
44973
|
+
enabled: true,
|
|
44974
|
+
endpoint: this.endpoint,
|
|
44975
|
+
getAuthHeaders: () => this.authHeaders()
|
|
44976
|
+
});
|
|
44977
|
+
} catch (err) {
|
|
44978
|
+
this.logger.warn?.(
|
|
44979
|
+
"[atbash] telemetry setup failed \u2014 continuing without metrics",
|
|
44980
|
+
{ error: String(err) }
|
|
44981
|
+
);
|
|
44982
|
+
}
|
|
44983
|
+
} else {
|
|
44984
|
+
this.logger.info?.(
|
|
44985
|
+
"[atbash] telemetry disabled \u2014 the agent bearer is only sent to hosts that already receive it, and this judge endpoint is not one",
|
|
44986
|
+
{ endpoint: this.endpoint }
|
|
44987
|
+
);
|
|
44691
44988
|
}
|
|
44692
44989
|
}
|
|
44693
44990
|
/**
|
|
@@ -44705,10 +45002,9 @@ var Atbash = class _Atbash {
|
|
|
44705
45002
|
_Atbash.environmentLogged = true;
|
|
44706
45003
|
const brief = (rid) => rid ? `${rid.slice(0, 8)}\u2026` : "(unset)";
|
|
44707
45004
|
this.logger.info?.(
|
|
44708
|
-
`[atbash] environment \u2014 judge=${this.endpoint}
|
|
45005
|
+
`[atbash] environment \u2014 judge=${this.endpoint} privateChain=${brief(native.DEFAULT_PRIVATE_BLOCKCHAIN_RID)} activeChain=${brief(this.blockchainRid)} responseSignatureCheck=${this.verifyPubKey ? "on" : "off"}`,
|
|
44709
45006
|
{
|
|
44710
45007
|
judgeEndpoint: this.endpoint,
|
|
44711
|
-
publicBlockchainRid: native.DEFAULT_BLOCKCHAIN_RID,
|
|
44712
45008
|
privateBlockchainRid: native.DEFAULT_PRIVATE_BLOCKCHAIN_RID,
|
|
44713
45009
|
activeBlockchainRid: this.blockchainRid,
|
|
44714
45010
|
responseSignatureCheck: Boolean(this.verifyPubKey)
|
|
@@ -44723,21 +45019,113 @@ var Atbash = class _Atbash {
|
|
|
44723
45019
|
* validated against the trusted allowlist / self-hosted policy; a
|
|
44724
45020
|
* self-hosted endpoint's `verifyPubKey` becomes the client default.
|
|
44725
45021
|
*/
|
|
45022
|
+
/**
|
|
45023
|
+
* Decide which key this client signs as.
|
|
45024
|
+
*
|
|
45025
|
+
* Most specific wins: a key passed in code, then a key file the host named,
|
|
45026
|
+
* then the environment, then the default key file. `config.json` is absent
|
|
45027
|
+
* from that list on purpose — it is a settings file, writable by anything
|
|
45028
|
+
* that can write the user's home and read by every Atbash integration on the
|
|
45029
|
+
* machine, so letting it name the key meant one stray value silently
|
|
45030
|
+
* re-pointed who each of them signed as.
|
|
45031
|
+
*
|
|
45032
|
+
* A named `keyPath` that does not exist throws rather than falling through.
|
|
45033
|
+
* The caller said which file holds its identity; quietly signing as a
|
|
45034
|
+
* different one is the outcome worth refusing.
|
|
45035
|
+
*
|
|
45036
|
+
* @param options - The `fromConfig` options, read for `agentKey` and `keyPath`.
|
|
45037
|
+
* @returns The resolved agent identity.
|
|
45038
|
+
* @throws When a named key file is missing, or no identity can be found.
|
|
45039
|
+
*/
|
|
45040
|
+
static resolveIdentity(options) {
|
|
45041
|
+
if (options.agentKey) return native.loadAgent(options.agentKey);
|
|
45042
|
+
if (options.keyPath) return loadAgentFromFile(options.keyPath);
|
|
45043
|
+
const fromEnv = agentKeyFromEnv();
|
|
45044
|
+
if (fromEnv) return native.loadAgent(fromEnv);
|
|
45045
|
+
try {
|
|
45046
|
+
return loadAgentFromFile();
|
|
45047
|
+
} catch (err) {
|
|
45048
|
+
throw _Atbash.explainStrandedKey(err);
|
|
45049
|
+
}
|
|
45050
|
+
}
|
|
45051
|
+
/**
|
|
45052
|
+
* Add the one thing a machine with no key file needs to hear.
|
|
45053
|
+
*
|
|
45054
|
+
* This is the only path where the operator cannot see what happened: no key
|
|
45055
|
+
* file, and the key they are looking for sits in `config.json`, which no
|
|
45056
|
+
* longer selects the identity. A bare "key file not found" sends them hunting
|
|
45057
|
+
* for a key they already have. Only this branch gets the hint — a caller who
|
|
45058
|
+
* named a `keyPath` is told about that path, where a stranded key is noise.
|
|
45059
|
+
*
|
|
45060
|
+
* @param err - The "key file not found" error from the default lookup.
|
|
45061
|
+
* @returns The same error, or one that also names the key in config.json.
|
|
45062
|
+
*/
|
|
45063
|
+
static explainStrandedKey(err) {
|
|
45064
|
+
const stranded = strandedAgentKey();
|
|
45065
|
+
if (!stranded) return err;
|
|
45066
|
+
let identity;
|
|
45067
|
+
try {
|
|
45068
|
+
identity = native.derivePublicKey(stranded);
|
|
45069
|
+
} catch {
|
|
45070
|
+
identity = "(unreadable)";
|
|
45071
|
+
}
|
|
45072
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
45073
|
+
return new Error(
|
|
45074
|
+
`${message}
|
|
45075
|
+
config.json still holds an "agentKey" (${identity}), but a settings file no longer chooses the signing key. Move it into one of the key files above, or set ATBASH_AGENT_KEY.`
|
|
45076
|
+
);
|
|
45077
|
+
}
|
|
45078
|
+
/**
|
|
45079
|
+
* Say so when `config.json` still holds an agent key.
|
|
45080
|
+
*
|
|
45081
|
+
* Nothing signs with it any more, and silence would leave an operator
|
|
45082
|
+
* believing one identity is in force while another is. The pubkey is named,
|
|
45083
|
+
* not the key, so the line is safe in a log.
|
|
45084
|
+
*
|
|
45085
|
+
* @param logger - The host logger, when one was supplied.
|
|
45086
|
+
*/
|
|
45087
|
+
static warnOnStrandedKey(logger3) {
|
|
45088
|
+
const stranded = strandedAgentKey();
|
|
45089
|
+
if (!stranded) return;
|
|
45090
|
+
let identity;
|
|
45091
|
+
try {
|
|
45092
|
+
identity = native.derivePublicKey(stranded);
|
|
45093
|
+
} catch {
|
|
45094
|
+
identity = "(unreadable)";
|
|
45095
|
+
}
|
|
45096
|
+
logger3?.warn?.(
|
|
45097
|
+
`[atbash] "agentKey" in config.json is ignored \u2014 settings do not choose the signing key. It holds ${identity}; this client signs as the key file or ATBASH_AGENT_KEY instead. Move it into the key file, or delete the field, to silence this.`
|
|
45098
|
+
);
|
|
45099
|
+
}
|
|
44726
45100
|
static fromConfig(options = {}) {
|
|
45101
|
+
const configuredEndpoint = resolve("judgeEndpoint") || void 0;
|
|
45102
|
+
const configuredVerifyPubKey = resolve("judgeVerifyPubKey") || void 0;
|
|
45103
|
+
if (!options.judge && configuredVerifyPubKey && !configuredEndpoint) {
|
|
45104
|
+
throw new Error(
|
|
45105
|
+
"judgeVerifyPubKey / ATBASH_JUDGE_VERIFY_PUBKEY is set but no judge endpoint is configured: set judgeEndpoint / ATBASH_ENDPOINT to the self-hosted judge"
|
|
45106
|
+
);
|
|
45107
|
+
}
|
|
44727
45108
|
const validated = validateJudgeEndpoint(
|
|
44728
|
-
options.judge ??
|
|
45109
|
+
options.judge ?? (configuredVerifyPubKey && configuredEndpoint ? {
|
|
45110
|
+
policy: "self-hosted",
|
|
45111
|
+
endpoint: configuredEndpoint,
|
|
45112
|
+
verifyPubKey: configuredVerifyPubKey
|
|
45113
|
+
} : { endpoint: configuredEndpoint })
|
|
44729
45114
|
);
|
|
44730
|
-
const
|
|
44731
|
-
|
|
44732
|
-
const blockchainRid = resolve("blockchainRid", options.blockchainRid) || void 0;
|
|
45115
|
+
const auth = _Atbash.resolveIdentity(options);
|
|
45116
|
+
_Atbash.warnOnStrandedKey(options.logger);
|
|
44733
45117
|
return new _Atbash(auth.privkey, {
|
|
44734
45118
|
endpoint: validated.url,
|
|
44735
|
-
|
|
45119
|
+
chain: options.chain,
|
|
45120
|
+
network: options.network,
|
|
45121
|
+
blockchainRid: options.blockchainRid,
|
|
44736
45122
|
timeoutMs: options.timeoutMs,
|
|
44737
45123
|
nodeUrls: options.nodeUrls,
|
|
44738
45124
|
orgName: options.orgName,
|
|
44739
45125
|
verifyPubKey: validated.verifyPubKey ?? void 0,
|
|
44740
45126
|
failClosed: options.failClosed,
|
|
45127
|
+
requireEnforcement: options.requireEnforcement,
|
|
45128
|
+
decisionTimeoutMs: options.decisionTimeoutMs,
|
|
44741
45129
|
// ATBASH_DEBUG lets an operator turn diagnostics on without editing a
|
|
44742
45130
|
// host's plugin config, which is usually the harder half.
|
|
44743
45131
|
debug: options.debug ?? /^(1|true|yes)$/i.test(resolve("debug")),
|
|
@@ -44773,7 +45161,7 @@ var Atbash = class _Atbash {
|
|
|
44773
45161
|
return this.track("checkAgentExists", pk, async () => {
|
|
44774
45162
|
const query = { pubkey: pk };
|
|
44775
45163
|
if (network) query.network = network;
|
|
44776
|
-
const brid = this.bridFromChainOpts(
|
|
45164
|
+
const brid = network ? this.bridFromChainOpts({ network }) : await this.defaultOrgBrid();
|
|
44777
45165
|
const resp = await this.http.get(
|
|
44778
45166
|
"/api/ai/exists",
|
|
44779
45167
|
query,
|
|
@@ -44804,6 +45192,15 @@ var Atbash = class _Atbash {
|
|
|
44804
45192
|
* return the signed tx hex. The server broadcasts to chain.
|
|
44805
45193
|
*/
|
|
44806
45194
|
async logToolCall(action, context = "", options = {}) {
|
|
45195
|
+
return this._logToolCall(action, context, options, false);
|
|
45196
|
+
}
|
|
45197
|
+
/**
|
|
45198
|
+
* `raisePreflightErrors` (the judge path, like Python's
|
|
45199
|
+
* `raise_preflight_errors`): a failed registration check throws instead of
|
|
45200
|
+
* becoming `{ success: false }`, so the caller can tell Atbash's "no"
|
|
45201
|
+
* (not registered, or a 4xx) from an outage.
|
|
45202
|
+
*/
|
|
45203
|
+
async _logToolCall(action, context, options, raisePreflightErrors) {
|
|
44807
45204
|
const start = performance.now();
|
|
44808
45205
|
recordCall("logToolCall", void 0, this.auth.pubkey);
|
|
44809
45206
|
let exists;
|
|
@@ -44813,18 +45210,20 @@ var Atbash = class _Atbash {
|
|
|
44813
45210
|
});
|
|
44814
45211
|
} catch (err) {
|
|
44815
45212
|
recordDuration("logToolCall", performance.now() - start, "error");
|
|
45213
|
+
if (raisePreflightErrors) throw err;
|
|
44816
45214
|
return { success: false, toolCallId: null, error: errorMessage(err) };
|
|
44817
45215
|
}
|
|
44818
45216
|
if (!exists) {
|
|
44819
45217
|
recordDuration("logToolCall", performance.now() - start, "error");
|
|
45218
|
+
if (raisePreflightErrors) throw new JudgeRefusalError(AGENT_NOT_REGISTERED);
|
|
44820
45219
|
return {
|
|
44821
45220
|
success: false,
|
|
44822
45221
|
toolCallId: null,
|
|
44823
|
-
error:
|
|
45222
|
+
error: AGENT_NOT_REGISTERED
|
|
44824
45223
|
};
|
|
44825
45224
|
}
|
|
44826
45225
|
const toolCallId = generateToolCallId();
|
|
44827
|
-
const brid = this.
|
|
45226
|
+
const brid = await this.callBrid(options.chainOpts);
|
|
44828
45227
|
const orgKey = options.orgEncryptionPubKey ?? this.orgEncryptionPubKey ?? this._orgKeyFromChain;
|
|
44829
45228
|
try {
|
|
44830
45229
|
const signedHex = orgKey ? signEncryptedToolCall(
|
|
@@ -44874,44 +45273,52 @@ var Atbash = class _Atbash {
|
|
|
44874
45273
|
if (!action?.trim()) {
|
|
44875
45274
|
throw new Error("action is required and cannot be empty.");
|
|
44876
45275
|
}
|
|
45276
|
+
if (isJailHeld(this.auth.pubkey)) return this.localJailBlock();
|
|
45277
|
+
const startedAt = Date.now();
|
|
44877
45278
|
let chainOpts = options.chainOpts;
|
|
44878
|
-
if (options.orgName) {
|
|
45279
|
+
if (options.orgName && this._explicitChain) {
|
|
45280
|
+
chainOpts = options.chainOpts ?? {
|
|
45281
|
+
blockchainRid: this._defaultChain.blockchainRid
|
|
45282
|
+
};
|
|
45283
|
+
} else if (options.orgName && this.forcedNetwork()) {
|
|
45284
|
+
chainOpts = { network: this.forcedNetwork() };
|
|
45285
|
+
} else if (options.orgName) {
|
|
44879
45286
|
const cached = this._chainCache.get(options.orgName);
|
|
44880
45287
|
if (cached) {
|
|
44881
45288
|
chainOpts = { network: cached.network };
|
|
44882
45289
|
} else {
|
|
44883
45290
|
const mapNetwork = await this.getActiveNetworkForOrg(options.orgName);
|
|
44884
45291
|
if (mapNetwork) {
|
|
44885
|
-
|
|
44886
|
-
this._chainCache.set(options.orgName, chain);
|
|
45292
|
+
this._chainCache.set(options.orgName, chainForNetwork(mapNetwork));
|
|
44887
45293
|
chainOpts = { network: mapNetwork };
|
|
44888
45294
|
} else if (!chainOpts?.blockchainRid) {
|
|
44889
|
-
const resolved = await this.resolveChainFromMap(
|
|
45295
|
+
const resolved = await this.resolveChainFromMap(
|
|
45296
|
+
options.orgName,
|
|
45297
|
+
null
|
|
45298
|
+
);
|
|
44890
45299
|
chainOpts = { ...chainOpts, network: resolved.network };
|
|
44891
45300
|
}
|
|
44892
45301
|
}
|
|
44893
45302
|
}
|
|
44894
|
-
const brid = this.
|
|
44895
|
-
const logResult = await this.
|
|
44896
|
-
|
|
44897
|
-
|
|
44898
|
-
chainOpts
|
|
44899
|
-
|
|
45303
|
+
const brid = await this.callBrid(chainOpts);
|
|
45304
|
+
const logResult = await this._logToolCall(
|
|
45305
|
+
action,
|
|
45306
|
+
context,
|
|
45307
|
+
{ toolName: options.toolName, toolArgsJson: options.toolArgsJson, chainOpts },
|
|
45308
|
+
true
|
|
45309
|
+
);
|
|
44900
45310
|
if (!logResult.success || !logResult.toolCallId || !logResult.signedHex) {
|
|
44901
45311
|
throw new Error(logResult.error || "Failed to sign log_tool_call");
|
|
44902
45312
|
}
|
|
44903
|
-
|
|
44904
|
-
|
|
44905
|
-
|
|
44906
|
-
|
|
44907
|
-
|
|
44908
|
-
|
|
44909
|
-
|
|
44910
|
-
|
|
44911
|
-
|
|
44912
|
-
brid
|
|
44913
|
-
);
|
|
44914
|
-
}
|
|
45313
|
+
const judgmentId = generateToolCallId();
|
|
45314
|
+
const signedJudgeAction = native.signJudgeAction(
|
|
45315
|
+
judgmentId,
|
|
45316
|
+
action,
|
|
45317
|
+
context || "",
|
|
45318
|
+
"",
|
|
45319
|
+
this.auth.privkey,
|
|
45320
|
+
brid
|
|
45321
|
+
);
|
|
44915
45322
|
const body = {
|
|
44916
45323
|
tool_call_id: logResult.toolCallId,
|
|
44917
45324
|
agent_pubkey: this.auth.pubkey,
|
|
@@ -44920,10 +45327,8 @@ var Atbash = class _Atbash {
|
|
|
44920
45327
|
};
|
|
44921
45328
|
if (signedJudgeAction) body.signed_judge_action = signedJudgeAction;
|
|
44922
45329
|
if (context) body.context = context;
|
|
44923
|
-
if (options.provider) body.provider = options.provider;
|
|
44924
45330
|
if (options.toolName) body.tool_name = options.toolName;
|
|
44925
45331
|
if (options.toolArgsJson) body.tool_args_json = options.toolArgsJson;
|
|
44926
|
-
if (options.model) body.model = options.model;
|
|
44927
45332
|
if (options.resolved) body.resolved = options.resolved;
|
|
44928
45333
|
if (options.mode) body.mode = options.mode;
|
|
44929
45334
|
let resp;
|
|
@@ -44934,44 +45339,73 @@ var Atbash = class _Atbash {
|
|
|
44934
45339
|
}
|
|
44935
45340
|
if (!resp.ok) throw await this.httpError(resp);
|
|
44936
45341
|
const bodyBytes = Buffer.from(await resp.arrayBuffer());
|
|
44937
|
-
const verifyPubKey = options.verifyPubKey
|
|
45342
|
+
const verifyPubKey = this.effectiveVerifyKey(options.verifyPubKey);
|
|
44938
45343
|
if (verifyPubKey !== void 0) {
|
|
44939
|
-
|
|
44940
|
-
if (!sig) {
|
|
44941
|
-
throw new SignatureVerificationError(
|
|
44942
|
-
"missing X-Atbash-Signature header"
|
|
44943
|
-
);
|
|
44944
|
-
}
|
|
44945
|
-
let ok;
|
|
44946
|
-
try {
|
|
44947
|
-
ok = native.verifySignature(bodyBytes, sig, verifyPubKey);
|
|
44948
|
-
} catch (err) {
|
|
44949
|
-
throw new SignatureVerificationError(
|
|
44950
|
-
`signature verification threw: ${errorMessage(err)}`
|
|
44951
|
-
);
|
|
44952
|
-
}
|
|
44953
|
-
if (!ok) {
|
|
44954
|
-
throw new SignatureVerificationError(
|
|
44955
|
-
"signature does not verify against configured verifyPubKey"
|
|
44956
|
-
);
|
|
44957
|
-
}
|
|
45344
|
+
verifyResponseSignature(bodyBytes, resp, verifyPubKey);
|
|
44958
45345
|
}
|
|
44959
|
-
const
|
|
45346
|
+
const parsed = tryParseJson(bodyBytes.toString("utf-8"));
|
|
45347
|
+
if (!isRecord2(parsed)) {
|
|
45348
|
+
throw new JudgeRefusalError(
|
|
45349
|
+
"The judge's reply could not be read, so the action was not approved."
|
|
45350
|
+
);
|
|
45351
|
+
}
|
|
45352
|
+
const data = parsed;
|
|
44960
45353
|
const rawScore = data.score;
|
|
44961
45354
|
const score = typeof rawScore === "number" && Number.isInteger(rawScore) && rawScore >= 1 && rawScore <= 10 ? rawScore : void 0;
|
|
44962
|
-
|
|
45355
|
+
const result = {
|
|
44963
45356
|
verdict: normalizeVerdict(data.verdict),
|
|
44964
|
-
|
|
44965
|
-
|
|
44966
|
-
|
|
44967
|
-
|
|
44968
|
-
|
|
44969
|
-
|
|
45357
|
+
allow: this.executable(data),
|
|
45358
|
+
actionType: normalizeActionType(data.action_type),
|
|
45359
|
+
reason: wireText(data.reason),
|
|
45360
|
+
confidence: wireNumber(data.confidence),
|
|
45361
|
+
provider: wireText(data.provider),
|
|
45362
|
+
latencyMs: wireNumber(data.latency_ms),
|
|
45363
|
+
toolCallId: wireText(data.tool_call_id, logResult.toolCallId),
|
|
44970
45364
|
onChain: Boolean(data.on_chain),
|
|
44971
45365
|
enforced: Boolean(data.enforced),
|
|
44972
|
-
enforcementMode:
|
|
44973
|
-
status:
|
|
44974
|
-
score
|
|
45366
|
+
enforcementMode: wireText(data.enforcement_mode),
|
|
45367
|
+
status: wireText(data.status),
|
|
45368
|
+
score,
|
|
45369
|
+
refusal: explicitRefusal(data)
|
|
45370
|
+
};
|
|
45371
|
+
return this.applyJailHold(result, startedAt);
|
|
45372
|
+
}
|
|
45373
|
+
/**
|
|
45374
|
+
* Start a local hold on an enforced, on-chain BLOCK (the verdict that jails).
|
|
45375
|
+
* Refuse any other result that lands while the agent is held, or whose
|
|
45376
|
+
* request was already in flight when the block arrived: the server judged it
|
|
45377
|
+
* on pre-jail state.
|
|
45378
|
+
*/
|
|
45379
|
+
applyJailHold(result, startedAt) {
|
|
45380
|
+
const pubkey = this.auth.pubkey;
|
|
45381
|
+
if (result.verdict === "BLOCK" && result.enforced && result.onChain) {
|
|
45382
|
+
recordBlock(pubkey);
|
|
45383
|
+
holdJail(
|
|
45384
|
+
pubkey,
|
|
45385
|
+
() => this.getAgentPolicy(pubkey).then((p) => p.isJailed),
|
|
45386
|
+
() => this.logger.warn?.("[atbash] local jail hold released: the chain did not confirm the jail in time")
|
|
45387
|
+
);
|
|
45388
|
+
return result;
|
|
45389
|
+
}
|
|
45390
|
+
return isJailHeld(pubkey) || blockedSince(pubkey, startedAt) ? this.localJailBlock(result.toolCallId) : result;
|
|
45391
|
+
}
|
|
45392
|
+
/** The server's jailed refusal, produced locally while the agent is held. */
|
|
45393
|
+
localJailBlock(toolCallId = generateToolCallId()) {
|
|
45394
|
+
return {
|
|
45395
|
+
verdict: "BLOCK",
|
|
45396
|
+
allow: false,
|
|
45397
|
+
actionType: "block",
|
|
45398
|
+
reason: "Agent is jailed. All actions are blocked until the organization owner unjails this agent.",
|
|
45399
|
+
confidence: 1,
|
|
45400
|
+
provider: "policy",
|
|
45401
|
+
latencyMs: 0,
|
|
45402
|
+
toolCallId,
|
|
45403
|
+
onChain: false,
|
|
45404
|
+
enforced: true,
|
|
45405
|
+
enforcementMode: "enforce",
|
|
45406
|
+
status: "",
|
|
45407
|
+
score: void 0,
|
|
45408
|
+
refusal: "BLOCK"
|
|
44975
45409
|
};
|
|
44976
45410
|
}
|
|
44977
45411
|
/* ── audit_tool_call (redact → judge → decision) ───────────────────────── */
|
|
@@ -45004,77 +45438,137 @@ var Atbash = class _Atbash {
|
|
|
45004
45438
|
}
|
|
45005
45439
|
try {
|
|
45006
45440
|
this.logger.info?.("[atbash] judge API called", { tool: toolName });
|
|
45007
|
-
const result = await
|
|
45008
|
-
|
|
45009
|
-
|
|
45010
|
-
|
|
45011
|
-
|
|
45012
|
-
|
|
45013
|
-
|
|
45014
|
-
|
|
45015
|
-
|
|
45016
|
-
|
|
45017
|
-
|
|
45018
|
-
|
|
45019
|
-
|
|
45020
|
-
|
|
45021
|
-
}
|
|
45022
|
-
return {
|
|
45023
|
-
allow: true,
|
|
45024
|
-
verdict: "ALLOW",
|
|
45025
|
-
reason: result.reason || "audit tier \u2014 request logged on-chain, no AI enforcement",
|
|
45026
|
-
toolCallId: result.toolCallId
|
|
45027
|
-
};
|
|
45028
|
-
}
|
|
45029
|
-
const action = result.actionType;
|
|
45030
|
-
if (action === "block") {
|
|
45441
|
+
const result = await withDeadline(
|
|
45442
|
+
this.judgeAction(actionText, contextText, {
|
|
45443
|
+
toolName,
|
|
45444
|
+
toolArgsJson: argsJson,
|
|
45445
|
+
orgName: this.orgName,
|
|
45446
|
+
// Passed through unredacted — caller vouches for the contents.
|
|
45447
|
+
resolved: input.resolved
|
|
45448
|
+
}),
|
|
45449
|
+
this.decisionTimeoutMs
|
|
45450
|
+
);
|
|
45451
|
+
return this.decide(result);
|
|
45452
|
+
} catch (err) {
|
|
45453
|
+
if (err instanceof SignatureVerificationError) {
|
|
45454
|
+
this.failJudge(errorMessage(err), err);
|
|
45031
45455
|
return {
|
|
45032
45456
|
allow: false,
|
|
45033
|
-
verdict: "
|
|
45034
|
-
reason:
|
|
45035
|
-
toolCallId: result.toolCallId
|
|
45457
|
+
verdict: "ERROR",
|
|
45458
|
+
reason: `The judge's reply failed its signature check (${errorMessage(err)}), so it was not trusted.`
|
|
45036
45459
|
};
|
|
45037
45460
|
}
|
|
45038
|
-
if (
|
|
45039
|
-
return {
|
|
45040
|
-
allow: false,
|
|
45041
|
-
verdict: "HOLD",
|
|
45042
|
-
reason: result.reason || "held for human confirmation",
|
|
45043
|
-
toolCallId: result.toolCallId
|
|
45044
|
-
};
|
|
45461
|
+
if (err instanceof JudgeRefusalError || err instanceof AtbashAPIError && isRefusalStatus(err.status)) {
|
|
45462
|
+
return { ...this.failJudge(errorMessage(err), err), allow: false };
|
|
45045
45463
|
}
|
|
45046
|
-
|
|
45047
|
-
|
|
45048
|
-
|
|
45049
|
-
|
|
45050
|
-
|
|
45051
|
-
|
|
45052
|
-
|
|
45053
|
-
|
|
45054
|
-
|
|
45055
|
-
|
|
45056
|
-
|
|
45057
|
-
|
|
45058
|
-
|
|
45059
|
-
|
|
45060
|
-
|
|
45061
|
-
|
|
45062
|
-
|
|
45464
|
+
return this.failJudge(errorMessage(err), err);
|
|
45465
|
+
}
|
|
45466
|
+
}
|
|
45467
|
+
/**
|
|
45468
|
+
* The verify key for one call (R4, governor tier-2 review). A per-call key
|
|
45469
|
+
* may only narrow what the client accepts: on a client pinned to a judge
|
|
45470
|
+
* key it must be that same key, never a replacement; on an unpinned client
|
|
45471
|
+
* it adds the check.
|
|
45472
|
+
*/
|
|
45473
|
+
effectiveVerifyKey(perCall) {
|
|
45474
|
+
if (perCall === void 0) return this.verifyPubKey;
|
|
45475
|
+
const key3 = perCall.trim().toLowerCase();
|
|
45476
|
+
if (this.verifyPubKey !== void 0 && key3 !== this.verifyPubKey) {
|
|
45477
|
+
throw new SignatureVerificationError(
|
|
45478
|
+
"a per-call verifyPubKey cannot replace the judge key this client is pinned to"
|
|
45479
|
+
);
|
|
45480
|
+
}
|
|
45481
|
+
return key3;
|
|
45482
|
+
}
|
|
45483
|
+
/**
|
|
45484
|
+
* Collapse a judge result into a {@link Decision}. The most restrictive
|
|
45485
|
+
* signal wins (security review 2026-09-30, H1): `action_type`, `verdict`
|
|
45486
|
+
* and the canonical `allow` are each able to deny, and only a result where
|
|
45487
|
+
* all three agree may execute. A present `allow` / `decision.allow` that is
|
|
45488
|
+
* not exactly `true` is the judge declining to grant permission, so it
|
|
45489
|
+
* denies even under `failClosed: false` — that option relaxes *errors*, it
|
|
45490
|
+
* never overrides a refusal.
|
|
45491
|
+
*/
|
|
45492
|
+
decide(result) {
|
|
45493
|
+
const inner = this.decideInner(result);
|
|
45494
|
+
if (!result.enforcementMode) return inner;
|
|
45495
|
+
return {
|
|
45496
|
+
...inner,
|
|
45497
|
+
enforced: result.enforced,
|
|
45498
|
+
enforcementMode: result.enforcementMode
|
|
45499
|
+
};
|
|
45500
|
+
}
|
|
45501
|
+
decideInner(result) {
|
|
45502
|
+
const toolCallId = result.toolCallId;
|
|
45503
|
+
const deny = (verdict, reason) => ({
|
|
45504
|
+
allow: false,
|
|
45505
|
+
verdict,
|
|
45506
|
+
reason,
|
|
45507
|
+
toolCallId
|
|
45508
|
+
});
|
|
45509
|
+
const notGranted = "the judge response did not grant permission";
|
|
45510
|
+
const held = deny("HOLD", result.reason || "held for human confirmation");
|
|
45511
|
+
const blocked = deny("BLOCK", result.reason || notGranted);
|
|
45512
|
+
if (result.refusal === "BLOCK") return blocked;
|
|
45513
|
+
if (result.verdict === "No verdict") {
|
|
45514
|
+
if (result.actionType === "block") {
|
|
45515
|
+
return blocked;
|
|
45516
|
+
}
|
|
45517
|
+
if (result.actionType === "hold_for_user_confirm") {
|
|
45518
|
+
return held;
|
|
45519
|
+
}
|
|
45520
|
+
if (result.refusal === "HOLD") return held;
|
|
45521
|
+
if (result.status !== "logged") {
|
|
45522
|
+
return this.failJudge(
|
|
45523
|
+
`judge returned no verdict without an audit-tier marker (status: ${result.status || "absent"})`,
|
|
45524
|
+
void 0,
|
|
45525
|
+
toolCallId
|
|
45526
|
+
);
|
|
45527
|
+
}
|
|
45528
|
+
if (this.requireEnforcement) {
|
|
45529
|
+
this.logger.warn?.(
|
|
45530
|
+
"[atbash] judge did not enforce this action (audit tier) and requireEnforcement is on: denied",
|
|
45531
|
+
{ toolCallId }
|
|
45532
|
+
);
|
|
45063
45533
|
return {
|
|
45064
|
-
allow:
|
|
45065
|
-
verdict: "
|
|
45066
|
-
reason:
|
|
45067
|
-
toolCallId
|
|
45534
|
+
allow: false,
|
|
45535
|
+
verdict: "ERROR",
|
|
45536
|
+
reason: "Atbash logged this action but did not check it (audit-tier plan), and this client requires a checked decision. Upgrade the plan, or set requireEnforcement: false for log-only mode.",
|
|
45537
|
+
toolCallId
|
|
45068
45538
|
};
|
|
45069
45539
|
}
|
|
45070
|
-
return
|
|
45071
|
-
|
|
45072
|
-
|
|
45073
|
-
|
|
45074
|
-
|
|
45075
|
-
|
|
45076
|
-
|
|
45540
|
+
if (result.allow !== true) return deny("BLOCK", notGranted);
|
|
45541
|
+
return {
|
|
45542
|
+
allow: true,
|
|
45543
|
+
verdict: "ALLOW",
|
|
45544
|
+
reason: result.reason || "audit tier \u2014 request logged on-chain, no AI enforcement",
|
|
45545
|
+
toolCallId
|
|
45546
|
+
};
|
|
45547
|
+
}
|
|
45548
|
+
const action = result.actionType;
|
|
45549
|
+
if (action === "block") {
|
|
45550
|
+
return deny("BLOCK", result.reason || "Blocked by your organisation's Atbash policy.");
|
|
45077
45551
|
}
|
|
45552
|
+
if (action === "hold_for_user_confirm") {
|
|
45553
|
+
return held;
|
|
45554
|
+
}
|
|
45555
|
+
if (result.refusal === "HOLD") return held;
|
|
45556
|
+
if (action === "allow") {
|
|
45557
|
+
if (result.verdict === "HOLD") return held;
|
|
45558
|
+
if (result.verdict === "BLOCK") return blocked;
|
|
45559
|
+
if (result.allow !== true) return deny("BLOCK", notGranted);
|
|
45560
|
+
return {
|
|
45561
|
+
allow: true,
|
|
45562
|
+
verdict: "ALLOW",
|
|
45563
|
+
reason: result.reason,
|
|
45564
|
+
toolCallId
|
|
45565
|
+
};
|
|
45566
|
+
}
|
|
45567
|
+
return this.failJudge(
|
|
45568
|
+
"unrecognized action_type from judge",
|
|
45569
|
+
void 0,
|
|
45570
|
+
toolCallId
|
|
45571
|
+
);
|
|
45078
45572
|
}
|
|
45079
45573
|
/**
|
|
45080
45574
|
* One exit for every judge failure.
|
|
@@ -45086,41 +45580,74 @@ var Atbash = class _Atbash {
|
|
|
45086
45580
|
*/
|
|
45087
45581
|
failJudge(reason, cause, toolCallId) {
|
|
45088
45582
|
const api2 = cause instanceof AtbashAPIError ? cause : null;
|
|
45583
|
+
const userReason = userFacingReason(reason, api2);
|
|
45089
45584
|
const status = api2 ? ` status=${api2.status || "no-response"}` : "";
|
|
45585
|
+
const detail = this.debug ? ` detail=${truncate(reason, 500)}` : "";
|
|
45090
45586
|
const body = this.debug && api2?.body ? ` body=${truncate(api2.body, 500)}` : "";
|
|
45091
45587
|
this.logger.warn?.(
|
|
45092
|
-
`[atbash] judge API failed \u2014${status} reason=${truncate(
|
|
45588
|
+
`[atbash] judge API failed \u2014${status} reason=${truncate(userReason, 300)}${detail}${body}`,
|
|
45093
45589
|
{
|
|
45094
|
-
reason,
|
|
45095
|
-
...api2 ? { status: api2.status
|
|
45590
|
+
reason: userReason,
|
|
45591
|
+
...api2 ? { status: api2.status } : {},
|
|
45592
|
+
...this.debug && api2 ? { body: api2.body, detail: reason } : {},
|
|
45096
45593
|
endpoint: this.endpoint,
|
|
45097
45594
|
...toolCallId ? { toolCallId } : {}
|
|
45098
45595
|
}
|
|
45099
45596
|
);
|
|
45100
|
-
return this.fail(
|
|
45597
|
+
return this.fail(userReason, toolCallId);
|
|
45598
|
+
}
|
|
45599
|
+
/**
|
|
45600
|
+
* The canonical permission for a response body under this client's
|
|
45601
|
+
* settings: {@link canonicalAllow}, minus the audit tier when
|
|
45602
|
+
* `requireEnforcement` is on. Never more permissive than `auditToolCall`.
|
|
45603
|
+
*/
|
|
45604
|
+
executable(data) {
|
|
45605
|
+
if (!canonicalAllow(data)) return false;
|
|
45606
|
+
return !(this.requireEnforcement && isAuditTierBody(data));
|
|
45101
45607
|
}
|
|
45102
45608
|
fail(reason, toolCallId) {
|
|
45103
45609
|
return { allow: !this.failClosed, verdict: "ERROR", reason, toolCallId };
|
|
45104
45610
|
}
|
|
45105
45611
|
/* ── judgment status ───────────────────────────────────────────────────── */
|
|
45106
|
-
|
|
45612
|
+
/**
|
|
45613
|
+
* Return the current status of a previously submitted judgment.
|
|
45614
|
+
*
|
|
45615
|
+
* `chainOpts` names which chain the judgment was signed against; the SDK
|
|
45616
|
+
* sends it as the `brid` query param the server routes by. Without it the
|
|
45617
|
+
* read uses the same chain `judgeAction` signs for (see `callBrid`): the
|
|
45618
|
+
* client's org chain when it has an `orgName`, else the client default.
|
|
45619
|
+
* A judgment signed with an explicit per-call `chainOpts` (or a per-call
|
|
45620
|
+
* `orgName` on another chain) must be polled with that same `chainOpts`.
|
|
45621
|
+
*/
|
|
45622
|
+
async getJudgmentStatus(judgmentId, agentPubkey, chainOpts) {
|
|
45107
45623
|
const pk = agentPubkey ?? this.auth.pubkey;
|
|
45108
45624
|
return this.track("getJudgmentStatus", pk, async () => {
|
|
45625
|
+
const brid = await this.callBrid(chainOpts);
|
|
45109
45626
|
const resp = await this.http.get(
|
|
45110
45627
|
"/api/v1/judge",
|
|
45111
|
-
{ tool_call_id: judgmentId, agent_pubkey: pk },
|
|
45112
|
-
this.authHeaders()
|
|
45628
|
+
{ tool_call_id: judgmentId, agent_pubkey: pk, brid },
|
|
45629
|
+
this.authHeaders(brid)
|
|
45113
45630
|
);
|
|
45114
45631
|
await this.raiseIfError(resp);
|
|
45115
|
-
const
|
|
45632
|
+
const bytes = Buffer.from(await resp.arrayBuffer());
|
|
45633
|
+
if (this.verifyPubKey !== void 0) {
|
|
45634
|
+
verifyResponseSignature(bytes, resp, this.verifyPubKey);
|
|
45635
|
+
}
|
|
45636
|
+
const parsed = tryParseJson(bytes.toString("utf-8"));
|
|
45637
|
+
const data = isRecord2(parsed) ? parsed : {};
|
|
45638
|
+
const rawId = data.tool_call_id ?? data.judgmentId;
|
|
45639
|
+
const statedId = wireText(rawId);
|
|
45640
|
+
const sameCall = rawId === void 0 || rawId === null || statedId === judgmentId;
|
|
45116
45641
|
return {
|
|
45117
45642
|
status: normalizeStatus(data.status),
|
|
45118
45643
|
verdict: normalizeVerdict(data.verdict),
|
|
45119
|
-
|
|
45120
|
-
|
|
45644
|
+
allow: sameCall && this.executable(data),
|
|
45645
|
+
reason: wireText(data.reason),
|
|
45646
|
+
judgmentId: statedId || judgmentId,
|
|
45121
45647
|
onChain: optBool(data.onChain),
|
|
45122
45648
|
cached: optBool(data.cached),
|
|
45123
|
-
responseTimeMs
|
|
45649
|
+
// The Dashboard sends response_time_ms; responseTimeMs is the spec name.
|
|
45650
|
+
responseTimeMs: optNumber(data.responseTimeMs ?? data.response_time_ms)
|
|
45124
45651
|
};
|
|
45125
45652
|
});
|
|
45126
45653
|
}
|
|
@@ -45129,7 +45656,11 @@ var Atbash = class _Atbash {
|
|
|
45129
45656
|
return this.track(
|
|
45130
45657
|
"getToolCalls",
|
|
45131
45658
|
void 0,
|
|
45132
|
-
() => this.riskEngineRecords(
|
|
45659
|
+
async () => this.riskEngineRecords(
|
|
45660
|
+
"tool-calls",
|
|
45661
|
+
{ limit: maxCount },
|
|
45662
|
+
await this.defaultOrgBrid()
|
|
45663
|
+
)
|
|
45133
45664
|
);
|
|
45134
45665
|
}
|
|
45135
45666
|
async getOrgToolCalls(orgName, maxCount) {
|
|
@@ -45146,25 +45677,32 @@ var Atbash = class _Atbash {
|
|
|
45146
45677
|
return this.track(
|
|
45147
45678
|
"getAgentToolCalls",
|
|
45148
45679
|
agentPubkey,
|
|
45149
|
-
() => this.riskEngineRecords(
|
|
45150
|
-
agent
|
|
45151
|
-
limit: maxCount
|
|
45152
|
-
|
|
45680
|
+
async () => this.riskEngineRecords(
|
|
45681
|
+
"agent-tool-calls",
|
|
45682
|
+
{ agent: agentPubkey, limit: maxCount },
|
|
45683
|
+
await this.defaultOrgBrid()
|
|
45684
|
+
)
|
|
45153
45685
|
);
|
|
45154
45686
|
}
|
|
45155
45687
|
async getToolCallCount() {
|
|
45156
45688
|
return this.track("getToolCallCount", void 0, async () => {
|
|
45157
|
-
const raw2 = await this.riskEngineGet(
|
|
45689
|
+
const raw2 = await this.riskEngineGet(
|
|
45690
|
+
"tool-call-count",
|
|
45691
|
+
{},
|
|
45692
|
+
await this.defaultOrgBrid()
|
|
45693
|
+
);
|
|
45158
45694
|
const n = Number(raw2);
|
|
45159
45695
|
return Number.isFinite(n) ? n : 0;
|
|
45160
45696
|
});
|
|
45161
45697
|
}
|
|
45162
45698
|
async getToolCallFull(toolCallId) {
|
|
45163
45699
|
return this.track("getToolCallFull", void 0, async () => {
|
|
45164
|
-
const raw2 = await this.riskEngineGet(
|
|
45165
|
-
|
|
45166
|
-
|
|
45167
|
-
|
|
45700
|
+
const raw2 = await this.riskEngineGet(
|
|
45701
|
+
"tool-call-full",
|
|
45702
|
+
{ tool_call_id: toolCallId },
|
|
45703
|
+
await this.defaultOrgBrid()
|
|
45704
|
+
);
|
|
45705
|
+
if (!isRecord2(raw2)) return null;
|
|
45168
45706
|
return toToolCallFull(raw2);
|
|
45169
45707
|
});
|
|
45170
45708
|
}
|
|
@@ -45176,7 +45714,7 @@ var Atbash = class _Atbash {
|
|
|
45176
45714
|
{ org: orgName },
|
|
45177
45715
|
brid
|
|
45178
45716
|
);
|
|
45179
|
-
if (!
|
|
45717
|
+
if (!isRecord2(raw2)) return null;
|
|
45180
45718
|
return {
|
|
45181
45719
|
orgName: String(raw2.org_name ?? ""),
|
|
45182
45720
|
tier: String(raw2.tier ?? ""),
|
|
@@ -45249,11 +45787,11 @@ var Atbash = class _Atbash {
|
|
|
45249
45787
|
const resp = await this.http.get(
|
|
45250
45788
|
"/api/insurance",
|
|
45251
45789
|
{ action: "safety-stats" },
|
|
45252
|
-
this.authHeaders()
|
|
45790
|
+
this.authHeaders(await this.defaultOrgBrid())
|
|
45253
45791
|
);
|
|
45254
45792
|
await this.raiseIfError(resp);
|
|
45255
45793
|
const data = await this.json(resp) ?? {};
|
|
45256
|
-
if (
|
|
45794
|
+
if (isRecord2(data.data)) return data.data;
|
|
45257
45795
|
return data;
|
|
45258
45796
|
});
|
|
45259
45797
|
}
|
|
@@ -45269,7 +45807,7 @@ var Atbash = class _Atbash {
|
|
|
45269
45807
|
if (network) params.network = network;
|
|
45270
45808
|
const brid = network ? this.bridFromChainOpts({ network }) : void 0;
|
|
45271
45809
|
const raw2 = await this.riskEngineGet("org-subscription", params, brid);
|
|
45272
|
-
if (!
|
|
45810
|
+
if (!isRecord2(raw2)) return null;
|
|
45273
45811
|
return coerceOrgSubscription(raw2, orgName);
|
|
45274
45812
|
});
|
|
45275
45813
|
}
|
|
@@ -45281,36 +45819,38 @@ var Atbash = class _Atbash {
|
|
|
45281
45819
|
* entry (caller falls back to per-chain subscription resolution).
|
|
45282
45820
|
*/
|
|
45283
45821
|
async getActiveNetworkForOrg(orgName) {
|
|
45822
|
+
let resp;
|
|
45284
45823
|
try {
|
|
45285
|
-
|
|
45824
|
+
resp = await this.http.get(
|
|
45286
45825
|
"/api/org-network",
|
|
45287
|
-
{ org: orgName },
|
|
45826
|
+
{ org: orgName.trim() },
|
|
45288
45827
|
this.authHeaders()
|
|
45289
45828
|
);
|
|
45290
|
-
|
|
45291
|
-
|
|
45292
|
-
if (data?.network === "public" || data?.network === "private") {
|
|
45293
|
-
return data.network;
|
|
45294
|
-
}
|
|
45295
|
-
return null;
|
|
45296
|
-
} catch {
|
|
45297
|
-
return null;
|
|
45829
|
+
} catch (err) {
|
|
45830
|
+
throw this.transportError(err);
|
|
45298
45831
|
}
|
|
45832
|
+
if (resp.status !== 200) throw await this.httpError(resp);
|
|
45833
|
+
const data = await this.json(resp);
|
|
45834
|
+
if (data?.network === "private") return data.network;
|
|
45835
|
+
return null;
|
|
45299
45836
|
}
|
|
45300
45837
|
/**
|
|
45301
45838
|
* Resolve which chain an org's actions should run against. Cached
|
|
45302
45839
|
* per-client by orgName. Resolution order:
|
|
45303
45840
|
* 1. `org_networks` map (authoritative).
|
|
45304
|
-
* 2.
|
|
45305
|
-
*
|
|
45306
|
-
*
|
|
45307
|
-
* Defaults to the public chain when nothing else resolves.
|
|
45841
|
+
* 2. Subscription fallback — the org's subscription row on the chain.
|
|
45842
|
+
* A lookup that finds the org wins outright. Where it finds nothing (a
|
|
45843
|
+
* brand-new org), the client's configured default decides.
|
|
45308
45844
|
*/
|
|
45309
45845
|
async resolveChainForOrg(orgName) {
|
|
45310
|
-
const
|
|
45846
|
+
const name2 = orgName.trim();
|
|
45847
|
+
if (this._explicitChain) return this._defaultChain;
|
|
45848
|
+
const forced = this.forcedNetwork();
|
|
45849
|
+
if (forced) return chainForNetwork(forced);
|
|
45850
|
+
const cached = this._chainCache.get(name2);
|
|
45311
45851
|
if (cached) return cached;
|
|
45312
|
-
const mapNetwork = await this.getActiveNetworkForOrg(
|
|
45313
|
-
return this.resolveChainFromMap(
|
|
45852
|
+
const mapNetwork = await this.getActiveNetworkForOrg(name2);
|
|
45853
|
+
return this.resolveChainFromMap(name2, mapNetwork);
|
|
45314
45854
|
}
|
|
45315
45855
|
/**
|
|
45316
45856
|
* Resolve a chain given an already-fetched `org_networks` map result.
|
|
@@ -45322,36 +45862,28 @@ var Atbash = class _Atbash {
|
|
|
45322
45862
|
const cached = this._chainCache.get(orgName);
|
|
45323
45863
|
if (cached) return cached;
|
|
45324
45864
|
if (mapNetwork) {
|
|
45325
|
-
const chain = mapNetwork
|
|
45865
|
+
const chain = chainForNetwork(mapNetwork);
|
|
45326
45866
|
this._chainCache.set(orgName, chain);
|
|
45327
45867
|
return chain;
|
|
45328
45868
|
}
|
|
45869
|
+
let privSub;
|
|
45329
45870
|
try {
|
|
45330
|
-
|
|
45331
|
-
|
|
45332
|
-
|
|
45333
|
-
|
|
45334
|
-
|
|
45335
|
-
|
|
45336
|
-
|
|
45337
|
-
|
|
45338
|
-
|
|
45339
|
-
|
|
45340
|
-
|
|
45341
|
-
|
|
45342
|
-
|
|
45343
|
-
if (pubSub) {
|
|
45344
|
-
this._chainCache.set(orgName, PUBLIC_CHAIN);
|
|
45345
|
-
return PUBLIC_CHAIN;
|
|
45346
|
-
}
|
|
45347
|
-
if (privSub?.is_private_blockchain) {
|
|
45348
|
-
this._chainCache.set(orgName, PRIVATE_CHAIN);
|
|
45349
|
-
return PRIVATE_CHAIN;
|
|
45350
|
-
}
|
|
45351
|
-
} catch {
|
|
45871
|
+
privSub = await this.getOrgSubscription(orgName, "private");
|
|
45872
|
+
} catch (failure) {
|
|
45873
|
+
const detail = failure instanceof Error ? failure.message : String(failure);
|
|
45874
|
+
throw new AtbashAPIError(
|
|
45875
|
+
failure instanceof AtbashAPIError ? failure.status : 0,
|
|
45876
|
+
`could not resolve the chain for org "${orgName}": ${detail}`,
|
|
45877
|
+
"",
|
|
45878
|
+
this.endpoint
|
|
45879
|
+
);
|
|
45880
|
+
}
|
|
45881
|
+
if (privSub) {
|
|
45882
|
+
this._chainCache.set(orgName, PRIVATE_CHAIN);
|
|
45883
|
+
return PRIVATE_CHAIN;
|
|
45352
45884
|
}
|
|
45353
|
-
this._chainCache.set(orgName,
|
|
45354
|
-
return
|
|
45885
|
+
this._chainCache.set(orgName, this._defaultChain);
|
|
45886
|
+
return this._defaultChain;
|
|
45355
45887
|
}
|
|
45356
45888
|
/** Drop any cached chain resolutions. Useful in tests. */
|
|
45357
45889
|
clearChainCache() {
|
|
@@ -45374,10 +45906,28 @@ var Atbash = class _Atbash {
|
|
|
45374
45906
|
recordCall(name2, void 0, agentPubkey);
|
|
45375
45907
|
try {
|
|
45376
45908
|
const result = await fn();
|
|
45377
|
-
|
|
45909
|
+
const durationMs = performance.now() - start;
|
|
45910
|
+
recordDuration(name2, durationMs, "success");
|
|
45911
|
+
recordEvent({
|
|
45912
|
+
functionName: name2,
|
|
45913
|
+
durationMs,
|
|
45914
|
+
status: "success",
|
|
45915
|
+
agentPubkey,
|
|
45916
|
+
chain: this.blockchainRid
|
|
45917
|
+
});
|
|
45378
45918
|
return result;
|
|
45379
45919
|
} catch (err) {
|
|
45380
|
-
|
|
45920
|
+
const durationMs = performance.now() - start;
|
|
45921
|
+
recordDuration(name2, durationMs, "error");
|
|
45922
|
+
recordEvent({
|
|
45923
|
+
functionName: name2,
|
|
45924
|
+
durationMs,
|
|
45925
|
+
status: "error",
|
|
45926
|
+
agentPubkey,
|
|
45927
|
+
chain: this.blockchainRid,
|
|
45928
|
+
errorClass: err instanceof Error ? err.constructor.name : typeof err,
|
|
45929
|
+
...errorDetail(err)
|
|
45930
|
+
});
|
|
45381
45931
|
throw err;
|
|
45382
45932
|
}
|
|
45383
45933
|
}
|
|
@@ -45388,10 +45938,21 @@ var Atbash = class _Atbash {
|
|
|
45388
45938
|
*/
|
|
45389
45939
|
bridFromChainOpts(chainOpts) {
|
|
45390
45940
|
if (chainOpts?.blockchainRid) return chainOpts.blockchainRid;
|
|
45391
|
-
if (chainOpts?.network
|
|
45392
|
-
if (chainOpts?.network === "public") return PUBLIC_CHAIN.blockchainRid;
|
|
45941
|
+
if (chainOpts?.network) return chainForNetwork(chainOpts.network).blockchainRid;
|
|
45393
45942
|
return this.blockchainRid;
|
|
45394
45943
|
}
|
|
45944
|
+
/**
|
|
45945
|
+
* The chain one call's transactions are signed for: the per-call override
|
|
45946
|
+
* when given, otherwise the client's org, otherwise the client default.
|
|
45947
|
+
* log_tool_call, judge_action and the judgment-status read all use this, so
|
|
45948
|
+
* a request never pairs transactions signed for two different chains.
|
|
45949
|
+
*/
|
|
45950
|
+
async callBrid(chainOpts) {
|
|
45951
|
+
if (chainOpts?.blockchainRid || chainOpts?.network) {
|
|
45952
|
+
return this.bridFromChainOpts(chainOpts);
|
|
45953
|
+
}
|
|
45954
|
+
return await this.defaultOrgBrid() ?? this.blockchainRid;
|
|
45955
|
+
}
|
|
45395
45956
|
/**
|
|
45396
45957
|
* Resolve the dashboard chain used by agent metadata/policy reads.
|
|
45397
45958
|
* Explicit per-call network overrides win; otherwise use the supplied org
|
|
@@ -45402,6 +45963,7 @@ var Atbash = class _Atbash {
|
|
|
45402
45963
|
async resolveAgentLookupNetwork(options) {
|
|
45403
45964
|
if (options.chainOpts?.network) return options.chainOpts.network;
|
|
45404
45965
|
if (options.chainOpts?.blockchainRid) return void 0;
|
|
45966
|
+
if (this._explicitChain) return this._defaultChain.network;
|
|
45405
45967
|
const orgName = options.orgName ?? this.orgName;
|
|
45406
45968
|
if (!orgName) return void 0;
|
|
45407
45969
|
return (await this.resolveChainForOrg(orgName)).network;
|
|
@@ -45414,25 +45976,10 @@ var Atbash = class _Atbash {
|
|
|
45414
45976
|
* trips the server's replay window.
|
|
45415
45977
|
*/
|
|
45416
45978
|
getAuthBearer(brid) {
|
|
45417
|
-
|
|
45418
|
-
const now = Date.now();
|
|
45419
|
-
const cached = this._authBearers.get(chainBrid);
|
|
45420
|
-
if (cached && now - cached.issuedAt < 4 * 60 * 1e3) return cached.hex;
|
|
45421
|
-
const nonce = `auth-${now.toString(36)}-${randomHex(4)}`;
|
|
45422
|
-
const hex = native.signLogToolCall(
|
|
45423
|
-
nonce,
|
|
45424
|
-
`auth:${now}`,
|
|
45425
|
-
"",
|
|
45426
|
-
"auth-bearer",
|
|
45427
|
-
"",
|
|
45428
|
-
this.auth.privkey,
|
|
45429
|
-
chainBrid
|
|
45430
|
-
);
|
|
45431
|
-
this._authBearers.set(chainBrid, { hex, issuedAt: now });
|
|
45432
|
-
return hex;
|
|
45979
|
+
return agentAuthBearer(this.auth, brid ?? this.blockchainRid);
|
|
45433
45980
|
}
|
|
45434
45981
|
authHeaders(brid) {
|
|
45435
|
-
return
|
|
45982
|
+
return agentAuthHeaders(this.auth, brid ?? this.blockchainRid);
|
|
45436
45983
|
}
|
|
45437
45984
|
async riskEngineGet(action, params, brid) {
|
|
45438
45985
|
let resp;
|
|
@@ -45451,14 +45998,14 @@ var Atbash = class _Atbash {
|
|
|
45451
45998
|
async riskEnginePost(body, network, brid) {
|
|
45452
45999
|
let resp;
|
|
45453
46000
|
try {
|
|
45454
|
-
const
|
|
45455
|
-
resp = await this.http.post(
|
|
46001
|
+
const path3 = network ? `/api/risk-engine?network=${encodeURIComponent(network)}` : "/api/risk-engine";
|
|
46002
|
+
resp = await this.http.post(path3, body, this.authHeaders(brid));
|
|
45456
46003
|
} catch (err) {
|
|
45457
46004
|
throw this.transportError(err);
|
|
45458
46005
|
}
|
|
45459
46006
|
if (resp.status !== 200) throw await this.httpError(resp);
|
|
45460
46007
|
const data = await this.json(resp);
|
|
45461
|
-
return
|
|
46008
|
+
return isRecord2(data) ? data : {};
|
|
45462
46009
|
}
|
|
45463
46010
|
async riskEngineRecords(action, params, brid) {
|
|
45464
46011
|
const raw2 = await this.riskEngineGet(action, params, brid);
|
|
@@ -45467,15 +46014,40 @@ var Atbash = class _Atbash {
|
|
|
45467
46014
|
}
|
|
45468
46015
|
/**
|
|
45469
46016
|
* BRID for an org — one round-trip to the map, honoring the client's chain
|
|
45470
|
-
* cache.
|
|
45471
|
-
*
|
|
46017
|
+
* cache. A "brand-new org" (nothing anywhere names its chain) is not an
|
|
46018
|
+
* error — `resolveChainForOrg` returns the client default for that case and
|
|
46019
|
+
* this helper returns its BRID. A transport failure or non-200 from
|
|
46020
|
+
* `/api/org-network` IS an error and propagates: the caller cannot fall
|
|
46021
|
+
* back to the default chain on outage, because with multi-chain live that
|
|
46022
|
+
* silently reads from the wrong chain. Matches the Python binding's
|
|
46023
|
+
* `_brid_for_org` semantics.
|
|
45472
46024
|
*/
|
|
45473
46025
|
async bridForOrg(orgName) {
|
|
45474
|
-
|
|
45475
|
-
|
|
45476
|
-
|
|
45477
|
-
|
|
45478
|
-
|
|
46026
|
+
return (await this.resolveChainForOrg(orgName)).blockchainRid;
|
|
46027
|
+
}
|
|
46028
|
+
/**
|
|
46029
|
+
* BRID for the client's configured default org, if it has one.
|
|
46030
|
+
*
|
|
46031
|
+
* Calls that carry no `orgName` argument are not chain-less: they still
|
|
46032
|
+
* belong to `this.orgName`, and that org lives on exactly one chain. Routing
|
|
46033
|
+
* them by the constructor's chain instead means a client configured
|
|
46034
|
+
* `network: "private"` reads the private chain for an org that lives on
|
|
46035
|
+
* public, and gets an empty answer rather than an error. So where an org is
|
|
46036
|
+
* known the org decides the chain, and the constructor's chain is what is
|
|
46037
|
+
* left when no org is known at all — the order `resolveAgentLookupNetwork`
|
|
46038
|
+
* already applies to agent metadata reads, and the order the dashboard
|
|
46039
|
+
* applies in `resolveChainForWallet`.
|
|
46040
|
+
*
|
|
46041
|
+
* Undefined when there is no default org, so callers keep falling back to
|
|
46042
|
+
* the client default.
|
|
46043
|
+
*/
|
|
46044
|
+
/** The switch's chain, unless this client named one of its own. */
|
|
46045
|
+
forcedNetwork() {
|
|
46046
|
+
return this._explicitChain ? void 0 : this._forcedNetwork;
|
|
46047
|
+
}
|
|
46048
|
+
async defaultOrgBrid() {
|
|
46049
|
+
if (this._explicitChain || !this.orgName) return void 0;
|
|
46050
|
+
return this.bridForOrg(this.orgName);
|
|
45479
46051
|
}
|
|
45480
46052
|
async raiseIfError(resp) {
|
|
45481
46053
|
if (resp.ok) return;
|
|
@@ -45487,7 +46059,8 @@ var Atbash = class _Atbash {
|
|
|
45487
46059
|
resp.status,
|
|
45488
46060
|
await safeText(resp),
|
|
45489
46061
|
resp.statusText,
|
|
45490
|
-
this.endpoint
|
|
46062
|
+
this.endpoint,
|
|
46063
|
+
requestPath(resp.url)
|
|
45491
46064
|
);
|
|
45492
46065
|
}
|
|
45493
46066
|
/**
|
|
@@ -45500,14 +46073,11 @@ var Atbash = class _Atbash {
|
|
|
45500
46073
|
transportError(err) {
|
|
45501
46074
|
if (err instanceof HttpTransportError) {
|
|
45502
46075
|
if (this.debug) {
|
|
45503
|
-
this.logger.warn?.(
|
|
45504
|
-
|
|
45505
|
-
|
|
45506
|
-
|
|
45507
|
-
|
|
45508
|
-
endpoint: this.endpoint
|
|
45509
|
-
}
|
|
45510
|
-
);
|
|
46076
|
+
this.logger.warn?.(`[atbash] transport failed \u2014 kind=${err.kind}`, {
|
|
46077
|
+
kind: err.kind,
|
|
46078
|
+
cause: err.cause instanceof Error ? err.cause.message : String(err.cause ?? ""),
|
|
46079
|
+
endpoint: this.endpoint
|
|
46080
|
+
});
|
|
45511
46081
|
}
|
|
45512
46082
|
return new AtbashAPIError(0, err.message, "", this.endpoint);
|
|
45513
46083
|
}
|
|
@@ -45539,6 +46109,66 @@ var Atbash = class _Atbash {
|
|
|
45539
46109
|
return native.containsEvasionCharacters(text);
|
|
45540
46110
|
}
|
|
45541
46111
|
};
|
|
46112
|
+
function userFacingReason(reason, api2) {
|
|
46113
|
+
if (api2 && api2.status > 0) {
|
|
46114
|
+
const where = ` (HTTP ${api2.status}${api2.path ? ` from ${api2.path}` : ""})`;
|
|
46115
|
+
const b = api2.body.toLowerCase();
|
|
46116
|
+
if (b.includes("agent not registered")) {
|
|
46117
|
+
return `Agent not registered with Atbash: onboard it in the Atbash dashboard${where}.`;
|
|
46118
|
+
}
|
|
46119
|
+
if (b.includes("jailed")) {
|
|
46120
|
+
return `This agent is jailed; unjail it in the Atbash dashboard${where}.`;
|
|
46121
|
+
}
|
|
46122
|
+
if (b.includes("agent has no policy") || b.includes("no policy configured")) {
|
|
46123
|
+
return `This agent has no policy; attach one in the Atbash dashboard${where}.`;
|
|
46124
|
+
}
|
|
46125
|
+
if (b.includes("audit tier") || b.includes("verdict disabled") || b.includes("verdict not supported")) {
|
|
46126
|
+
return `The organisation's plan does not include checked decisions${where}.`;
|
|
46127
|
+
}
|
|
46128
|
+
return `The Atbash judge answered with an error${where}, so the action was not approved.`;
|
|
46129
|
+
}
|
|
46130
|
+
const text = api2 ? api2.body || reason : reason;
|
|
46131
|
+
return truncate(text.replace(/https?:\/\/[^\s)]+/g, "the judge"), 300);
|
|
46132
|
+
}
|
|
46133
|
+
var DEFAULT_DECISION_TIMEOUT_MS = 6e4;
|
|
46134
|
+
async function withDeadline(p, ms) {
|
|
46135
|
+
let timer;
|
|
46136
|
+
const deadline = new Promise((_, reject) => {
|
|
46137
|
+
timer = setTimeout(
|
|
46138
|
+
() => reject(
|
|
46139
|
+
new Error(
|
|
46140
|
+
`The judge did not give a decision within ${Math.round(ms / 1e3)} s, so the action was not approved. Check the network, or raise decisionTimeoutMs.`
|
|
46141
|
+
)
|
|
46142
|
+
),
|
|
46143
|
+
ms
|
|
46144
|
+
);
|
|
46145
|
+
});
|
|
46146
|
+
p.catch(() => void 0);
|
|
46147
|
+
try {
|
|
46148
|
+
return await Promise.race([p, deadline]);
|
|
46149
|
+
} finally {
|
|
46150
|
+
clearTimeout(timer);
|
|
46151
|
+
}
|
|
46152
|
+
}
|
|
46153
|
+
function verifyResponseSignature(bodyBytes, resp, verifyPubKey) {
|
|
46154
|
+
const sig = resp.headers.get("X-Atbash-Signature");
|
|
46155
|
+
if (!sig) {
|
|
46156
|
+
throw new SignatureVerificationError("missing X-Atbash-Signature header");
|
|
46157
|
+
}
|
|
46158
|
+
let ok;
|
|
46159
|
+
try {
|
|
46160
|
+
ok = native.verifySignature(bodyBytes, sig, verifyPubKey);
|
|
46161
|
+
} catch (err) {
|
|
46162
|
+
throw new SignatureVerificationError(
|
|
46163
|
+
`signature verification threw: ${errorMessage(err)}`
|
|
46164
|
+
);
|
|
46165
|
+
}
|
|
46166
|
+
if (!ok) {
|
|
46167
|
+
throw new SignatureVerificationError(
|
|
46168
|
+
"signature does not verify against configured verifyPubKey"
|
|
46169
|
+
);
|
|
46170
|
+
}
|
|
46171
|
+
}
|
|
45542
46172
|
function baseToolCall(raw2) {
|
|
45543
46173
|
return {
|
|
45544
46174
|
toolCallId: String(raw2.tool_call_id ?? ""),
|
|
@@ -45605,15 +46235,17 @@ function coerceOrgSubscription(raw2, orgName) {
|
|
|
45605
46235
|
is_active: Boolean(raw2.is_active)
|
|
45606
46236
|
};
|
|
45607
46237
|
}
|
|
45608
|
-
function
|
|
46238
|
+
function isRecord2(v) {
|
|
45609
46239
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
45610
46240
|
}
|
|
45611
46241
|
function optString(v) {
|
|
45612
46242
|
if (v === null || v === void 0) return void 0;
|
|
46243
|
+
if (typeof v === "object" || typeof v === "function") return void 0;
|
|
45613
46244
|
return typeof v === "string" ? v : String(v);
|
|
45614
46245
|
}
|
|
45615
46246
|
function optNumber(v) {
|
|
45616
46247
|
if (v === null || v === void 0) return void 0;
|
|
46248
|
+
if (typeof v === "object" || typeof v === "function") return void 0;
|
|
45617
46249
|
const n = Number(v);
|
|
45618
46250
|
return Number.isFinite(n) ? n : void 0;
|
|
45619
46251
|
}
|
|
@@ -45628,9 +46260,13 @@ function tryParseJson(text) {
|
|
|
45628
46260
|
return void 0;
|
|
45629
46261
|
}
|
|
45630
46262
|
}
|
|
45631
|
-
function
|
|
45632
|
-
|
|
45633
|
-
|
|
46263
|
+
function requestPath(url) {
|
|
46264
|
+
if (!url) return void 0;
|
|
46265
|
+
try {
|
|
46266
|
+
return new URL(url).pathname || void 0;
|
|
46267
|
+
} catch {
|
|
46268
|
+
return void 0;
|
|
46269
|
+
}
|
|
45634
46270
|
}
|
|
45635
46271
|
async function safeText(resp) {
|
|
45636
46272
|
try {
|
|
@@ -45661,31 +46297,20 @@ function truncate(text, limit = MAX_ACTION_LEN) {
|
|
|
45661
46297
|
return text.slice(0, limit) + "\u2026";
|
|
45662
46298
|
}
|
|
45663
46299
|
|
|
45664
|
-
// src-ts/key-path.ts
|
|
45665
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46300
|
+
// src-ts/browser/key-path.ts
|
|
45666
46301
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45667
|
-
import { homedir } from "os";
|
|
45668
|
-
import { join as join2 } from "path";
|
|
45669
|
-
var KEY_DIR_REL = ".config/atbash";
|
|
45670
46302
|
var KEY_FILENAMES = ["guard-client-key", "atbash-client-key"];
|
|
45671
|
-
|
|
45672
|
-
|
|
45673
|
-
}
|
|
45674
|
-
function expandHome(p) {
|
|
45675
|
-
if (!p.startsWith("~/")) return p;
|
|
45676
|
-
return join2(home(), p.slice(2));
|
|
45677
|
-
}
|
|
46303
|
+
var unavailable = (name2) => {
|
|
46304
|
+
throw new Error(`${name2} is not available in the browser bundle`);
|
|
46305
|
+
};
|
|
45678
46306
|
function keyPathCandidates() {
|
|
45679
|
-
return
|
|
46307
|
+
return unavailable("keyPathCandidates");
|
|
45680
46308
|
}
|
|
45681
|
-
function chooseKeyPath(
|
|
45682
|
-
|
|
45683
|
-
const candidates = keyPathCandidates();
|
|
45684
|
-
return candidates.find(exists) ?? candidates[0];
|
|
46309
|
+
function chooseKeyPath(_input, _exists) {
|
|
46310
|
+
return unavailable("chooseKeyPath");
|
|
45685
46311
|
}
|
|
45686
46312
|
|
|
45687
46313
|
// src-ts/redact.ts
|
|
45688
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45689
46314
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45690
46315
|
function redactJsonStrings(value) {
|
|
45691
46316
|
if (typeof value === "string") {
|
|
@@ -45705,7 +46330,6 @@ function redactJsonStrings(value) {
|
|
|
45705
46330
|
}
|
|
45706
46331
|
|
|
45707
46332
|
// src-ts/signature.ts
|
|
45708
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45709
46333
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45710
46334
|
function verifyJudgeResponseSignature(bodyBytes, signatureHex, pubKeyHex) {
|
|
45711
46335
|
if (!signatureHex) {
|
|
@@ -45729,7 +46353,6 @@ function verifyJudgeResponseSignature(bodyBytes, signatureHex, pubKeyHex) {
|
|
|
45729
46353
|
}
|
|
45730
46354
|
|
|
45731
46355
|
// src-ts/memory/boot-sync-message.ts
|
|
45732
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45733
46356
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45734
46357
|
var BOOT_SYNC_HINT = "check the chain endpoint and orgName if the cause above does not explain it";
|
|
45735
46358
|
function bootSyncFailureLine(cause) {
|
|
@@ -45742,11 +46365,9 @@ function bootSyncFailureLine(cause) {
|
|
|
45742
46365
|
}
|
|
45743
46366
|
|
|
45744
46367
|
// src-ts/memory/index.ts
|
|
45745
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45746
46368
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45747
46369
|
|
|
45748
46370
|
// src-ts/browser/memory-crypto.ts
|
|
45749
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45750
46371
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45751
46372
|
var { Buffer: Buffer4 } = index;
|
|
45752
46373
|
var HKDF_INFO = new TextEncoder().encode("atbash:memory-encryption");
|
|
@@ -45822,7 +46443,6 @@ async function decryptMemoryContent2(ciphertext, nonce, key3) {
|
|
|
45822
46443
|
}
|
|
45823
46444
|
|
|
45824
46445
|
// src-ts/browser/memory-scan.ts
|
|
45825
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45826
46446
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45827
46447
|
var STUB_MSG2 = "not available in @atbash/sdk browser bundle \u2014 scan memory server-side";
|
|
45828
46448
|
async function scanMemory(_entry, _auth, _opts) {
|
|
@@ -45833,7 +46453,6 @@ async function scanMemoryBatch(_entries, _auth, _opts) {
|
|
|
45833
46453
|
}
|
|
45834
46454
|
|
|
45835
46455
|
// src-ts/browser/memory-chain.ts
|
|
45836
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45837
46456
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45838
46457
|
var STUB_MSG3 = "not available in @atbash/sdk browser bundle \u2014 commit/rollback memory server-side";
|
|
45839
46458
|
async function commitMemoryVersion(_plaintext, _auth, _opts) {
|
|
@@ -45842,13 +46461,13 @@ async function commitMemoryVersion(_plaintext, _auth, _opts) {
|
|
|
45842
46461
|
async function getActiveMemoryId(_auth, _chainOpts) {
|
|
45843
46462
|
throw new Error(`getActiveMemoryId ${STUB_MSG3}`);
|
|
45844
46463
|
}
|
|
45845
|
-
async function
|
|
45846
|
-
throw new Error(`
|
|
46464
|
+
async function getRecentAgentMemory(_auth, _chainOpts) {
|
|
46465
|
+
throw new Error(`getRecentAgentMemory ${STUB_MSG3}`);
|
|
45847
46466
|
}
|
|
45848
|
-
async function
|
|
45849
|
-
throw new Error(`
|
|
46467
|
+
async function getActiveAgentMemory(_auth, _chainOpts) {
|
|
46468
|
+
throw new Error(`getActiveAgentMemory ${STUB_MSG3}`);
|
|
45850
46469
|
}
|
|
45851
|
-
async function getMemoryHistory(_auth, _chainOpts) {
|
|
46470
|
+
async function getMemoryHistory(_auth, _chainOpts, _filePath, _page) {
|
|
45852
46471
|
throw new Error(`getMemoryHistory ${STUB_MSG3}`);
|
|
45853
46472
|
}
|
|
45854
46473
|
async function getMemoryById(_id, _auth, _chainOpts) {
|
|
@@ -45862,7 +46481,6 @@ async function rollbackMemory(_toId, _reason, _auth, _opts) {
|
|
|
45862
46481
|
}
|
|
45863
46482
|
|
|
45864
46483
|
// src-ts/browser/memory-classifier.ts
|
|
45865
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
45866
46484
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45867
46485
|
var STUB_MSG4 = "not available in @atbash/sdk browser bundle \u2014 classify memory writes server-side";
|
|
45868
46486
|
var DEFAULT_MEMORY_WRITE_TOOL_NAMES = [
|
|
@@ -45885,119 +46503,23 @@ function classifyMemoryWrite(_event, _ctx, _opts = {}) {
|
|
|
45885
46503
|
throw new Error(`classifyMemoryWrite ${STUB_MSG4}`);
|
|
45886
46504
|
}
|
|
45887
46505
|
|
|
45888
|
-
// src-ts/memory
|
|
45889
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46506
|
+
// src-ts/browser/memory-guard.ts
|
|
45890
46507
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
45891
|
-
|
|
45892
|
-
function
|
|
45893
|
-
|
|
45894
|
-
const ev = event ?? {};
|
|
45895
|
-
const c = ctx ?? {};
|
|
45896
|
-
const argsCandidate = ev.params ?? c.params ?? ev.args ?? c.args ?? ev.arguments ?? c.arguments;
|
|
45897
|
-
const argsObj = argsCandidate && typeof argsCandidate === "object" ? argsCandidate : {};
|
|
45898
|
-
const argsKeys = Object.keys(argsObj).slice(0, 20);
|
|
45899
|
-
const pickedPath = typeof argsObj.file_path === "string" && argsObj.file_path || typeof argsObj.path === "string" && argsObj.path || typeof argsObj.filename === "string" && argsObj.filename || null;
|
|
45900
|
-
const editsArr = Array.isArray(argsObj.edits) ? argsObj.edits : null;
|
|
45901
|
-
const firstEditKeys = editsArr && editsArr[0] && typeof editsArr[0] === "object" ? Object.keys(editsArr[0]).slice(0, 10) : null;
|
|
45902
|
-
const tool = ev.toolName ?? c.tool?.name ?? c.toolName ?? c.name ?? "(none)";
|
|
45903
|
-
logger2.info("[atbash][probe] before_tool_call", {
|
|
45904
|
-
toolName: tool,
|
|
45905
|
-
eventKeys: Object.keys(ev).slice(0, 20),
|
|
45906
|
-
ctxKeys: Object.keys(c).slice(0, 20),
|
|
45907
|
-
argsKeys,
|
|
45908
|
-
pickedPath,
|
|
45909
|
-
firstEditKeys,
|
|
45910
|
-
editsCount: editsArr?.length,
|
|
45911
|
-
memoryWrite: !!memEntry,
|
|
45912
|
-
memoryPath: memEntry?.key
|
|
45913
|
-
});
|
|
46508
|
+
var STUB_MSG5 = "not available in @atbash/sdk browser bundle \u2014 guard memory writes agent-side";
|
|
46509
|
+
async function guardMemoryWrite(_input) {
|
|
46510
|
+
throw new Error(`guardMemoryWrite ${STUB_MSG5}`);
|
|
45914
46511
|
}
|
|
45915
|
-
|
|
45916
|
-
|
|
45917
|
-
|
|
45918
|
-
|
|
45919
|
-
|
|
45920
|
-
|
|
45921
|
-
|
|
45922
|
-
|
|
45923
|
-
threshold,
|
|
45924
|
-
patterns,
|
|
45925
|
-
toolNames,
|
|
45926
|
-
enforce = true,
|
|
45927
|
-
debug: debug2 = false,
|
|
45928
|
-
logger: logger2,
|
|
45929
|
-
memoryFilePath
|
|
45930
|
-
} = input;
|
|
45931
|
-
const memEntry = classifyMemoryWrite(event, ctx, { patterns, toolNames });
|
|
45932
|
-
if (debug2) emitDebugProbe(event, ctx, memEntry, logger2);
|
|
45933
|
-
if (!memEntry) return { handled: false };
|
|
45934
|
-
let scanResult;
|
|
45935
|
-
try {
|
|
45936
|
-
scanResult = await scanMemory(memEntry, auth, {
|
|
45937
|
-
endpoint,
|
|
45938
|
-
verifyPubKey,
|
|
45939
|
-
orgName,
|
|
45940
|
-
threshold
|
|
45941
|
-
});
|
|
45942
|
-
} catch (err) {
|
|
45943
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
45944
|
-
logger2?.warn?.("[atbash] memory scan failed", {
|
|
45945
|
-
path: memEntry.key,
|
|
45946
|
-
reason
|
|
45947
|
-
});
|
|
45948
|
-
return {
|
|
45949
|
-
handled: true,
|
|
45950
|
-
decision: enforce ? { allow: false, block: true, reason } : { allow: true }
|
|
45951
|
-
};
|
|
45952
|
-
}
|
|
45953
|
-
if (scanResult.verdict === "red") {
|
|
45954
|
-
logger2?.warn?.("[atbash] memory BLOCK", {
|
|
45955
|
-
path: memEntry.key,
|
|
45956
|
-
reason: scanResult.reason
|
|
45957
|
-
});
|
|
45958
|
-
return {
|
|
45959
|
-
handled: true,
|
|
45960
|
-
decision: enforce ? { allow: false, block: true, reason: scanResult.reason } : { allow: true },
|
|
45961
|
-
scanResult,
|
|
45962
|
-
committed: false
|
|
45963
|
-
};
|
|
45964
|
-
}
|
|
45965
|
-
const isManagedMemoryFile = memoryFilePath !== void 0 && path3.resolve(memEntry.key) === path3.resolve(memoryFilePath);
|
|
45966
|
-
if (isManagedMemoryFile) {
|
|
45967
|
-
commitMemoryVersion(memEntry.value, auth, {
|
|
45968
|
-
score: scanResult.score,
|
|
45969
|
-
orgName,
|
|
45970
|
-
endpoint
|
|
45971
|
-
}).catch((err) => {
|
|
45972
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
45973
|
-
logger2?.warn?.("[atbash] memory commit to chain failed", {
|
|
45974
|
-
path: memEntry.key,
|
|
45975
|
-
reason
|
|
45976
|
-
});
|
|
45977
|
-
});
|
|
45978
|
-
} else {
|
|
45979
|
-
logger2?.info?.(
|
|
45980
|
-
"[atbash] scanned but not committed \u2014 not the managed memory file",
|
|
45981
|
-
{
|
|
45982
|
-
path: memEntry.key,
|
|
45983
|
-
memoryFilePath: memoryFilePath ?? "(not configured)"
|
|
45984
|
-
}
|
|
45985
|
-
);
|
|
45986
|
-
}
|
|
45987
|
-
logger2?.info?.(
|
|
45988
|
-
scanResult.verdict === "yellow" ? "[atbash] memory HOLD" : "[atbash] memory ALLOW",
|
|
45989
|
-
{ path: memEntry.key, score: scanResult.score, reason: scanResult.reason }
|
|
45990
|
-
);
|
|
45991
|
-
return {
|
|
45992
|
-
handled: true,
|
|
45993
|
-
decision: { allow: true },
|
|
45994
|
-
scanResult,
|
|
45995
|
-
committed: isManagedMemoryFile
|
|
45996
|
-
};
|
|
46512
|
+
|
|
46513
|
+
// src-ts/browser/memory-slot.ts
|
|
46514
|
+
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
46515
|
+
var unavailable2 = (name2) => {
|
|
46516
|
+
throw new Error(`${name2} is not available in the browser bundle`);
|
|
46517
|
+
};
|
|
46518
|
+
function memorySlotOf(_target, _home, _root2, _extraHomes, _p) {
|
|
46519
|
+
return unavailable2("memorySlotOf");
|
|
45997
46520
|
}
|
|
45998
46521
|
|
|
45999
46522
|
// src-ts/memory/sync.ts
|
|
46000
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46001
46523
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
46002
46524
|
var MemoryIntegrityError = class extends Error {
|
|
46003
46525
|
constructor(id, reason) {
|
|
@@ -46015,7 +46537,7 @@ async function syncLocalMemory(auth, pointer, opts = {}) {
|
|
|
46015
46537
|
if (withinTtl) {
|
|
46016
46538
|
return { drifted: false, checked: false, pointer };
|
|
46017
46539
|
}
|
|
46018
|
-
const currentId = await getActiveMemoryId(auth, opts.chainOpts);
|
|
46540
|
+
const currentId = await getActiveMemoryId(auth, opts.chainOpts, opts.filePath);
|
|
46019
46541
|
const nextPointer = { activeId: currentId, checkedAt: now };
|
|
46020
46542
|
if (currentId === pointer.activeId) {
|
|
46021
46543
|
return { drifted: false, checked: true, pointer: nextPointer };
|
|
@@ -46031,9 +46553,8 @@ async function syncLocalMemory(auth, pointer, opts = {}) {
|
|
|
46031
46553
|
}
|
|
46032
46554
|
|
|
46033
46555
|
// src-ts/browser/memory-pointer-store.ts
|
|
46034
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46035
46556
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
46036
|
-
var
|
|
46557
|
+
var unavailable3 = (name2) => {
|
|
46037
46558
|
throw new Error(`${name2} is not available in the browser bundle`);
|
|
46038
46559
|
};
|
|
46039
46560
|
var PointerStore = class {
|
|
@@ -46047,38 +46568,35 @@ var PointerStore = class {
|
|
|
46047
46568
|
}
|
|
46048
46569
|
};
|
|
46049
46570
|
function defaultPointerPath(_workspaceDir) {
|
|
46050
|
-
return
|
|
46571
|
+
return unavailable3("defaultPointerPath");
|
|
46051
46572
|
}
|
|
46052
46573
|
|
|
46053
46574
|
// src-ts/browser/memory-file-logger.ts
|
|
46054
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46055
46575
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
46056
|
-
var
|
|
46576
|
+
var unavailable4 = (name2) => {
|
|
46057
46577
|
throw new Error(`${name2} is not available in the browser bundle`);
|
|
46058
46578
|
};
|
|
46059
46579
|
function createFileLogger(_logFilePath, _hostLogger) {
|
|
46060
|
-
return
|
|
46580
|
+
return unavailable4("createFileLogger");
|
|
46061
46581
|
}
|
|
46062
46582
|
function defaultPluginLogPath(_workspaceDir) {
|
|
46063
|
-
return
|
|
46583
|
+
return unavailable4("defaultPluginLogPath");
|
|
46064
46584
|
}
|
|
46065
46585
|
|
|
46066
46586
|
// src-ts/browser/memory-read-classifier.ts
|
|
46067
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46068
46587
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
46069
|
-
var
|
|
46588
|
+
var STUB_MSG6 = "not available in @atbash/sdk browser bundle \u2014 classify memory reads server-side";
|
|
46070
46589
|
var DEFAULT_MEMORY_READ_TOOL_NAMES = [
|
|
46071
46590
|
"memory_search",
|
|
46072
46591
|
"memory_get"
|
|
46073
46592
|
];
|
|
46074
46593
|
function classifyMemoryRead(_event, _ctx, _opts = {}) {
|
|
46075
|
-
throw new Error(`classifyMemoryRead ${
|
|
46594
|
+
throw new Error(`classifyMemoryRead ${STUB_MSG6}`);
|
|
46076
46595
|
}
|
|
46077
46596
|
|
|
46078
46597
|
// src-ts/browser/memory-guard-manager.ts
|
|
46079
|
-
init_define_ATBASH_CHROMIA_NODE_URLS();
|
|
46080
46598
|
init_define_ATBASH_PRIVATE_NODE_URLS();
|
|
46081
|
-
var
|
|
46599
|
+
var unavailable5 = (name2) => {
|
|
46082
46600
|
throw new Error(`${name2} is not available in the browser bundle`);
|
|
46083
46601
|
};
|
|
46084
46602
|
var MemoryGuardManager = class {
|
|
@@ -46098,7 +46616,7 @@ var MemoryGuardManager = class {
|
|
|
46098
46616
|
}
|
|
46099
46617
|
};
|
|
46100
46618
|
function createMemoryGuardManager(_opts) {
|
|
46101
|
-
return
|
|
46619
|
+
return unavailable5("createMemoryGuardManager");
|
|
46102
46620
|
}
|
|
46103
46621
|
|
|
46104
46622
|
// src-ts/index.ts
|
|
@@ -46160,8 +46678,6 @@ export {
|
|
|
46160
46678
|
Atbash,
|
|
46161
46679
|
AtbashAPIError,
|
|
46162
46680
|
BOOT_SYNC_HINT,
|
|
46163
|
-
DEFAULT_BLOCKCHAIN_RID,
|
|
46164
|
-
DEFAULT_CHROMIA_NODE_URLS,
|
|
46165
46681
|
DEFAULT_ENDPOINT,
|
|
46166
46682
|
DEFAULT_MEMORY_PATH_PATTERNS,
|
|
46167
46683
|
DEFAULT_MEMORY_READ_TOOL_NAMES,
|
|
@@ -46169,19 +46685,25 @@ export {
|
|
|
46169
46685
|
EciesDomain,
|
|
46170
46686
|
HttpClient,
|
|
46171
46687
|
HttpTransportError,
|
|
46688
|
+
JudgeRefusalError,
|
|
46172
46689
|
KEY_FILENAMES,
|
|
46173
46690
|
MemoryGuardManager,
|
|
46174
46691
|
MemoryIntegrityError,
|
|
46692
|
+
PRIVATE_CHAIN,
|
|
46175
46693
|
PointerStore,
|
|
46176
46694
|
SignatureVerificationError,
|
|
46177
46695
|
bootSyncFailureLine,
|
|
46178
46696
|
buildAllowedJudgeHosts,
|
|
46697
|
+
canonicalAllow,
|
|
46698
|
+
chainForNetwork,
|
|
46179
46699
|
chooseKeyPath,
|
|
46180
46700
|
claimHashHex,
|
|
46181
46701
|
classifyMemoryRead,
|
|
46182
46702
|
classifyMemoryWrite,
|
|
46183
46703
|
columnAad,
|
|
46184
46704
|
commitMemoryVersion,
|
|
46705
|
+
configureEvents,
|
|
46706
|
+
configureJailHold,
|
|
46185
46707
|
containsEvasionCharacters2 as containsEvasionCharacters,
|
|
46186
46708
|
containsSecret2 as containsSecret,
|
|
46187
46709
|
createFileLogger,
|
|
@@ -46197,25 +46719,29 @@ export {
|
|
|
46197
46719
|
encryptForOrg,
|
|
46198
46720
|
encryptMemoryContent2 as encryptMemoryContent,
|
|
46199
46721
|
encryptedLength,
|
|
46722
|
+
eventsAreOn,
|
|
46200
46723
|
flushTelemetry,
|
|
46201
46724
|
generateKeypair2 as generateKeypair,
|
|
46202
|
-
|
|
46725
|
+
getActiveAgentMemory,
|
|
46203
46726
|
getActiveMemoryId,
|
|
46204
|
-
getAllAgentMemory,
|
|
46205
46727
|
getConfigDir,
|
|
46206
46728
|
getConfigPath,
|
|
46207
46729
|
getMemoryById,
|
|
46208
46730
|
getMemoryHistory,
|
|
46731
|
+
getRecentAgentMemory,
|
|
46209
46732
|
getRollbackHistory,
|
|
46210
46733
|
guardMemoryWrite,
|
|
46211
46734
|
isEnvelope,
|
|
46735
|
+
isJailHeld,
|
|
46212
46736
|
isValidPrivateKey2 as isValidPrivateKey,
|
|
46213
46737
|
keyFingerprintOf,
|
|
46214
46738
|
keyPathCandidates,
|
|
46215
46739
|
loadAgent2 as loadAgent,
|
|
46216
46740
|
loadAgentFromFile,
|
|
46217
46741
|
loadUserConfig,
|
|
46742
|
+
memorySlotOf,
|
|
46218
46743
|
normalizeActionForHash,
|
|
46744
|
+
normalizeActionType,
|
|
46219
46745
|
normalizeForMatching2 as normalizeForMatching,
|
|
46220
46746
|
normalizeStatus,
|
|
46221
46747
|
normalizeVerdict,
|
|
@@ -46224,8 +46750,10 @@ export {
|
|
|
46224
46750
|
pubkeyToHex,
|
|
46225
46751
|
recordCall,
|
|
46226
46752
|
recordDuration,
|
|
46753
|
+
recordEvent,
|
|
46227
46754
|
redactJsonStrings,
|
|
46228
46755
|
redactSecrets2 as redactSecrets,
|
|
46756
|
+
releaseJailHolds,
|
|
46229
46757
|
resolve,
|
|
46230
46758
|
resolveKeyPath,
|
|
46231
46759
|
rollbackMemory,
|
|
@@ -46264,4 +46792,3 @@ postchain-client/built/esm/index.js:
|
|
|
46264
46792
|
@noble/ciphers/utils.js:
|
|
46265
46793
|
(*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) *)
|
|
46266
46794
|
*/
|
|
46267
|
-
//# sourceMappingURL=browser.mjs.map
|