@blockrun/clawrouter 0.12.95 → 0.12.96
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/auth.d.ts +82 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +388 -0
- package/dist/auth.js.map +1 -0
- package/dist/balance.d.ts +97 -0
- package/dist/balance.d.ts.map +1 -0
- package/dist/balance.js +157 -0
- package/dist/balance.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +256 -54994
- package/dist/cli.js.map +1 -1
- package/dist/compression/codebook.d.ts +24 -0
- package/dist/compression/codebook.d.ts.map +1 -0
- package/dist/compression/codebook.js +119 -0
- package/dist/compression/codebook.js.map +1 -0
- package/dist/compression/index.d.ts +33 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +246 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/compression/layers/deduplication.d.ts +28 -0
- package/dist/compression/layers/deduplication.d.ts.map +1 -0
- package/dist/compression/layers/deduplication.js +101 -0
- package/dist/compression/layers/deduplication.js.map +1 -0
- package/dist/compression/layers/dictionary.d.ts +21 -0
- package/dist/compression/layers/dictionary.d.ts.map +1 -0
- package/dist/compression/layers/dictionary.js +73 -0
- package/dist/compression/layers/dictionary.js.map +1 -0
- package/dist/compression/layers/dynamic-codebook.d.ts +26 -0
- package/dist/compression/layers/dynamic-codebook.d.ts.map +1 -0
- package/dist/compression/layers/dynamic-codebook.js +149 -0
- package/dist/compression/layers/dynamic-codebook.js.map +1 -0
- package/dist/compression/layers/json-compact.d.ts +23 -0
- package/dist/compression/layers/json-compact.d.ts.map +1 -0
- package/dist/compression/layers/json-compact.js +79 -0
- package/dist/compression/layers/json-compact.js.map +1 -0
- package/dist/compression/layers/observation.d.ts +21 -0
- package/dist/compression/layers/observation.d.ts.map +1 -0
- package/dist/compression/layers/observation.js +130 -0
- package/dist/compression/layers/observation.js.map +1 -0
- package/dist/compression/layers/paths.d.ts +24 -0
- package/dist/compression/layers/paths.d.ts.map +1 -0
- package/dist/compression/layers/paths.js +110 -0
- package/dist/compression/layers/paths.js.map +1 -0
- package/dist/compression/layers/whitespace.d.ts +27 -0
- package/dist/compression/layers/whitespace.d.ts.map +1 -0
- package/dist/compression/layers/whitespace.js +60 -0
- package/dist/compression/layers/whitespace.js.map +1 -0
- package/dist/compression/types.d.ts +84 -0
- package/dist/compression/types.d.ts.map +1 -0
- package/dist/compression/types.js +27 -0
- package/dist/compression/types.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/dedup.d.ts +34 -0
- package/dist/dedup.d.ts.map +1 -0
- package/dist/dedup.js +150 -0
- package/dist/dedup.js.map +1 -0
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +375 -0
- package/dist/doctor.js.map +1 -0
- package/dist/error-classification.test.d.ts +2 -0
- package/dist/error-classification.test.d.ts.map +1 -0
- package/dist/error-classification.test.js +59 -0
- package/dist/error-classification.test.js.map +1 -0
- package/dist/errors.d.ts +54 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +85 -0
- package/dist/errors.js.map +1 -0
- package/dist/exclude-models.d.ts +28 -0
- package/dist/exclude-models.d.ts.map +1 -0
- package/dist/exclude-models.integration.test.d.ts +2 -0
- package/dist/exclude-models.integration.test.d.ts.map +1 -0
- package/dist/exclude-models.integration.test.js +46 -0
- package/dist/exclude-models.integration.test.js.map +1 -0
- package/dist/exclude-models.js +70 -0
- package/dist/exclude-models.js.map +1 -0
- package/dist/exclude-models.test.d.ts +5 -0
- package/dist/exclude-models.test.d.ts.map +1 -0
- package/dist/exclude-models.test.js +95 -0
- package/dist/exclude-models.test.js.map +1 -0
- package/dist/fs-read.d.ts +11 -0
- package/dist/fs-read.d.ts.map +1 -0
- package/dist/fs-read.js +47 -0
- package/dist/fs-read.js.map +1 -0
- package/dist/index.d.ts +34 -1368
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1071 -56194
- package/dist/index.js.map +1 -1
- package/dist/journal.d.ts +67 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +184 -0
- package/dist/journal.js.map +1 -0
- package/dist/journal.test.d.ts +2 -0
- package/dist/journal.test.d.ts.map +1 -0
- package/dist/journal.test.js +201 -0
- package/dist/journal.test.js.map +1 -0
- package/dist/logger.d.ts +33 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +35 -0
- package/dist/logger.js.map +1 -0
- package/dist/models.d.ts +107 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +941 -0
- package/dist/models.js.map +1 -0
- package/dist/models.test.d.ts +2 -0
- package/dist/models.test.d.ts.map +1 -0
- package/dist/models.test.js +38 -0
- package/dist/models.test.js.map +1 -0
- package/dist/partners/index.d.ts +8 -0
- package/dist/partners/index.d.ts.map +1 -0
- package/dist/partners/index.js +6 -0
- package/dist/partners/index.js.map +1 -0
- package/dist/partners/registry.d.ts +51 -0
- package/dist/partners/registry.d.ts.map +1 -0
- package/dist/partners/registry.js +256 -0
- package/dist/partners/registry.js.map +1 -0
- package/dist/partners/tools.d.ts +24 -0
- package/dist/partners/tools.d.ts.map +1 -0
- package/dist/partners/tools.js +97 -0
- package/dist/partners/tools.js.map +1 -0
- package/dist/payment-preauth.d.ts +17 -0
- package/dist/payment-preauth.d.ts.map +1 -0
- package/dist/payment-preauth.js +102 -0
- package/dist/payment-preauth.js.map +1 -0
- package/dist/provider.d.ts +19 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +45 -0
- package/dist/provider.js.map +1 -0
- package/dist/proxy.d.ts +210 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.debrand.test.d.ts +2 -0
- package/dist/proxy.debrand.test.d.ts.map +1 -0
- package/dist/proxy.debrand.test.js +101 -0
- package/dist/proxy.debrand.test.js.map +1 -0
- package/dist/proxy.degraded-response.test.d.ts +2 -0
- package/dist/proxy.degraded-response.test.d.ts.map +1 -0
- package/dist/proxy.degraded-response.test.js +105 -0
- package/dist/proxy.degraded-response.test.js.map +1 -0
- package/dist/proxy.image-download.test.d.ts +2 -0
- package/dist/proxy.image-download.test.d.ts.map +1 -0
- package/dist/proxy.image-download.test.js +92 -0
- package/dist/proxy.image-download.test.js.map +1 -0
- package/dist/proxy.js +3810 -0
- package/dist/proxy.js.map +1 -0
- package/dist/proxy.models-endpoint.test.d.ts +2 -0
- package/dist/proxy.models-endpoint.test.d.ts.map +1 -0
- package/dist/proxy.models-endpoint.test.js +19 -0
- package/dist/proxy.models-endpoint.test.js.map +1 -0
- package/dist/proxy.multiturn-thinking.test.d.ts +2 -0
- package/dist/proxy.multiturn-thinking.test.d.ts.map +1 -0
- package/dist/proxy.multiturn-thinking.test.js +82 -0
- package/dist/proxy.multiturn-thinking.test.js.map +1 -0
- package/dist/proxy.payment-chain-reuse.test.d.ts +2 -0
- package/dist/proxy.payment-chain-reuse.test.d.ts.map +1 -0
- package/dist/proxy.payment-chain-reuse.test.js +30 -0
- package/dist/proxy.payment-chain-reuse.test.js.map +1 -0
- package/dist/proxy.solana-resilience.test.d.ts +12 -0
- package/dist/proxy.solana-resilience.test.d.ts.map +1 -0
- package/dist/proxy.solana-resilience.test.js +39 -0
- package/dist/proxy.solana-resilience.test.js.map +1 -0
- package/dist/report.d.ts +6 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +44 -0
- package/dist/report.js.map +1 -0
- package/dist/response-cache.advanced.test.d.ts +2 -0
- package/dist/response-cache.advanced.test.d.ts.map +1 -0
- package/dist/response-cache.advanced.test.js +566 -0
- package/dist/response-cache.advanced.test.js.map +1 -0
- package/dist/response-cache.d.ts +85 -0
- package/dist/response-cache.d.ts.map +1 -0
- package/dist/response-cache.edge-cases.test.d.ts +2 -0
- package/dist/response-cache.edge-cases.test.d.ts.map +1 -0
- package/dist/response-cache.edge-cases.test.js +488 -0
- package/dist/response-cache.edge-cases.test.js.map +1 -0
- package/dist/response-cache.extreme.test.d.ts +2 -0
- package/dist/response-cache.extreme.test.d.ts.map +1 -0
- package/dist/response-cache.extreme.test.js +561 -0
- package/dist/response-cache.extreme.test.js.map +1 -0
- package/dist/response-cache.js +240 -0
- package/dist/response-cache.js.map +1 -0
- package/dist/response-cache.test.d.ts +2 -0
- package/dist/response-cache.test.d.ts.map +1 -0
- package/dist/response-cache.test.js +242 -0
- package/dist/response-cache.test.js.map +1 -0
- package/dist/retry.d.ts +42 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +99 -0
- package/dist/retry.js.map +1 -0
- package/dist/router/config.d.ts +11 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +1215 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/index.d.ts +18 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +19 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/llm-classifier.d.ts +29 -0
- package/dist/router/llm-classifier.d.ts.map +1 -0
- package/dist/router/llm-classifier.js +99 -0
- package/dist/router/llm-classifier.js.map +1 -0
- package/dist/router/rules.d.ts +12 -0
- package/dist/router/rules.d.ts.map +1 -0
- package/dist/router/rules.js +202 -0
- package/dist/router/rules.js.map +1 -0
- package/dist/router/selector.d.ts +58 -0
- package/dist/router/selector.d.ts.map +1 -0
- package/dist/router/selector.js +165 -0
- package/dist/router/selector.js.map +1 -0
- package/dist/router/selector.test.d.ts +2 -0
- package/dist/router/selector.test.d.ts.map +1 -0
- package/dist/router/selector.test.js +67 -0
- package/dist/router/selector.test.js.map +1 -0
- package/dist/router/strategy.d.ts +19 -0
- package/dist/router/strategy.d.ts.map +1 -0
- package/dist/router/strategy.js +138 -0
- package/dist/router/strategy.js.map +1 -0
- package/dist/router/strategy.test.d.ts +2 -0
- package/dist/router/strategy.test.d.ts.map +1 -0
- package/dist/router/strategy.test.js +131 -0
- package/dist/router/strategy.test.js.map +1 -0
- package/dist/router/types.d.ts +127 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +11 -0
- package/dist/router/types.js.map +1 -0
- package/dist/session.d.ts +124 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +256 -0
- package/dist/session.js.map +1 -0
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +163 -0
- package/dist/session.test.js.map +1 -0
- package/dist/solana-balance.d.ts +48 -0
- package/dist/solana-balance.d.ts.map +1 -0
- package/dist/solana-balance.js +142 -0
- package/dist/solana-balance.js.map +1 -0
- package/dist/spend-control.d.ts +112 -0
- package/dist/spend-control.d.ts.map +1 -0
- package/dist/spend-control.js +278 -0
- package/dist/spend-control.js.map +1 -0
- package/dist/spend-control.test.d.ts +5 -0
- package/dist/spend-control.test.d.ts.map +1 -0
- package/dist/spend-control.test.js +210 -0
- package/dist/spend-control.test.js.map +1 -0
- package/dist/stats.d.ts +64 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +295 -0
- package/dist/stats.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/update-hint.test.d.ts +9 -0
- package/dist/update-hint.test.d.ts.map +1 -0
- package/dist/update-hint.test.js +156 -0
- package/dist/update-hint.test.js.map +1 -0
- package/dist/updater.d.ts +10 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +55 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/dist/wallet.d.ts +52 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +93 -0
- package/dist/wallet.js.map +1 -0
- package/dist/wallet.test.d.ts +6 -0
- package/dist/wallet.test.d.ts.map +1 -0
- package/dist/wallet.test.js +117 -0
- package/dist/wallet.test.js.map +1 -0
- package/dist/x402-sdk.test.d.ts +6 -0
- package/dist/x402-sdk.test.d.ts.map +1 -0
- package/dist/x402-sdk.test.js +161 -0
- package/dist/x402-sdk.test.js.map +1 -0
- package/package.json +1 -1
- package/scripts/e2e-multiturn.mjs +4 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 4: Path Shortening
|
|
3
|
+
*
|
|
4
|
+
* Detects common filesystem path prefixes and replaces them with short codes.
|
|
5
|
+
* Common in coding assistant contexts with repeated file paths.
|
|
6
|
+
*
|
|
7
|
+
* Safe for LLM: Lossless abbreviation with path map header.
|
|
8
|
+
* Expected savings: 1-3%
|
|
9
|
+
*/
|
|
10
|
+
// Regex to match filesystem paths
|
|
11
|
+
const PATH_REGEX = /(?:\/[\w.-]+){3,}/g;
|
|
12
|
+
/**
|
|
13
|
+
* Extract all paths from messages and find common prefixes.
|
|
14
|
+
*/
|
|
15
|
+
function extractPaths(messages) {
|
|
16
|
+
const paths = [];
|
|
17
|
+
for (const message of messages) {
|
|
18
|
+
// Only process string content (skip arrays for multimodal messages)
|
|
19
|
+
if (!message.content || typeof message.content !== "string")
|
|
20
|
+
continue;
|
|
21
|
+
const matches = message.content.match(PATH_REGEX);
|
|
22
|
+
if (matches) {
|
|
23
|
+
paths.push(...matches);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return paths;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Group paths by their common prefixes.
|
|
30
|
+
* Returns prefixes that appear at least 3 times.
|
|
31
|
+
*/
|
|
32
|
+
function findFrequentPrefixes(paths) {
|
|
33
|
+
const prefixCounts = new Map();
|
|
34
|
+
for (const path of paths) {
|
|
35
|
+
const parts = path.split("/").filter(Boolean);
|
|
36
|
+
// Try prefixes of different lengths
|
|
37
|
+
for (let i = 2; i < parts.length; i++) {
|
|
38
|
+
const prefix = "/" + parts.slice(0, i).join("/") + "/";
|
|
39
|
+
prefixCounts.set(prefix, (prefixCounts.get(prefix) || 0) + 1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Return prefixes that appear 3+ times, sorted by length (longest first)
|
|
43
|
+
return Array.from(prefixCounts.entries())
|
|
44
|
+
.filter(([, count]) => count >= 3)
|
|
45
|
+
.sort((a, b) => b[0].length - a[0].length)
|
|
46
|
+
.slice(0, 5) // Max 5 path codes
|
|
47
|
+
.map(([prefix]) => prefix);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Apply path shortening to all messages.
|
|
51
|
+
*/
|
|
52
|
+
export function shortenPaths(messages) {
|
|
53
|
+
const allPaths = extractPaths(messages);
|
|
54
|
+
if (allPaths.length < 5) {
|
|
55
|
+
// Not enough paths to benefit from shortening
|
|
56
|
+
return {
|
|
57
|
+
messages,
|
|
58
|
+
pathMap: {},
|
|
59
|
+
charsSaved: 0,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const prefixes = findFrequentPrefixes(allPaths);
|
|
63
|
+
if (prefixes.length === 0) {
|
|
64
|
+
return {
|
|
65
|
+
messages,
|
|
66
|
+
pathMap: {},
|
|
67
|
+
charsSaved: 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Create path map
|
|
71
|
+
const pathMap = {};
|
|
72
|
+
prefixes.forEach((prefix, i) => {
|
|
73
|
+
pathMap[`$P${i + 1}`] = prefix;
|
|
74
|
+
});
|
|
75
|
+
// Replace paths in messages
|
|
76
|
+
let charsSaved = 0;
|
|
77
|
+
const result = messages.map((message) => {
|
|
78
|
+
// Only process string content (skip arrays for multimodal messages)
|
|
79
|
+
if (!message.content || typeof message.content !== "string")
|
|
80
|
+
return message;
|
|
81
|
+
let content = message.content;
|
|
82
|
+
const originalLength = content.length;
|
|
83
|
+
// Replace prefixes (longest first to avoid partial replacements)
|
|
84
|
+
for (const [code, prefix] of Object.entries(pathMap)) {
|
|
85
|
+
content = content.split(prefix).join(code + "/");
|
|
86
|
+
}
|
|
87
|
+
charsSaved += originalLength - content.length;
|
|
88
|
+
return {
|
|
89
|
+
...message,
|
|
90
|
+
content,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
messages: result,
|
|
95
|
+
pathMap,
|
|
96
|
+
charsSaved,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generate the path map header for the codebook.
|
|
101
|
+
*/
|
|
102
|
+
export function generatePathMapHeader(pathMap) {
|
|
103
|
+
if (Object.keys(pathMap).length === 0)
|
|
104
|
+
return "";
|
|
105
|
+
const entries = Object.entries(pathMap)
|
|
106
|
+
.map(([code, path]) => `${code}=${path}`)
|
|
107
|
+
.join(", ");
|
|
108
|
+
return `[Paths: ${entries}]`;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/compression/layers/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 2: Whitespace Normalization
|
|
3
|
+
*
|
|
4
|
+
* Reduces excessive whitespace without changing semantic meaning.
|
|
5
|
+
*
|
|
6
|
+
* Safe for LLM: Tokenizers normalize whitespace anyway.
|
|
7
|
+
* Expected savings: 3-8%
|
|
8
|
+
*/
|
|
9
|
+
import { NormalizedMessage } from "../types";
|
|
10
|
+
export interface WhitespaceResult {
|
|
11
|
+
messages: NormalizedMessage[];
|
|
12
|
+
charsSaved: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normalize whitespace in a string.
|
|
16
|
+
*
|
|
17
|
+
* - Max 2 consecutive newlines
|
|
18
|
+
* - Remove trailing whitespace from lines
|
|
19
|
+
* - Normalize tabs to spaces
|
|
20
|
+
* - Trim start/end
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeWhitespace(content: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Apply whitespace normalization to all messages.
|
|
25
|
+
*/
|
|
26
|
+
export declare function normalizeMessagesWhitespace(messages: NormalizedMessage[]): WhitespaceResult;
|
|
27
|
+
//# sourceMappingURL=whitespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitespace.d.ts","sourceRoot":"","sources":["../../../src/compression/layers/whitespace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsB3D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,CAqB3F"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 2: Whitespace Normalization
|
|
3
|
+
*
|
|
4
|
+
* Reduces excessive whitespace without changing semantic meaning.
|
|
5
|
+
*
|
|
6
|
+
* Safe for LLM: Tokenizers normalize whitespace anyway.
|
|
7
|
+
* Expected savings: 3-8%
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Normalize whitespace in a string.
|
|
11
|
+
*
|
|
12
|
+
* - Max 2 consecutive newlines
|
|
13
|
+
* - Remove trailing whitespace from lines
|
|
14
|
+
* - Normalize tabs to spaces
|
|
15
|
+
* - Trim start/end
|
|
16
|
+
*/
|
|
17
|
+
export function normalizeWhitespace(content) {
|
|
18
|
+
// Defensive type check - content might be array/object for multimodal messages
|
|
19
|
+
if (!content || typeof content !== "string")
|
|
20
|
+
return content;
|
|
21
|
+
return (content
|
|
22
|
+
// Normalize line endings
|
|
23
|
+
.replace(/\r\n/g, "\n")
|
|
24
|
+
.replace(/\r/g, "\n")
|
|
25
|
+
// Max 2 consecutive newlines (preserve paragraph breaks)
|
|
26
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
27
|
+
// Remove trailing whitespace from each line
|
|
28
|
+
.replace(/[ \t]+$/gm, "")
|
|
29
|
+
// Normalize multiple spaces to single (except at line start for indentation)
|
|
30
|
+
.replace(/([^\n]) {2,}/g, "$1 ")
|
|
31
|
+
// Reduce excessive indentation (more than 8 spaces → 2 spaces per level)
|
|
32
|
+
.replace(/^[ ]{8,}/gm, (match) => " ".repeat(Math.ceil(match.length / 4)))
|
|
33
|
+
// Normalize tabs to 2 spaces
|
|
34
|
+
.replace(/\t/g, " ")
|
|
35
|
+
// Trim
|
|
36
|
+
.trim());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Apply whitespace normalization to all messages.
|
|
40
|
+
*/
|
|
41
|
+
export function normalizeMessagesWhitespace(messages) {
|
|
42
|
+
let charsSaved = 0;
|
|
43
|
+
const result = messages.map((message) => {
|
|
44
|
+
// Only process string content (skip arrays for multimodal messages)
|
|
45
|
+
if (!message.content || typeof message.content !== "string")
|
|
46
|
+
return message;
|
|
47
|
+
const originalLength = message.content.length;
|
|
48
|
+
const normalizedContent = normalizeWhitespace(message.content);
|
|
49
|
+
charsSaved += originalLength - normalizedContent.length;
|
|
50
|
+
return {
|
|
51
|
+
...message,
|
|
52
|
+
content: normalizedContent,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
messages: result,
|
|
57
|
+
charsSaved,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=whitespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitespace.js","sourceRoot":"","sources":["../../../src/compression/layers/whitespace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,+EAA+E;IAC/E,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAiB,CAAC;IAEtE,OAAO,CACL,OAAO;QACL,yBAAyB;SACxB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;QACrB,yDAAyD;SACxD,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,4CAA4C;SAC3C,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,6EAA6E;SAC5E,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;QAChC,yEAAyE;SACxE,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,6BAA6B;SAC5B,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;QACrB,OAAO;SACN,IAAI,EAAE,CACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAA6B;IACvE,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACtC,oEAAoE;QACpE,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC;QAE5E,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,UAAU,IAAI,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC;QAExD,OAAO;YACL,GAAG,OAAO;YACV,OAAO,EAAE,iBAAiB;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-Safe Context Compression Types
|
|
3
|
+
*
|
|
4
|
+
* Types for the 7-layer compression system that reduces token usage
|
|
5
|
+
* while preserving semantic meaning for LLM queries.
|
|
6
|
+
*/
|
|
7
|
+
export interface ContentPart {
|
|
8
|
+
type: "text" | "image_url";
|
|
9
|
+
text?: string;
|
|
10
|
+
image_url?: {
|
|
11
|
+
url: string;
|
|
12
|
+
detail?: "low" | "high" | "auto";
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface NormalizedMessage {
|
|
16
|
+
role: "system" | "user" | "assistant" | "tool";
|
|
17
|
+
content: string | ContentPart[] | null;
|
|
18
|
+
tool_call_id?: string;
|
|
19
|
+
tool_calls?: ToolCall[];
|
|
20
|
+
name?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ToolCall {
|
|
23
|
+
id: string;
|
|
24
|
+
type: "function";
|
|
25
|
+
function: {
|
|
26
|
+
name: string;
|
|
27
|
+
arguments: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface CompressionConfig {
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
preserveRaw: boolean;
|
|
33
|
+
layers: {
|
|
34
|
+
deduplication: boolean;
|
|
35
|
+
whitespace: boolean;
|
|
36
|
+
dictionary: boolean;
|
|
37
|
+
paths: boolean;
|
|
38
|
+
jsonCompact: boolean;
|
|
39
|
+
observation: boolean;
|
|
40
|
+
dynamicCodebook: boolean;
|
|
41
|
+
};
|
|
42
|
+
dictionary: {
|
|
43
|
+
maxEntries: number;
|
|
44
|
+
minPhraseLength: number;
|
|
45
|
+
includeCodebookHeader: boolean;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface CompressionStats {
|
|
49
|
+
duplicatesRemoved: number;
|
|
50
|
+
whitespaceSavedChars: number;
|
|
51
|
+
dictionarySubstitutions: number;
|
|
52
|
+
pathsShortened: number;
|
|
53
|
+
jsonCompactedChars: number;
|
|
54
|
+
observationsCompressed: number;
|
|
55
|
+
observationCharsSaved: number;
|
|
56
|
+
dynamicSubstitutions: number;
|
|
57
|
+
dynamicCharsSaved: number;
|
|
58
|
+
}
|
|
59
|
+
export interface CompressionResult {
|
|
60
|
+
messages: NormalizedMessage[];
|
|
61
|
+
originalMessages: NormalizedMessage[];
|
|
62
|
+
originalChars: number;
|
|
63
|
+
compressedChars: number;
|
|
64
|
+
compressionRatio: number;
|
|
65
|
+
stats: CompressionStats;
|
|
66
|
+
codebook: Record<string, string>;
|
|
67
|
+
pathMap: Record<string, string>;
|
|
68
|
+
dynamicCodes: Record<string, string>;
|
|
69
|
+
}
|
|
70
|
+
export interface CompressionLogData {
|
|
71
|
+
enabled: boolean;
|
|
72
|
+
ratio: number;
|
|
73
|
+
original_chars: number;
|
|
74
|
+
compressed_chars: number;
|
|
75
|
+
stats: {
|
|
76
|
+
duplicates_removed: number;
|
|
77
|
+
whitespace_saved: number;
|
|
78
|
+
dictionary_subs: number;
|
|
79
|
+
paths_shortened: number;
|
|
80
|
+
json_compacted: number;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export declare const DEFAULT_COMPRESSION_CONFIG: CompressionConfig;
|
|
84
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compression/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;KAClC,CAAC;CACH;AAID,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IAGrB,MAAM,EAAE;QACN,aAAa,EAAE,OAAO,CAAC;QACvB,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,KAAK,EAAE,OAAO,CAAC;QACf,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,OAAO,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IAGF,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,OAAO,CAAC;KAChC,CAAC;CACH;AAGD,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAGD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IAGtC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,KAAK,EAAE,gBAAgB,CAAC;IAGxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAGD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE;QACL,kBAAkB,EAAE,MAAM,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAID,eAAO,MAAM,0BAA0B,EAAE,iBAiBxC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-Safe Context Compression Types
|
|
3
|
+
*
|
|
4
|
+
* Types for the 7-layer compression system that reduces token usage
|
|
5
|
+
* while preserving semantic meaning for LLM queries.
|
|
6
|
+
*/
|
|
7
|
+
// Default configuration - CONSERVATIVE settings for model compatibility
|
|
8
|
+
// Only enable layers that don't require the model to decode anything
|
|
9
|
+
export const DEFAULT_COMPRESSION_CONFIG = {
|
|
10
|
+
enabled: true,
|
|
11
|
+
preserveRaw: true,
|
|
12
|
+
layers: {
|
|
13
|
+
deduplication: true, // Safe: removes duplicate messages
|
|
14
|
+
whitespace: true, // Safe: normalizes whitespace
|
|
15
|
+
dictionary: false, // DISABLED: requires model to understand codebook
|
|
16
|
+
paths: false, // DISABLED: requires model to understand path codes
|
|
17
|
+
jsonCompact: true, // Safe: just removes JSON whitespace
|
|
18
|
+
observation: false, // DISABLED: may lose important context
|
|
19
|
+
dynamicCodebook: false, // DISABLED: requires model to understand codes
|
|
20
|
+
},
|
|
21
|
+
dictionary: {
|
|
22
|
+
maxEntries: 50,
|
|
23
|
+
minPhraseLength: 15,
|
|
24
|
+
includeCodebookHeader: false, // No codebook header needed
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/compression/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsGH,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IAC3D,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE;QACN,aAAa,EAAE,IAAI,EAAE,mCAAmC;QACxD,UAAU,EAAE,IAAI,EAAE,8BAA8B;QAChD,UAAU,EAAE,KAAK,EAAE,kDAAkD;QACrE,KAAK,EAAE,KAAK,EAAE,oDAAoD;QAClE,WAAW,EAAE,IAAI,EAAE,qCAAqC;QACxD,WAAW,EAAE,KAAK,EAAE,uCAAuC;QAC3D,eAAe,EAAE,KAAK,EAAE,+CAA+C;KACxE;IACD,UAAU,EAAE;QACV,UAAU,EAAE,EAAE;QACd,eAAe,EAAE,EAAE;QACnB,qBAAqB,EAAE,KAAK,EAAE,4BAA4B;KAC3D;CACF,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Module
|
|
3
|
+
*
|
|
4
|
+
* Reads environment variables at module load time.
|
|
5
|
+
* Separated from network code to avoid security scanner false positives.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Proxy port configuration - resolved once at module load.
|
|
9
|
+
* Reads BLOCKRUN_PROXY_PORT env var or defaults to 8402.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PROXY_PORT: number;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,eAAO,MAAM,UAAU,QASnB,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Module
|
|
3
|
+
*
|
|
4
|
+
* Reads environment variables at module load time.
|
|
5
|
+
* Separated from network code to avoid security scanner false positives.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_PORT = 8402;
|
|
8
|
+
/**
|
|
9
|
+
* Proxy port configuration - resolved once at module load.
|
|
10
|
+
* Reads BLOCKRUN_PROXY_PORT env var or defaults to 8402.
|
|
11
|
+
*/
|
|
12
|
+
export const PROXY_PORT = (() => {
|
|
13
|
+
const envPort = process["env"].BLOCKRUN_PROXY_PORT;
|
|
14
|
+
if (envPort) {
|
|
15
|
+
const parsed = parseInt(envPort, 10);
|
|
16
|
+
if (!isNaN(parsed) && parsed > 0 && parsed < 65536) {
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return DEFAULT_PORT;
|
|
21
|
+
})();
|
|
22
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC;IACnD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC,EAAE,CAAC"}
|
package/dist/dedup.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request Deduplication
|
|
3
|
+
*
|
|
4
|
+
* Prevents double-charging when OpenClaw retries a request after timeout.
|
|
5
|
+
* Tracks in-flight requests and caches completed responses for a short TTL.
|
|
6
|
+
*/
|
|
7
|
+
export type CachedResponse = {
|
|
8
|
+
status: number;
|
|
9
|
+
headers: Record<string, string>;
|
|
10
|
+
body: Buffer;
|
|
11
|
+
completedAt: number;
|
|
12
|
+
};
|
|
13
|
+
export declare class RequestDeduplicator {
|
|
14
|
+
private inflight;
|
|
15
|
+
private completed;
|
|
16
|
+
private ttlMs;
|
|
17
|
+
constructor(ttlMs?: number);
|
|
18
|
+
/** Hash request body to create a dedup key. */
|
|
19
|
+
static hash(body: Buffer): string;
|
|
20
|
+
/** Check if a response is cached for this key. */
|
|
21
|
+
getCached(key: string): CachedResponse | undefined;
|
|
22
|
+
/** Check if a request with this key is currently in-flight. Returns a promise to wait on. */
|
|
23
|
+
getInflight(key: string): Promise<CachedResponse> | undefined;
|
|
24
|
+
/** Mark a request as in-flight. */
|
|
25
|
+
markInflight(key: string): void;
|
|
26
|
+
/** Complete an in-flight request — cache result and notify waiters. */
|
|
27
|
+
complete(key: string, result: CachedResponse): void;
|
|
28
|
+
/** Remove an in-flight entry on error (don't cache failures).
|
|
29
|
+
* Also rejects any waiters so they can retry independently. */
|
|
30
|
+
removeInflight(key: string): void;
|
|
31
|
+
/** Prune expired completed entries. */
|
|
32
|
+
private prune;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAuDF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,SAAiB;IAIlC,+CAA+C;IAC/C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgBjC,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAUlD,6FAA6F;IAC7F,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS;IAQ7D,mCAAmC;IACnC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM/B,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAiBnD;oEACgE;IAChE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAsBjC,uCAAuC;IACvC,OAAO,CAAC,KAAK;CAQd"}
|
package/dist/dedup.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request Deduplication
|
|
3
|
+
*
|
|
4
|
+
* Prevents double-charging when OpenClaw retries a request after timeout.
|
|
5
|
+
* Tracks in-flight requests and caches completed responses for a short TTL.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
const DEFAULT_TTL_MS = 30_000; // 30 seconds
|
|
9
|
+
const MAX_BODY_SIZE = 1_048_576; // 1MB
|
|
10
|
+
/**
|
|
11
|
+
* Canonicalize JSON by sorting object keys recursively.
|
|
12
|
+
* Ensures identical logical content produces identical string regardless of field order.
|
|
13
|
+
*/
|
|
14
|
+
function canonicalize(obj) {
|
|
15
|
+
if (obj === null || typeof obj !== "object") {
|
|
16
|
+
return obj;
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(obj)) {
|
|
19
|
+
return obj.map(canonicalize);
|
|
20
|
+
}
|
|
21
|
+
const sorted = {};
|
|
22
|
+
for (const key of Object.keys(obj).sort()) {
|
|
23
|
+
sorted[key] = canonicalize(obj[key]);
|
|
24
|
+
}
|
|
25
|
+
return sorted;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Strip OpenClaw-injected timestamps from message content.
|
|
29
|
+
* Format: [DAY YYYY-MM-DD HH:MM TZ] at the start of messages.
|
|
30
|
+
* Example: [SUN 2026-02-07 13:30 PST] Hello world
|
|
31
|
+
*
|
|
32
|
+
* This ensures requests with different timestamps but same content hash identically.
|
|
33
|
+
*/
|
|
34
|
+
const TIMESTAMP_PATTERN = /^\[\w{3}\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\s+\w+\]\s*/;
|
|
35
|
+
function stripTimestamps(obj) {
|
|
36
|
+
if (obj === null || typeof obj !== "object") {
|
|
37
|
+
return obj;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(obj)) {
|
|
40
|
+
return obj.map(stripTimestamps);
|
|
41
|
+
}
|
|
42
|
+
const result = {};
|
|
43
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
44
|
+
if (key === "content" && typeof value === "string") {
|
|
45
|
+
// Strip timestamp prefix from message content
|
|
46
|
+
result[key] = value.replace(TIMESTAMP_PATTERN, "");
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
result[key] = stripTimestamps(value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
export class RequestDeduplicator {
|
|
55
|
+
inflight = new Map();
|
|
56
|
+
completed = new Map();
|
|
57
|
+
ttlMs;
|
|
58
|
+
constructor(ttlMs = DEFAULT_TTL_MS) {
|
|
59
|
+
this.ttlMs = ttlMs;
|
|
60
|
+
}
|
|
61
|
+
/** Hash request body to create a dedup key. */
|
|
62
|
+
static hash(body) {
|
|
63
|
+
// Canonicalize JSON to ensure consistent hashing regardless of field order.
|
|
64
|
+
// Also strip OpenClaw-injected timestamps so retries with different timestamps
|
|
65
|
+
// still match the same dedup key.
|
|
66
|
+
let content = body;
|
|
67
|
+
try {
|
|
68
|
+
const parsed = JSON.parse(body.toString());
|
|
69
|
+
const stripped = stripTimestamps(parsed);
|
|
70
|
+
const canonical = canonicalize(stripped);
|
|
71
|
+
content = Buffer.from(JSON.stringify(canonical));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Not valid JSON, use raw bytes
|
|
75
|
+
}
|
|
76
|
+
return createHash("sha256").update(content).digest("hex").slice(0, 16);
|
|
77
|
+
}
|
|
78
|
+
/** Check if a response is cached for this key. */
|
|
79
|
+
getCached(key) {
|
|
80
|
+
const entry = this.completed.get(key);
|
|
81
|
+
if (!entry)
|
|
82
|
+
return undefined;
|
|
83
|
+
if (Date.now() - entry.completedAt > this.ttlMs) {
|
|
84
|
+
this.completed.delete(key);
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
return entry;
|
|
88
|
+
}
|
|
89
|
+
/** Check if a request with this key is currently in-flight. Returns a promise to wait on. */
|
|
90
|
+
getInflight(key) {
|
|
91
|
+
const entry = this.inflight.get(key);
|
|
92
|
+
if (!entry)
|
|
93
|
+
return undefined;
|
|
94
|
+
return new Promise((resolve) => {
|
|
95
|
+
entry.resolvers.push(resolve);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Mark a request as in-flight. */
|
|
99
|
+
markInflight(key) {
|
|
100
|
+
this.inflight.set(key, {
|
|
101
|
+
resolvers: [],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** Complete an in-flight request — cache result and notify waiters. */
|
|
105
|
+
complete(key, result) {
|
|
106
|
+
// Only cache responses within size limit
|
|
107
|
+
if (result.body.length <= MAX_BODY_SIZE) {
|
|
108
|
+
this.completed.set(key, result);
|
|
109
|
+
}
|
|
110
|
+
const entry = this.inflight.get(key);
|
|
111
|
+
if (entry) {
|
|
112
|
+
for (const resolve of entry.resolvers) {
|
|
113
|
+
resolve(result);
|
|
114
|
+
}
|
|
115
|
+
this.inflight.delete(key);
|
|
116
|
+
}
|
|
117
|
+
this.prune();
|
|
118
|
+
}
|
|
119
|
+
/** Remove an in-flight entry on error (don't cache failures).
|
|
120
|
+
* Also rejects any waiters so they can retry independently. */
|
|
121
|
+
removeInflight(key) {
|
|
122
|
+
const entry = this.inflight.get(key);
|
|
123
|
+
if (entry) {
|
|
124
|
+
// Resolve waiters with a sentinel error response so they don't hang forever.
|
|
125
|
+
// Waiters will see a 503 and can retry on their own.
|
|
126
|
+
const errorBody = Buffer.from(JSON.stringify({
|
|
127
|
+
error: { message: "Original request failed, please retry", type: "dedup_origin_failed" },
|
|
128
|
+
}));
|
|
129
|
+
for (const resolve of entry.resolvers) {
|
|
130
|
+
resolve({
|
|
131
|
+
status: 503,
|
|
132
|
+
headers: { "content-type": "application/json" },
|
|
133
|
+
body: errorBody,
|
|
134
|
+
completedAt: Date.now(),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
this.inflight.delete(key);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Prune expired completed entries. */
|
|
141
|
+
prune() {
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
for (const [key, entry] of this.completed) {
|
|
144
|
+
if (now - entry.completedAt > this.ttlMs) {
|
|
145
|
+
this.completed.delete(key);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BlockRun Doctor - AI-Powered Diagnostics
|
|
3
|
+
*
|
|
4
|
+
* Collects system diagnostics and sends to Claude Opus 4.6 for analysis.
|
|
5
|
+
* Works independently of OpenClaw - direct x402 payment to BlockRun API.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runDoctor(userQuestion?: string, model?: "sonnet" | "opus"): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkaH,wBAAsB,SAAS,CAC7B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAClC,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
|