@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,558 @@
1
+ import { createHash } from "node:crypto";
2
+ import { resolveProviderProfile, } from "./provider-profile.js";
3
+ import { directDeepSeekV4Layer } from "./provider-profiles.js";
4
+ const USER_EVIDENCE = {
5
+ source: "user-config",
6
+ confidence: "exact",
7
+ };
8
+ const ALLOWED_KEYS = [
9
+ "authType",
10
+ "keyEnv",
11
+ "baseUrlEnv",
12
+ "headers",
13
+ "tools",
14
+ "images",
15
+ "structuredOutput",
16
+ "streamOptions",
17
+ "reasoning",
18
+ "limits",
19
+ "cache",
20
+ "usage",
21
+ "terminal",
22
+ ];
23
+ const ALLOWED_REASONING_KEYS = [
24
+ "generation",
25
+ "controlDialect",
26
+ "acceptedEfforts",
27
+ "disable",
28
+ "disableForm",
29
+ "outputShapes",
30
+ "replayScope",
31
+ "finalTurnPreservation",
32
+ ];
33
+ const ALLOWED_LIMIT_KEYS = ["contextTokens", "outputTokens", "source"];
34
+ const ALLOWED_CACHE_KEYS = [
35
+ "kind",
36
+ "affinityField",
37
+ "isolationField",
38
+ "cacheAffectingFields",
39
+ ];
40
+ const ALLOWED_USAGE_KEYS = [
41
+ "cachedInput",
42
+ "uncachedInput",
43
+ "cacheWrite",
44
+ "reasoningOutput",
45
+ ];
46
+ const ALLOWED_TERMINAL_KEYS = ["naturalEofAccepted"];
47
+ const AUTH_TYPES = [
48
+ "bearer",
49
+ "custom-headers",
50
+ "none-keyless",
51
+ ];
52
+ const TRI_STATES = [
53
+ "supported",
54
+ "unsupported",
55
+ "unknown",
56
+ ];
57
+ const GENERATIONS = [
58
+ "none",
59
+ "optional",
60
+ "default-on",
61
+ "mandatory",
62
+ "unknown",
63
+ ];
64
+ const OUTPUT_SHAPES = [
65
+ "reasoning-content",
66
+ "reasoning-field",
67
+ "signed-thinking-block",
68
+ "thought-signature",
69
+ "encrypted-reasoning-items",
70
+ "structured-details",
71
+ "ollama-thinking",
72
+ ];
73
+ const REPLAY_SCOPES = [
74
+ "none",
75
+ "tool-turn",
76
+ "next-turn",
77
+ "all-history",
78
+ "server-state",
79
+ "configurable",
80
+ ];
81
+ const PRESERVATIONS = [
82
+ "required",
83
+ "supported",
84
+ "unsupported",
85
+ "unknown",
86
+ ];
87
+ const CACHE_KINDS = [
88
+ "automatic-prefix",
89
+ "affinity-key",
90
+ "explicit-breakpoint",
91
+ "none-documented",
92
+ "unknown",
93
+ ];
94
+ const LIMIT_SOURCES = [
95
+ "provider-doc",
96
+ "catalog",
97
+ "user-config",
98
+ "family-default",
99
+ "unknown",
100
+ ];
101
+ const EFFORT_DIALECT_DISABLE_FORMS = [
102
+ "effort-none",
103
+ "effort-minimal-floor",
104
+ "omit-control",
105
+ ];
106
+ function isRecord(value) {
107
+ return typeof value === "object" && value !== null && !Array.isArray(value);
108
+ }
109
+ function oneOf(value, allowed) {
110
+ return typeof value === "string" && allowed.includes(value)
111
+ ? value
112
+ : undefined;
113
+ }
114
+ function stringList(value, errors, field) {
115
+ if (!Array.isArray(value))
116
+ return undefined;
117
+ const list = [];
118
+ for (const entry of value) {
119
+ if (typeof entry !== "string" || !entry.trim()) {
120
+ errors.push(`${field} entries must be non-empty strings`);
121
+ return undefined;
122
+ }
123
+ list.push(entry.trim());
124
+ }
125
+ return list;
126
+ }
127
+ /**
128
+ * Local, actionable validation. Nothing here performs a network call; the goal
129
+ * is that an invalid declaration fails before any request is dispatched.
130
+ */
131
+ export function validateCustomProviderProfile(raw) {
132
+ const errors = [];
133
+ if (raw === undefined || raw === null)
134
+ return { errors };
135
+ if (!isRecord(raw)) {
136
+ return { errors: ["profile must be an object"] };
137
+ }
138
+ for (const key of Object.keys(raw)) {
139
+ if (!ALLOWED_KEYS.includes(key)) {
140
+ errors.push(`unknown profile field "${key}" (allowed: ${ALLOWED_KEYS.join(", ")})`);
141
+ }
142
+ }
143
+ const authType = oneOf(raw.authType, AUTH_TYPES);
144
+ if (raw.authType !== undefined && authType === undefined) {
145
+ errors.push(`authType must be one of ${AUTH_TYPES.join(", ")} (query auth is not supported yet)`);
146
+ }
147
+ const keyEnv = typeof raw.keyEnv === "string" && raw.keyEnv.trim()
148
+ ? raw.keyEnv.trim()
149
+ : undefined;
150
+ if (raw.keyEnv !== undefined && keyEnv === undefined) {
151
+ errors.push("keyEnv must be a non-empty string");
152
+ }
153
+ const baseUrlEnv = typeof raw.baseUrlEnv === "string" && raw.baseUrlEnv.trim()
154
+ ? raw.baseUrlEnv.trim()
155
+ : undefined;
156
+ if (raw.baseUrlEnv !== undefined && baseUrlEnv === undefined) {
157
+ errors.push("baseUrlEnv must be a non-empty string");
158
+ }
159
+ if (authType === "none-keyless" && keyEnv !== undefined) {
160
+ errors.push("keyEnv cannot be combined with authType none-keyless");
161
+ }
162
+ let headers;
163
+ if (raw.headers !== undefined) {
164
+ if (!isRecord(raw.headers)) {
165
+ errors.push("headers must be an object");
166
+ }
167
+ else {
168
+ headers = {};
169
+ for (const [name, value] of Object.entries(raw.headers)) {
170
+ if (typeof value !== "string" || !name.trim()) {
171
+ errors.push("header names and values must be non-empty strings");
172
+ break;
173
+ }
174
+ headers[name.trim()] = value;
175
+ }
176
+ }
177
+ }
178
+ if (authType === "custom-headers" && !headers) {
179
+ errors.push("authType custom-headers requires a headers object");
180
+ }
181
+ for (const field of ["tools", "images", "structuredOutput", "streamOptions"]) {
182
+ const value = raw[field];
183
+ if (value === undefined)
184
+ continue;
185
+ if (oneOf(value, TRI_STATES) === undefined) {
186
+ errors.push(`${field} must be supported | unsupported | unknown, not ${JSON.stringify(value)}`);
187
+ }
188
+ }
189
+ let reasoning;
190
+ if (raw.reasoning !== undefined) {
191
+ if (!isRecord(raw.reasoning)) {
192
+ errors.push("reasoning must be an object");
193
+ }
194
+ else {
195
+ const r = raw.reasoning;
196
+ for (const key of Object.keys(r)) {
197
+ if (!ALLOWED_REASONING_KEYS.includes(key)) {
198
+ errors.push(`unknown reasoning field "${key}" (allowed: ${ALLOWED_REASONING_KEYS.join(", ")})`);
199
+ }
200
+ }
201
+ const generation = oneOf(r.generation, GENERATIONS);
202
+ if (r.generation !== undefined && generation === undefined) {
203
+ errors.push(`reasoning.generation must be one of ${GENERATIONS.join(", ")}`);
204
+ }
205
+ const controlDialect = oneOf(r.controlDialect, [
206
+ "openai-effort",
207
+ "none",
208
+ ]);
209
+ if (r.controlDialect !== undefined &&
210
+ controlDialect === undefined) {
211
+ errors.push("reasoning.controlDialect must be openai-effort or none (other dialects are not serializable on custom routes yet)");
212
+ }
213
+ const disable = oneOf(r.disable, TRI_STATES);
214
+ if (r.disable !== undefined && disable === undefined) {
215
+ errors.push("reasoning.disable must be supported | unsupported | unknown");
216
+ }
217
+ const disableForm = oneOf(r.disableForm, EFFORT_DIALECT_DISABLE_FORMS);
218
+ if (r.disableForm !== undefined && disableForm === undefined) {
219
+ errors.push(`reasoning.disableForm must be one of ${EFFORT_DIALECT_DISABLE_FORMS.join(", ")} for effort dialects`);
220
+ }
221
+ if (disable === "supported" && !disableForm) {
222
+ errors.push("reasoning.disable supported requires a disableForm");
223
+ }
224
+ if (generation === "mandatory" && disable === "supported") {
225
+ errors.push("mandatory reasoning cannot declare disable supported; use disable unsupported");
226
+ }
227
+ const outputShapes = stringList(r.outputShapes, errors, "reasoning.outputShapes");
228
+ if (outputShapes) {
229
+ for (const shape of outputShapes) {
230
+ if (!OUTPUT_SHAPES.includes(shape)) {
231
+ errors.push(`reasoning.outputShapes contains unknown shape "${shape}"`);
232
+ }
233
+ }
234
+ }
235
+ const validatedOutputShapes = outputShapes;
236
+ const acceptedEfforts = stringList(r.acceptedEfforts, errors, "reasoning.acceptedEfforts");
237
+ if (acceptedEfforts) {
238
+ for (const effort of acceptedEfforts) {
239
+ if (effort !== effort.toLowerCase()) {
240
+ errors.push("reasoning.acceptedEfforts must be lowercase");
241
+ }
242
+ }
243
+ }
244
+ const replayScope = oneOf(r.replayScope, REPLAY_SCOPES);
245
+ if (r.replayScope !== undefined && replayScope === undefined) {
246
+ errors.push(`reasoning.replayScope must be one of ${REPLAY_SCOPES.join(", ")}`);
247
+ }
248
+ const finalTurnPreservation = oneOf(r.finalTurnPreservation, PRESERVATIONS);
249
+ if (r.finalTurnPreservation !== undefined &&
250
+ finalTurnPreservation === undefined) {
251
+ errors.push(`reasoning.finalTurnPreservation must be one of ${PRESERVATIONS.join(", ")}`);
252
+ }
253
+ reasoning = {
254
+ ...(generation !== undefined ? { generation } : {}),
255
+ ...(controlDialect !== undefined ? { controlDialect } : {}),
256
+ ...(acceptedEfforts !== undefined ? { acceptedEfforts } : {}),
257
+ ...(disable !== undefined ? { disable } : {}),
258
+ ...(disableForm !== undefined ? { disableForm } : {}),
259
+ ...(validatedOutputShapes !== undefined
260
+ ? { outputShapes: validatedOutputShapes }
261
+ : {}),
262
+ ...(replayScope !== undefined ? { replayScope } : {}),
263
+ ...(finalTurnPreservation !== undefined
264
+ ? { finalTurnPreservation }
265
+ : {}),
266
+ };
267
+ }
268
+ }
269
+ let limits;
270
+ if (raw.limits !== undefined) {
271
+ if (!isRecord(raw.limits)) {
272
+ errors.push("limits must be an object");
273
+ }
274
+ else {
275
+ for (const key of Object.keys(raw.limits)) {
276
+ if (!ALLOWED_LIMIT_KEYS.includes(key)) {
277
+ errors.push(`unknown limits field "${key}" (allowed: ${ALLOWED_LIMIT_KEYS.join(", ")})`);
278
+ }
279
+ }
280
+ const { contextTokens, outputTokens } = raw.limits;
281
+ if (contextTokens !== undefined &&
282
+ (typeof contextTokens !== "number" ||
283
+ !Number.isInteger(contextTokens) ||
284
+ contextTokens <= 0)) {
285
+ errors.push("limits.contextTokens must be a positive integer");
286
+ }
287
+ if (outputTokens !== undefined &&
288
+ (typeof outputTokens !== "number" ||
289
+ !Number.isInteger(outputTokens) ||
290
+ outputTokens <= 0)) {
291
+ errors.push("limits.outputTokens must be a positive integer");
292
+ }
293
+ const source = oneOf(raw.limits.source, LIMIT_SOURCES);
294
+ if (raw.limits.source !== undefined && source === undefined) {
295
+ errors.push(`limits.source must be one of ${LIMIT_SOURCES.join(", ")}`);
296
+ }
297
+ limits = {
298
+ ...(typeof contextTokens === "number" ? { contextTokens } : {}),
299
+ ...(typeof outputTokens === "number" ? { outputTokens } : {}),
300
+ ...(source !== undefined ? { source } : {}),
301
+ };
302
+ }
303
+ }
304
+ let cache;
305
+ if (raw.cache !== undefined) {
306
+ if (!isRecord(raw.cache)) {
307
+ errors.push("cache must be an object");
308
+ }
309
+ else {
310
+ for (const key of Object.keys(raw.cache)) {
311
+ if (!ALLOWED_CACHE_KEYS.includes(key)) {
312
+ errors.push(`unknown cache field "${key}" (allowed: ${ALLOWED_CACHE_KEYS.join(", ")})`);
313
+ }
314
+ }
315
+ const kind = oneOf(raw.cache.kind, CACHE_KINDS);
316
+ if (raw.cache.kind !== undefined && kind === undefined) {
317
+ errors.push(`cache.kind must be one of ${CACHE_KINDS.join(", ")}`);
318
+ }
319
+ const cacheAffectingFields = stringList(raw.cache.cacheAffectingFields, errors, "cache.cacheAffectingFields");
320
+ cache = {
321
+ ...(kind !== undefined ? { kind } : {}),
322
+ ...(typeof raw.cache.affinityField === "string" && raw.cache.affinityField
323
+ ? { affinityField: raw.cache.affinityField }
324
+ : {}),
325
+ ...(typeof raw.cache.isolationField === "string" &&
326
+ raw.cache.isolationField
327
+ ? { isolationField: raw.cache.isolationField }
328
+ : {}),
329
+ ...(cacheAffectingFields !== undefined ? { cacheAffectingFields } : {}),
330
+ };
331
+ }
332
+ }
333
+ let usage;
334
+ if (raw.usage !== undefined) {
335
+ if (!isRecord(raw.usage)) {
336
+ errors.push("usage must be an object");
337
+ }
338
+ else {
339
+ for (const key of Object.keys(raw.usage)) {
340
+ if (!ALLOWED_USAGE_KEYS.includes(key)) {
341
+ errors.push(`unknown usage field "${key}" (allowed: ${ALLOWED_USAGE_KEYS.join(", ")})`);
342
+ }
343
+ }
344
+ usage = {
345
+ ...(stringList(raw.usage.cachedInput, errors, "usage.cachedInput")
346
+ ? {
347
+ cachedInput: stringList(raw.usage.cachedInput, errors, "usage.cachedInput"),
348
+ }
349
+ : {}),
350
+ ...(stringList(raw.usage.uncachedInput, errors, "usage.uncachedInput")
351
+ ? {
352
+ uncachedInput: stringList(raw.usage.uncachedInput, errors, "usage.uncachedInput"),
353
+ }
354
+ : {}),
355
+ ...(stringList(raw.usage.cacheWrite, errors, "usage.cacheWrite")
356
+ ? {
357
+ cacheWrite: stringList(raw.usage.cacheWrite, errors, "usage.cacheWrite"),
358
+ }
359
+ : {}),
360
+ ...(stringList(raw.usage.reasoningOutput, errors, "usage.reasoningOutput")
361
+ ? {
362
+ reasoningOutput: stringList(raw.usage.reasoningOutput, errors, "usage.reasoningOutput"),
363
+ }
364
+ : {}),
365
+ };
366
+ }
367
+ }
368
+ let terminal;
369
+ if (raw.terminal !== undefined) {
370
+ if (!isRecord(raw.terminal)) {
371
+ errors.push("terminal must be an object");
372
+ }
373
+ else {
374
+ for (const key of Object.keys(raw.terminal)) {
375
+ if (!ALLOWED_TERMINAL_KEYS.includes(key)) {
376
+ errors.push(`unknown terminal field "${key}" (allowed: ${ALLOWED_TERMINAL_KEYS.join(", ")})`);
377
+ }
378
+ }
379
+ if (typeof raw.terminal.naturalEofAccepted !== "boolean") {
380
+ errors.push("terminal.naturalEofAccepted must be a boolean");
381
+ }
382
+ else {
383
+ terminal = { naturalEofAccepted: raw.terminal.naturalEofAccepted };
384
+ }
385
+ }
386
+ }
387
+ if (errors.length > 0)
388
+ return { errors };
389
+ return {
390
+ spec: {
391
+ ...(authType !== undefined ? { authType } : {}),
392
+ ...(keyEnv !== undefined ? { keyEnv } : {}),
393
+ ...(baseUrlEnv !== undefined ? { baseUrlEnv } : {}),
394
+ ...(headers !== undefined ? { headers } : {}),
395
+ ...(oneOf(raw.tools, TRI_STATES) !== undefined
396
+ ? { tools: oneOf(raw.tools, TRI_STATES) }
397
+ : {}),
398
+ ...(oneOf(raw.images, TRI_STATES) !== undefined
399
+ ? { images: oneOf(raw.images, TRI_STATES) }
400
+ : {}),
401
+ ...(oneOf(raw.structuredOutput, TRI_STATES) !== undefined
402
+ ? { structuredOutput: oneOf(raw.structuredOutput, TRI_STATES) }
403
+ : {}),
404
+ ...(oneOf(raw.streamOptions, TRI_STATES) !== undefined
405
+ ? { streamOptions: oneOf(raw.streamOptions, TRI_STATES) }
406
+ : {}),
407
+ ...(reasoning !== undefined ? { reasoning } : {}),
408
+ ...(limits !== undefined ? { limits } : {}),
409
+ ...(cache !== undefined ? { cache } : {}),
410
+ ...(usage !== undefined ? { usage } : {}),
411
+ ...(terminal !== undefined ? { terminal } : {}),
412
+ },
413
+ errors,
414
+ };
415
+ }
416
+ /** Maps a validated spec onto the user-config evidence layer. */
417
+ export function customProfileLayer(spec) {
418
+ if (!spec)
419
+ return undefined;
420
+ const r = spec.reasoning;
421
+ return {
422
+ evidence: USER_EVIDENCE,
423
+ transport: {
424
+ authType: spec.authType ?? "bearer",
425
+ ...(spec.keyEnv ? { keyEnv: spec.keyEnv } : {}),
426
+ ...(spec.baseUrlEnv ? { baseUrlEnv: spec.baseUrlEnv } : {}),
427
+ ...(spec.headers ? { headers: spec.headers } : {}),
428
+ systemPolicy: "single-leading",
429
+ },
430
+ capabilities: {
431
+ ...(spec.tools ? { tools: spec.tools } : {}),
432
+ ...(spec.images ? { images: spec.images } : {}),
433
+ ...(spec.structuredOutput
434
+ ? { structuredOutput: spec.structuredOutput }
435
+ : {}),
436
+ ...(spec.streamOptions ? { streamOptions: spec.streamOptions } : {}),
437
+ },
438
+ reasoning: r
439
+ ? {
440
+ ...(r.generation ? { generation: r.generation } : {}),
441
+ ...(r.controlDialect
442
+ ? {
443
+ control: {
444
+ dialect: r.controlDialect,
445
+ status: r.controlDialect === "none" ? "unsupported" : "supported",
446
+ evidence: USER_EVIDENCE,
447
+ },
448
+ }
449
+ : {}),
450
+ ...(r.acceptedEfforts ? { acceptedEfforts: r.acceptedEfforts } : {}),
451
+ ...(r.disable ? { disable: r.disable } : {}),
452
+ ...(r.disableForm ? { disableForm: r.disableForm } : {}),
453
+ ...(r.outputShapes ? { outputShapes: r.outputShapes } : {}),
454
+ ...(r.replayScope ? { replayScope: r.replayScope } : {}),
455
+ ...(r.finalTurnPreservation
456
+ ? { finalTurnPreservation: r.finalTurnPreservation }
457
+ : {}),
458
+ }
459
+ : undefined,
460
+ limits: spec.limits
461
+ ? {
462
+ ...(spec.limits.contextTokens !== undefined
463
+ ? { contextTokens: spec.limits.contextTokens }
464
+ : {}),
465
+ ...(spec.limits.outputTokens !== undefined
466
+ ? { outputTokens: spec.limits.outputTokens }
467
+ : {}),
468
+ source: spec.limits.source ?? "user-config",
469
+ }
470
+ : undefined,
471
+ cache: spec.cache
472
+ ? {
473
+ kind: spec.cache.kind ?? "unknown",
474
+ ...(spec.cache.affinityField
475
+ ? { affinityField: spec.cache.affinityField }
476
+ : {}),
477
+ ...(spec.cache.isolationField
478
+ ? { isolationField: spec.cache.isolationField }
479
+ : {}),
480
+ ...(spec.cache.cacheAffectingFields
481
+ ? { cacheAffectingFields: spec.cache.cacheAffectingFields }
482
+ : []),
483
+ }
484
+ : undefined,
485
+ usage: spec.usage,
486
+ terminal: spec.terminal
487
+ ? {
488
+ proofs: ["done-sentinel", "finish-reason"],
489
+ naturalEofAccepted: spec.terminal.naturalEofAccepted ?? false,
490
+ }
491
+ : undefined,
492
+ };
493
+ }
494
+ export function endpointPrivacyHash(baseUrl) {
495
+ return `sha256:${createHash("sha256")
496
+ .update(baseUrl.replace(/\/$/, ""))
497
+ .digest("hex")}`;
498
+ }
499
+ function isDirectDeepSeekRoute(baseUrl, model) {
500
+ let host = "";
501
+ try {
502
+ host = new URL(baseUrl).hostname.toLowerCase();
503
+ }
504
+ catch {
505
+ return false;
506
+ }
507
+ return ((host === "api.deepseek.com" || host.endsWith(".deepseek.com")) &&
508
+ /deepseek-v\d/i.test(model));
509
+ }
510
+ /**
511
+ * Conservative unknown unless declared; a custom endpoint that verifiably is
512
+ * the direct DeepSeek API earns the documented V4 builtin layer as route
513
+ * evidence below user declarations.
514
+ */
515
+ export function resolveCustomProviderProfile(input) {
516
+ const layers = {};
517
+ const userLayer = customProfileLayer(input.profile);
518
+ if (userLayer)
519
+ layers.userConfig = userLayer;
520
+ if (isDirectDeepSeekRoute(input.baseUrl, input.model)) {
521
+ layers.builtin = directDeepSeekV4Layer();
522
+ }
523
+ return resolveProviderProfile({
524
+ provider: input.id,
525
+ model: input.model,
526
+ wireApi: "chat-completions",
527
+ endpointHash: endpointPrivacyHash(input.baseUrl),
528
+ layers,
529
+ });
530
+ }
531
+ /**
532
+ * Serializer style for the compatible path. Undeclared routes omit optional
533
+ * reasoning controls entirely (send narrowly, parse broadly).
534
+ */
535
+ export function customReasoningStyle(profile) {
536
+ const dialect = profile?.reasoning?.controlDialect;
537
+ return dialect === "openai-effort" ? "openai" : "none";
538
+ }
539
+ /** Resolves `${ENV_NAME}` header references before dispatch; throws locally. */
540
+ export function resolveCustomHeaders(headers) {
541
+ if (!headers)
542
+ return undefined;
543
+ const resolved = {};
544
+ for (const [name, value] of Object.entries(headers)) {
545
+ const match = /^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(value.trim());
546
+ if (!match) {
547
+ resolved[name] = value;
548
+ continue;
549
+ }
550
+ const envValue = process.env[match[1]]?.trim();
551
+ if (!envValue) {
552
+ throw new Error(`custom provider header ${name} references unset environment variable ${match[1]}`);
553
+ }
554
+ resolved[name] = envValue;
555
+ }
556
+ return resolved;
557
+ }
558
+ //# sourceMappingURL=custom-provider-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-provider-profile.js","sourceRoot":"","sources":["../../src/llm/custom-provider-profile.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@
7
7
  * are plain strings. This module is the single source of truth for those.
8
8
  */
9
9
  import { type LlmProvider } from "./provider.js";
10
+ import type { CompatibleUsageAliases } from "./token-usage.js";
11
+ import { type CustomProviderProfileSpec } from "./custom-provider-profile.js";
10
12
  /** Persisted shape of one user-defined provider (JSON-serialisable). */
11
13
  export interface CustomProviderDef {
12
14
  readonly id: string;
@@ -14,15 +16,25 @@ export interface CustomProviderDef {
14
16
  /** Normalised base URL ending in `/v1`. */
15
17
  readonly baseUrl: string;
16
18
  readonly envVar?: string | undefined;
19
+ /** Separate API-key environment; takes precedence over `envVar`. */
20
+ readonly keyEnv?: string | undefined;
21
+ /** Separate endpoint environment; `envVar` never doubles as one. */
22
+ readonly baseUrlEnv?: string | undefined;
17
23
  readonly defaultModel: string;
24
+ /** Optional telemetry-only aliases relative to a compatible `usage` object. */
25
+ readonly usageAliases?: CompatibleUsageAliases | undefined;
26
+ /** Optional validated wire-profile declaration. */
27
+ readonly profile?: CustomProviderProfileSpec | undefined;
18
28
  }
29
+ /** Validation errors for a definition's declared profile, if any. */
30
+ export declare function customProviderProfileErrors(def: CustomProviderDef): string[];
19
31
  /** Build an OpenAI-compatible `LlmProvider` for a custom definition. */
20
32
  export declare function buildCustomProvider(def: CustomProviderDef): LlmProvider;
21
33
  /** All custom provider ids currently registered in config. */
22
34
  export declare function getCustomProviderIds(): Promise<string[]>;
23
35
  /** Resolve a custom definition by id (sync, against a provided defs list). */
24
36
  export declare function findCustomProviderDef(id: string, defs: readonly CustomProviderDef[]): CustomProviderDef | undefined;
25
- /** Resolve the `LlmProvider` for a custom provider id. */
37
+ /** Resolve a custom definition by id. */
26
38
  export declare function getCustomProvider(id: string): Promise<LlmProvider | undefined>;
27
39
  export declare function getCustomProviderSync(id: string): LlmProvider | undefined;
28
40
  /** Invalidate the in-memory provider cache for one id (or all when omitted). */