@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,100 @@
1
+ import { type GenerationAttemptMode, type GenerationAttemptOutcome, type GenerationAttemptReason, type ProviderId } from "../types.js";
2
+ import type { OperationUsageSnapshot } from "./operation-usage.js";
3
+ import type { ContextUsageSnapshot } from "./token-usage.js";
4
+ /** Versioned runtime representation for one observed context measurement. */
5
+ export declare const CONTEXT_SNAPSHOT_VERSION: 1;
6
+ export type ContextSnapshotScope = "provider-request" | "assembled-request" | "message-history" | "unknown";
7
+ export type ContextSnapshotPrecision = "provider-exact" | "estimate" | "unknown";
8
+ export type ContextLimitSource = "session-override" | "model-catalog" | "configured-trigger" | "provider-reported" | "unknown";
9
+ export interface ContextSnapshotLimit {
10
+ readonly source: ContextLimitSource;
11
+ readonly tokens?: number | undefined;
12
+ }
13
+ export type ContextSnapshotHeadroom = {
14
+ readonly kind: "known";
15
+ /** Remaining tokens in the same scope as contextTokens. */
16
+ readonly remainingTokens: number;
17
+ /** Optional future request-budget metadata; T110 leaves it unknown. */
18
+ readonly effectiveTriggerTokens?: number | undefined;
19
+ readonly outputReserveTokens?: number | undefined;
20
+ readonly safetyMarginTokens?: number | undefined;
21
+ } | {
22
+ readonly kind: "unknown";
23
+ };
24
+ /** Provider-reported cache outcomes; absence is explicitly unknown, never zero. */
25
+ export type ContextSnapshotCache = {
26
+ readonly kind: "unknown";
27
+ } | {
28
+ readonly kind: "reported";
29
+ readonly readTokens?: number | undefined;
30
+ readonly creationTokens?: number | undefined;
31
+ /** Input tokens explicitly not served from the provider cache. */
32
+ readonly uncachedTokens?: number | undefined;
33
+ };
34
+ /** Provider-reported reasoning usage; absence is explicitly unknown, never zero. */
35
+ export type ContextSnapshotReasoning = {
36
+ readonly kind: "unknown";
37
+ } | {
38
+ readonly kind: "reported";
39
+ readonly outputTokens?: number | undefined;
40
+ readonly inputArtifactTokens?: number | undefined;
41
+ };
42
+ /**
43
+ * A T100 record sequence is scoped to one logical provider operation. It is
44
+ * exposed only when that operation snapshot actually reached the caller.
45
+ */
46
+ export type ContextAttemptReference = {
47
+ readonly kind: "unavailable";
48
+ } | {
49
+ readonly kind: "generation";
50
+ readonly sequence: number;
51
+ readonly provider: ProviderId;
52
+ readonly model: string;
53
+ readonly mode: GenerationAttemptMode;
54
+ readonly reason: GenerationAttemptReason;
55
+ readonly outcome: GenerationAttemptOutcome;
56
+ };
57
+ export interface ContextSnapshotV1 {
58
+ readonly version: typeof CONTEXT_SNAPSHOT_VERSION;
59
+ /** The observed context fill in the declared scope. */
60
+ readonly contextTokens: number;
61
+ readonly lastCompletionTokens: number;
62
+ readonly sessionPromptTokens: number;
63
+ readonly sessionCompletionTokens: number;
64
+ readonly scope: ContextSnapshotScope;
65
+ readonly precision: ContextSnapshotPrecision;
66
+ readonly limit: ContextSnapshotLimit;
67
+ readonly headroom: ContextSnapshotHeadroom;
68
+ readonly cache: ContextSnapshotCache;
69
+ readonly reasoning: ContextSnapshotReasoning;
70
+ readonly attempt: ContextAttemptReference;
71
+ /** Epoch milliseconds captured at measurement time, never at projection time. */
72
+ readonly observedAt: number;
73
+ }
74
+ export interface CreateContextSnapshotInput {
75
+ readonly contextTokens: number;
76
+ readonly lastCompletionTokens?: number | undefined;
77
+ readonly sessionPromptTokens?: number | undefined;
78
+ readonly sessionCompletionTokens?: number | undefined;
79
+ readonly scope: ContextSnapshotScope;
80
+ readonly precision: ContextSnapshotPrecision;
81
+ readonly limit?: ContextSnapshotLimit | undefined;
82
+ readonly headroom?: ContextSnapshotHeadroom | undefined;
83
+ readonly cache?: ContextSnapshotCache | undefined;
84
+ readonly reasoning?: ContextSnapshotReasoning | undefined;
85
+ readonly attempt?: ContextAttemptReference | undefined;
86
+ readonly observedAt?: number | undefined;
87
+ }
88
+ /** Build one immutable, versioned observation without synthesizing telemetry. */
89
+ export declare function createContextSnapshot(input: CreateContextSnapshotInput): ContextSnapshotV1;
90
+ /** The only legacy projection consumed by existing renderers and old history. */
91
+ export declare function toLegacyContextUsage(snapshot: ContextSnapshotV1): ContextUsageSnapshot;
92
+ export declare function contextLimitFromSessionOverride(tokens: number | undefined): ContextSnapshotLimit;
93
+ /** Rebind only live limit metadata; measurements retain their original time. */
94
+ export declare function withContextSnapshotLimit(snapshot: ContextSnapshotV1, limit: ContextSnapshotLimit): ContextSnapshotV1;
95
+ /** Convert an unversioned six-field persisted/rendering snapshot once. */
96
+ export declare function contextSnapshotFromLegacy(snapshot: ContextUsageSnapshot, limit: ContextSnapshotLimit, observedAt?: number | undefined): ContextSnapshotV1;
97
+ /** Narrow persisted JSON before treating it as the current schema. */
98
+ export declare function isContextSnapshotV1(value: unknown): value is ContextSnapshotV1;
99
+ /** Return the final physical T100 attempt only when it really exists. */
100
+ export declare function contextAttemptFromOperationUsage(operationUsage: OperationUsageSnapshot | undefined): ContextAttemptReference;
@@ -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":"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"}
@@ -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;