@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.
Files changed (264) hide show
  1. package/README.md +14 -0
  2. package/dist/agent/compaction-executor.d.ts +68 -0
  3. package/dist/agent/compaction-executor.js +343 -0
  4. package/dist/agent/compaction-executor.js.map +1 -0
  5. package/dist/agent/context-breakdown.js +2 -0
  6. package/dist/agent/context-breakdown.js.map +1 -1
  7. package/dist/agent/context-manager.d.ts +23 -9
  8. package/dist/agent/context-manager.js +72 -43
  9. package/dist/agent/context-manager.js.map +1 -1
  10. package/dist/agent/events.d.ts +3 -0
  11. package/dist/agent/loop-guard.d.ts +2 -0
  12. package/dist/agent/loop-guard.js +48 -3
  13. package/dist/agent/loop-guard.js.map +1 -1
  14. package/dist/agent/prompt-composer.js +6 -6
  15. package/dist/agent/prompt-composer.js.map +1 -1
  16. package/dist/agent/reliability-policy.d.ts +1 -0
  17. package/dist/agent/reliability-policy.js +6 -3
  18. package/dist/agent/reliability-policy.js.map +1 -1
  19. package/dist/agent/request-accounting.d.ts +97 -0
  20. package/dist/agent/request-accounting.js +207 -0
  21. package/dist/agent/request-accounting.js.map +1 -0
  22. package/dist/agent/request-budget.d.ts +2 -2
  23. package/dist/agent/request-budget.js +2 -4
  24. package/dist/agent/request-budget.js.map +1 -1
  25. package/dist/agent/runner.d.ts +8 -2
  26. package/dist/agent/runner.js +409 -178
  27. package/dist/agent/runner.js.map +1 -1
  28. package/dist/agent/session-title.d.ts +0 -26
  29. package/dist/agent/session-title.js +0 -80
  30. package/dist/agent/session-title.js.map +1 -1
  31. package/dist/agent/tool-history.d.ts +2 -2
  32. package/dist/agent/tool-history.js +19 -6
  33. package/dist/agent/tool-history.js.map +1 -1
  34. package/dist/app/adapters/agent-event-adapter.js +19 -0
  35. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  36. package/dist/app/adapters/current-agent-adapter.js +4 -0
  37. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  38. package/dist/app/commands/catalog.js +24 -0
  39. package/dist/app/commands/catalog.js.map +1 -1
  40. package/dist/app/controllers/cancel-coordinator.d.ts +51 -0
  41. package/dist/app/controllers/cancel-coordinator.js +48 -0
  42. package/dist/app/controllers/cancel-coordinator.js.map +1 -0
  43. package/dist/app/controllers/session-compact-helper.d.ts +19 -2
  44. package/dist/app/controllers/session-compact-helper.js +100 -127
  45. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  46. package/dist/app/controllers/session-context-usage.d.ts +32 -15
  47. package/dist/app/controllers/session-context-usage.js +186 -51
  48. package/dist/app/controllers/session-context-usage.js.map +1 -1
  49. package/dist/app/controllers/session-controller.d.ts +20 -11
  50. package/dist/app/controllers/session-controller.js +111 -90
  51. package/dist/app/controllers/session-controller.js.map +1 -1
  52. package/dist/app/controllers/session-naming.d.ts +31 -0
  53. package/dist/app/controllers/session-naming.js +173 -0
  54. package/dist/app/controllers/session-naming.js.map +1 -0
  55. package/dist/app/controllers/session-persistence.d.ts +2 -2
  56. package/dist/app/controllers/session-persistence.js +3 -6
  57. package/dist/app/controllers/session-persistence.js.map +1 -1
  58. package/dist/app/controllers/session-turn-request.d.ts +2 -1
  59. package/dist/app/controllers/session-turn-request.js +3 -0
  60. package/dist/app/controllers/session-turn-request.js.map +1 -1
  61. package/dist/app/controllers/turn-controller.d.ts +2 -1
  62. package/dist/app/controllers/turn-controller.js +1 -0
  63. package/dist/app/controllers/turn-controller.js.map +1 -1
  64. package/dist/app/events/app-event.d.ts +9 -0
  65. package/dist/app/events/app-event.js.map +1 -1
  66. package/dist/app/ports/agent-port.d.ts +8 -1
  67. package/dist/classic/app/ClassicApp.js +2 -1
  68. package/dist/classic/app/ClassicApp.js.map +1 -1
  69. package/dist/classic/app/app-wiring.js +1 -2
  70. package/dist/classic/app/app-wiring.js.map +1 -1
  71. package/dist/classic/app/wiring-interactions.js +2 -7
  72. package/dist/classic/app/wiring-interactions.js.map +1 -1
  73. package/dist/classic/blocks/tool-lines.js +2 -1
  74. package/dist/classic/blocks/tool-lines.js.map +1 -1
  75. package/dist/classic/input/cancel-ladder.d.ts +2 -19
  76. package/dist/classic/input/cancel-ladder.js +13 -20
  77. package/dist/classic/input/cancel-ladder.js.map +1 -1
  78. package/dist/commands/providers.js +2 -0
  79. package/dist/commands/providers.js.map +1 -1
  80. package/dist/llm/adapters/anthropic-tools.d.ts +31 -14
  81. package/dist/llm/adapters/anthropic-tools.js +124 -29
  82. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  83. package/dist/llm/adapters/gemini-tools.d.ts +16 -4
  84. package/dist/llm/adapters/gemini-tools.js +117 -16
  85. package/dist/llm/adapters/gemini-tools.js.map +1 -1
  86. package/dist/llm/adapters/openai-tools.d.ts +13 -2
  87. package/dist/llm/adapters/openai-tools.js +58 -11
  88. package/dist/llm/adapters/openai-tools.js.map +1 -1
  89. package/dist/llm/agentrouter.js +68 -45
  90. package/dist/llm/agentrouter.js.map +1 -1
  91. package/dist/llm/anthropic.js +69 -36
  92. package/dist/llm/anthropic.js.map +1 -1
  93. package/dist/llm/aws-mantle.js +70 -32
  94. package/dist/llm/aws-mantle.js.map +1 -1
  95. package/dist/llm/bynara.js +26 -69
  96. package/dist/llm/bynara.js.map +1 -1
  97. package/dist/llm/capabilities.d.ts +2 -1
  98. package/dist/llm/capabilities.js +47 -0
  99. package/dist/llm/capabilities.js.map +1 -1
  100. package/dist/llm/context-snapshot.d.ts +100 -0
  101. package/dist/llm/context-snapshot.js +277 -0
  102. package/dist/llm/context-snapshot.js.map +1 -0
  103. package/dist/llm/context-windows.d.ts +10 -0
  104. package/dist/llm/context-windows.js +129 -0
  105. package/dist/llm/context-windows.js.map +1 -0
  106. package/dist/llm/custom-provider-profile.d.ts +75 -0
  107. package/dist/llm/custom-provider-profile.js +558 -0
  108. package/dist/llm/custom-provider-profile.js.map +1 -0
  109. package/dist/llm/custom-providers.d.ts +13 -1
  110. package/dist/llm/custom-providers.js +77 -25
  111. package/dist/llm/custom-providers.js.map +1 -1
  112. package/dist/llm/effort-fallback.d.ts +44 -0
  113. package/dist/llm/effort-fallback.js +101 -0
  114. package/dist/llm/effort-fallback.js.map +1 -0
  115. package/dist/llm/fireworks.js +4 -0
  116. package/dist/llm/fireworks.js.map +1 -1
  117. package/dist/llm/free.js +4 -0
  118. package/dist/llm/free.js.map +1 -1
  119. package/dist/llm/gemini.d.ts +1 -1
  120. package/dist/llm/gemini.js +89 -51
  121. package/dist/llm/gemini.js.map +1 -1
  122. package/dist/llm/groq.js +4 -0
  123. package/dist/llm/groq.js.map +1 -1
  124. package/dist/llm/hetzner.js +4 -0
  125. package/dist/llm/hetzner.js.map +1 -1
  126. package/dist/llm/http.d.ts +49 -10
  127. package/dist/llm/http.js +417 -153
  128. package/dist/llm/http.js.map +1 -1
  129. package/dist/llm/kimchi.js +4 -0
  130. package/dist/llm/kimchi.js.map +1 -1
  131. package/dist/llm/lightning.js +4 -0
  132. package/dist/llm/lightning.js.map +1 -1
  133. package/dist/llm/meta.d.ts +2 -0
  134. package/dist/llm/meta.js +811 -655
  135. package/dist/llm/meta.js.map +1 -1
  136. package/dist/llm/modal.js +4 -0
  137. package/dist/llm/modal.js.map +1 -1
  138. package/dist/llm/model-families.d.ts +9 -0
  139. package/dist/llm/model-families.js +39 -0
  140. package/dist/llm/model-families.js.map +1 -0
  141. package/dist/llm/nvidia.js +4 -0
  142. package/dist/llm/nvidia.js.map +1 -1
  143. package/dist/llm/ollama.js +44 -40
  144. package/dist/llm/ollama.js.map +1 -1
  145. package/dist/llm/openai.js +4 -0
  146. package/dist/llm/openai.js.map +1 -1
  147. package/dist/llm/openrouter.js +4 -0
  148. package/dist/llm/openrouter.js.map +1 -1
  149. package/dist/llm/operation-ledger.d.ts +60 -0
  150. package/dist/llm/operation-ledger.js +136 -0
  151. package/dist/llm/operation-ledger.js.map +1 -0
  152. package/dist/llm/operation-usage.d.ts +32 -0
  153. package/dist/llm/operation-usage.js +172 -0
  154. package/dist/llm/operation-usage.js.map +1 -0
  155. package/dist/llm/orcarouter.d.ts +7 -0
  156. package/dist/llm/orcarouter.js +166 -0
  157. package/dist/llm/orcarouter.js.map +1 -0
  158. package/dist/llm/provider-profile-layers.d.ts +7 -0
  159. package/dist/llm/provider-profile-layers.js +961 -0
  160. package/dist/llm/provider-profile-layers.js.map +1 -0
  161. package/dist/llm/provider-profile.d.ts +181 -0
  162. package/dist/llm/provider-profile.js +329 -0
  163. package/dist/llm/provider-profile.js.map +1 -0
  164. package/dist/llm/provider-profiles.d.ts +13 -0
  165. package/dist/llm/provider-profiles.js +86 -0
  166. package/dist/llm/provider-profiles.js.map +1 -0
  167. package/dist/llm/provider.d.ts +2 -0
  168. package/dist/llm/provider.js +67 -0
  169. package/dist/llm/provider.js.map +1 -1
  170. package/dist/llm/qwen-cloud.js +4 -0
  171. package/dist/llm/qwen-cloud.js.map +1 -1
  172. package/dist/llm/reasoning-artifacts.d.ts +101 -0
  173. package/dist/llm/reasoning-artifacts.js +440 -0
  174. package/dist/llm/reasoning-artifacts.js.map +1 -0
  175. package/dist/llm/request-fingerprint.d.ts +10 -0
  176. package/dist/llm/request-fingerprint.js +313 -0
  177. package/dist/llm/request-fingerprint.js.map +1 -0
  178. package/dist/llm/request-plan.d.ts +119 -0
  179. package/dist/llm/request-plan.js +279 -0
  180. package/dist/llm/request-plan.js.map +1 -0
  181. package/dist/llm/router.d.ts +19 -1
  182. package/dist/llm/router.js +447 -75
  183. package/dist/llm/router.js.map +1 -1
  184. package/dist/llm/stream-events.d.ts +47 -0
  185. package/dist/llm/stream-events.js +55 -0
  186. package/dist/llm/stream-events.js.map +1 -0
  187. package/dist/llm/stream-terminal.d.ts +30 -0
  188. package/dist/llm/stream-terminal.js +51 -0
  189. package/dist/llm/stream-terminal.js.map +1 -0
  190. package/dist/llm/token-estimate-calibration.d.ts +23 -0
  191. package/dist/llm/token-estimate-calibration.js +140 -0
  192. package/dist/llm/token-estimate-calibration.js.map +1 -0
  193. package/dist/llm/token-usage.d.ts +35 -5
  194. package/dist/llm/token-usage.js +212 -162
  195. package/dist/llm/token-usage.js.map +1 -1
  196. package/dist/llm/tokenrouter.js +8 -2
  197. package/dist/llm/tokenrouter.js.map +1 -1
  198. package/dist/modes/ask.js +11 -5
  199. package/dist/modes/ask.js.map +1 -1
  200. package/dist/noninteractive/start-noninteractive.js +31 -2
  201. package/dist/noninteractive/start-noninteractive.js.map +1 -1
  202. package/dist/noninteractive/stream-blocks.js +15 -4
  203. package/dist/noninteractive/stream-blocks.js.map +1 -1
  204. package/dist/prompts/embedded.js +1 -1
  205. package/dist/prompts/embedded.js.map +1 -1
  206. package/dist/prompts/system.agent.md +6 -0
  207. package/dist/store/config.js +5 -1
  208. package/dist/store/config.js.map +1 -1
  209. package/dist/store/history.d.ts +2 -0
  210. package/dist/store/history.js +19 -10
  211. package/dist/store/history.js.map +1 -1
  212. package/dist/store/plan.js +20 -14
  213. package/dist/store/plan.js.map +1 -1
  214. package/dist/tools/elevated-shell.d.ts +1 -1
  215. package/dist/tools/elevated-shell.js +24 -72
  216. package/dist/tools/elevated-shell.js.map +1 -1
  217. package/dist/tools/nmap-runner.js +30 -36
  218. package/dist/tools/nmap-runner.js.map +1 -1
  219. package/dist/tools/sudo-session.d.ts +83 -0
  220. package/dist/tools/sudo-session.js +124 -0
  221. package/dist/tools/sudo-session.js.map +1 -0
  222. package/dist/tui-v2/app/App.js +9 -24
  223. package/dist/tui-v2/app/App.js.map +1 -1
  224. package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
  225. package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
  226. package/dist/tui-v2/components/transcript/intro-card.js +2 -1
  227. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
  228. package/dist/tui-v2/composer/composer-editor.js +2 -1
  229. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  230. package/dist/types.d.ts +156 -1
  231. package/dist/types.js +1 -0
  232. package/dist/types.js.map +1 -1
  233. package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
  234. package/dist/ui-core/bootstrap/composition-root.js +26 -3
  235. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  236. package/dist/ui-core/commands/picker-commands.js +11 -5
  237. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  238. package/dist/ui-core/commands/session-commands.js +41 -5
  239. package/dist/ui-core/commands/session-commands.js.map +1 -1
  240. package/dist/ui-core/plan/plan-lifecycle.js +3 -2
  241. package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
  242. package/dist/ui-core/rendering/context-limit.js +4 -1
  243. package/dist/ui-core/rendering/context-limit.js.map +1 -1
  244. package/dist/ui-core/rendering/duration.d.ts +2 -1
  245. package/dist/ui-core/rendering/duration.js +13 -5
  246. package/dist/ui-core/rendering/duration.js.map +1 -1
  247. package/dist/ui-core/rendering/intro-header.js +2 -2
  248. package/dist/ui-core/rendering/intro-header.js.map +1 -1
  249. package/dist/ui-core/rendering/theme.d.ts +1 -0
  250. package/dist/ui-core/rendering/theme.js +2 -0
  251. package/dist/ui-core/rendering/theme.js.map +1 -1
  252. package/dist/ui-core/state/transcript-hydrate.js +3 -3
  253. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  254. package/dist/ui-core/state/transcript-reducer.d.ts +5 -0
  255. package/dist/ui-core/state/transcript-reducer.js +76 -3
  256. package/dist/ui-core/state/transcript-reducer.js.map +1 -1
  257. package/dist/ui-core/state/transcript-store.d.ts +10 -1
  258. package/dist/ui-core/state/transcript-store.js +22 -1
  259. package/dist/ui-core/state/transcript-store.js.map +1 -1
  260. package/dist/ui-core/state/transcript-types.d.ts +2 -0
  261. package/dist/ui-core/state/transcript-types.js.map +1 -1
  262. package/dist/version.generated.d.ts +2 -2
  263. package/dist/version.generated.js +2 -2
  264. package/package.json +6 -1
@@ -0,0 +1,440 @@
1
+ import { createHash } from "node:crypto";
2
+ function immutableClone(value) {
3
+ if (Array.isArray(value)) {
4
+ return Object.freeze(value.map((entry) => immutableClone(entry)));
5
+ }
6
+ if (value && typeof value === "object") {
7
+ const copy = {};
8
+ for (const [key, entry] of Object.entries(value)) {
9
+ copy[key] = immutableClone(entry);
10
+ }
11
+ return Object.freeze(copy);
12
+ }
13
+ return value;
14
+ }
15
+ function freezeRoute(route) {
16
+ return Object.freeze({ ...route });
17
+ }
18
+ function rawByteLength(raw) {
19
+ const serialized = typeof raw === "string" ? raw : JSON.stringify(raw);
20
+ return Buffer.byteLength(serialized ?? "", "utf8");
21
+ }
22
+ function estimateRawTokens(byteLength) {
23
+ // Match the repository-wide conservative mixed text/JSON estimate without
24
+ // importing the agent layer into the LLM artifact model.
25
+ return Math.ceil(byteLength / 3.3);
26
+ }
27
+ function endpointHash(endpoint) {
28
+ let normalized = endpoint;
29
+ try {
30
+ const url = new URL(endpoint);
31
+ url.username = "";
32
+ url.password = "";
33
+ url.search = "";
34
+ url.hash = "";
35
+ normalized = url.toString().replace(/\/$/, "");
36
+ }
37
+ catch {
38
+ // A malformed custom endpoint remains comparable by hash, but its raw
39
+ // value is never retained in the artifact or emitted as telemetry.
40
+ }
41
+ return `sha256:${createHash("sha256").update(normalized).digest("hex")}`;
42
+ }
43
+ /**
44
+ * Builds privacy-safe route provenance. Endpoint identity is a one-way hash so
45
+ * persisted artifacts and replay diagnostics never retain custom URL/query data.
46
+ */
47
+ export function createReasoningArtifactProvenance(input) {
48
+ return freezeRoute({
49
+ provider: input.provider,
50
+ dialect: input.dialect,
51
+ ...(input.model ? { model: input.model } : {}),
52
+ ...(input.endpoint ? { endpointHash: endpointHash(input.endpoint) } : {}),
53
+ ...(input.legacy ? { legacy: true } : {}),
54
+ });
55
+ }
56
+ /** Creates a safe serialization target without retaining the endpoint itself. */
57
+ export function createReasoningArtifactReplayTarget(input) {
58
+ return freezeRoute({
59
+ provider: input.provider,
60
+ model: input.model,
61
+ dialect: input.dialect,
62
+ ...(input.endpoint ? { endpointHash: endpointHash(input.endpoint) } : {}),
63
+ });
64
+ }
65
+ /**
66
+ * Clones and freezes raw provider state before attaching byte/token accounting.
67
+ * The factory is the only supported way to create artifacts from provider data.
68
+ */
69
+ export function createReasoningArtifact(input) {
70
+ const raw = immutableClone(input.raw);
71
+ const byteLength = rawByteLength(raw);
72
+ const position = freezeRoute({
73
+ sequence: input.position?.sequence ?? 0,
74
+ placement: input.position?.placement ?? "assistant",
75
+ ...(input.position?.toolCallId
76
+ ? { toolCallId: input.position.toolCallId }
77
+ : {}),
78
+ ...(input.position?.toolCallIndex !== undefined
79
+ ? { toolCallIndex: input.position.toolCallIndex }
80
+ : {}),
81
+ });
82
+ const replay = freezeRoute({
83
+ scope: input.replay.scope,
84
+ persistence: input.replay.persistence,
85
+ });
86
+ const accounting = freezeRoute({
87
+ byteLength,
88
+ estimatedTokens: estimateRawTokens(byteLength),
89
+ });
90
+ return Object.freeze({
91
+ version: 1,
92
+ kind: input.kind,
93
+ raw,
94
+ ...(input.displaySummary !== undefined
95
+ ? { displaySummary: input.displaySummary }
96
+ : {}),
97
+ provenance: freezeRoute({ ...input.provenance }),
98
+ replay,
99
+ position,
100
+ accounting,
101
+ });
102
+ }
103
+ function rawRecord(artifact) {
104
+ const raw = artifact.raw;
105
+ return raw && typeof raw === "object" && !Array.isArray(raw)
106
+ ? raw
107
+ : undefined;
108
+ }
109
+ /** Returns the plaintext payload only for plaintext/signed artifact formats. */
110
+ export function reasoningArtifactText(artifact) {
111
+ if (typeof artifact.raw === "string")
112
+ return artifact.raw;
113
+ const raw = rawRecord(artifact);
114
+ if (!raw)
115
+ return undefined;
116
+ const text = raw.text ?? raw.thinking;
117
+ return typeof text === "string" ? text : undefined;
118
+ }
119
+ /** Returns the opaque signature only for signed/thought-signature artifacts. */
120
+ export function reasoningArtifactSignature(artifact) {
121
+ if (artifact.kind === "thought-signature" && typeof artifact.raw === "string") {
122
+ return artifact.raw;
123
+ }
124
+ const raw = rawRecord(artifact);
125
+ const signature = raw?.signature ?? raw?.thoughtSignature;
126
+ return typeof signature === "string" ? signature : undefined;
127
+ }
128
+ /** Preserves encrypted items exactly as opaque JSON records for Meta replay. */
129
+ export function reasoningArtifactItems(artifact) {
130
+ const source = Array.isArray(artifact.raw)
131
+ ? artifact.raw
132
+ : Array.isArray(rawRecord(artifact)?.items)
133
+ ? rawRecord(artifact)?.items
134
+ : rawRecord(artifact)?.encrypted_content !== undefined
135
+ ? [artifact.raw]
136
+ : [];
137
+ return source.flatMap((item) => item && typeof item === "object" && !Array.isArray(item)
138
+ ? [{ ...item }]
139
+ : []);
140
+ }
141
+ function legacyProvenance(kind) {
142
+ switch (kind) {
143
+ case "signed":
144
+ return createReasoningArtifactProvenance({
145
+ provider: "anthropic",
146
+ dialect: "anthropic-messages",
147
+ legacy: true,
148
+ });
149
+ case "encrypted":
150
+ return createReasoningArtifactProvenance({
151
+ provider: "meta",
152
+ dialect: "meta-responses",
153
+ legacy: true,
154
+ });
155
+ case "thought-signature":
156
+ return createReasoningArtifactProvenance({
157
+ provider: "gemini",
158
+ dialect: "gemini-generate-content",
159
+ legacy: true,
160
+ });
161
+ default:
162
+ return createReasoningArtifactProvenance({
163
+ provider: "legacy",
164
+ dialect: "openai-compatible",
165
+ legacy: true,
166
+ });
167
+ }
168
+ }
169
+ function legacyReasoningArtifacts(message) {
170
+ const artifacts = [];
171
+ let sequence = 0;
172
+ const block = message.reasoningBlock;
173
+ if (block?.signature && block.text) {
174
+ artifacts.push(createReasoningArtifact({
175
+ kind: "signed",
176
+ raw: { thinking: block.text, signature: block.signature },
177
+ displaySummary: block.text,
178
+ provenance: legacyProvenance("signed"),
179
+ replay: { scope: "tool-turn", persistence: "tool-turn" },
180
+ position: { sequence: sequence++, placement: "before-tool-call" },
181
+ }));
182
+ }
183
+ else if (block?.text) {
184
+ artifacts.push(createReasoningArtifact({
185
+ kind: "plaintext",
186
+ raw: block.text,
187
+ displaySummary: block.text,
188
+ provenance: legacyProvenance("plaintext"),
189
+ replay: { scope: "all-history", persistence: "all-turns" },
190
+ position: { sequence: sequence++, placement: "assistant" },
191
+ }));
192
+ }
193
+ if (block?.items?.length) {
194
+ artifacts.push(createReasoningArtifact({
195
+ kind: "encrypted",
196
+ raw: { items: block.items },
197
+ displaySummary: block.text || undefined,
198
+ provenance: legacyProvenance("encrypted"),
199
+ replay: { scope: "tool-turn", persistence: "tool-turn" },
200
+ position: { sequence: sequence++, placement: "before-tool-call" },
201
+ }));
202
+ }
203
+ for (let index = 0; index < (message.toolCalls?.length ?? 0); index += 1) {
204
+ const call = message.toolCalls[index];
205
+ if (!call.thoughtSignature)
206
+ continue;
207
+ artifacts.push(createReasoningArtifact({
208
+ kind: "thought-signature",
209
+ raw: call.thoughtSignature,
210
+ provenance: legacyProvenance("thought-signature"),
211
+ replay: { scope: "tool-turn", persistence: "tool-turn" },
212
+ position: {
213
+ sequence: sequence++,
214
+ placement: "on-tool-call",
215
+ toolCallId: call.id,
216
+ toolCallIndex: index,
217
+ },
218
+ }));
219
+ }
220
+ return artifacts;
221
+ }
222
+ function normalizeArtifact(artifact) {
223
+ return createReasoningArtifact({
224
+ kind: artifact.kind,
225
+ raw: artifact.raw,
226
+ ...(artifact.displaySummary !== undefined
227
+ ? { displaySummary: artifact.displaySummary }
228
+ : {}),
229
+ provenance: artifact.provenance,
230
+ replay: artifact.replay,
231
+ position: artifact.position,
232
+ });
233
+ }
234
+ /**
235
+ * Returns canonical artifacts for a message. Legacy fields are converted only
236
+ * when canonical data is absent, preventing duplicate replay after migration.
237
+ */
238
+ export function reasoningArtifactsForMessage(message) {
239
+ if (message.reasoningArtifacts?.length) {
240
+ return message.reasoningArtifacts.map(normalizeArtifact);
241
+ }
242
+ return legacyReasoningArtifacts(message);
243
+ }
244
+ /** Projects canonical artifacts back onto the existing legacy replay surface. */
245
+ export function legacyReasoningBlockFromArtifacts(artifacts) {
246
+ let text;
247
+ let signature;
248
+ const items = [];
249
+ for (const artifact of [...artifacts].sort((left, right) => left.position.sequence - right.position.sequence)) {
250
+ if (artifact.kind === "signed") {
251
+ text ??= reasoningArtifactText(artifact);
252
+ signature ??= reasoningArtifactSignature(artifact);
253
+ continue;
254
+ }
255
+ if (artifact.kind === "plaintext") {
256
+ text ??= reasoningArtifactText(artifact);
257
+ continue;
258
+ }
259
+ if (artifact.kind === "encrypted") {
260
+ items.push(...reasoningArtifactItems(artifact));
261
+ }
262
+ }
263
+ if (text === undefined && !signature && items.length === 0)
264
+ return undefined;
265
+ return {
266
+ text: text ?? "",
267
+ ...(signature ? { signature } : {}),
268
+ ...(items.length ? { items } : {}),
269
+ };
270
+ }
271
+ function applyThoughtSignatures(toolCalls, artifacts) {
272
+ if (!toolCalls?.length)
273
+ return toolCalls ? [...toolCalls] : undefined;
274
+ let changed = false;
275
+ const calls = toolCalls.map((call, index) => {
276
+ if (call.thoughtSignature)
277
+ return call;
278
+ const artifact = artifacts.find((candidate) => candidate.kind === "thought-signature" &&
279
+ (candidate.position.toolCallId === call.id ||
280
+ candidate.position.toolCallIndex === index));
281
+ const signature = artifact ? reasoningArtifactSignature(artifact) : undefined;
282
+ if (!signature)
283
+ return call;
284
+ changed = true;
285
+ return { ...call, thoughtSignature: signature };
286
+ });
287
+ return changed ? calls : [...toolCalls];
288
+ }
289
+ /**
290
+ * Hydrates persisted legacy data into canonical artifacts while retaining the
291
+ * original fields for older consumers and provider adapters.
292
+ */
293
+ export function canonicalizeChatMessageReasoningArtifacts(message) {
294
+ const artifacts = reasoningArtifactsForMessage(message);
295
+ if (artifacts.length === 0)
296
+ return { ...message };
297
+ const reasoningBlock = message.reasoningBlock ?? legacyReasoningBlockFromArtifacts(artifacts);
298
+ const toolCalls = applyThoughtSignatures(message.toolCalls, artifacts);
299
+ return {
300
+ ...message,
301
+ reasoningArtifacts: artifacts,
302
+ ...(reasoningBlock ? { reasoningBlock } : {}),
303
+ ...(toolCalls ? { toolCalls } : {}),
304
+ };
305
+ }
306
+ /** Canonical artifact accounting for a message, including un-migrated history. */
307
+ export function reasoningArtifactTokensForMessage(message) {
308
+ return reasoningArtifactsForMessage(message).reduce((sum, artifact) => sum + artifact.accounting.estimatedTokens, 0);
309
+ }
310
+ /** Builds signed Anthropic-family artifacts without deriving replay state from display text. */
311
+ export function createSignedThinkingArtifacts(input) {
312
+ return input.blocks.map((block) => {
313
+ const replayable = Boolean(block.thinking && block.signature);
314
+ return createReasoningArtifact({
315
+ kind: replayable ? "signed" : "plaintext",
316
+ raw: block.raw,
317
+ ...(block.thinking ? { displaySummary: block.thinking } : {}),
318
+ provenance: input.provenance,
319
+ replay: replayable
320
+ ? { scope: "tool-turn", persistence: "tool-turn" }
321
+ : { scope: "none", persistence: "never" },
322
+ position: {
323
+ sequence: block.sequence,
324
+ placement: block.toolCallIndex === undefined ? "assistant" : "before-tool-call",
325
+ ...(block.toolCallIndex === undefined
326
+ ? {}
327
+ : { toolCallIndex: block.toolCallIndex }),
328
+ },
329
+ });
330
+ });
331
+ }
332
+ /**
333
+ * Rebinds artifact positions only after duplicate and empty tool-call ids have
334
+ * been repaired. Raw artifact bytes stay immutable; only the history position
335
+ * receives the durable call id.
336
+ */
337
+ export function rebindReasoningArtifactsToToolCalls(input) {
338
+ if (!input.artifacts?.length)
339
+ return undefined;
340
+ return input.artifacts.map((artifact) => {
341
+ const byIndex = artifact.position.toolCallIndex;
342
+ const index = byIndex !== undefined
343
+ ? byIndex
344
+ : artifact.position.toolCallId
345
+ ? input.toolCalls.findIndex((call) => call.id === artifact.position.toolCallId)
346
+ : -1;
347
+ const toolCall = index >= 0 ? input.toolCalls[index] : undefined;
348
+ if (!toolCall || artifact.position.toolCallId === toolCall.id)
349
+ return artifact;
350
+ return createReasoningArtifact({
351
+ kind: artifact.kind,
352
+ raw: artifact.raw,
353
+ ...(artifact.displaySummary !== undefined
354
+ ? { displaySummary: artifact.displaySummary }
355
+ : {}),
356
+ provenance: artifact.provenance,
357
+ replay: artifact.replay,
358
+ position: {
359
+ ...artifact.position,
360
+ toolCallId: toolCall.id,
361
+ ...(byIndex === undefined ? { toolCallIndex: index } : {}),
362
+ },
363
+ });
364
+ });
365
+ }
366
+ /** Retain active tool artifacts unconditionally; retain final turns only by policy. */
367
+ export function reasoningArtifactsForPersistence(input) {
368
+ if (!input.artifacts?.length)
369
+ return undefined;
370
+ const retained = input.artifacts.filter((artifact) => input.hasToolCalls
371
+ ? artifact.replay.scope !== "none" || artifact.replay.persistence === "tool-turn"
372
+ : artifact.replay.persistence === "final-turn" ||
373
+ artifact.replay.persistence === "all-turns");
374
+ return retained.length ? retained : undefined;
375
+ }
376
+ function decision(artifact, target, action, reason) {
377
+ return Object.freeze({
378
+ version: 1,
379
+ action,
380
+ kind: artifact.kind,
381
+ ...(reason ? { reason } : {}),
382
+ source: artifact.provenance,
383
+ target,
384
+ byteLength: artifact.accounting.byteLength,
385
+ });
386
+ }
387
+ /**
388
+ * Conservative compatibility predicate used at final serialization only. It
389
+ * never mutates stored history and never returns raw payloads in its decision.
390
+ */
391
+ export function reasoningArtifactReplayDecision(artifact, target, context = {}) {
392
+ if (artifact.replay.scope === "none") {
393
+ return decision(artifact, target, "omitted", "replay-disabled");
394
+ }
395
+ if (artifact.replay.scope === "tool-turn" && !context.hasToolCalls) {
396
+ return decision(artifact, target, "omitted", "not-a-tool-turn");
397
+ }
398
+ const source = artifact.provenance;
399
+ const legacyPlaintext = source.legacy === true &&
400
+ (artifact.kind === "plaintext" || artifact.kind === "summary");
401
+ if (legacyPlaintext) {
402
+ return target.dialect === "openai-compatible"
403
+ ? decision(artifact, target, "replayed")
404
+ : decision(artifact, target, "omitted", "dialect-mismatch");
405
+ }
406
+ if (source.provider !== target.provider) {
407
+ return decision(artifact, target, "omitted", "provider-mismatch");
408
+ }
409
+ if (source.dialect !== target.dialect) {
410
+ return decision(artifact, target, "omitted", "dialect-mismatch");
411
+ }
412
+ if (source.model && source.model !== target.model) {
413
+ return decision(artifact, target, "omitted", "model-mismatch");
414
+ }
415
+ if (source.endpointHash && !target.endpointHash) {
416
+ return decision(artifact, target, "omitted", "endpoint-unknown");
417
+ }
418
+ if (source.endpointHash && source.endpointHash !== target.endpointHash) {
419
+ return decision(artifact, target, "omitted", "endpoint-mismatch");
420
+ }
421
+ return decision(artifact, target, "replayed");
422
+ }
423
+ /**
424
+ * Filters only the wire projection. Omitted artifacts remain unchanged in the
425
+ * message/persistence timeline, while callers can emit the metadata-only
426
+ * decisions to their operation telemetry.
427
+ */
428
+ export function selectReasoningArtifactsForReplay(input) {
429
+ if (!input.artifacts?.length)
430
+ return [];
431
+ const selected = [];
432
+ for (const artifact of input.artifacts) {
433
+ const replay = reasoningArtifactReplayDecision(artifact, input.target, input.context);
434
+ input.observe?.(replay);
435
+ if (replay.action === "replayed")
436
+ selected.push(artifact);
437
+ }
438
+ return selected;
439
+ }
440
+ //# sourceMappingURL=reasoning-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-artifacts.js","sourceRoot":"","sources":["../../src/llm/reasoning-artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { GenerationAttemptInput, RequestFingerprintV1 } from "../types.js";
2
+ export declare const REQUEST_FINGERPRINT_VERSION: 1;
3
+ export declare const REQUEST_FINGERPRINT_SERIALIZER_VERSION: 1;
4
+ /**
5
+ * Captures hashes and byte counts from the exact JSON string passed to fetch.
6
+ * The returned value has no request body, header, URL, or decoded JSON values.
7
+ */
8
+ export declare function fingerprintFinalRequest(input: Pick<GenerationAttemptInput, "provider" | "model">, body: BodyInit | null | undefined): RequestFingerprintV1 | undefined;
9
+ export type PrefixAffinityClassification = "exact_append_eligible" | "partial_prefix_eligible" | "not_eligible" | "unknown";
10
+ export declare function classifyPrefixAffinity(prior: RequestFingerprintV1 | undefined, next: RequestFingerprintV1 | undefined): PrefixAffinityClassification;