@pentoshi/clai 4.1.0 → 4.2.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/README.md +14 -0
- package/dist/agent/compaction-executor.d.ts +68 -0
- package/dist/agent/compaction-executor.js +343 -0
- package/dist/agent/compaction-executor.js.map +1 -0
- package/dist/agent/context-breakdown.js +2 -0
- package/dist/agent/context-breakdown.js.map +1 -1
- package/dist/agent/context-manager.d.ts +23 -9
- package/dist/agent/context-manager.js +72 -43
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/events.d.ts +3 -0
- package/dist/agent/loop-guard.d.ts +2 -0
- package/dist/agent/loop-guard.js +48 -3
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/prompt-composer.js +6 -6
- package/dist/agent/prompt-composer.js.map +1 -1
- package/dist/agent/reliability-policy.d.ts +1 -0
- package/dist/agent/reliability-policy.js +6 -3
- package/dist/agent/reliability-policy.js.map +1 -1
- package/dist/agent/request-accounting.d.ts +97 -0
- package/dist/agent/request-accounting.js +207 -0
- package/dist/agent/request-accounting.js.map +1 -0
- package/dist/agent/request-budget.d.ts +2 -2
- package/dist/agent/request-budget.js +2 -4
- package/dist/agent/request-budget.js.map +1 -1
- package/dist/agent/runner.d.ts +8 -2
- package/dist/agent/runner.js +409 -178
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-title.d.ts +0 -26
- package/dist/agent/session-title.js +0 -80
- package/dist/agent/session-title.js.map +1 -1
- package/dist/agent/tool-history.d.ts +2 -2
- package/dist/agent/tool-history.js +19 -6
- package/dist/agent/tool-history.js.map +1 -1
- package/dist/app/adapters/agent-event-adapter.js +19 -0
- package/dist/app/adapters/agent-event-adapter.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.js +4 -0
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/commands/catalog.js +24 -0
- package/dist/app/commands/catalog.js.map +1 -1
- package/dist/app/controllers/cancel-coordinator.d.ts +51 -0
- package/dist/app/controllers/cancel-coordinator.js +48 -0
- package/dist/app/controllers/cancel-coordinator.js.map +1 -0
- package/dist/app/controllers/session-compact-helper.d.ts +19 -2
- package/dist/app/controllers/session-compact-helper.js +100 -127
- package/dist/app/controllers/session-compact-helper.js.map +1 -1
- package/dist/app/controllers/session-context-usage.d.ts +32 -15
- package/dist/app/controllers/session-context-usage.js +186 -51
- package/dist/app/controllers/session-context-usage.js.map +1 -1
- package/dist/app/controllers/session-controller.d.ts +20 -11
- package/dist/app/controllers/session-controller.js +111 -90
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-naming.d.ts +31 -0
- package/dist/app/controllers/session-naming.js +173 -0
- package/dist/app/controllers/session-naming.js.map +1 -0
- package/dist/app/controllers/session-persistence.d.ts +2 -2
- package/dist/app/controllers/session-persistence.js +3 -6
- package/dist/app/controllers/session-persistence.js.map +1 -1
- package/dist/app/controllers/session-turn-request.d.ts +2 -1
- package/dist/app/controllers/session-turn-request.js +3 -0
- package/dist/app/controllers/session-turn-request.js.map +1 -1
- package/dist/app/controllers/turn-controller.d.ts +2 -1
- package/dist/app/controllers/turn-controller.js +1 -0
- package/dist/app/controllers/turn-controller.js.map +1 -1
- package/dist/app/events/app-event.d.ts +9 -0
- package/dist/app/events/app-event.js.map +1 -1
- package/dist/app/ports/agent-port.d.ts +8 -1
- package/dist/classic/app/ClassicApp.js +2 -1
- package/dist/classic/app/ClassicApp.js.map +1 -1
- package/dist/classic/app/app-wiring.js +1 -2
- package/dist/classic/app/app-wiring.js.map +1 -1
- package/dist/classic/app/wiring-interactions.js +2 -7
- package/dist/classic/app/wiring-interactions.js.map +1 -1
- package/dist/classic/blocks/tool-lines.js +2 -1
- package/dist/classic/blocks/tool-lines.js.map +1 -1
- package/dist/classic/input/cancel-ladder.d.ts +2 -19
- package/dist/classic/input/cancel-ladder.js +13 -20
- package/dist/classic/input/cancel-ladder.js.map +1 -1
- package/dist/commands/providers.js +2 -0
- package/dist/commands/providers.js.map +1 -1
- package/dist/llm/adapters/anthropic-tools.d.ts +31 -14
- package/dist/llm/adapters/anthropic-tools.js +124 -29
- package/dist/llm/adapters/anthropic-tools.js.map +1 -1
- package/dist/llm/adapters/gemini-tools.d.ts +16 -4
- package/dist/llm/adapters/gemini-tools.js +117 -16
- package/dist/llm/adapters/gemini-tools.js.map +1 -1
- package/dist/llm/adapters/openai-tools.d.ts +13 -2
- package/dist/llm/adapters/openai-tools.js +58 -11
- package/dist/llm/adapters/openai-tools.js.map +1 -1
- package/dist/llm/agentrouter.js +68 -45
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.js +69 -36
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +70 -32
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +26 -69
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +2 -1
- package/dist/llm/capabilities.js +47 -0
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/context-snapshot.d.ts +100 -0
- package/dist/llm/context-snapshot.js +277 -0
- package/dist/llm/context-snapshot.js.map +1 -0
- package/dist/llm/context-windows.d.ts +10 -0
- package/dist/llm/context-windows.js +129 -0
- package/dist/llm/context-windows.js.map +1 -0
- package/dist/llm/custom-provider-profile.d.ts +75 -0
- package/dist/llm/custom-provider-profile.js +558 -0
- package/dist/llm/custom-provider-profile.js.map +1 -0
- package/dist/llm/custom-providers.d.ts +13 -1
- package/dist/llm/custom-providers.js +77 -25
- package/dist/llm/custom-providers.js.map +1 -1
- package/dist/llm/effort-fallback.d.ts +44 -0
- package/dist/llm/effort-fallback.js +101 -0
- package/dist/llm/effort-fallback.js.map +1 -0
- package/dist/llm/fireworks.js +4 -0
- package/dist/llm/fireworks.js.map +1 -1
- package/dist/llm/free.js +4 -0
- package/dist/llm/free.js.map +1 -1
- package/dist/llm/gemini.d.ts +1 -1
- package/dist/llm/gemini.js +89 -51
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.js +4 -0
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/hetzner.js +4 -0
- package/dist/llm/hetzner.js.map +1 -1
- package/dist/llm/http.d.ts +49 -10
- package/dist/llm/http.js +417 -153
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +4 -0
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/lightning.js +4 -0
- package/dist/llm/lightning.js.map +1 -1
- package/dist/llm/meta.d.ts +2 -0
- package/dist/llm/meta.js +811 -655
- package/dist/llm/meta.js.map +1 -1
- package/dist/llm/modal.js +4 -0
- package/dist/llm/modal.js.map +1 -1
- package/dist/llm/model-families.d.ts +9 -0
- package/dist/llm/model-families.js +39 -0
- package/dist/llm/model-families.js.map +1 -0
- package/dist/llm/nvidia.js +4 -0
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.js +44 -40
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +4 -0
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +4 -0
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/operation-ledger.d.ts +60 -0
- package/dist/llm/operation-ledger.js +136 -0
- package/dist/llm/operation-ledger.js.map +1 -0
- package/dist/llm/operation-usage.d.ts +32 -0
- package/dist/llm/operation-usage.js +172 -0
- package/dist/llm/operation-usage.js.map +1 -0
- package/dist/llm/orcarouter.d.ts +7 -0
- package/dist/llm/orcarouter.js +166 -0
- package/dist/llm/orcarouter.js.map +1 -0
- package/dist/llm/provider-profile-layers.d.ts +7 -0
- package/dist/llm/provider-profile-layers.js +961 -0
- package/dist/llm/provider-profile-layers.js.map +1 -0
- package/dist/llm/provider-profile.d.ts +181 -0
- package/dist/llm/provider-profile.js +329 -0
- package/dist/llm/provider-profile.js.map +1 -0
- package/dist/llm/provider-profiles.d.ts +13 -0
- package/dist/llm/provider-profiles.js +86 -0
- package/dist/llm/provider-profiles.js.map +1 -0
- package/dist/llm/provider.d.ts +2 -0
- package/dist/llm/provider.js +67 -0
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/qwen-cloud.js +4 -0
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/reasoning-artifacts.d.ts +101 -0
- package/dist/llm/reasoning-artifacts.js +440 -0
- package/dist/llm/reasoning-artifacts.js.map +1 -0
- package/dist/llm/request-fingerprint.d.ts +10 -0
- package/dist/llm/request-fingerprint.js +313 -0
- package/dist/llm/request-fingerprint.js.map +1 -0
- package/dist/llm/request-plan.d.ts +119 -0
- package/dist/llm/request-plan.js +279 -0
- package/dist/llm/request-plan.js.map +1 -0
- package/dist/llm/router.d.ts +19 -1
- package/dist/llm/router.js +447 -75
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/stream-events.d.ts +47 -0
- package/dist/llm/stream-events.js +55 -0
- package/dist/llm/stream-events.js.map +1 -0
- package/dist/llm/stream-terminal.d.ts +30 -0
- package/dist/llm/stream-terminal.js +51 -0
- package/dist/llm/stream-terminal.js.map +1 -0
- package/dist/llm/token-estimate-calibration.d.ts +23 -0
- package/dist/llm/token-estimate-calibration.js +140 -0
- package/dist/llm/token-estimate-calibration.js.map +1 -0
- package/dist/llm/token-usage.d.ts +35 -5
- package/dist/llm/token-usage.js +212 -162
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tokenrouter.js +8 -2
- package/dist/llm/tokenrouter.js.map +1 -1
- package/dist/modes/ask.js +11 -5
- package/dist/modes/ask.js.map +1 -1
- package/dist/noninteractive/start-noninteractive.js +31 -2
- package/dist/noninteractive/start-noninteractive.js.map +1 -1
- package/dist/noninteractive/stream-blocks.js +15 -4
- package/dist/noninteractive/stream-blocks.js.map +1 -1
- package/dist/prompts/embedded.js +1 -1
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/system.agent.md +6 -0
- package/dist/store/config.js +5 -1
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +2 -0
- package/dist/store/history.js +19 -10
- package/dist/store/history.js.map +1 -1
- package/dist/store/plan.js +20 -14
- package/dist/store/plan.js.map +1 -1
- package/dist/tools/elevated-shell.d.ts +1 -1
- package/dist/tools/elevated-shell.js +24 -72
- package/dist/tools/elevated-shell.js.map +1 -1
- package/dist/tools/nmap-runner.js +30 -36
- package/dist/tools/nmap-runner.js.map +1 -1
- package/dist/tools/sudo-session.d.ts +83 -0
- package/dist/tools/sudo-session.js +124 -0
- package/dist/tools/sudo-session.js.map +1 -0
- package/dist/tui-v2/app/App.js +9 -24
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
- package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
- package/dist/tui-v2/components/transcript/intro-card.js +2 -1
- package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +2 -1
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/types.d.ts +156 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
- package/dist/ui-core/bootstrap/composition-root.js +26 -3
- package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
- package/dist/ui-core/commands/picker-commands.js +11 -5
- package/dist/ui-core/commands/picker-commands.js.map +1 -1
- package/dist/ui-core/commands/session-commands.js +41 -5
- package/dist/ui-core/commands/session-commands.js.map +1 -1
- package/dist/ui-core/plan/plan-lifecycle.js +3 -2
- package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
- package/dist/ui-core/rendering/context-limit.js +4 -1
- package/dist/ui-core/rendering/context-limit.js.map +1 -1
- package/dist/ui-core/rendering/duration.d.ts +2 -1
- package/dist/ui-core/rendering/duration.js +13 -5
- package/dist/ui-core/rendering/duration.js.map +1 -1
- package/dist/ui-core/rendering/intro-header.js +2 -2
- package/dist/ui-core/rendering/intro-header.js.map +1 -1
- package/dist/ui-core/rendering/theme.d.ts +1 -0
- package/dist/ui-core/rendering/theme.js +2 -0
- package/dist/ui-core/rendering/theme.js.map +1 -1
- package/dist/ui-core/state/transcript-hydrate.js +3 -3
- package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
- package/dist/ui-core/state/transcript-reducer.d.ts +5 -0
- package/dist/ui-core/state/transcript-reducer.js +76 -3
- package/dist/ui-core/state/transcript-reducer.js.map +1 -1
- package/dist/ui-core/state/transcript-store.d.ts +10 -1
- package/dist/ui-core/state/transcript-store.js +22 -1
- package/dist/ui-core/state/transcript-store.js.map +1 -1
- package/dist/ui-core/state/transcript-types.d.ts +2 -0
- package/dist/ui-core/state/transcript-types.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +6 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const REQUEST_FINGERPRINT_VERSION = 1;
|
|
3
|
+
export const REQUEST_FINGERPRINT_SERIALIZER_VERSION = 1;
|
|
4
|
+
function byteLength(value) {
|
|
5
|
+
return Buffer.byteLength(value, "utf8");
|
|
6
|
+
}
|
|
7
|
+
function updateChunk(hash, value) {
|
|
8
|
+
const bytes = byteLength(value);
|
|
9
|
+
hash.update(`${bytes}:`, "utf8");
|
|
10
|
+
hash.update(value, "utf8");
|
|
11
|
+
return bytes;
|
|
12
|
+
}
|
|
13
|
+
function sha256(value) {
|
|
14
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
15
|
+
}
|
|
16
|
+
function chainedSha256(previous, value) {
|
|
17
|
+
const hash = createHash("sha256");
|
|
18
|
+
hash.update("clai.request-fingerprint.prefix.v1\0", "utf8");
|
|
19
|
+
if (previous)
|
|
20
|
+
hash.update(previous, "hex");
|
|
21
|
+
updateChunk(hash, value);
|
|
22
|
+
return hash.digest("hex");
|
|
23
|
+
}
|
|
24
|
+
function skipWhitespace(source, index) {
|
|
25
|
+
let next = index;
|
|
26
|
+
while (next < source.length && /\s/.test(source[next]))
|
|
27
|
+
next += 1;
|
|
28
|
+
return next;
|
|
29
|
+
}
|
|
30
|
+
function scanJsonString(source, start) {
|
|
31
|
+
if (source[start] !== '"')
|
|
32
|
+
throw new Error("expected JSON string");
|
|
33
|
+
for (let index = start + 1; index < source.length; index += 1) {
|
|
34
|
+
if (source[index] === "\\") {
|
|
35
|
+
index += 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (source[index] === '"')
|
|
39
|
+
return index + 1;
|
|
40
|
+
}
|
|
41
|
+
throw new Error("unterminated JSON string");
|
|
42
|
+
}
|
|
43
|
+
function scanJsonValue(source, start) {
|
|
44
|
+
const first = source[start];
|
|
45
|
+
if (first === '"')
|
|
46
|
+
return scanJsonString(source, start);
|
|
47
|
+
if (first !== "{" && first !== "[") {
|
|
48
|
+
let end = start;
|
|
49
|
+
while (end < source.length && !/[\s,}\]]/.test(source[end]))
|
|
50
|
+
end += 1;
|
|
51
|
+
if (end === start)
|
|
52
|
+
throw new Error("expected JSON value");
|
|
53
|
+
return end;
|
|
54
|
+
}
|
|
55
|
+
let depth = 0;
|
|
56
|
+
let inString = false;
|
|
57
|
+
for (let index = start; index < source.length; index += 1) {
|
|
58
|
+
const character = source[index];
|
|
59
|
+
if (inString) {
|
|
60
|
+
if (character === "\\") {
|
|
61
|
+
index += 1;
|
|
62
|
+
}
|
|
63
|
+
else if (character === '"') {
|
|
64
|
+
inString = false;
|
|
65
|
+
}
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (character === '"') {
|
|
69
|
+
inString = true;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (character === "{" || character === "[") {
|
|
73
|
+
depth += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (character === "}" || character === "]") {
|
|
77
|
+
depth -= 1;
|
|
78
|
+
if (depth === 0)
|
|
79
|
+
return index + 1;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw new Error("unterminated JSON value");
|
|
83
|
+
}
|
|
84
|
+
function rootJsonFields(source) {
|
|
85
|
+
let index = skipWhitespace(source, 0);
|
|
86
|
+
if (source[index] !== "{")
|
|
87
|
+
throw new Error("expected JSON object");
|
|
88
|
+
index = skipWhitespace(source, index + 1);
|
|
89
|
+
const fields = [];
|
|
90
|
+
while (source[index] !== "}") {
|
|
91
|
+
const start = index;
|
|
92
|
+
const keyEnd = scanJsonString(source, index);
|
|
93
|
+
const name = JSON.parse(source.slice(index, keyEnd));
|
|
94
|
+
index = skipWhitespace(source, keyEnd);
|
|
95
|
+
if (source[index] !== ":")
|
|
96
|
+
throw new Error("expected JSON field separator");
|
|
97
|
+
const valueStart = skipWhitespace(source, index + 1);
|
|
98
|
+
const end = scanJsonValue(source, valueStart);
|
|
99
|
+
fields.push({ name, start, valueStart, end });
|
|
100
|
+
index = skipWhitespace(source, end);
|
|
101
|
+
if (source[index] === ",") {
|
|
102
|
+
index = skipWhitespace(source, index + 1);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (source[index] === "}")
|
|
106
|
+
break;
|
|
107
|
+
throw new Error("expected JSON field delimiter");
|
|
108
|
+
}
|
|
109
|
+
if (skipWhitespace(source, index + 1) !== source.length) {
|
|
110
|
+
throw new Error("unexpected JSON suffix");
|
|
111
|
+
}
|
|
112
|
+
return fields;
|
|
113
|
+
}
|
|
114
|
+
function arrayElements(source, range) {
|
|
115
|
+
let index = skipWhitespace(source, range.start);
|
|
116
|
+
if (source[index] !== "[")
|
|
117
|
+
return [];
|
|
118
|
+
index = skipWhitespace(source, index + 1);
|
|
119
|
+
const elements = [];
|
|
120
|
+
while (source[index] !== "]") {
|
|
121
|
+
const start = index;
|
|
122
|
+
const end = scanJsonValue(source, start);
|
|
123
|
+
elements.push({ start, end });
|
|
124
|
+
index = skipWhitespace(source, end);
|
|
125
|
+
if (source[index] === ",") {
|
|
126
|
+
index = skipWhitespace(source, index + 1);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (source[index] === "]")
|
|
130
|
+
break;
|
|
131
|
+
throw new Error("expected JSON array delimiter");
|
|
132
|
+
}
|
|
133
|
+
return elements;
|
|
134
|
+
}
|
|
135
|
+
function sectionKind(fieldName) {
|
|
136
|
+
if (fieldName === "system" || fieldName === "systemInstruction") {
|
|
137
|
+
return "instructions";
|
|
138
|
+
}
|
|
139
|
+
if (fieldName === "tools")
|
|
140
|
+
return "tools";
|
|
141
|
+
if (fieldName === "messages" || fieldName === "contents" || fieldName === "input") {
|
|
142
|
+
return "history";
|
|
143
|
+
}
|
|
144
|
+
return "settings";
|
|
145
|
+
}
|
|
146
|
+
function serializerId(input) {
|
|
147
|
+
switch (input.provider) {
|
|
148
|
+
case "anthropic":
|
|
149
|
+
return "anthropic-messages";
|
|
150
|
+
case "gemini":
|
|
151
|
+
return "gemini-generate-content";
|
|
152
|
+
case "meta":
|
|
153
|
+
return "meta-responses";
|
|
154
|
+
case "ollama":
|
|
155
|
+
return "ollama-chat";
|
|
156
|
+
case "aws-mantle":
|
|
157
|
+
return /(?:^|[./-])(?:anthropic|claude)(?:[./-]|$)/i.test(input.model)
|
|
158
|
+
? "anthropic-messages"
|
|
159
|
+
: "chat-completions";
|
|
160
|
+
default:
|
|
161
|
+
return "chat-completions";
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function freezeFingerprint(serializer, body, sections, prefixes) {
|
|
165
|
+
return Object.freeze({
|
|
166
|
+
version: REQUEST_FINGERPRINT_VERSION,
|
|
167
|
+
serializer: Object.freeze({
|
|
168
|
+
id: serializer,
|
|
169
|
+
version: REQUEST_FINGERPRINT_SERIALIZER_VERSION,
|
|
170
|
+
}),
|
|
171
|
+
body: Object.freeze({ ...body }),
|
|
172
|
+
sections: Object.freeze(sections.map((section) => Object.freeze({ ...section }))),
|
|
173
|
+
prefixes: Object.freeze(prefixes.map((prefix) => Object.freeze({ ...prefix }))),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
function wireOnlyFingerprint(input, body) {
|
|
177
|
+
return freezeFingerprint(serializerId(input), { byteLength: byteLength(body), sha256: sha256(body) }, [], [
|
|
178
|
+
{
|
|
179
|
+
ordinal: 1,
|
|
180
|
+
section: "wire",
|
|
181
|
+
boundary: "wire",
|
|
182
|
+
byteLength: byteLength(body),
|
|
183
|
+
sha256: sha256(body),
|
|
184
|
+
},
|
|
185
|
+
]);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Captures hashes and byte counts from the exact JSON string passed to fetch.
|
|
189
|
+
* The returned value has no request body, header, URL, or decoded JSON values.
|
|
190
|
+
*/
|
|
191
|
+
export function fingerprintFinalRequest(input, body) {
|
|
192
|
+
if (typeof body !== "string")
|
|
193
|
+
return undefined;
|
|
194
|
+
try {
|
|
195
|
+
JSON.parse(body);
|
|
196
|
+
const fields = rootJsonFields(body);
|
|
197
|
+
const sections = new Map();
|
|
198
|
+
const sectionOrder = [];
|
|
199
|
+
const appendSection = (kind, value, itemCount = 0) => {
|
|
200
|
+
let section = sections.get(kind);
|
|
201
|
+
if (!section) {
|
|
202
|
+
section = {
|
|
203
|
+
kind,
|
|
204
|
+
hash: createHash("sha256").update(`clai.request-fingerprint.section.${kind}.v1\0`, "utf8"),
|
|
205
|
+
byteLength: 0,
|
|
206
|
+
itemCount: 0,
|
|
207
|
+
};
|
|
208
|
+
sections.set(kind, section);
|
|
209
|
+
sectionOrder.push(section);
|
|
210
|
+
}
|
|
211
|
+
section.byteLength += updateChunk(section.hash, value);
|
|
212
|
+
section.itemCount += itemCount;
|
|
213
|
+
};
|
|
214
|
+
const boundaries = [];
|
|
215
|
+
for (const field of fields) {
|
|
216
|
+
const kind = sectionKind(field.name);
|
|
217
|
+
const fieldValue = body.slice(field.start, field.end);
|
|
218
|
+
const history = kind === "history"
|
|
219
|
+
? arrayElements(body, { start: field.valueStart, end: field.end })
|
|
220
|
+
: [];
|
|
221
|
+
appendSection(kind, fieldValue, history.length);
|
|
222
|
+
for (let index = 0; index < history.length; index += 1) {
|
|
223
|
+
boundaries.push({
|
|
224
|
+
end: history[index].end,
|
|
225
|
+
section: "history",
|
|
226
|
+
boundary: "history-item",
|
|
227
|
+
historyItems: index + 1,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
boundaries.push({
|
|
231
|
+
end: field.end,
|
|
232
|
+
section: kind,
|
|
233
|
+
boundary: "field",
|
|
234
|
+
...(kind === "history" ? { historyItems: history.length } : {}),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
boundaries.push({
|
|
238
|
+
end: body.length,
|
|
239
|
+
section: "wire",
|
|
240
|
+
boundary: "wire",
|
|
241
|
+
});
|
|
242
|
+
let cursor = 0;
|
|
243
|
+
let previous;
|
|
244
|
+
let prefixBytes = 0;
|
|
245
|
+
const prefixes = [];
|
|
246
|
+
for (const boundary of boundaries) {
|
|
247
|
+
const chunk = body.slice(cursor, boundary.end);
|
|
248
|
+
prefixBytes += byteLength(chunk);
|
|
249
|
+
previous = chainedSha256(previous, chunk);
|
|
250
|
+
prefixes.push({
|
|
251
|
+
ordinal: prefixes.length + 1,
|
|
252
|
+
section: boundary.section,
|
|
253
|
+
boundary: boundary.boundary,
|
|
254
|
+
byteLength: prefixBytes,
|
|
255
|
+
sha256: previous,
|
|
256
|
+
...(boundary.historyItems !== undefined
|
|
257
|
+
? { historyItems: boundary.historyItems }
|
|
258
|
+
: {}),
|
|
259
|
+
});
|
|
260
|
+
cursor = boundary.end;
|
|
261
|
+
}
|
|
262
|
+
const sectionFingerprints = sectionOrder.map((section) => ({
|
|
263
|
+
section: section.kind,
|
|
264
|
+
byteLength: section.byteLength,
|
|
265
|
+
sha256: section.hash.digest("hex"),
|
|
266
|
+
...(section.kind === "history" ? { itemCount: section.itemCount } : {}),
|
|
267
|
+
}));
|
|
268
|
+
return freezeFingerprint(serializerId(input), { byteLength: byteLength(body), sha256: sha256(body) }, sectionFingerprints, prefixes);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return wireOnlyFingerprint(input, body);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function historyItemPrefix(fingerprint, historyItems) {
|
|
275
|
+
return fingerprint.prefixes.find((prefix) => prefix.section === "history" &&
|
|
276
|
+
prefix.boundary === "history-item" &&
|
|
277
|
+
prefix.historyItems === historyItems);
|
|
278
|
+
}
|
|
279
|
+
function stableHistoryItems(fingerprint) {
|
|
280
|
+
return fingerprint.prefixes.reduce((largest, prefix) => prefix.section === "history" &&
|
|
281
|
+
prefix.boundary === "history-item" &&
|
|
282
|
+
prefix.historyItems !== undefined &&
|
|
283
|
+
prefix.historyItems > largest
|
|
284
|
+
? prefix.historyItems
|
|
285
|
+
: largest, 0);
|
|
286
|
+
}
|
|
287
|
+
function sectionSha256(fingerprint, section) {
|
|
288
|
+
return fingerprint.sections.find((entry) => entry.section === section)
|
|
289
|
+
?.sha256;
|
|
290
|
+
}
|
|
291
|
+
export function classifyPrefixAffinity(prior, next) {
|
|
292
|
+
if (!prior || !next)
|
|
293
|
+
return "unknown";
|
|
294
|
+
if (prior.serializer.id !== next.serializer.id)
|
|
295
|
+
return "not_eligible";
|
|
296
|
+
const items = stableHistoryItems(prior);
|
|
297
|
+
if (items === 0)
|
|
298
|
+
return "unknown";
|
|
299
|
+
const priorPrefix = historyItemPrefix(prior, items);
|
|
300
|
+
const nextPrefix = historyItemPrefix(next, items);
|
|
301
|
+
if (!priorPrefix || !nextPrefix)
|
|
302
|
+
return "unknown";
|
|
303
|
+
if (sectionSha256(prior, "instructions") !==
|
|
304
|
+
sectionSha256(next, "instructions") ||
|
|
305
|
+
sectionSha256(prior, "tools") !== sectionSha256(next, "tools")) {
|
|
306
|
+
return "not_eligible";
|
|
307
|
+
}
|
|
308
|
+
if (priorPrefix.sha256 === nextPrefix.sha256) {
|
|
309
|
+
return "exact_append_eligible";
|
|
310
|
+
}
|
|
311
|
+
return "partial_prefix_eligible";
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=request-fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-fingerprint.js","sourceRoot":"","sources":["../../src/llm/request-fingerprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { ChatMessage, ProviderId, ReasoningArtifactReplayDecision, ReasoningArtifactReplayTarget, ReasoningPreference, RequestFingerprintSerializerId, ToolChoice, ToolDefinition } from "../types.js";
|
|
2
|
+
import { type CachePolicySpec, type ContextLimitSpec, type ProfileReplayScope, type ProfileTriState, type ReasoningControlDialect, type ReasoningGeneration } from "./provider-profile.js";
|
|
3
|
+
/**
|
|
4
|
+
* Canonical request plan (doc 03 §"Canonical request plan", doc 06 §3).
|
|
5
|
+
*
|
|
6
|
+
* One immutable, renderer-neutral object describes what a logical generation
|
|
7
|
+
* will send: route, timeline with stable/mutable boundaries, tools, replay
|
|
8
|
+
* decisions for every artifact, controls, images, route policy, budget, and a
|
|
9
|
+
* privacy-safe cache-prefix fingerprint. Provider serializers emit their wire
|
|
10
|
+
* bodies from a compiled plan; nothing dispatches from ad hoc message arrays
|
|
11
|
+
* past this boundary.
|
|
12
|
+
*/
|
|
13
|
+
export declare const REQUEST_PLAN_VERSION: 1;
|
|
14
|
+
export declare const REQUEST_PLAN_COMPILER_VERSION: 1;
|
|
15
|
+
export type RequestPlanSectionKind = "instructions" | "history" | "live";
|
|
16
|
+
export interface RequestPlanBoundary {
|
|
17
|
+
readonly kind: RequestPlanSectionKind;
|
|
18
|
+
/** Inclusive index into `timeline.messages`. */
|
|
19
|
+
readonly messageStart: number;
|
|
20
|
+
/** Exclusive index into `timeline.messages`. */
|
|
21
|
+
readonly messageEnd: number;
|
|
22
|
+
readonly messageCount: number;
|
|
23
|
+
}
|
|
24
|
+
export type RequestPlanControlSuppression = "observed-rejection" | "capability-denied";
|
|
25
|
+
export interface RequestPlanControls {
|
|
26
|
+
readonly reasoning?: ReasoningPreference | undefined;
|
|
27
|
+
readonly controlSuppression?: RequestPlanControlSuppression | undefined;
|
|
28
|
+
readonly temperature: number;
|
|
29
|
+
readonly topP?: number | undefined;
|
|
30
|
+
readonly requestedMaxTokens?: number | undefined;
|
|
31
|
+
readonly stream: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface RequestPlanRoute {
|
|
34
|
+
readonly provider: ProviderId;
|
|
35
|
+
readonly model: string;
|
|
36
|
+
readonly serializer: RequestFingerprintSerializerId;
|
|
37
|
+
readonly serializerVersion: 1;
|
|
38
|
+
readonly compilerVersion: 1;
|
|
39
|
+
readonly endpointHash?: string | undefined;
|
|
40
|
+
}
|
|
41
|
+
export interface RequestPlanArtifactDecision {
|
|
42
|
+
readonly messageIndex: number;
|
|
43
|
+
readonly decision: ReasoningArtifactReplayDecision;
|
|
44
|
+
}
|
|
45
|
+
export type RequestPlanCacheSectionName = "instructions" | "tools" | "history" | "artifacts" | "settings";
|
|
46
|
+
export interface RequestPlanCacheSection {
|
|
47
|
+
readonly ordinal: number;
|
|
48
|
+
readonly section: RequestPlanCacheSectionName;
|
|
49
|
+
readonly sha256: string;
|
|
50
|
+
readonly byteLength: number;
|
|
51
|
+
readonly estimatedTokens: number;
|
|
52
|
+
readonly itemCount: number;
|
|
53
|
+
}
|
|
54
|
+
export interface RequestPlanCacheFingerprint {
|
|
55
|
+
readonly prefixMessageCount: number;
|
|
56
|
+
readonly replayedArtifactCount: number;
|
|
57
|
+
readonly sections: readonly RequestPlanCacheSection[];
|
|
58
|
+
readonly prefixSha256: string;
|
|
59
|
+
}
|
|
60
|
+
export interface RequestPlanRoutePolicy {
|
|
61
|
+
readonly reasoningGeneration: ReasoningGeneration;
|
|
62
|
+
readonly controlDialect: ReasoningControlDialect;
|
|
63
|
+
readonly controlStatus: ProfileTriState;
|
|
64
|
+
readonly replayScope: ProfileReplayScope;
|
|
65
|
+
readonly cache: CachePolicySpec;
|
|
66
|
+
readonly limits: ContextLimitSpec;
|
|
67
|
+
}
|
|
68
|
+
export interface RequestPlanV1 {
|
|
69
|
+
readonly version: 1;
|
|
70
|
+
readonly route: RequestPlanRoute;
|
|
71
|
+
readonly timeline: {
|
|
72
|
+
readonly messages: readonly ChatMessage[];
|
|
73
|
+
readonly sections: readonly RequestPlanBoundary[];
|
|
74
|
+
/** Every message excluded from the cacheable prefix, in timeline order. */
|
|
75
|
+
readonly mutableMessageIndexes: readonly number[];
|
|
76
|
+
};
|
|
77
|
+
readonly tools: {
|
|
78
|
+
readonly definitions: readonly ToolDefinition[];
|
|
79
|
+
readonly choice?: ToolChoice | undefined;
|
|
80
|
+
readonly parallelToolCalls?: boolean | undefined;
|
|
81
|
+
};
|
|
82
|
+
readonly replay: {
|
|
83
|
+
readonly target: ReasoningArtifactReplayTarget;
|
|
84
|
+
readonly decisions: readonly RequestPlanArtifactDecision[];
|
|
85
|
+
};
|
|
86
|
+
readonly controls: RequestPlanControls;
|
|
87
|
+
readonly images: {
|
|
88
|
+
readonly visionAccepted: boolean;
|
|
89
|
+
readonly imageMessageIndexes: readonly number[];
|
|
90
|
+
readonly imageCount: number;
|
|
91
|
+
};
|
|
92
|
+
readonly policy: RequestPlanRoutePolicy;
|
|
93
|
+
readonly budget: {
|
|
94
|
+
readonly plannedAdmissions: 1;
|
|
95
|
+
};
|
|
96
|
+
readonly cache: {
|
|
97
|
+
readonly policy: CachePolicySpec;
|
|
98
|
+
readonly fingerprint: RequestPlanCacheFingerprint;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export interface CompileRequestPlanInput {
|
|
102
|
+
readonly provider: ProviderId;
|
|
103
|
+
readonly model: string;
|
|
104
|
+
readonly messages: readonly ChatMessage[];
|
|
105
|
+
readonly stream: boolean;
|
|
106
|
+
/** Raw endpoint string; only its normalized hash is retained. */
|
|
107
|
+
readonly endpoint?: string | undefined;
|
|
108
|
+
readonly reasoning?: ReasoningPreference | undefined;
|
|
109
|
+
readonly tools?: readonly ToolDefinition[] | undefined;
|
|
110
|
+
readonly toolChoice?: ToolChoice | undefined;
|
|
111
|
+
readonly parallelToolCalls?: boolean | undefined;
|
|
112
|
+
readonly temperature?: number | undefined;
|
|
113
|
+
readonly maxTokens?: number | undefined;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Deterministically compile one immutable plan. Compilation is pure: the same
|
|
117
|
+
* inputs always produce a deep-equal plan with identical section hashes.
|
|
118
|
+
*/
|
|
119
|
+
export declare function compileRequestPlan(input: CompileRequestPlanInput): RequestPlanV1;
|