@blockrun/clawrouter 0.12.93 → 0.12.95
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/dist/cli.js +133 -54
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +75 -54
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -924,6 +924,8 @@ type UsageEntry = {
|
|
|
924
924
|
baselineCost: number;
|
|
925
925
|
savings: number;
|
|
926
926
|
latencyMs: number;
|
|
927
|
+
/** Whether the request completed successfully or ended in an error */
|
|
928
|
+
status?: "success" | "error";
|
|
927
929
|
/** Input (prompt) tokens reported by the provider */
|
|
928
930
|
inputTokens?: number;
|
|
929
931
|
/** Output (completion) tokens reported by the provider */
|
package/dist/index.js
CHANGED
|
@@ -25957,7 +25957,7 @@ var require_permessage_deflate = __commonJS({
|
|
|
25957
25957
|
var kBuffers = /* @__PURE__ */ Symbol("buffers");
|
|
25958
25958
|
var kError = /* @__PURE__ */ Symbol("error");
|
|
25959
25959
|
var zlibLimiter;
|
|
25960
|
-
var
|
|
25960
|
+
var PerMessageDeflate2 = class {
|
|
25961
25961
|
/**
|
|
25962
25962
|
* Creates a PerMessageDeflate instance.
|
|
25963
25963
|
*
|
|
@@ -25968,6 +25968,9 @@ var require_permessage_deflate = __commonJS({
|
|
|
25968
25968
|
* acknowledge disabling of client context takeover
|
|
25969
25969
|
* @param {Number} [options.concurrencyLimit=10] The number of concurrent
|
|
25970
25970
|
* calls to zlib
|
|
25971
|
+
* @param {Boolean} [options.isServer=false] Create the instance in either
|
|
25972
|
+
* server or client mode
|
|
25973
|
+
* @param {Number} [options.maxPayload=0] The maximum allowed message length
|
|
25971
25974
|
* @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
|
|
25972
25975
|
* use of a custom server window size
|
|
25973
25976
|
* @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
|
|
@@ -25978,15 +25981,12 @@ var require_permessage_deflate = __commonJS({
|
|
|
25978
25981
|
* deflate
|
|
25979
25982
|
* @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
|
|
25980
25983
|
* inflate
|
|
25981
|
-
* @param {Boolean} [isServer=false] Create the instance in either server or
|
|
25982
|
-
* client mode
|
|
25983
|
-
* @param {Number} [maxPayload=0] The maximum allowed message length
|
|
25984
25984
|
*/
|
|
25985
|
-
constructor(options
|
|
25986
|
-
this._maxPayload = maxPayload | 0;
|
|
25985
|
+
constructor(options) {
|
|
25987
25986
|
this._options = options || {};
|
|
25988
25987
|
this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024;
|
|
25989
|
-
this.
|
|
25988
|
+
this._maxPayload = this._options.maxPayload | 0;
|
|
25989
|
+
this._isServer = !!this._options.isServer;
|
|
25990
25990
|
this._deflate = null;
|
|
25991
25991
|
this._inflate = null;
|
|
25992
25992
|
this.params = null;
|
|
@@ -26295,7 +26295,7 @@ var require_permessage_deflate = __commonJS({
|
|
|
26295
26295
|
});
|
|
26296
26296
|
}
|
|
26297
26297
|
};
|
|
26298
|
-
module.exports =
|
|
26298
|
+
module.exports = PerMessageDeflate2;
|
|
26299
26299
|
function deflateOnData(chunk) {
|
|
26300
26300
|
this[kBuffers].push(chunk);
|
|
26301
26301
|
this[kTotalLength] += chunk.length;
|
|
@@ -26530,7 +26530,7 @@ var require_receiver = __commonJS({
|
|
|
26530
26530
|
"node_modules/ws/lib/receiver.js"(exports, module) {
|
|
26531
26531
|
"use strict";
|
|
26532
26532
|
var { Writable } = __require("stream");
|
|
26533
|
-
var
|
|
26533
|
+
var PerMessageDeflate2 = require_permessage_deflate();
|
|
26534
26534
|
var {
|
|
26535
26535
|
BINARY_TYPES,
|
|
26536
26536
|
EMPTY_BUFFER,
|
|
@@ -26697,7 +26697,7 @@ var require_receiver = __commonJS({
|
|
|
26697
26697
|
return;
|
|
26698
26698
|
}
|
|
26699
26699
|
const compressed = (buf[0] & 64) === 64;
|
|
26700
|
-
if (compressed && !this._extensions[
|
|
26700
|
+
if (compressed && !this._extensions[PerMessageDeflate2.extensionName]) {
|
|
26701
26701
|
const error = this.createError(
|
|
26702
26702
|
RangeError,
|
|
26703
26703
|
"RSV1 must be clear",
|
|
@@ -26941,7 +26941,7 @@ var require_receiver = __commonJS({
|
|
|
26941
26941
|
* @private
|
|
26942
26942
|
*/
|
|
26943
26943
|
decompress(data, cb) {
|
|
26944
|
-
const perMessageDeflate = this._extensions[
|
|
26944
|
+
const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName];
|
|
26945
26945
|
perMessageDeflate.decompress(data, this._fin, (err, buf) => {
|
|
26946
26946
|
if (err) return cb(err);
|
|
26947
26947
|
if (buf.length) {
|
|
@@ -27123,7 +27123,7 @@ var require_sender = __commonJS({
|
|
|
27123
27123
|
"use strict";
|
|
27124
27124
|
var { Duplex } = __require("stream");
|
|
27125
27125
|
var { randomFillSync } = __require("crypto");
|
|
27126
|
-
var
|
|
27126
|
+
var PerMessageDeflate2 = require_permessage_deflate();
|
|
27127
27127
|
var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants();
|
|
27128
27128
|
var { isBlob, isValidStatusCode } = require_validation();
|
|
27129
27129
|
var { mask: applyMask, toBuffer } = require_buffer_util();
|
|
@@ -27407,7 +27407,7 @@ var require_sender = __commonJS({
|
|
|
27407
27407
|
* @public
|
|
27408
27408
|
*/
|
|
27409
27409
|
send(data, options, cb) {
|
|
27410
|
-
const perMessageDeflate = this._extensions[
|
|
27410
|
+
const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName];
|
|
27411
27411
|
let opcode = options.binary ? 2 : 1;
|
|
27412
27412
|
let rsv1 = options.compress;
|
|
27413
27413
|
let byteLength;
|
|
@@ -27531,7 +27531,7 @@ var require_sender = __commonJS({
|
|
|
27531
27531
|
this.sendFrame(_Sender.frame(data, options), cb);
|
|
27532
27532
|
return;
|
|
27533
27533
|
}
|
|
27534
|
-
const perMessageDeflate = this._extensions[
|
|
27534
|
+
const perMessageDeflate = this._extensions[PerMessageDeflate2.extensionName];
|
|
27535
27535
|
this._bufferedBytes += options[kByteLength];
|
|
27536
27536
|
this._state = DEFLATING;
|
|
27537
27537
|
perMessageDeflate.compress(data, options.fin, (_, buf) => {
|
|
@@ -27969,11 +27969,11 @@ var require_extension = __commonJS({
|
|
|
27969
27969
|
return offers;
|
|
27970
27970
|
}
|
|
27971
27971
|
function format(extensions) {
|
|
27972
|
-
return Object.keys(extensions).map((
|
|
27973
|
-
let configurations = extensions[
|
|
27972
|
+
return Object.keys(extensions).map((extension2) => {
|
|
27973
|
+
let configurations = extensions[extension2];
|
|
27974
27974
|
if (!Array.isArray(configurations)) configurations = [configurations];
|
|
27975
27975
|
return configurations.map((params) => {
|
|
27976
|
-
return [
|
|
27976
|
+
return [extension2].concat(
|
|
27977
27977
|
Object.keys(params).map((k) => {
|
|
27978
27978
|
let values = params[k];
|
|
27979
27979
|
if (!Array.isArray(values)) values = [values];
|
|
@@ -27999,7 +27999,7 @@ var require_websocket = __commonJS({
|
|
|
27999
27999
|
var { randomBytes: randomBytes3, createHash: createHash4 } = __require("crypto");
|
|
28000
28000
|
var { Duplex, Readable } = __require("stream");
|
|
28001
28001
|
var { URL: URL2 } = __require("url");
|
|
28002
|
-
var
|
|
28002
|
+
var PerMessageDeflate2 = require_permessage_deflate();
|
|
28003
28003
|
var Receiver2 = require_receiver();
|
|
28004
28004
|
var Sender2 = require_sender();
|
|
28005
28005
|
var { isBlob } = require_validation();
|
|
@@ -28207,8 +28207,8 @@ var require_websocket = __commonJS({
|
|
|
28207
28207
|
this.emit("close", this._closeCode, this._closeMessage);
|
|
28208
28208
|
return;
|
|
28209
28209
|
}
|
|
28210
|
-
if (this._extensions[
|
|
28211
|
-
this._extensions[
|
|
28210
|
+
if (this._extensions[PerMessageDeflate2.extensionName]) {
|
|
28211
|
+
this._extensions[PerMessageDeflate2.extensionName].cleanup();
|
|
28212
28212
|
}
|
|
28213
28213
|
this._receiver.removeAllListeners();
|
|
28214
28214
|
this._readyState = _WebSocket.CLOSED;
|
|
@@ -28370,7 +28370,7 @@ var require_websocket = __commonJS({
|
|
|
28370
28370
|
fin: true,
|
|
28371
28371
|
...options
|
|
28372
28372
|
};
|
|
28373
|
-
if (!this._extensions[
|
|
28373
|
+
if (!this._extensions[PerMessageDeflate2.extensionName]) {
|
|
28374
28374
|
opts.compress = false;
|
|
28375
28375
|
}
|
|
28376
28376
|
this._sender.send(data || EMPTY_BUFFER, opts, cb);
|
|
@@ -28496,7 +28496,7 @@ var require_websocket = __commonJS({
|
|
|
28496
28496
|
} else {
|
|
28497
28497
|
try {
|
|
28498
28498
|
parsedUrl = new URL2(address2);
|
|
28499
|
-
} catch
|
|
28499
|
+
} catch {
|
|
28500
28500
|
throw new SyntaxError(`Invalid URL: ${address2}`);
|
|
28501
28501
|
}
|
|
28502
28502
|
}
|
|
@@ -28544,13 +28544,13 @@ var require_websocket = __commonJS({
|
|
|
28544
28544
|
opts.path = parsedUrl.pathname + parsedUrl.search;
|
|
28545
28545
|
opts.timeout = opts.handshakeTimeout;
|
|
28546
28546
|
if (opts.perMessageDeflate) {
|
|
28547
|
-
perMessageDeflate = new
|
|
28548
|
-
opts.perMessageDeflate
|
|
28549
|
-
false,
|
|
28550
|
-
opts.maxPayload
|
|
28551
|
-
);
|
|
28547
|
+
perMessageDeflate = new PerMessageDeflate2({
|
|
28548
|
+
...opts.perMessageDeflate,
|
|
28549
|
+
isServer: false,
|
|
28550
|
+
maxPayload: opts.maxPayload
|
|
28551
|
+
});
|
|
28552
28552
|
opts.headers["Sec-WebSocket-Extensions"] = format({
|
|
28553
|
-
[
|
|
28553
|
+
[PerMessageDeflate2.extensionName]: perMessageDeflate.offer()
|
|
28554
28554
|
});
|
|
28555
28555
|
}
|
|
28556
28556
|
if (protocols.length) {
|
|
@@ -28693,19 +28693,19 @@ var require_websocket = __commonJS({
|
|
|
28693
28693
|
return;
|
|
28694
28694
|
}
|
|
28695
28695
|
const extensionNames = Object.keys(extensions);
|
|
28696
|
-
if (extensionNames.length !== 1 || extensionNames[0] !==
|
|
28696
|
+
if (extensionNames.length !== 1 || extensionNames[0] !== PerMessageDeflate2.extensionName) {
|
|
28697
28697
|
const message = "Server indicated an extension that was not requested";
|
|
28698
28698
|
abortHandshake(websocket, socket, message);
|
|
28699
28699
|
return;
|
|
28700
28700
|
}
|
|
28701
28701
|
try {
|
|
28702
|
-
perMessageDeflate.accept(extensions[
|
|
28702
|
+
perMessageDeflate.accept(extensions[PerMessageDeflate2.extensionName]);
|
|
28703
28703
|
} catch (err) {
|
|
28704
28704
|
const message = "Invalid Sec-WebSocket-Extensions header";
|
|
28705
28705
|
abortHandshake(websocket, socket, message);
|
|
28706
28706
|
return;
|
|
28707
28707
|
}
|
|
28708
|
-
websocket._extensions[
|
|
28708
|
+
websocket._extensions[PerMessageDeflate2.extensionName] = perMessageDeflate;
|
|
28709
28709
|
}
|
|
28710
28710
|
websocket.setSocket(socket, head, {
|
|
28711
28711
|
allowSynchronousEvents: opts.allowSynchronousEvents,
|
|
@@ -29024,9 +29024,9 @@ var require_websocket_server = __commonJS({
|
|
|
29024
29024
|
var http2 = __require("http");
|
|
29025
29025
|
var { Duplex } = __require("stream");
|
|
29026
29026
|
var { createHash: createHash4 } = __require("crypto");
|
|
29027
|
-
var
|
|
29028
|
-
var
|
|
29029
|
-
var
|
|
29027
|
+
var extension2 = require_extension();
|
|
29028
|
+
var PerMessageDeflate2 = require_permessage_deflate();
|
|
29029
|
+
var subprotocol2 = require_subprotocol();
|
|
29030
29030
|
var WebSocket2 = require_websocket();
|
|
29031
29031
|
var { CLOSE_TIMEOUT, GUID, kWebSocket } = require_constants();
|
|
29032
29032
|
var keyRegex = /^[+/0-9A-Za-z]{22}==$/;
|
|
@@ -29249,7 +29249,7 @@ var require_websocket_server = __commonJS({
|
|
|
29249
29249
|
let protocols = /* @__PURE__ */ new Set();
|
|
29250
29250
|
if (secWebSocketProtocol !== void 0) {
|
|
29251
29251
|
try {
|
|
29252
|
-
protocols =
|
|
29252
|
+
protocols = subprotocol2.parse(secWebSocketProtocol);
|
|
29253
29253
|
} catch (err) {
|
|
29254
29254
|
const message = "Invalid Sec-WebSocket-Protocol header";
|
|
29255
29255
|
abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);
|
|
@@ -29259,16 +29259,16 @@ var require_websocket_server = __commonJS({
|
|
|
29259
29259
|
const secWebSocketExtensions = req.headers["sec-websocket-extensions"];
|
|
29260
29260
|
const extensions = {};
|
|
29261
29261
|
if (this.options.perMessageDeflate && secWebSocketExtensions !== void 0) {
|
|
29262
|
-
const perMessageDeflate = new
|
|
29263
|
-
this.options.perMessageDeflate,
|
|
29264
|
-
true,
|
|
29265
|
-
this.options.maxPayload
|
|
29266
|
-
);
|
|
29262
|
+
const perMessageDeflate = new PerMessageDeflate2({
|
|
29263
|
+
...this.options.perMessageDeflate,
|
|
29264
|
+
isServer: true,
|
|
29265
|
+
maxPayload: this.options.maxPayload
|
|
29266
|
+
});
|
|
29267
29267
|
try {
|
|
29268
|
-
const offers =
|
|
29269
|
-
if (offers[
|
|
29270
|
-
perMessageDeflate.accept(offers[
|
|
29271
|
-
extensions[
|
|
29268
|
+
const offers = extension2.parse(secWebSocketExtensions);
|
|
29269
|
+
if (offers[PerMessageDeflate2.extensionName]) {
|
|
29270
|
+
perMessageDeflate.accept(offers[PerMessageDeflate2.extensionName]);
|
|
29271
|
+
extensions[PerMessageDeflate2.extensionName] = perMessageDeflate;
|
|
29272
29272
|
}
|
|
29273
29273
|
} catch (err) {
|
|
29274
29274
|
const message = "Invalid or unacceptable Sec-WebSocket-Extensions header";
|
|
@@ -29339,10 +29339,10 @@ var require_websocket_server = __commonJS({
|
|
|
29339
29339
|
ws._protocol = protocol;
|
|
29340
29340
|
}
|
|
29341
29341
|
}
|
|
29342
|
-
if (extensions[
|
|
29343
|
-
const params = extensions[
|
|
29344
|
-
const value =
|
|
29345
|
-
[
|
|
29342
|
+
if (extensions[PerMessageDeflate2.extensionName]) {
|
|
29343
|
+
const params = extensions[PerMessageDeflate2.extensionName].params;
|
|
29344
|
+
const value = extension2.format({
|
|
29345
|
+
[PerMessageDeflate2.extensionName]: [params]
|
|
29346
29346
|
});
|
|
29347
29347
|
headers.push(`Sec-WebSocket-Extensions: ${value}`);
|
|
29348
29348
|
ws._extensions = extensions;
|
|
@@ -29410,13 +29410,16 @@ var require_websocket_server = __commonJS({
|
|
|
29410
29410
|
});
|
|
29411
29411
|
|
|
29412
29412
|
// node_modules/ws/wrapper.mjs
|
|
29413
|
-
var import_stream, import_receiver, import_sender, import_websocket, import_websocket_server, wrapper_default;
|
|
29413
|
+
var import_stream, import_extension, import_permessage_deflate, import_receiver, import_sender, import_subprotocol, import_websocket, import_websocket_server, wrapper_default;
|
|
29414
29414
|
var init_wrapper = __esm({
|
|
29415
29415
|
"node_modules/ws/wrapper.mjs"() {
|
|
29416
29416
|
"use strict";
|
|
29417
29417
|
import_stream = __toESM(require_stream(), 1);
|
|
29418
|
+
import_extension = __toESM(require_extension(), 1);
|
|
29419
|
+
import_permessage_deflate = __toESM(require_permessage_deflate(), 1);
|
|
29418
29420
|
import_receiver = __toESM(require_receiver(), 1);
|
|
29419
29421
|
import_sender = __toESM(require_sender(), 1);
|
|
29422
|
+
import_subprotocol = __toESM(require_subprotocol(), 1);
|
|
29420
29423
|
import_websocket = __toESM(require_websocket(), 1);
|
|
29421
29424
|
import_websocket_server = __toESM(require_websocket_server(), 1);
|
|
29422
29425
|
wrapper_default = import_websocket.default;
|
|
@@ -46573,8 +46576,8 @@ var x402Client = class _x402Client {
|
|
|
46573
46576
|
* @param extension - The client extension to register
|
|
46574
46577
|
* @returns The x402Client instance for chaining
|
|
46575
46578
|
*/
|
|
46576
|
-
registerExtension(
|
|
46577
|
-
this.registeredExtensions.set(
|
|
46579
|
+
registerExtension(extension2) {
|
|
46580
|
+
this.registeredExtensions.set(extension2.key, extension2);
|
|
46578
46581
|
return this;
|
|
46579
46582
|
}
|
|
46580
46583
|
/**
|
|
@@ -46720,9 +46723,9 @@ var x402Client = class _x402Client {
|
|
|
46720
46723
|
return paymentPayload;
|
|
46721
46724
|
}
|
|
46722
46725
|
let enriched = paymentPayload;
|
|
46723
|
-
for (const [key,
|
|
46724
|
-
if (key in paymentRequired.extensions &&
|
|
46725
|
-
enriched = await
|
|
46726
|
+
for (const [key, extension2] of this.registeredExtensions) {
|
|
46727
|
+
if (key in paymentRequired.extensions && extension2.enrichPaymentPayload) {
|
|
46728
|
+
enriched = await extension2.enrichPaymentPayload(enriched, paymentRequired);
|
|
46726
46729
|
}
|
|
46727
46730
|
}
|
|
46728
46731
|
return enriched;
|
|
@@ -52959,6 +52962,7 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
|
|
|
52959
52962
|
let accumulatedContent = "";
|
|
52960
52963
|
let responseInputTokens;
|
|
52961
52964
|
let responseOutputTokens;
|
|
52965
|
+
let requestHadError = false;
|
|
52962
52966
|
const isChatCompletion = req.url?.includes("/chat/completions");
|
|
52963
52967
|
const sessionId = getSessionId(req.headers);
|
|
52964
52968
|
let effectiveSessionId = sessionId;
|
|
@@ -54223,6 +54227,7 @@ data: [DONE]
|
|
|
54223
54227
|
const rawErrBody = lastError?.body || structuredMessage;
|
|
54224
54228
|
const errStatus = lastError?.status || 502;
|
|
54225
54229
|
const transformedErr = transformPaymentError(rawErrBody);
|
|
54230
|
+
requestHadError = true;
|
|
54226
54231
|
if (headersSentEarly) {
|
|
54227
54232
|
let errPayload;
|
|
54228
54233
|
try {
|
|
@@ -54266,6 +54271,21 @@ data: [DONE]
|
|
|
54266
54271
|
completedAt: Date.now()
|
|
54267
54272
|
});
|
|
54268
54273
|
}
|
|
54274
|
+
const errModel = routingDecision?.model ?? modelId;
|
|
54275
|
+
if (errModel) {
|
|
54276
|
+
const errPayment = paymentStore.getStore()?.amountUsd ?? 0;
|
|
54277
|
+
logUsage({
|
|
54278
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
54279
|
+
model: errModel,
|
|
54280
|
+
tier: routingDecision?.tier ?? "DIRECT",
|
|
54281
|
+
cost: errPayment,
|
|
54282
|
+
baselineCost: errPayment,
|
|
54283
|
+
savings: 0,
|
|
54284
|
+
latencyMs: Date.now() - startTime,
|
|
54285
|
+
status: "error"
|
|
54286
|
+
}).catch(() => {
|
|
54287
|
+
});
|
|
54288
|
+
}
|
|
54269
54289
|
return;
|
|
54270
54290
|
}
|
|
54271
54291
|
const responseChunks = [];
|
|
@@ -54600,6 +54620,7 @@ data: [DONE]
|
|
|
54600
54620
|
baselineCost: logBaseline,
|
|
54601
54621
|
savings: logSavings,
|
|
54602
54622
|
latencyMs: Date.now() - startTime,
|
|
54623
|
+
status: requestHadError ? "error" : "success",
|
|
54603
54624
|
...responseInputTokens !== void 0 && { inputTokens: responseInputTokens },
|
|
54604
54625
|
...responseOutputTokens !== void 0 && { outputTokens: responseOutputTokens }
|
|
54605
54626
|
};
|