@pentoshi/clai 4.0.3 → 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 (314) hide show
  1. package/README.md +45 -9
  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/confirm-port.js +6 -3
  6. package/dist/agent/confirm-port.js.map +1 -1
  7. package/dist/agent/context-breakdown.js +2 -0
  8. package/dist/agent/context-breakdown.js.map +1 -1
  9. package/dist/agent/context-manager.d.ts +23 -9
  10. package/dist/agent/context-manager.js +72 -43
  11. package/dist/agent/context-manager.js.map +1 -1
  12. package/dist/agent/events.d.ts +3 -0
  13. package/dist/agent/loop-guard.d.ts +2 -0
  14. package/dist/agent/loop-guard.js +48 -3
  15. package/dist/agent/loop-guard.js.map +1 -1
  16. package/dist/agent/prompt-composer.js +6 -6
  17. package/dist/agent/prompt-composer.js.map +1 -1
  18. package/dist/agent/reliability-policy.d.ts +1 -0
  19. package/dist/agent/reliability-policy.js +6 -3
  20. package/dist/agent/reliability-policy.js.map +1 -1
  21. package/dist/agent/request-accounting.d.ts +97 -0
  22. package/dist/agent/request-accounting.js +207 -0
  23. package/dist/agent/request-accounting.js.map +1 -0
  24. package/dist/agent/request-budget.d.ts +2 -2
  25. package/dist/agent/request-budget.js +2 -4
  26. package/dist/agent/request-budget.js.map +1 -1
  27. package/dist/agent/runner.d.ts +8 -2
  28. package/dist/agent/runner.js +412 -181
  29. package/dist/agent/runner.js.map +1 -1
  30. package/dist/agent/session-title.d.ts +0 -26
  31. package/dist/agent/session-title.js +0 -80
  32. package/dist/agent/session-title.js.map +1 -1
  33. package/dist/agent/tool-history.d.ts +2 -2
  34. package/dist/agent/tool-history.js +19 -6
  35. package/dist/agent/tool-history.js.map +1 -1
  36. package/dist/agent/turn-outcome.d.ts +1 -1
  37. package/dist/agent/turn-outcome.js +2 -12
  38. package/dist/agent/turn-outcome.js.map +1 -1
  39. package/dist/app/adapters/agent-event-adapter.js +19 -0
  40. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  41. package/dist/app/adapters/current-agent-adapter.js +4 -0
  42. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  43. package/dist/app/commands/catalog.js +23 -16
  44. package/dist/app/commands/catalog.js.map +1 -1
  45. package/dist/app/controllers/cancel-coordinator.d.ts +51 -0
  46. package/dist/app/controllers/cancel-coordinator.js +48 -0
  47. package/dist/app/controllers/cancel-coordinator.js.map +1 -0
  48. package/dist/app/controllers/session-compact-helper.d.ts +19 -2
  49. package/dist/app/controllers/session-compact-helper.js +100 -127
  50. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  51. package/dist/app/controllers/session-context-usage.d.ts +32 -15
  52. package/dist/app/controllers/session-context-usage.js +186 -51
  53. package/dist/app/controllers/session-context-usage.js.map +1 -1
  54. package/dist/app/controllers/session-controller.d.ts +22 -11
  55. package/dist/app/controllers/session-controller.js +137 -92
  56. package/dist/app/controllers/session-controller.js.map +1 -1
  57. package/dist/app/controllers/session-naming.d.ts +31 -0
  58. package/dist/app/controllers/session-naming.js +173 -0
  59. package/dist/app/controllers/session-naming.js.map +1 -0
  60. package/dist/app/controllers/session-persistence.d.ts +2 -2
  61. package/dist/app/controllers/session-persistence.js +3 -6
  62. package/dist/app/controllers/session-persistence.js.map +1 -1
  63. package/dist/app/controllers/session-turn-request.d.ts +2 -1
  64. package/dist/app/controllers/session-turn-request.js +3 -0
  65. package/dist/app/controllers/session-turn-request.js.map +1 -1
  66. package/dist/app/controllers/turn-continuation.d.ts +0 -6
  67. package/dist/app/controllers/turn-continuation.js +4 -21
  68. package/dist/app/controllers/turn-continuation.js.map +1 -1
  69. package/dist/app/controllers/turn-controller.d.ts +2 -1
  70. package/dist/app/controllers/turn-controller.js +1 -0
  71. package/dist/app/controllers/turn-controller.js.map +1 -1
  72. package/dist/app/events/app-event.d.ts +9 -0
  73. package/dist/app/events/app-event.js.map +1 -1
  74. package/dist/app/ports/agent-port.d.ts +8 -1
  75. package/dist/app/ports/transcript-item.d.ts +9 -1
  76. package/dist/classic/app/ClassicApp.js +3 -3
  77. package/dist/classic/app/ClassicApp.js.map +1 -1
  78. package/dist/classic/app/app-wiring.js +1 -2
  79. package/dist/classic/app/app-wiring.js.map +1 -1
  80. package/dist/classic/app/wiring-interactions.js +4 -9
  81. package/dist/classic/app/wiring-interactions.js.map +1 -1
  82. package/dist/classic/blocks/TurnSummaryBlock.d.ts +3 -0
  83. package/dist/classic/blocks/TurnSummaryBlock.js +6 -0
  84. package/dist/classic/blocks/TurnSummaryBlock.js.map +1 -0
  85. package/dist/classic/blocks/tool-lines.js +2 -1
  86. package/dist/classic/blocks/tool-lines.js.map +1 -1
  87. package/dist/classic/blocks/turn-summary-lines.d.ts +3 -0
  88. package/dist/classic/blocks/turn-summary-lines.js +7 -0
  89. package/dist/classic/blocks/turn-summary-lines.js.map +1 -0
  90. package/dist/classic/chrome/status-rows.d.ts +0 -1
  91. package/dist/classic/chrome/status-rows.js +0 -12
  92. package/dist/classic/chrome/status-rows.js.map +1 -1
  93. package/dist/classic/feed/Feed.js +2 -0
  94. package/dist/classic/feed/Feed.js.map +1 -1
  95. package/dist/classic/feed/feed-blocks.d.ts +1 -1
  96. package/dist/classic/feed/feed-blocks.js +3 -0
  97. package/dist/classic/feed/feed-blocks.js.map +1 -1
  98. package/dist/classic/input/cancel-ladder.d.ts +2 -19
  99. package/dist/classic/input/cancel-ladder.js +13 -20
  100. package/dist/classic/input/cancel-ladder.js.map +1 -1
  101. package/dist/commands/providers.js +2 -0
  102. package/dist/commands/providers.js.map +1 -1
  103. package/dist/llm/adapters/anthropic-tools.d.ts +31 -14
  104. package/dist/llm/adapters/anthropic-tools.js +124 -29
  105. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  106. package/dist/llm/adapters/gemini-tools.d.ts +16 -4
  107. package/dist/llm/adapters/gemini-tools.js +117 -16
  108. package/dist/llm/adapters/gemini-tools.js.map +1 -1
  109. package/dist/llm/adapters/openai-tools.d.ts +13 -2
  110. package/dist/llm/adapters/openai-tools.js +58 -11
  111. package/dist/llm/adapters/openai-tools.js.map +1 -1
  112. package/dist/llm/agentrouter.js +68 -45
  113. package/dist/llm/agentrouter.js.map +1 -1
  114. package/dist/llm/anthropic.js +69 -36
  115. package/dist/llm/anthropic.js.map +1 -1
  116. package/dist/llm/aws-mantle.js +70 -32
  117. package/dist/llm/aws-mantle.js.map +1 -1
  118. package/dist/llm/bynara.js +26 -69
  119. package/dist/llm/bynara.js.map +1 -1
  120. package/dist/llm/capabilities.d.ts +2 -1
  121. package/dist/llm/capabilities.js +56 -1
  122. package/dist/llm/capabilities.js.map +1 -1
  123. package/dist/llm/context-snapshot.d.ts +100 -0
  124. package/dist/llm/context-snapshot.js +277 -0
  125. package/dist/llm/context-snapshot.js.map +1 -0
  126. package/dist/llm/context-windows.d.ts +10 -0
  127. package/dist/llm/context-windows.js +129 -0
  128. package/dist/llm/context-windows.js.map +1 -0
  129. package/dist/llm/custom-provider-profile.d.ts +75 -0
  130. package/dist/llm/custom-provider-profile.js +558 -0
  131. package/dist/llm/custom-provider-profile.js.map +1 -0
  132. package/dist/llm/custom-providers.d.ts +13 -1
  133. package/dist/llm/custom-providers.js +77 -25
  134. package/dist/llm/custom-providers.js.map +1 -1
  135. package/dist/llm/effort-fallback.d.ts +44 -0
  136. package/dist/llm/effort-fallback.js +101 -0
  137. package/dist/llm/effort-fallback.js.map +1 -0
  138. package/dist/llm/fireworks.d.ts +3 -0
  139. package/dist/llm/fireworks.js +103 -0
  140. package/dist/llm/fireworks.js.map +1 -0
  141. package/dist/llm/free.js +4 -0
  142. package/dist/llm/free.js.map +1 -1
  143. package/dist/llm/gemini.d.ts +1 -1
  144. package/dist/llm/gemini.js +89 -51
  145. package/dist/llm/gemini.js.map +1 -1
  146. package/dist/llm/groq.js +4 -0
  147. package/dist/llm/groq.js.map +1 -1
  148. package/dist/llm/hetzner.d.ts +3 -0
  149. package/dist/llm/hetzner.js +98 -0
  150. package/dist/llm/hetzner.js.map +1 -0
  151. package/dist/llm/http.d.ts +60 -10
  152. package/dist/llm/http.js +465 -156
  153. package/dist/llm/http.js.map +1 -1
  154. package/dist/llm/kimchi.js +4 -0
  155. package/dist/llm/kimchi.js.map +1 -1
  156. package/dist/llm/lightning.js +4 -0
  157. package/dist/llm/lightning.js.map +1 -1
  158. package/dist/llm/meta.d.ts +2 -0
  159. package/dist/llm/meta.js +839 -624
  160. package/dist/llm/meta.js.map +1 -1
  161. package/dist/llm/modal.js +4 -0
  162. package/dist/llm/modal.js.map +1 -1
  163. package/dist/llm/model-families.d.ts +9 -0
  164. package/dist/llm/model-families.js +39 -0
  165. package/dist/llm/model-families.js.map +1 -0
  166. package/dist/llm/nvidia.js +4 -0
  167. package/dist/llm/nvidia.js.map +1 -1
  168. package/dist/llm/ollama.js +44 -40
  169. package/dist/llm/ollama.js.map +1 -1
  170. package/dist/llm/openai.js +4 -0
  171. package/dist/llm/openai.js.map +1 -1
  172. package/dist/llm/openrouter.js +4 -0
  173. package/dist/llm/openrouter.js.map +1 -1
  174. package/dist/llm/operation-ledger.d.ts +60 -0
  175. package/dist/llm/operation-ledger.js +136 -0
  176. package/dist/llm/operation-ledger.js.map +1 -0
  177. package/dist/llm/operation-usage.d.ts +32 -0
  178. package/dist/llm/operation-usage.js +172 -0
  179. package/dist/llm/operation-usage.js.map +1 -0
  180. package/dist/llm/orcarouter.d.ts +7 -0
  181. package/dist/llm/orcarouter.js +166 -0
  182. package/dist/llm/orcarouter.js.map +1 -0
  183. package/dist/llm/provider-profile-layers.d.ts +7 -0
  184. package/dist/llm/provider-profile-layers.js +961 -0
  185. package/dist/llm/provider-profile-layers.js.map +1 -0
  186. package/dist/llm/provider-profile.d.ts +181 -0
  187. package/dist/llm/provider-profile.js +329 -0
  188. package/dist/llm/provider-profile.js.map +1 -0
  189. package/dist/llm/provider-profiles.d.ts +13 -0
  190. package/dist/llm/provider-profiles.js +86 -0
  191. package/dist/llm/provider-profiles.js.map +1 -0
  192. package/dist/llm/provider.d.ts +2 -0
  193. package/dist/llm/provider.js +198 -21
  194. package/dist/llm/provider.js.map +1 -1
  195. package/dist/llm/qwen-cloud.js +4 -0
  196. package/dist/llm/qwen-cloud.js.map +1 -1
  197. package/dist/llm/reasoning-artifacts.d.ts +101 -0
  198. package/dist/llm/reasoning-artifacts.js +440 -0
  199. package/dist/llm/reasoning-artifacts.js.map +1 -0
  200. package/dist/llm/request-fingerprint.d.ts +10 -0
  201. package/dist/llm/request-fingerprint.js +313 -0
  202. package/dist/llm/request-fingerprint.js.map +1 -0
  203. package/dist/llm/request-plan.d.ts +119 -0
  204. package/dist/llm/request-plan.js +279 -0
  205. package/dist/llm/request-plan.js.map +1 -0
  206. package/dist/llm/router.d.ts +19 -1
  207. package/dist/llm/router.js +504 -102
  208. package/dist/llm/router.js.map +1 -1
  209. package/dist/llm/stream-events.d.ts +47 -0
  210. package/dist/llm/stream-events.js +55 -0
  211. package/dist/llm/stream-events.js.map +1 -0
  212. package/dist/llm/stream-terminal.d.ts +30 -0
  213. package/dist/llm/stream-terminal.js +51 -0
  214. package/dist/llm/stream-terminal.js.map +1 -0
  215. package/dist/llm/token-estimate-calibration.d.ts +23 -0
  216. package/dist/llm/token-estimate-calibration.js +140 -0
  217. package/dist/llm/token-estimate-calibration.js.map +1 -0
  218. package/dist/llm/token-usage.d.ts +35 -5
  219. package/dist/llm/token-usage.js +212 -162
  220. package/dist/llm/token-usage.js.map +1 -1
  221. package/dist/llm/tokenrouter.js +13 -6
  222. package/dist/llm/tokenrouter.js.map +1 -1
  223. package/dist/modes/ask.js +11 -5
  224. package/dist/modes/ask.js.map +1 -1
  225. package/dist/noninteractive/start-noninteractive.js +31 -2
  226. package/dist/noninteractive/start-noninteractive.js.map +1 -1
  227. package/dist/noninteractive/stream-blocks.js +15 -4
  228. package/dist/noninteractive/stream-blocks.js.map +1 -1
  229. package/dist/prompts/embedded.js +1 -1
  230. package/dist/prompts/embedded.js.map +1 -1
  231. package/dist/prompts/system.agent.md +6 -0
  232. package/dist/store/config.js +7 -1
  233. package/dist/store/config.js.map +1 -1
  234. package/dist/store/history.d.ts +2 -0
  235. package/dist/store/history.js +19 -10
  236. package/dist/store/history.js.map +1 -1
  237. package/dist/store/plan.js +20 -14
  238. package/dist/store/plan.js.map +1 -1
  239. package/dist/tools/elevated-shell.d.ts +1 -1
  240. package/dist/tools/elevated-shell.js +24 -72
  241. package/dist/tools/elevated-shell.js.map +1 -1
  242. package/dist/tools/fs.d.ts +5 -3
  243. package/dist/tools/fs.js +8 -5
  244. package/dist/tools/fs.js.map +1 -1
  245. package/dist/tools/nmap-runner.js +30 -36
  246. package/dist/tools/nmap-runner.js.map +1 -1
  247. package/dist/tools/sudo-session.d.ts +83 -0
  248. package/dist/tools/sudo-session.js +124 -0
  249. package/dist/tools/sudo-session.js.map +1 -0
  250. package/dist/tui-v2/app/App.js +9 -24
  251. package/dist/tui-v2/app/App.js.map +1 -1
  252. package/dist/tui-v2/components/plan/plan-view.js +5 -3
  253. package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
  254. package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
  255. package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
  256. package/dist/tui-v2/components/status/status-line.js +1 -14
  257. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  258. package/dist/tui-v2/components/transcript/intro-card.js +2 -1
  259. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
  260. package/dist/tui-v2/components/transcript/notice-row.d.ts +3 -1
  261. package/dist/tui-v2/components/transcript/notice-row.js +28 -3
  262. package/dist/tui-v2/components/transcript/notice-row.js.map +1 -1
  263. package/dist/tui-v2/components/transcript/thinking-block.d.ts +0 -5
  264. package/dist/tui-v2/components/transcript/thinking-block.js +3 -8
  265. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  266. package/dist/tui-v2/components/transcript/tool-card.js +16 -7
  267. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  268. package/dist/tui-v2/components/transcript/transcript-row.d.ts +0 -2
  269. package/dist/tui-v2/components/transcript/transcript-row.js +7 -3
  270. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  271. package/dist/tui-v2/components/transcript/transcript-view.js +1 -3
  272. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  273. package/dist/tui-v2/composer/composer-editor.js +2 -1
  274. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  275. package/dist/types.d.ts +156 -1
  276. package/dist/types.js +3 -0
  277. package/dist/types.js.map +1 -1
  278. package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
  279. package/dist/ui-core/bootstrap/composition-root.js +26 -3
  280. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  281. package/dist/ui-core/commands/picker-commands.js +11 -5
  282. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  283. package/dist/ui-core/commands/session-commands.js +41 -5
  284. package/dist/ui-core/commands/session-commands.js.map +1 -1
  285. package/dist/ui-core/plan/plan-lifecycle.js +3 -2
  286. package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
  287. package/dist/ui-core/rendering/context-limit.js +4 -1
  288. package/dist/ui-core/rendering/context-limit.js.map +1 -1
  289. package/dist/ui-core/rendering/duration.d.ts +5 -0
  290. package/dist/ui-core/rendering/duration.js +43 -0
  291. package/dist/ui-core/rendering/duration.js.map +1 -0
  292. package/dist/ui-core/rendering/intro-header.js +2 -2
  293. package/dist/ui-core/rendering/intro-header.js.map +1 -1
  294. package/dist/ui-core/rendering/theme.d.ts +1 -0
  295. package/dist/ui-core/rendering/theme.js +2 -0
  296. package/dist/ui-core/rendering/theme.js.map +1 -1
  297. package/dist/ui-core/rendering/transcript-semantic.js +2 -0
  298. package/dist/ui-core/rendering/transcript-semantic.js.map +1 -1
  299. package/dist/ui-core/state/transcript-compaction.js +2 -0
  300. package/dist/ui-core/state/transcript-compaction.js.map +1 -1
  301. package/dist/ui-core/state/transcript-hydrate.js +34 -4
  302. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  303. package/dist/ui-core/state/transcript-reducer.d.ts +5 -0
  304. package/dist/ui-core/state/transcript-reducer.js +96 -8
  305. package/dist/ui-core/state/transcript-reducer.js.map +1 -1
  306. package/dist/ui-core/state/transcript-store.d.ts +10 -1
  307. package/dist/ui-core/state/transcript-store.js +22 -1
  308. package/dist/ui-core/state/transcript-store.js.map +1 -1
  309. package/dist/ui-core/state/transcript-types.d.ts +9 -1
  310. package/dist/ui-core/state/transcript-types.js +3 -1
  311. package/dist/ui-core/state/transcript-types.js.map +1 -1
  312. package/dist/version.generated.d.ts +2 -2
  313. package/dist/version.generated.js +2 -2
  314. package/package.json +6 -1
@@ -0,0 +1,279 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createReasoningArtifactReplayTarget, reasoningArtifactReplayDecision, reasoningArtifactsForMessage, } from "./reasoning-artifacts.js";
3
+ import { isRequestContextSystemMessage } from "./system-messages.js";
4
+ import { isReasoningUnsupported, modelAcceptsImages, modelSupportsThinking, } from "./capabilities.js";
5
+ import { resolveSampling } from "./sampling.js";
6
+ import { isBuiltInProviderId, resolveProviderProfile, } from "./provider-profile.js";
7
+ import { providerWireApi, resolveBuiltInProfile } from "./provider-profiles.js";
8
+ /**
9
+ * Canonical request plan (doc 03 §"Canonical request plan", doc 06 §3).
10
+ *
11
+ * One immutable, renderer-neutral object describes what a logical generation
12
+ * will send: route, timeline with stable/mutable boundaries, tools, replay
13
+ * decisions for every artifact, controls, images, route policy, budget, and a
14
+ * privacy-safe cache-prefix fingerprint. Provider serializers emit their wire
15
+ * bodies from a compiled plan; nothing dispatches from ad hoc message arrays
16
+ * past this boundary.
17
+ */
18
+ export const REQUEST_PLAN_VERSION = 1;
19
+ export const REQUEST_PLAN_COMPILER_VERSION = 1;
20
+ const REPLAY_DIALECT_BY_WIRE = {
21
+ "chat-completions": "openai-compatible",
22
+ "anthropic-messages": "anthropic-messages",
23
+ "gemini-generate-content": "gemini-generate-content",
24
+ "meta-responses": "meta-responses",
25
+ "ollama-chat": "ollama-chat",
26
+ };
27
+ const PLAN_HASH_DOMAIN = "clai.request-plan.v1\0";
28
+ // Repository-wide conservative mixed text/JSON ratio; matches the artifact
29
+ // accounting estimator so plan sections compose with other token estimates.
30
+ function estimateTokens(byteLength) {
31
+ return Math.ceil(byteLength / 3.3);
32
+ }
33
+ function hashParts(parts) {
34
+ const hash = createHash("sha256").update(PLAN_HASH_DOMAIN, "utf8");
35
+ let byteLength = 0;
36
+ for (const part of parts) {
37
+ const bytes = Buffer.from(part, "utf8");
38
+ hash.update(`${bytes.length}:`, "utf8");
39
+ hash.update(bytes);
40
+ byteLength += bytes.length;
41
+ }
42
+ return { sha256: hash.digest("hex"), byteLength };
43
+ }
44
+ /** Leading system/developer run; the stable instruction prefix. */
45
+ function instructionsEnd(messages) {
46
+ let index = 0;
47
+ while (index < messages.length && messages[index].role === "system") {
48
+ index += 1;
49
+ }
50
+ return index;
51
+ }
52
+ /**
53
+ * The mutable suffix starts at the last user message: everything after it is
54
+ * the in-flight turn (live request state, open tool exchange, current input)
55
+ * and may still change before dispatch.
56
+ */
57
+ function liveStart(messages) {
58
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
59
+ if (messages[index].role === "user")
60
+ return index;
61
+ }
62
+ return messages.length;
63
+ }
64
+ function cacheAffectingValue(field, controls) {
65
+ switch (field) {
66
+ case "messages":
67
+ case "tools":
68
+ return `${field}-section`;
69
+ case "thinking":
70
+ return `${controls.reasoningEnabled}:${controls.effort}`;
71
+ case "reasoning":
72
+ return controls.reasoningEnabled ? "enabled" : "omitted";
73
+ case "reasoning_effort":
74
+ case "reasoning.effort":
75
+ return controls.reasoningEnabled ? controls.effort : "off";
76
+ case "temperature":
77
+ return String(controls.temperature);
78
+ case "top_p":
79
+ return controls.topP === undefined ? "omitted" : String(controls.topP);
80
+ default:
81
+ return "declared";
82
+ }
83
+ }
84
+ function cacheSection(ordinal, section, parts) {
85
+ const { sha256, byteLength } = hashParts(parts);
86
+ return Object.freeze({
87
+ ordinal,
88
+ section,
89
+ sha256,
90
+ byteLength,
91
+ estimatedTokens: estimateTokens(byteLength),
92
+ itemCount: parts.length,
93
+ });
94
+ }
95
+ /**
96
+ * Deterministically compile one immutable plan. Compilation is pure: the same
97
+ * inputs always produce a deep-equal plan with identical section hashes.
98
+ */
99
+ export function compileRequestPlan(input) {
100
+ const messages = Object.freeze([...input.messages]);
101
+ const wire = providerWireApi(input.provider, input.model);
102
+ const target = createReasoningArtifactReplayTarget({
103
+ provider: input.provider,
104
+ model: input.model,
105
+ dialect: REPLAY_DIALECT_BY_WIRE[wire],
106
+ ...(input.endpoint ? { endpoint: input.endpoint } : {}),
107
+ });
108
+ const instructionsBoundary = instructionsEnd(messages);
109
+ const liveBoundary = liveStart(messages);
110
+ const sections = [
111
+ {
112
+ kind: "instructions",
113
+ messageStart: 0,
114
+ messageEnd: instructionsBoundary,
115
+ messageCount: instructionsBoundary,
116
+ },
117
+ {
118
+ kind: "history",
119
+ messageStart: instructionsBoundary,
120
+ messageEnd: liveBoundary,
121
+ messageCount: Math.max(0, liveBoundary - instructionsBoundary),
122
+ },
123
+ {
124
+ kind: "live",
125
+ messageStart: liveBoundary,
126
+ messageEnd: messages.length,
127
+ messageCount: Math.max(0, messages.length - liveBoundary),
128
+ },
129
+ ].map((section) => Object.freeze(section));
130
+ const mutableMessageIndexes = [];
131
+ for (let index = 0; index < messages.length; index += 1) {
132
+ if (index >= liveBoundary || isRequestContextSystemMessage(messages[index])) {
133
+ mutableMessageIndexes.push(index);
134
+ }
135
+ }
136
+ const reasoningEnabled = Boolean(input.reasoning?.enabled);
137
+ const effort = input.reasoning?.effort ?? "medium";
138
+ const controlSuppression = isReasoningUnsupported(input.provider, input.model)
139
+ ? "observed-rejection"
140
+ : reasoningEnabled && !modelSupportsThinking(input.provider, input.model)
141
+ ? "capability-denied"
142
+ : undefined;
143
+ const sampling = resolveSampling({
144
+ provider: input.provider,
145
+ model: input.model,
146
+ reasoningEnabled,
147
+ requestedTemperature: input.temperature,
148
+ });
149
+ const profile = isBuiltInProviderId(input.provider)
150
+ ? resolveBuiltInProfile({
151
+ provider: input.provider,
152
+ model: input.model,
153
+ endpointHash: target.endpointHash,
154
+ })
155
+ : resolveProviderProfile({
156
+ provider: input.provider,
157
+ model: input.model,
158
+ wireApi: wire,
159
+ endpointHash: target.endpointHash,
160
+ });
161
+ const decisions = [];
162
+ const replayedArtifactParts = [];
163
+ for (let index = 0; index < messages.length; index += 1) {
164
+ const message = messages[index];
165
+ const withinCacheBoundary = index < liveBoundary && !isRequestContextSystemMessage(message);
166
+ for (const artifact of reasoningArtifactsForMessage(message)) {
167
+ const decision = reasoningArtifactReplayDecision(artifact, target, {
168
+ hasToolCalls: Boolean(message.toolCalls?.length),
169
+ });
170
+ decisions.push(Object.freeze({ messageIndex: index, decision }));
171
+ if (decision.action === "replayed" && withinCacheBoundary) {
172
+ replayedArtifactParts.push(JSON.stringify({
173
+ kind: artifact.kind,
174
+ raw: artifact.raw,
175
+ position: artifact.position,
176
+ }));
177
+ }
178
+ }
179
+ }
180
+ const tools = Object.freeze([...(input.tools ?? [])]);
181
+ const imageMessageIndexes = [];
182
+ let imageCount = 0;
183
+ for (let index = 0; index < messages.length; index += 1) {
184
+ const count = messages[index].images?.length ?? 0;
185
+ if (count > 0) {
186
+ imageMessageIndexes.push(index);
187
+ imageCount += count;
188
+ }
189
+ }
190
+ const stableInstructions = messages
191
+ .slice(0, instructionsBoundary)
192
+ .filter((message) => !isRequestContextSystemMessage(message));
193
+ const stableHistory = messages
194
+ .slice(instructionsBoundary, liveBoundary)
195
+ .filter((message) => !isRequestContextSystemMessage(message));
196
+ const settingsValueInput = {
197
+ reasoningEnabled,
198
+ effort,
199
+ temperature: sampling.temperature,
200
+ topP: sampling.topP,
201
+ };
202
+ const cacheSections = [
203
+ cacheSection(1, "instructions", stableInstructions.map((m) => JSON.stringify(m))),
204
+ cacheSection(2, "tools", tools.map((tool) => JSON.stringify(tool))),
205
+ cacheSection(3, "history", stableHistory.map((m) => JSON.stringify(m))),
206
+ cacheSection(4, "artifacts", replayedArtifactParts),
207
+ cacheSection(5, "settings", [
208
+ `serializer:${wire}`,
209
+ `version:${REQUEST_PLAN_COMPILER_VERSION}`,
210
+ ...[...profile.cache.cacheAffectingFields]
211
+ .sort()
212
+ .map((field) => `${field}=${cacheAffectingValue(field, settingsValueInput)}`),
213
+ ]),
214
+ ];
215
+ const prefixHash = createHash("sha256").update(PLAN_HASH_DOMAIN, "utf8");
216
+ for (const section of cacheSections)
217
+ prefixHash.update(section.sha256, "hex");
218
+ return Object.freeze({
219
+ version: REQUEST_PLAN_VERSION,
220
+ route: Object.freeze({
221
+ provider: input.provider,
222
+ model: input.model,
223
+ serializer: wire,
224
+ serializerVersion: 1,
225
+ compilerVersion: REQUEST_PLAN_COMPILER_VERSION,
226
+ ...(target.endpointHash ? { endpointHash: target.endpointHash } : {}),
227
+ }),
228
+ timeline: Object.freeze({
229
+ messages,
230
+ sections: Object.freeze(sections),
231
+ mutableMessageIndexes: Object.freeze(mutableMessageIndexes),
232
+ }),
233
+ tools: Object.freeze({
234
+ definitions: tools,
235
+ ...(input.toolChoice !== undefined ? { choice: input.toolChoice } : {}),
236
+ ...(input.parallelToolCalls !== undefined
237
+ ? { parallelToolCalls: input.parallelToolCalls }
238
+ : {}),
239
+ }),
240
+ replay: Object.freeze({
241
+ target,
242
+ decisions: Object.freeze(decisions),
243
+ }),
244
+ controls: Object.freeze({
245
+ ...(input.reasoning ? { reasoning: input.reasoning } : {}),
246
+ ...(controlSuppression ? { controlSuppression } : {}),
247
+ temperature: sampling.temperature,
248
+ ...(sampling.topP !== undefined ? { topP: sampling.topP } : {}),
249
+ ...(input.maxTokens !== undefined
250
+ ? { requestedMaxTokens: input.maxTokens }
251
+ : {}),
252
+ stream: input.stream,
253
+ }),
254
+ images: Object.freeze({
255
+ visionAccepted: modelAcceptsImages(input.provider, input.model),
256
+ imageMessageIndexes: Object.freeze(imageMessageIndexes),
257
+ imageCount,
258
+ }),
259
+ policy: Object.freeze({
260
+ reasoningGeneration: profile.reasoning.generation,
261
+ controlDialect: profile.reasoning.control.dialect,
262
+ controlStatus: profile.reasoning.control.status,
263
+ replayScope: profile.reasoning.replayScope,
264
+ cache: profile.cache,
265
+ limits: profile.limits,
266
+ }),
267
+ budget: Object.freeze({ plannedAdmissions: 1 }),
268
+ cache: Object.freeze({
269
+ policy: profile.cache,
270
+ fingerprint: Object.freeze({
271
+ prefixMessageCount: stableInstructions.length + stableHistory.length,
272
+ replayedArtifactCount: replayedArtifactParts.length,
273
+ sections: Object.freeze(cacheSections),
274
+ prefixSha256: prefixHash.digest("hex"),
275
+ }),
276
+ }),
277
+ });
278
+ }
279
+ //# sourceMappingURL=request-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-plan.js","sourceRoot":"","sources":["../../src/llm/request-plan.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,33 @@
1
- import type { CompletionRequest, CompletionResult, ProviderId } from "../types.js";
1
+ import type { CompletionRequest, CompletionResult, ProviderId, SuccessfulRequestSnapshot } from "../types.js";
2
2
  import { ProviderError } from "./http.js";
3
+ import { type ProviderStreamEventSink } from "./stream-events.js";
3
4
  import { type ProviderKeyEvent } from "./key-rotation.js";
4
5
  import type { LlmProvider, ProviderAuth } from "./provider.js";
6
+ import { OperationUsageRecorder, type OperationUsageSnapshot } from "./operation-usage.js";
7
+ import { OperationLedger } from "./operation-ledger.js";
5
8
  /** Toast replace-key so key rotation never stacks notifications. */
6
9
  export declare const API_KEY_TOAST_KEY = "api-key-rotation";
7
10
  export type ProviderKeyEventHandler = (event: ProviderKeyEvent) => void;
8
11
  export interface StreamWithProviderOptions {
9
12
  readonly onStatus?: ((message: string) => void) | undefined;
10
13
  readonly onKeyEvent?: ProviderKeyEventHandler | undefined;
14
+ readonly onStreamEvent?: ProviderStreamEventSink | undefined;
15
+ /** Additive per-admission accounting for this logical operation. */
16
+ readonly attemptUsage?: OperationUsageRecorder | undefined;
17
+ readonly operation?: OperationLedger | undefined;
18
+ readonly adoptFallback?: boolean | undefined;
19
+ /** Receives the immutable terminal snapshot on success or failure. */
20
+ readonly onOperationUsage?: ((snapshot: OperationUsageSnapshot) => void) | undefined;
11
21
  /** Cap retries for this request (default MAX_RETRIES). Use 0-1 for compaction. */
12
22
  readonly maxRetries?: number | undefined;
23
+ /**
24
+ * Pin the route and emit exactly one physical generation request: no provider
25
+ * fallback, no key or endpoint rotation, no capability-adaptation retry. Used
26
+ * by operations whose prompt is too expensive to send twice (compaction) and
27
+ * by auxiliary requests that must not multiply.
28
+ */
29
+ readonly singleDispatch?: boolean | undefined;
30
+ readonly onSuccessfulRequest?: ((snapshot: SuccessfulRequestSnapshot) => void) | undefined;
13
31
  }
14
32
  /**
15
33
  * User-facing classification of provider failures (auth, capacity, disconnect,