@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,277 @@
1
+ import { providerIds, } from "../types.js";
2
+ /** Versioned runtime representation for one observed context measurement. */
3
+ export const CONTEXT_SNAPSHOT_VERSION = 1;
4
+ const LIMIT_SOURCES = new Set([
5
+ "session-override",
6
+ "model-catalog",
7
+ "configured-trigger",
8
+ "provider-reported",
9
+ "unknown",
10
+ ]);
11
+ const SCOPES = new Set([
12
+ "provider-request",
13
+ "assembled-request",
14
+ "message-history",
15
+ "unknown",
16
+ ]);
17
+ const PRECISIONS = new Set([
18
+ "provider-exact",
19
+ "estimate",
20
+ "unknown",
21
+ ]);
22
+ const UNKNOWN_HEADROOM = Object.freeze({
23
+ kind: "unknown",
24
+ });
25
+ const UNKNOWN_CACHE = Object.freeze({
26
+ kind: "unknown",
27
+ });
28
+ const UNKNOWN_REASONING = Object.freeze({
29
+ kind: "unknown",
30
+ });
31
+ const UNAVAILABLE_ATTEMPT = Object.freeze({
32
+ kind: "unavailable",
33
+ });
34
+ function nonNegativeInteger(value) {
35
+ if (typeof value !== "number" || !Number.isFinite(value))
36
+ return 0;
37
+ return Math.max(0, Math.floor(value));
38
+ }
39
+ function optionalNonNegativeInteger(value) {
40
+ if (typeof value !== "number" || !Number.isFinite(value))
41
+ return undefined;
42
+ return Math.max(0, Math.floor(value));
43
+ }
44
+ function positiveInteger(value) {
45
+ const normalized = optionalNonNegativeInteger(value);
46
+ return normalized !== undefined && normalized > 0 ? normalized : undefined;
47
+ }
48
+ function normalizeLimit(limit) {
49
+ if (!limit || !LIMIT_SOURCES.has(limit.source)) {
50
+ return Object.freeze({ source: "unknown" });
51
+ }
52
+ const tokens = positiveInteger(limit.tokens);
53
+ return Object.freeze({
54
+ source: limit.source,
55
+ ...(tokens !== undefined ? { tokens } : {}),
56
+ });
57
+ }
58
+ function normalizeCache(cache) {
59
+ if (!cache || cache.kind !== "reported")
60
+ return UNKNOWN_CACHE;
61
+ const readTokens = optionalNonNegativeInteger(cache.readTokens);
62
+ const creationTokens = optionalNonNegativeInteger(cache.creationTokens);
63
+ const uncachedTokens = optionalNonNegativeInteger(cache.uncachedTokens);
64
+ if (readTokens === undefined &&
65
+ creationTokens === undefined &&
66
+ uncachedTokens === undefined) {
67
+ return UNKNOWN_CACHE;
68
+ }
69
+ return Object.freeze({
70
+ kind: "reported",
71
+ ...(readTokens !== undefined ? { readTokens } : {}),
72
+ ...(creationTokens !== undefined ? { creationTokens } : {}),
73
+ ...(uncachedTokens !== undefined ? { uncachedTokens } : {}),
74
+ });
75
+ }
76
+ function normalizeReasoning(reasoning) {
77
+ if (!reasoning || reasoning.kind !== "reported")
78
+ return UNKNOWN_REASONING;
79
+ const outputTokens = optionalNonNegativeInteger(reasoning.outputTokens);
80
+ const inputArtifactTokens = optionalNonNegativeInteger(reasoning.inputArtifactTokens);
81
+ if (outputTokens === undefined && inputArtifactTokens === undefined) {
82
+ return UNKNOWN_REASONING;
83
+ }
84
+ return Object.freeze({
85
+ kind: "reported",
86
+ ...(outputTokens !== undefined ? { outputTokens } : {}),
87
+ ...(inputArtifactTokens !== undefined ? { inputArtifactTokens } : {}),
88
+ });
89
+ }
90
+ function derivedHeadroom(contextTokens, scope, limit) {
91
+ if (scope === "message-history" ||
92
+ scope === "unknown" ||
93
+ limit.source !== "session-override" ||
94
+ limit.tokens === undefined) {
95
+ return UNKNOWN_HEADROOM;
96
+ }
97
+ return Object.freeze({
98
+ kind: "known",
99
+ remainingTokens: Math.max(0, limit.tokens - contextTokens),
100
+ });
101
+ }
102
+ function normalizeObservedAt(value) {
103
+ const candidate = value ?? Date.now();
104
+ return nonNegativeInteger(candidate);
105
+ }
106
+ /** Build one immutable, versioned observation without synthesizing telemetry. */
107
+ export function createContextSnapshot(input) {
108
+ const contextTokens = nonNegativeInteger(input.contextTokens);
109
+ const limit = normalizeLimit(input.limit);
110
+ return Object.freeze({
111
+ version: CONTEXT_SNAPSHOT_VERSION,
112
+ contextTokens,
113
+ lastCompletionTokens: nonNegativeInteger(input.lastCompletionTokens),
114
+ sessionPromptTokens: nonNegativeInteger(input.sessionPromptTokens),
115
+ sessionCompletionTokens: nonNegativeInteger(input.sessionCompletionTokens),
116
+ scope: input.scope,
117
+ precision: input.precision,
118
+ limit,
119
+ headroom: input.headroom ?? derivedHeadroom(contextTokens, input.scope, limit),
120
+ cache: normalizeCache(input.cache),
121
+ reasoning: normalizeReasoning(input.reasoning),
122
+ attempt: input.attempt ?? UNAVAILABLE_ATTEMPT,
123
+ observedAt: normalizeObservedAt(input.observedAt),
124
+ });
125
+ }
126
+ /** The only legacy projection consumed by existing renderers and old history. */
127
+ export function toLegacyContextUsage(snapshot) {
128
+ return Object.freeze({
129
+ contextTokens: snapshot.contextTokens,
130
+ contextLimit: snapshot.limit.source === "session-override" && snapshot.limit.tokens
131
+ ? snapshot.limit.tokens
132
+ : 0,
133
+ lastCompletionTokens: snapshot.lastCompletionTokens,
134
+ sessionPromptTokens: snapshot.sessionPromptTokens,
135
+ sessionCompletionTokens: snapshot.sessionCompletionTokens,
136
+ exact: snapshot.precision === "provider-exact",
137
+ });
138
+ }
139
+ export function contextLimitFromSessionOverride(tokens) {
140
+ const normalized = positiveInteger(tokens);
141
+ return Object.freeze(normalized === undefined
142
+ ? { source: "unknown" }
143
+ : { source: "session-override", tokens: normalized });
144
+ }
145
+ /** Rebind only live limit metadata; measurements retain their original time. */
146
+ export function withContextSnapshotLimit(snapshot, limit) {
147
+ const normalizedLimit = normalizeLimit(limit);
148
+ return Object.freeze({
149
+ ...snapshot,
150
+ limit: normalizedLimit,
151
+ headroom: derivedHeadroom(snapshot.contextTokens, snapshot.scope, normalizedLimit),
152
+ });
153
+ }
154
+ /** Convert an unversioned six-field persisted/rendering snapshot once. */
155
+ export function contextSnapshotFromLegacy(snapshot, limit, observedAt) {
156
+ return createContextSnapshot({
157
+ contextTokens: snapshot.contextTokens,
158
+ lastCompletionTokens: snapshot.lastCompletionTokens,
159
+ sessionPromptTokens: snapshot.sessionPromptTokens,
160
+ sessionCompletionTokens: snapshot.sessionCompletionTokens,
161
+ scope: "unknown",
162
+ precision: snapshot.exact ? "provider-exact" : "estimate",
163
+ limit,
164
+ observedAt,
165
+ });
166
+ }
167
+ function isRecord(value) {
168
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
169
+ }
170
+ function isNonNegativeIntegerValue(value) {
171
+ return (typeof value === "number" &&
172
+ Number.isSafeInteger(value) &&
173
+ value >= 0);
174
+ }
175
+ function hasOptionalNonNegativeInteger(value) {
176
+ return value === undefined || isNonNegativeIntegerValue(value);
177
+ }
178
+ function isContextLimit(value) {
179
+ return (isRecord(value) &&
180
+ LIMIT_SOURCES.has(value.source) &&
181
+ (value.tokens === undefined ||
182
+ (isNonNegativeIntegerValue(value.tokens) && value.tokens > 0)));
183
+ }
184
+ function isContextHeadroom(value) {
185
+ if (!isRecord(value))
186
+ return false;
187
+ if (value.kind === "unknown")
188
+ return true;
189
+ return (value.kind === "known" &&
190
+ isNonNegativeIntegerValue(value.remainingTokens) &&
191
+ hasOptionalNonNegativeInteger(value.effectiveTriggerTokens) &&
192
+ hasOptionalNonNegativeInteger(value.outputReserveTokens) &&
193
+ hasOptionalNonNegativeInteger(value.safetyMarginTokens));
194
+ }
195
+ function isContextCache(value) {
196
+ if (!isRecord(value))
197
+ return false;
198
+ if (value.kind === "unknown")
199
+ return true;
200
+ return (value.kind === "reported" &&
201
+ hasOptionalNonNegativeInteger(value.readTokens) &&
202
+ hasOptionalNonNegativeInteger(value.creationTokens) &&
203
+ hasOptionalNonNegativeInteger(value.uncachedTokens));
204
+ }
205
+ function isContextReasoning(value) {
206
+ if (!isRecord(value))
207
+ return false;
208
+ if (value.kind === "unknown")
209
+ return true;
210
+ return (value.kind === "reported" &&
211
+ hasOptionalNonNegativeInteger(value.outputTokens) &&
212
+ hasOptionalNonNegativeInteger(value.inputArtifactTokens));
213
+ }
214
+ const ATTEMPT_MODES = new Set(["complete", "stream"]);
215
+ const ATTEMPT_REASONS = new Set([
216
+ "initial",
217
+ "retry",
218
+ "fallback",
219
+ "adaptation",
220
+ "provider-retry",
221
+ ]);
222
+ const ATTEMPT_OUTCOMES = new Set([
223
+ "success",
224
+ "failure",
225
+ "cancelled",
226
+ ]);
227
+ const ATTEMPT_PROVIDERS = new Set(providerIds);
228
+ function isContextAttempt(value) {
229
+ if (!isRecord(value))
230
+ return false;
231
+ if (value.kind === "unavailable")
232
+ return true;
233
+ return (value.kind === "generation" &&
234
+ isNonNegativeIntegerValue(value.sequence) &&
235
+ value.sequence > 0 &&
236
+ ATTEMPT_PROVIDERS.has(value.provider) &&
237
+ typeof value.model === "string" &&
238
+ value.model.trim().length > 0 &&
239
+ ATTEMPT_MODES.has(value.mode) &&
240
+ ATTEMPT_REASONS.has(value.reason) &&
241
+ ATTEMPT_OUTCOMES.has(value.outcome));
242
+ }
243
+ /** Narrow persisted JSON before treating it as the current schema. */
244
+ export function isContextSnapshotV1(value) {
245
+ if (!isRecord(value) || value.version !== CONTEXT_SNAPSHOT_VERSION)
246
+ return false;
247
+ return (SCOPES.has(value.scope) &&
248
+ PRECISIONS.has(value.precision) &&
249
+ isContextLimit(value.limit) &&
250
+ isContextHeadroom(value.headroom) &&
251
+ isContextCache(value.cache) &&
252
+ isContextReasoning(value.reasoning) &&
253
+ isContextAttempt(value.attempt) &&
254
+ [
255
+ value.contextTokens,
256
+ value.lastCompletionTokens,
257
+ value.sessionPromptTokens,
258
+ value.sessionCompletionTokens,
259
+ value.observedAt,
260
+ ].every(isNonNegativeIntegerValue));
261
+ }
262
+ /** Return the final physical T100 attempt only when it really exists. */
263
+ export function contextAttemptFromOperationUsage(operationUsage) {
264
+ const attempt = operationUsage?.attempts.at(-1);
265
+ if (!attempt)
266
+ return UNAVAILABLE_ATTEMPT;
267
+ return Object.freeze({
268
+ kind: "generation",
269
+ sequence: attempt.sequence,
270
+ provider: attempt.provider,
271
+ model: attempt.model,
272
+ mode: attempt.mode,
273
+ reason: attempt.reason,
274
+ outcome: attempt.outcome,
275
+ });
276
+ }
277
+ //# sourceMappingURL=context-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-snapshot.js","sourceRoot":"","sources":["../../src/llm/context-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ProviderId } from "../types.js";
2
+ export declare function modelContextWindow(model: string | undefined, provider?: ProviderId | undefined): number;
3
+ /**
4
+ * The model's nominal family window, ignoring provider-served overrides.
5
+ * Some overrides (Groq's low-TPM tiers) are budget advisories that steer
6
+ * earlier compaction, not physical maximums a dispatch gate should enforce.
7
+ */
8
+ export declare function nominalModelContextWindow(model: string | undefined): number;
9
+ /** Exact served window for a provider-published alias, when one exists. */
10
+ export declare function providerContextOverrideTokens(provider: ProviderId, model: string | undefined): number | undefined;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Known model context windows (tokens). Patterns are tested in order;
3
+ * first match wins. Keep conservative defaults so % never under-reports fill.
4
+ */
5
+ const CONTEXT_WINDOW_RULES = [
6
+ // Anthropic
7
+ { pattern: /claude-(?:fable|mythos)-5/i, tokens: 1_000_000 },
8
+ { pattern: /claude-(?:opus|sonnet)-5/i, tokens: 1_000_000 },
9
+ { pattern: /claude-(?:opus|sonnet)-4\.[678]/i, tokens: 1_000_000 },
10
+ { pattern: /claude-(?:opus|sonnet)-4/i, tokens: 200_000 },
11
+ { pattern: /claude-haiku-4/i, tokens: 200_000 },
12
+ { pattern: /claude-3-7/i, tokens: 200_000 },
13
+ { pattern: /claude-3-5/i, tokens: 200_000 },
14
+ { pattern: /claude-3/i, tokens: 200_000 },
15
+ // OpenAI
16
+ { pattern: /gpt-5\.[456](?:[-.]|$)/i, tokens: 1_050_000 },
17
+ { pattern: /gpt-5/i, tokens: 400_000 },
18
+ { pattern: /gpt-4\.1/i, tokens: 1_047_576 },
19
+ { pattern: /gpt-4o/i, tokens: 128_000 },
20
+ { pattern: /gpt-4-turbo/i, tokens: 128_000 },
21
+ // Plain gpt-4 is 8k (32k for the -32k variant); the generic 128k rule below
22
+ // used to over-size it, so no warning arrived before a hard context error.
23
+ { pattern: /gpt-4-32k/i, tokens: 32_768 },
24
+ { pattern: /^gpt-4(?:-\d{4})?$/i, tokens: 8_192 },
25
+ { pattern: /gpt-4/i, tokens: 128_000 },
26
+ { pattern: /o3/i, tokens: 200_000 },
27
+ { pattern: /o4/i, tokens: 200_000 },
28
+ { pattern: /o1/i, tokens: 200_000 },
29
+ // Google — keep explicit rules ahead of the generic /gemini/i fallback, which
30
+ // used to catch the shipped gemini-3.x default at an order of magnitude low.
31
+ { pattern: /gemini-3/i, tokens: 1_048_576 },
32
+ { pattern: /gemini-2\.5/i, tokens: 1_048_576 },
33
+ { pattern: /gemini-2\.0/i, tokens: 1_048_576 },
34
+ { pattern: /gemini-1\.5/i, tokens: 1_048_576 },
35
+ { pattern: /gemini/i, tokens: 128_000 },
36
+ // Meta / Groq
37
+ { pattern: /llama-4/i, tokens: 128_000 },
38
+ { pattern: /llama-3\.3/i, tokens: 128_000 },
39
+ { pattern: /llama-3\.1/i, tokens: 128_000 },
40
+ { pattern: /llama-3/i, tokens: 128_000 },
41
+ // DeepSeek / Qwen / Kimi / GLM / etc.
42
+ { pattern: /deepseek-v4/i, tokens: 1_000_000 },
43
+ { pattern: /deepseek/i, tokens: 128_000 },
44
+ { pattern: /qwen3\.7/i, tokens: 1_000_000 },
45
+ { pattern: /qwen3\.(?:8|6|5)/i, tokens: 262_144 },
46
+ { pattern: /qwen3/i, tokens: 128_000 },
47
+ { pattern: /qwen2\.5/i, tokens: 128_000 },
48
+ { pattern: /qwen/i, tokens: 128_000 },
49
+ // Kimi-K3 is a 1M-window model. Keep this before generic Kimi/K2 rules so
50
+ // Modal and gateway model IDs such as `moonshotai/Kimi-K3` are not clamped
51
+ // to the legacy 128k family window.
52
+ { pattern: /kimi-k3/i, tokens: 1_000_000 },
53
+ { pattern: /kimi-k2/i, tokens: 256_000 },
54
+ { pattern: /kimi/i, tokens: 128_000 },
55
+ { pattern: /glm-?5\.2/i, tokens: 1_000_000 },
56
+ { pattern: /glm-?5/i, tokens: 200_000 },
57
+ { pattern: /glm-?4\.[56]/i, tokens: 200_000 },
58
+ { pattern: /glm-?4/i, tokens: 128_000 },
59
+ { pattern: /minimax-m3/i, tokens: 1_000_000 },
60
+ { pattern: /minimax-m2\.7/i, tokens: 204_800 },
61
+ { pattern: /minimax/i, tokens: 128_000 },
62
+ { pattern: /mimo/i, tokens: 128_000 },
63
+ { pattern: /gpt-oss/i, tokens: 128_000 },
64
+ { pattern: /nemotron/i, tokens: 128_000 },
65
+ { pattern: /muse-spark/i, tokens: 1_048_576 },
66
+ ];
67
+ const DEFAULT_CONTEXT_WINDOW = 250_000;
68
+ /**
69
+ * Provider-specific served windows that are smaller than the model's nominal
70
+ * one. The `provider` argument used to be accepted and discarded, so `%` of
71
+ * context was wrong wherever a gateway serves a truncated window.
72
+ */
73
+ const PROVIDER_CONTEXT_OVERRIDES = {
74
+ // Groq serves these two on a low TPM tier; the usable prompt is far below the
75
+ // model's nominal window (mirrors `groqInputTokenBudget`).
76
+ groq: [
77
+ { pattern: /qwen\/qwen3-32b/i, tokens: 5_500 },
78
+ { pattern: /openai\/gpt-oss-20b/i, tokens: 7_500 },
79
+ ],
80
+ // TokenRouter publishes the real upstream window per model id, and several
81
+ // are far larger than the generic family rules below would guess. Model ids
82
+ // are vendor-namespaced (`deepseek/deepseek-v4-pro`) but older sessions and
83
+ // catalogs still carry the bare alias, so both forms must match (MR-033).
84
+ tokenrouter: [
85
+ { pattern: /^(?:[a-z0-9-]+\/)?deepseek-v4-(?:pro|flash)$/i, tokens: 1_000_000 },
86
+ { pattern: /^(?:[a-z0-9-]+\/)?minimax-m3$/i, tokens: 524_288 },
87
+ { pattern: /^(?:[a-z0-9-]+\/)?minimax-m2p7$/i, tokens: 196_608 },
88
+ { pattern: /^(?:[a-z0-9-]+\/)?kimi-k2(?:p\d|\.\d)/i, tokens: 262_144 },
89
+ { pattern: /^(?:[a-z0-9-]+\/)?qwen3p\d-plus$/i, tokens: 262_144 },
90
+ { pattern: /^(?:[a-z0-9-]+\/)?glm-5p1(?:-fast)?$/i, tokens: 202_752 },
91
+ { pattern: /^(?:[a-z0-9-]+\/)?gpt-oss-120b$/i, tokens: 131_072 },
92
+ ],
93
+ };
94
+ export function modelContextWindow(model, provider) {
95
+ if (!model)
96
+ return DEFAULT_CONTEXT_WINDOW;
97
+ const overrides = provider ? PROVIDER_CONTEXT_OVERRIDES[provider] : undefined;
98
+ if (overrides) {
99
+ for (const rule of overrides) {
100
+ if (rule.pattern.test(model))
101
+ return rule.tokens;
102
+ }
103
+ }
104
+ return nominalModelContextWindow(model);
105
+ }
106
+ /**
107
+ * The model's nominal family window, ignoring provider-served overrides.
108
+ * Some overrides (Groq's low-TPM tiers) are budget advisories that steer
109
+ * earlier compaction, not physical maximums a dispatch gate should enforce.
110
+ */
111
+ export function nominalModelContextWindow(model) {
112
+ if (!model)
113
+ return DEFAULT_CONTEXT_WINDOW;
114
+ for (const rule of CONTEXT_WINDOW_RULES) {
115
+ if (rule.pattern.test(model))
116
+ return rule.tokens;
117
+ }
118
+ return DEFAULT_CONTEXT_WINDOW;
119
+ }
120
+ /** Exact served window for a provider-published alias, when one exists. */
121
+ export function providerContextOverrideTokens(provider, model) {
122
+ if (!model)
123
+ return undefined;
124
+ const overrides = PROVIDER_CONTEXT_OVERRIDES[provider];
125
+ if (!overrides)
126
+ return undefined;
127
+ return overrides.find((rule) => rule.pattern.test(model))?.tokens;
128
+ }
129
+ //# sourceMappingURL=context-windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-windows.js","sourceRoot":"","sources":["../../src/llm/context-windows.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,oBAAoB,GAGrB;IACH,YAAY;IACZ,EAAE,OAAO,EAAE,4BAA4B,EAAE,MAAM,EAAE,SAAS,EAAE;IAC5D,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,SAAS,EAAE;IAC3D,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,SAAS,EAAE;IAClE,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,OAAO,EAAE;IACzD,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE;IAC/C,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;IAC3C,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;IAC3C,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IACzC,SAAS;IACT,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,SAAS,EAAE;IACzD,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IACtC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE;IAC3C,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IACvC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE;IAC5C,4EAA4E;IAC5E,2EAA2E;IAC3E,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE;IACzC,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE;IACjD,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IACtC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IACnC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IACnC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IACnC,8EAA8E;IAC9E,6EAA6E;IAC7E,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE;IAC3C,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE;IAC9C,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE;IAC9C,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE;IAC9C,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IACvC,cAAc;IACd,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IACxC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;IAC3C,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;IAC3C,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IACxC,sCAAsC;IACtC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE;IAC9C,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IACzC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE;IAC3C,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE;IACjD,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IACtC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IACzC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IACrC,0EAA0E;IAC1E,2EAA2E;IAC3E,oCAAoC;IACpC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE;IAC1C,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IACxC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IACrC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE;IAC5C,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IACvC,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7C,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IACvC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE;IAC7C,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE;IAC9C,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IACxC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IACrC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IACxC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IACzC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE;CAC9C,CAAC;AAEF,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAEvC;;;;GAIG;AACH,MAAM,0BAA0B,GAE5B;IACF,8EAA8E;IAC9E,2DAA2D;IAC3D,IAAI,EAAE;QACJ,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,EAAE;KACnD;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,WAAW,EAAE;QACX,EAAE,OAAO,EAAE,+CAA+C,EAAE,MAAM,EAAE,SAAS,EAAE;QAC/E,EAAE,OAAO,EAAE,gCAAgC,EAAE,MAAM,EAAE,OAAO,EAAE;QAC9D,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,OAAO,EAAE;QAChE,EAAE,OAAO,EAAE,wCAAwC,EAAE,MAAM,EAAE,OAAO,EAAE;QACtE,EAAE,OAAO,EAAE,mCAAmC,EAAE,MAAM,EAAE,OAAO,EAAE;QACjE,EAAE,OAAO,EAAE,uCAAuC,EAAE,MAAM,EAAE,OAAO,EAAE;QACrE,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,OAAO,EAAE;KACjE;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,KAAyB,EACzB,QAAiC;IAEjC,IAAI,CAAC,KAAK;QAAE,OAAO,sBAAsB,CAAC;IAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAyB;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,sBAAsB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACnD,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,6BAA6B,CAC3C,QAAoB,EACpB,KAAyB;IAEzB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,SAAS,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;AACpE,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { type FinalTurnPreservation, type ProfileReplayScope, type ProfileTriState, type ProviderProfile, type ProviderProfileLayer, type ReasoningDisableForm, type ReasoningGeneration, type ReasoningOutputShape } from "./provider-profile.js";
2
+ import type { ReasoningStyle } from "./http.js";
3
+ import type { CachePolicyKind, LimitSource } from "./provider-profile.js";
4
+ export type CustomAuthType = "bearer" | "custom-headers" | "none-keyless";
5
+ /** Serializable wire subset a custom route may declare. */
6
+ export interface CustomProviderProfileSpec {
7
+ readonly authType?: CustomAuthType | undefined;
8
+ readonly keyEnv?: string | undefined;
9
+ readonly baseUrlEnv?: string | undefined;
10
+ /** Values may be literals or `${ENV_NAME}` references. */
11
+ readonly headers?: Readonly<Record<string, string>> | undefined;
12
+ readonly tools?: ProfileTriState | undefined;
13
+ readonly images?: ProfileTriState | undefined;
14
+ readonly structuredOutput?: ProfileTriState | undefined;
15
+ readonly streamOptions?: ProfileTriState | undefined;
16
+ readonly reasoning?: {
17
+ readonly generation?: ReasoningGeneration | undefined;
18
+ readonly controlDialect?: "openai-effort" | "none" | undefined;
19
+ readonly acceptedEfforts?: readonly string[] | undefined;
20
+ readonly disable?: ProfileTriState | undefined;
21
+ readonly disableForm?: ReasoningDisableForm | undefined;
22
+ readonly outputShapes?: readonly ReasoningOutputShape[] | undefined;
23
+ readonly replayScope?: ProfileReplayScope | undefined;
24
+ readonly finalTurnPreservation?: FinalTurnPreservation | undefined;
25
+ } | undefined;
26
+ readonly limits?: {
27
+ readonly contextTokens?: number | undefined;
28
+ readonly outputTokens?: number | undefined;
29
+ readonly source?: LimitSource | undefined;
30
+ } | undefined;
31
+ readonly cache?: {
32
+ readonly kind?: CachePolicyKind | undefined;
33
+ readonly affinityField?: string | undefined;
34
+ readonly isolationField?: string | undefined;
35
+ readonly cacheAffectingFields?: readonly string[] | undefined;
36
+ } | undefined;
37
+ readonly usage?: {
38
+ readonly cachedInput?: readonly string[] | undefined;
39
+ readonly uncachedInput?: readonly string[] | undefined;
40
+ readonly cacheWrite?: readonly string[] | undefined;
41
+ readonly reasoningOutput?: readonly string[] | undefined;
42
+ } | undefined;
43
+ readonly terminal?: {
44
+ readonly naturalEofAccepted?: boolean | undefined;
45
+ } | undefined;
46
+ }
47
+ /**
48
+ * Local, actionable validation. Nothing here performs a network call; the goal
49
+ * is that an invalid declaration fails before any request is dispatched.
50
+ */
51
+ export declare function validateCustomProviderProfile(raw: unknown): {
52
+ spec?: CustomProviderProfileSpec;
53
+ errors: string[];
54
+ };
55
+ /** Maps a validated spec onto the user-config evidence layer. */
56
+ export declare function customProfileLayer(spec: CustomProviderProfileSpec | undefined): ProviderProfileLayer | undefined;
57
+ export declare function endpointPrivacyHash(baseUrl: string): string;
58
+ /**
59
+ * Conservative unknown unless declared; a custom endpoint that verifiably is
60
+ * the direct DeepSeek API earns the documented V4 builtin layer as route
61
+ * evidence below user declarations.
62
+ */
63
+ export declare function resolveCustomProviderProfile(input: {
64
+ id: string;
65
+ model: string;
66
+ baseUrl: string;
67
+ profile?: CustomProviderProfileSpec | undefined;
68
+ }): ProviderProfile;
69
+ /**
70
+ * Serializer style for the compatible path. Undeclared routes omit optional
71
+ * reasoning controls entirely (send narrowly, parse broadly).
72
+ */
73
+ export declare function customReasoningStyle(profile: CustomProviderProfileSpec | undefined): ReasoningStyle;
74
+ /** Resolves `${ENV_NAME}` header references before dispatch; throws locally. */
75
+ export declare function resolveCustomHeaders(headers: Readonly<Record<string, string>> | undefined): Record<string, string> | undefined;