zidane 5.13.26 → 5.14.1

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 (164) hide show
  1. package/dist/{acp-CjAoILwj.js → acp-24uU2WDs.js} +7 -7
  2. package/dist/{acp-CjAoILwj.js.map → acp-24uU2WDs.js.map} +1 -1
  3. package/dist/acp-cli.js +12 -7
  4. package/dist/acp-cli.js.map +1 -1
  5. package/dist/acp.d.ts +3 -3
  6. package/dist/acp.js +1 -1
  7. package/dist/{tools-B32lZXLE.js → agent-Cch2ayTt.js} +8036 -9460
  8. package/dist/agent-Cch2ayTt.js.map +1 -0
  9. package/dist/{agent-DQIL5BFk.d.ts → agent-EFWt6uQ_.d.ts} +368 -209
  10. package/dist/agent-EFWt6uQ_.d.ts.map +1 -0
  11. package/dist/agent.d.ts +3 -0
  12. package/dist/agent.js +5 -0
  13. package/dist/anthropic-RGqsJlC8.js +807 -0
  14. package/dist/anthropic-RGqsJlC8.js.map +1 -0
  15. package/dist/{atomic-write-Bgtr5JPu.js → atomic-write-B7zr1ddF.js} +2 -2
  16. package/dist/{atomic-write-Bgtr5JPu.js.map → atomic-write-B7zr1ddF.js.map} +1 -1
  17. package/dist/{auth-DPrSP1YV.js → auth-C-ms5N2x.js} +33 -5
  18. package/dist/{auth-DPrSP1YV.js.map → auth-C-ms5N2x.js.map} +1 -1
  19. package/dist/cache-telemetry-BKAwsNxm.js +169 -0
  20. package/dist/cache-telemetry-BKAwsNxm.js.map +1 -0
  21. package/dist/chat/pure.d.ts +3 -3
  22. package/dist/chat/pure.js +1 -1
  23. package/dist/chat.d.ts +22 -8
  24. package/dist/chat.d.ts.map +1 -1
  25. package/dist/chat.js +30 -5
  26. package/dist/chat.js.map +1 -1
  27. package/dist/contexts/daytona.d.ts +3 -3
  28. package/dist/contexts/docker.d.ts +1 -1
  29. package/dist/contexts/docker.js +0 -1
  30. package/dist/contexts/docker.js.map +1 -1
  31. package/dist/contexts/e2b.d.ts +2 -2
  32. package/dist/contexts/sandbox.d.ts +1 -1
  33. package/dist/{contexts-BebciJyQ.js → contexts-Lzf5huID.js} +5 -3
  34. package/dist/contexts-Lzf5huID.js.map +1 -0
  35. package/dist/contexts.d.ts +3 -3
  36. package/dist/contexts.js +1 -1
  37. package/dist/errors-CkTvg97v.d.ts +203 -0
  38. package/dist/errors-CkTvg97v.d.ts.map +1 -0
  39. package/dist/errors.d.ts +3 -0
  40. package/dist/errors.js +3 -0
  41. package/dist/eval.d.ts +1 -1
  42. package/dist/eval.js +3 -3
  43. package/dist/glob-DluQFSw1.js +270 -0
  44. package/dist/glob-DluQFSw1.js.map +1 -0
  45. package/dist/headless.d.ts +1 -1
  46. package/dist/headless.js +406 -1
  47. package/dist/headless.js.map +1 -0
  48. package/dist/{index-HQJDOWvo.d.ts → index-B3ciFUZx.d.ts} +2 -2
  49. package/dist/index-B3ciFUZx.d.ts.map +1 -0
  50. package/dist/{index-YY3vp2F2.d.ts → index-BtzE3Uaq.d.ts} +89 -419
  51. package/dist/index-BtzE3Uaq.d.ts.map +1 -0
  52. package/dist/{index-C5qw3pj7.d.ts → index-tSzOaWNt.d.ts} +3 -3
  53. package/dist/{index-C5qw3pj7.d.ts.map → index-tSzOaWNt.d.ts.map} +1 -1
  54. package/dist/index.d.ts +12 -8
  55. package/dist/index.js +114 -168
  56. package/dist/index.js.map +1 -1
  57. package/dist/{logger-C2ngE8CY.d.ts → logger-DGiGf7DW.d.ts} +2 -2
  58. package/dist/{logger-C2ngE8CY.d.ts.map → logger-DGiGf7DW.d.ts.map} +1 -1
  59. package/dist/mcp.d.ts +1 -1
  60. package/dist/messages-YZQLKaz2.js +1157 -0
  61. package/dist/messages-YZQLKaz2.js.map +1 -0
  62. package/dist/oauth-8LqbeI_Q.js +292 -0
  63. package/dist/oauth-8LqbeI_Q.js.map +1 -0
  64. package/dist/{messages-Iy_vEycX.js → openai-compat-0Y7jcncn.js} +27 -1379
  65. package/dist/openai-compat-0Y7jcncn.js.map +1 -0
  66. package/dist/output/stream-json.d.ts +2 -2
  67. package/dist/output/stream-json.js +1 -1
  68. package/dist/output/terminal.d.ts +2 -2
  69. package/dist/{presets-B9nDwmaz.js → presets-BQWYMHdd.js} +3 -2
  70. package/dist/{presets-B9nDwmaz.js.map → presets-BQWYMHdd.js.map} +1 -1
  71. package/dist/presets.d.ts +2 -2
  72. package/dist/presets.js +1 -1
  73. package/dist/prompt.d.ts +2 -0
  74. package/dist/prompt.js +210 -0
  75. package/dist/prompt.js.map +1 -0
  76. package/dist/providers/anthropic.d.ts +2 -0
  77. package/dist/providers/anthropic.js +2 -0
  78. package/dist/providers/arcee.d.ts +2 -0
  79. package/dist/providers/arcee.js +42 -0
  80. package/dist/providers/arcee.js.map +1 -0
  81. package/dist/providers/baseten.d.ts +2 -0
  82. package/dist/providers/baseten.js +66 -0
  83. package/dist/providers/baseten.js.map +1 -0
  84. package/dist/providers/cerebras.d.ts +2 -0
  85. package/dist/providers/cerebras.js +31 -0
  86. package/dist/providers/cerebras.js.map +1 -0
  87. package/dist/providers/local.d.ts +2 -0
  88. package/dist/providers/local.js +44 -0
  89. package/dist/providers/local.js.map +1 -0
  90. package/dist/providers/openai-compat.d.ts +2 -0
  91. package/dist/providers/openai-compat.js +2 -0
  92. package/dist/providers/openai.d.ts +2 -0
  93. package/dist/providers/openai.js +504 -0
  94. package/dist/providers/openai.js.map +1 -0
  95. package/dist/providers/openrouter.d.ts +2 -0
  96. package/dist/providers/openrouter.js +52 -0
  97. package/dist/providers/openrouter.js.map +1 -0
  98. package/dist/providers/xai.d.ts +2 -0
  99. package/dist/providers/xai.js +2 -0
  100. package/dist/providers-DgmdYGKm.js +168 -0
  101. package/dist/providers-DgmdYGKm.js.map +1 -0
  102. package/dist/providers.d.ts +1 -1
  103. package/dist/providers.js +10 -2
  104. package/dist/restate.d.ts +2 -2
  105. package/dist/run-summary-DkN8KsHM.d.ts +249 -0
  106. package/dist/run-summary-DkN8KsHM.d.ts.map +1 -0
  107. package/dist/run-summary-nD3IQ4ZQ.js +253 -0
  108. package/dist/run-summary-nD3IQ4ZQ.js.map +1 -0
  109. package/dist/{sandbox-B-bMq3K6.d.ts → sandbox-Dgy-m6UF.d.ts} +2 -2
  110. package/dist/{sandbox-B-bMq3K6.d.ts.map → sandbox-Dgy-m6UF.d.ts.map} +1 -1
  111. package/dist/session/sqlite.d.ts +1 -1
  112. package/dist/{session-CiA1_8SB.js → session-CqrAFAKJ.js} +2 -2
  113. package/dist/{session-CiA1_8SB.js.map → session-CqrAFAKJ.js.map} +1 -1
  114. package/dist/session.d.ts +1 -1
  115. package/dist/session.js +2 -2
  116. package/dist/skills.d.ts +2 -2
  117. package/dist/system-prompt-BlsdjcUi.d.ts +139 -0
  118. package/dist/system-prompt-BlsdjcUi.d.ts.map +1 -0
  119. package/dist/timeout-CpFm0jJ6.d.ts +10 -0
  120. package/dist/timeout-CpFm0jJ6.d.ts.map +1 -0
  121. package/dist/timeout-kGGSXagK.js +84 -0
  122. package/dist/timeout-kGGSXagK.js.map +1 -0
  123. package/dist/{tool-formatters-w5oaoCS4.d.ts → tool-formatters-C6iLgc9f.d.ts} +2 -2
  124. package/dist/{tool-formatters-w5oaoCS4.d.ts.map → tool-formatters-C6iLgc9f.d.ts.map} +1 -1
  125. package/dist/tools/fetch-url.d.ts +1 -1
  126. package/dist/tools/web-search.d.ts +1 -1
  127. package/dist/tools-CCd8e-HT.js +1739 -0
  128. package/dist/tools-CCd8e-HT.js.map +1 -0
  129. package/dist/tools.d.ts +2 -2
  130. package/dist/tools.js +2 -1
  131. package/dist/{transcript-anchors-BJ-ESWnm.d.ts → transcript-anchors-CjKRKZVx.d.ts} +4 -4
  132. package/dist/{transcript-anchors-BJ-ESWnm.d.ts.map → transcript-anchors-CjKRKZVx.d.ts.map} +1 -1
  133. package/dist/{transcript-anchors-BUtOd-qa.js → transcript-anchors-HyCGJhsK.js} +11 -10
  134. package/dist/{transcript-anchors-BUtOd-qa.js.map → transcript-anchors-HyCGJhsK.js.map} +1 -1
  135. package/dist/tui.d.ts +3 -3
  136. package/dist/tui.js +40 -15
  137. package/dist/tui.js.map +1 -1
  138. package/dist/{turn-operations-BSSQHNq1.d.ts → turn-operations-Dw02ZoSQ.d.ts} +3 -3
  139. package/dist/{turn-operations-BSSQHNq1.d.ts.map → turn-operations-Dw02ZoSQ.d.ts.map} +1 -1
  140. package/dist/{turn-operations-B_XeuNp-.js → turn-operations-tG0vuBNc.js} +2 -2
  141. package/dist/{turn-operations-B_XeuNp-.js.map → turn-operations-tG0vuBNc.js.map} +1 -1
  142. package/dist/{types-Bs2oY7Ux.d.ts → types-BqdTeBaC.d.ts} +9 -1
  143. package/dist/types-BqdTeBaC.d.ts.map +1 -0
  144. package/dist/types-CyVGdbia.js.map +1 -1
  145. package/dist/types.d.ts +6 -5
  146. package/dist/xai-tPdbAGkq.js +379 -0
  147. package/dist/xai-tPdbAGkq.js.map +1 -0
  148. package/docs/ARCHITECTURE.md +6 -3
  149. package/docs/CHAT.md +4 -0
  150. package/docs/SKILL.md +33 -7
  151. package/package.json +63 -1
  152. package/dist/agent-DQIL5BFk.d.ts.map +0 -1
  153. package/dist/contexts-BebciJyQ.js.map +0 -1
  154. package/dist/glob-D56-KpBp.js +0 -118
  155. package/dist/glob-D56-KpBp.js.map +0 -1
  156. package/dist/headless-2SH7dvoW.js +0 -656
  157. package/dist/headless-2SH7dvoW.js.map +0 -1
  158. package/dist/index-HQJDOWvo.d.ts.map +0 -1
  159. package/dist/index-YY3vp2F2.d.ts.map +0 -1
  160. package/dist/messages-Iy_vEycX.js.map +0 -1
  161. package/dist/providers-BMw1D_lj.js +0 -2332
  162. package/dist/providers-BMw1D_lj.js.map +0 -1
  163. package/dist/tools-B32lZXLE.js.map +0 -1
  164. package/dist/types-Bs2oY7Ux.d.ts.map +0 -1
package/dist/prompt.js ADDED
@@ -0,0 +1,210 @@
1
+ //#region src/system-prompt.ts
2
+ /**
3
+ * System-prompt boundary marker — splits a system prompt into a stable static
4
+ * prefix (cached) and a per-turn dynamic suffix (NOT cached).
5
+ *
6
+ * Why this exists: providers attach `cache_control` markers on the last block
7
+ * of the system prompt, so the cached prefix covers the entire system text.
8
+ * Any byte change anywhere — including a per-turn `<env>` rewrite — busts the
9
+ * cache for the doctrine that sits below. A literal marker in the system
10
+ * string lets providers split it into:
11
+ *
12
+ * ┌──────────────┐ cache_control: ephemeral
13
+ * │ STATIC half │ — doctrine, skills catalog, tool catalog,
14
+ * │ │ user instructions
15
+ * ├──────────────┤ ← SYSTEM_PROMPT_BOUNDARY
16
+ * │ DYNAMIC half │ — env, cwd, mtimes, anything per-turn
17
+ * └──────────────┘ (no cache_control)
18
+ *
19
+ * The static prefix rides the prompt cache across turns/sessions; the dynamic
20
+ * suffix re-bills per turn. Net effect: a cwd change between turns no longer
21
+ * invalidates 4 KB of doctrine.
22
+ *
23
+ * Wire contract:
24
+ *
25
+ * - `splitSystemPrompt(s)` is pure; missing marker ⇒ entire string is static
26
+ * (current behavior — no caller is forced to opt in).
27
+ * - `renderSystemForWire(s)` strips the marker so it never reaches the model;
28
+ * used by every provider before the bytes hit the wire, including the
29
+ * cache-disabled path on providers that DO support `cache_control`.
30
+ * - The marker uses underscores rather than XML/punctuation so it's
31
+ * unambiguous when scanning prompts manually and unlikely to collide with
32
+ * model-written content.
33
+ * - Providers handle the split internally (Anthropic emits a 2-block array;
34
+ * OpenAI-compat splits the leading `system` message into multi-part text).
35
+ * Callers always pass a single `string` — no API break.
36
+ */
37
+ /**
38
+ * Literal marker inserted in a system prompt to separate cacheable doctrine
39
+ * from per-turn dynamic content. Providers split on this token.
40
+ *
41
+ * Underscored on both sides for visual distinctiveness — a stray instance in
42
+ * model-written prose is implausible. Don't change the value without shipping
43
+ * a migration; existing sessions carry the old marker in their cached
44
+ * prompts.
45
+ */
46
+ const SYSTEM_PROMPT_BOUNDARY = "__ZIDANE_SYSTEM_PROMPT_BOUNDARY__";
47
+ /**
48
+ * Split a system prompt around the first {@link SYSTEM_PROMPT_BOUNDARY}.
49
+ *
50
+ * Splits on the FIRST occurrence — subsequent markers are folded into the
51
+ * dynamic half. This way callers can append additional `<env>` style blocks
52
+ * with extra markers without each one creating a new cache layer (Anthropic
53
+ * caps breakpoints; we use the budget elsewhere). The marker itself is
54
+ * stripped from both sides — providers attach `cache_control` directly to
55
+ * the static half's text content.
56
+ *
57
+ * A single blank line (`\n\n`) immediately adjacent to the marker on each
58
+ * side is trimmed — callers conventionally write
59
+ * `<doctrine>\n\n<MARKER>\n\n<env>` and expect the rendered wire bytes to
60
+ * read as one logical paragraph. Blank lines beyond that immediate pair
61
+ * (e.g. `\n\n\n<env>`) are preserved verbatim so callers composing their
62
+ * own spacing don't lose intentional gaps.
63
+ *
64
+ * Pure / no I/O / no allocation when the marker is absent (returns the input
65
+ * verbatim on the static side and the empty string on the dynamic side).
66
+ */
67
+ function splitSystemPrompt(system) {
68
+ if (system.length === 0) return {
69
+ static: "",
70
+ dynamic: ""
71
+ };
72
+ const idx = system.indexOf(SYSTEM_PROMPT_BOUNDARY);
73
+ if (idx < 0) return {
74
+ static: system,
75
+ dynamic: ""
76
+ };
77
+ const staticPart = system.slice(0, idx);
78
+ const dynamicPart = system.slice(idx + 33);
79
+ return {
80
+ static: trimTrailingBlankLine(staticPart),
81
+ dynamic: trimLeadingBlankLine(dynamicPart)
82
+ };
83
+ }
84
+ /**
85
+ * Compose a system prompt from a static prefix and an optional dynamic
86
+ * suffix. Inserts {@link SYSTEM_PROMPT_BOUNDARY} between them only when the
87
+ * dynamic side is non-empty — single-block prompts stay marker-free, so
88
+ * callers that never opt in pay zero overhead and providers fall back to the
89
+ * existing whole-string caching path.
90
+ *
91
+ * Spacing is `\n\n` on both sides of the marker so doctrine fragments,
92
+ * which conventionally separate sections with a blank line, read cleanly
93
+ * around the boundary.
94
+ */
95
+ function joinSystemPrompt(staticPart, dynamicPart) {
96
+ if (dynamicPart.length === 0) return staticPart;
97
+ if (staticPart.length === 0) return `${SYSTEM_PROMPT_BOUNDARY}\n\n${dynamicPart}`;
98
+ return `${staticPart}\n\n${SYSTEM_PROMPT_BOUNDARY}\n\n${dynamicPart}`;
99
+ }
100
+ /**
101
+ * Append `extra` to the STATIC half of a system prompt, preserving any
102
+ * existing dynamic suffix.
103
+ *
104
+ * Used by the agent to fold in run-stable content (skills catalog, lazy tool
105
+ * catalog) without bumping it into the dynamic half — both catalogs are
106
+ * built once per run and remain byte-stable for the duration, so they
107
+ * belong in the cached prefix.
108
+ *
109
+ * Returns a new string; the input is not mutated. When `extra` is empty,
110
+ * returns the input verbatim.
111
+ */
112
+ function appendStaticSection(system, extra) {
113
+ if (extra.length === 0) return system;
114
+ const { static: staticPart, dynamic } = splitSystemPrompt(system);
115
+ return joinSystemPrompt(staticPart.length === 0 ? extra : `${staticPart}\n\n${extra}`, dynamic);
116
+ }
117
+ /**
118
+ * Append `extra` to the DYNAMIC half of a system prompt. Inserts the boundary
119
+ * marker if the input didn't already carry one.
120
+ *
121
+ * Used by hosts (typically the TUI) to inject per-turn state — current cwd,
122
+ * IDE selection, project root — without forcing every caller to know the
123
+ * marker format. The host's `system:transform` hook rewrites the dynamic
124
+ * half each turn; the static doctrine above stays byte-stable and rides the
125
+ * cache.
126
+ *
127
+ * Returns a new string; the input is not mutated. When `extra` is empty,
128
+ * returns the input verbatim.
129
+ */
130
+ function appendDynamicSection(system, extra) {
131
+ if (extra.length === 0) return system;
132
+ const { static: staticPart, dynamic } = splitSystemPrompt(system);
133
+ return joinSystemPrompt(staticPart, dynamic.length === 0 ? extra : `${dynamic}\n\n${extra}`);
134
+ }
135
+ /**
136
+ * Replace the entire dynamic half of a system prompt with `next`. Used by
137
+ * the TUI's `<env>` rewriter where the entire dynamic section is regenerated
138
+ * each turn rather than appended to.
139
+ *
140
+ * When `next` is empty, drops the dynamic half (and the marker) entirely.
141
+ */
142
+ function replaceDynamicSection(system, next) {
143
+ const { static: staticPart } = splitSystemPrompt(system);
144
+ return joinSystemPrompt(staticPart, next);
145
+ }
146
+ /**
147
+ * Strip the boundary marker so it never reaches the wire — collapses
148
+ * `<static>${BOUNDARY}<dynamic>` into `<static>\n\n<dynamic>` for providers
149
+ * that can't honor `cache_control` (vanilla OpenAI Chat Completions, Codex,
150
+ * Cerebras, ...) or for the cache-disabled path on any provider.
151
+ *
152
+ * Cache-aware providers re-derive the split from the original (un-rendered)
153
+ * system string via `splitSystemPrompt` — `renderSystemForWire` is the
154
+ * marker-free counterpart used to build the actual wire bytes.
155
+ *
156
+ * No-op when the input has no marker. Pure / no I/O.
157
+ */
158
+ function renderSystemForWire(system) {
159
+ if (system.length === 0) return system;
160
+ const parts = splitSystemPrompt(system);
161
+ if (parts.dynamic.length === 0) return parts.static;
162
+ if (parts.static.length === 0) return parts.dynamic;
163
+ return `${parts.static}\n\n${parts.dynamic}`;
164
+ }
165
+ /** True when `system` contains the boundary marker. */
166
+ function hasSystemPromptBoundary(system) {
167
+ return system.includes(SYSTEM_PROMPT_BOUNDARY);
168
+ }
169
+ /** Strip a single trailing `\n\n` (and any leftover trailing whitespace within that pair). */
170
+ function trimTrailingBlankLine(s) {
171
+ let end = s.length;
172
+ let newlines = 0;
173
+ while (end > 0 && newlines < 2) {
174
+ const ch = s.charCodeAt(end - 1);
175
+ if (ch === 10) {
176
+ newlines += 1;
177
+ end -= 1;
178
+ continue;
179
+ }
180
+ if (ch === 32 || ch === 9) {
181
+ end -= 1;
182
+ continue;
183
+ }
184
+ break;
185
+ }
186
+ return newlines > 0 ? s.slice(0, end) : s;
187
+ }
188
+ /** Strip a single leading `\n\n` (and any leftover leading whitespace within that pair). */
189
+ function trimLeadingBlankLine(s) {
190
+ let start = 0;
191
+ let newlines = 0;
192
+ while (start < s.length && newlines < 2) {
193
+ const ch = s.charCodeAt(start);
194
+ if (ch === 10) {
195
+ newlines += 1;
196
+ start += 1;
197
+ continue;
198
+ }
199
+ if (ch === 32 || ch === 9) {
200
+ start += 1;
201
+ continue;
202
+ }
203
+ break;
204
+ }
205
+ return newlines > 0 ? s.slice(start) : s;
206
+ }
207
+ //#endregion
208
+ export { SYSTEM_PROMPT_BOUNDARY, appendDynamicSection, appendStaticSection, hasSystemPromptBoundary, joinSystemPrompt, renderSystemForWire, replaceDynamicSection, splitSystemPrompt };
209
+
210
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","names":[],"sources":["../src/system-prompt.ts"],"sourcesContent":["/**\n * System-prompt boundary marker — splits a system prompt into a stable static\n * prefix (cached) and a per-turn dynamic suffix (NOT cached).\n *\n * Why this exists: providers attach `cache_control` markers on the last block\n * of the system prompt, so the cached prefix covers the entire system text.\n * Any byte change anywhere — including a per-turn `<env>` rewrite — busts the\n * cache for the doctrine that sits below. A literal marker in the system\n * string lets providers split it into:\n *\n * ┌──────────────┐ cache_control: ephemeral\n * │ STATIC half │ — doctrine, skills catalog, tool catalog,\n * │ │ user instructions\n * ├──────────────┤ ← SYSTEM_PROMPT_BOUNDARY\n * │ DYNAMIC half │ — env, cwd, mtimes, anything per-turn\n * └──────────────┘ (no cache_control)\n *\n * The static prefix rides the prompt cache across turns/sessions; the dynamic\n * suffix re-bills per turn. Net effect: a cwd change between turns no longer\n * invalidates 4 KB of doctrine.\n *\n * Wire contract:\n *\n * - `splitSystemPrompt(s)` is pure; missing marker ⇒ entire string is static\n * (current behavior — no caller is forced to opt in).\n * - `renderSystemForWire(s)` strips the marker so it never reaches the model;\n * used by every provider before the bytes hit the wire, including the\n * cache-disabled path on providers that DO support `cache_control`.\n * - The marker uses underscores rather than XML/punctuation so it's\n * unambiguous when scanning prompts manually and unlikely to collide with\n * model-written content.\n * - Providers handle the split internally (Anthropic emits a 2-block array;\n * OpenAI-compat splits the leading `system` message into multi-part text).\n * Callers always pass a single `string` — no API break.\n */\n\n/**\n * Literal marker inserted in a system prompt to separate cacheable doctrine\n * from per-turn dynamic content. Providers split on this token.\n *\n * Underscored on both sides for visual distinctiveness — a stray instance in\n * model-written prose is implausible. Don't change the value without shipping\n * a migration; existing sessions carry the old marker in their cached\n * prompts.\n */\nexport const SYSTEM_PROMPT_BOUNDARY = '__ZIDANE_SYSTEM_PROMPT_BOUNDARY__'\n\n/** Result of {@link splitSystemPrompt} — both halves stripped of the marker. */\nexport interface SystemPromptParts {\n /** Bytes BEFORE the marker (or the entire string when no marker present). Cacheable. */\n static: string\n /** Bytes AFTER the marker. Empty when no marker present. NOT cached. */\n dynamic: string\n}\n\n/**\n * Split a system prompt around the first {@link SYSTEM_PROMPT_BOUNDARY}.\n *\n * Splits on the FIRST occurrence — subsequent markers are folded into the\n * dynamic half. This way callers can append additional `<env>` style blocks\n * with extra markers without each one creating a new cache layer (Anthropic\n * caps breakpoints; we use the budget elsewhere). The marker itself is\n * stripped from both sides — providers attach `cache_control` directly to\n * the static half's text content.\n *\n * A single blank line (`\\n\\n`) immediately adjacent to the marker on each\n * side is trimmed — callers conventionally write\n * `<doctrine>\\n\\n<MARKER>\\n\\n<env>` and expect the rendered wire bytes to\n * read as one logical paragraph. Blank lines beyond that immediate pair\n * (e.g. `\\n\\n\\n<env>`) are preserved verbatim so callers composing their\n * own spacing don't lose intentional gaps.\n *\n * Pure / no I/O / no allocation when the marker is absent (returns the input\n * verbatim on the static side and the empty string on the dynamic side).\n */\nexport function splitSystemPrompt(system: string): SystemPromptParts {\n if (system.length === 0)\n return { static: '', dynamic: '' }\n const idx = system.indexOf(SYSTEM_PROMPT_BOUNDARY)\n if (idx < 0)\n return { static: system, dynamic: '' }\n const staticPart = system.slice(0, idx)\n const dynamicPart = system.slice(idx + SYSTEM_PROMPT_BOUNDARY.length)\n // Strip a single immediately-adjacent newline pair on each side. Callers\n // typically write `<doctrine>\\n\\n<MARKER>\\n\\n<env>` and expect the rendered\n // wire bytes to read as one logical paragraph. The trim is bounded so\n // intentional blank lines further out (e.g. `\\n\\n\\n<env>`) are preserved\n // for callers that compose their own spacing.\n return {\n static: trimTrailingBlankLine(staticPart),\n dynamic: trimLeadingBlankLine(dynamicPart),\n }\n}\n\n/**\n * Compose a system prompt from a static prefix and an optional dynamic\n * suffix. Inserts {@link SYSTEM_PROMPT_BOUNDARY} between them only when the\n * dynamic side is non-empty — single-block prompts stay marker-free, so\n * callers that never opt in pay zero overhead and providers fall back to the\n * existing whole-string caching path.\n *\n * Spacing is `\\n\\n` on both sides of the marker so doctrine fragments,\n * which conventionally separate sections with a blank line, read cleanly\n * around the boundary.\n */\nexport function joinSystemPrompt(staticPart: string, dynamicPart: string): string {\n if (dynamicPart.length === 0)\n return staticPart\n if (staticPart.length === 0)\n return `${SYSTEM_PROMPT_BOUNDARY}\\n\\n${dynamicPart}`\n return `${staticPart}\\n\\n${SYSTEM_PROMPT_BOUNDARY}\\n\\n${dynamicPart}`\n}\n\n/**\n * Append `extra` to the STATIC half of a system prompt, preserving any\n * existing dynamic suffix.\n *\n * Used by the agent to fold in run-stable content (skills catalog, lazy tool\n * catalog) without bumping it into the dynamic half — both catalogs are\n * built once per run and remain byte-stable for the duration, so they\n * belong in the cached prefix.\n *\n * Returns a new string; the input is not mutated. When `extra` is empty,\n * returns the input verbatim.\n */\nexport function appendStaticSection(system: string, extra: string): string {\n if (extra.length === 0)\n return system\n const { static: staticPart, dynamic } = splitSystemPrompt(system)\n const nextStatic = staticPart.length === 0 ? extra : `${staticPart}\\n\\n${extra}`\n return joinSystemPrompt(nextStatic, dynamic)\n}\n\n/**\n * Append `extra` to the DYNAMIC half of a system prompt. Inserts the boundary\n * marker if the input didn't already carry one.\n *\n * Used by hosts (typically the TUI) to inject per-turn state — current cwd,\n * IDE selection, project root — without forcing every caller to know the\n * marker format. The host's `system:transform` hook rewrites the dynamic\n * half each turn; the static doctrine above stays byte-stable and rides the\n * cache.\n *\n * Returns a new string; the input is not mutated. When `extra` is empty,\n * returns the input verbatim.\n */\nexport function appendDynamicSection(system: string, extra: string): string {\n if (extra.length === 0)\n return system\n const { static: staticPart, dynamic } = splitSystemPrompt(system)\n const nextDynamic = dynamic.length === 0 ? extra : `${dynamic}\\n\\n${extra}`\n return joinSystemPrompt(staticPart, nextDynamic)\n}\n\n/**\n * Replace the entire dynamic half of a system prompt with `next`. Used by\n * the TUI's `<env>` rewriter where the entire dynamic section is regenerated\n * each turn rather than appended to.\n *\n * When `next` is empty, drops the dynamic half (and the marker) entirely.\n */\nexport function replaceDynamicSection(system: string, next: string): string {\n const { static: staticPart } = splitSystemPrompt(system)\n return joinSystemPrompt(staticPart, next)\n}\n\n/**\n * Strip the boundary marker so it never reaches the wire — collapses\n * `<static>${BOUNDARY}<dynamic>` into `<static>\\n\\n<dynamic>` for providers\n * that can't honor `cache_control` (vanilla OpenAI Chat Completions, Codex,\n * Cerebras, ...) or for the cache-disabled path on any provider.\n *\n * Cache-aware providers re-derive the split from the original (un-rendered)\n * system string via `splitSystemPrompt` — `renderSystemForWire` is the\n * marker-free counterpart used to build the actual wire bytes.\n *\n * No-op when the input has no marker. Pure / no I/O.\n */\nexport function renderSystemForWire(system: string): string {\n if (system.length === 0)\n return system\n const parts = splitSystemPrompt(system)\n if (parts.dynamic.length === 0)\n return parts.static\n if (parts.static.length === 0)\n return parts.dynamic\n return `${parts.static}\\n\\n${parts.dynamic}`\n}\n\n/** True when `system` contains the boundary marker. */\nexport function hasSystemPromptBoundary(system: string): boolean {\n return system.includes(SYSTEM_PROMPT_BOUNDARY)\n}\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/** Strip a single trailing `\\n\\n` (and any leftover trailing whitespace within that pair). */\nfunction trimTrailingBlankLine(s: string): string {\n // Walk back across at most two `\\n` separated only by spaces/tabs.\n let end = s.length\n let newlines = 0\n while (end > 0 && newlines < 2) {\n const ch = s.charCodeAt(end - 1)\n if (ch === 0x0A) {\n newlines += 1\n end -= 1\n continue\n }\n if (ch === 0x20 || ch === 0x09) {\n end -= 1\n continue\n }\n break\n }\n return newlines > 0 ? s.slice(0, end) : s\n}\n\n/** Strip a single leading `\\n\\n` (and any leftover leading whitespace within that pair). */\nfunction trimLeadingBlankLine(s: string): string {\n let start = 0\n let newlines = 0\n while (start < s.length && newlines < 2) {\n const ch = s.charCodeAt(start)\n if (ch === 0x0A) {\n newlines += 1\n start += 1\n continue\n }\n if (ch === 0x20 || ch === 0x09) {\n start += 1\n continue\n }\n break\n }\n return newlines > 0 ? s.slice(start) : s\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,MAAa,yBAAyB;;;;;;;;;;;;;;;;;;;;;AA8BtC,SAAgB,kBAAkB,QAAmC;CACnE,IAAI,OAAO,WAAW,GACpB,OAAO;EAAE,QAAQ;EAAI,SAAS;CAAG;CACnC,MAAM,MAAM,OAAO,QAAQ,sBAAsB;CACjD,IAAI,MAAM,GACR,OAAO;EAAE,QAAQ;EAAQ,SAAS;CAAG;CACvC,MAAM,aAAa,OAAO,MAAM,GAAG,GAAG;CACtC,MAAM,cAAc,OAAO,MAAM,MAAM,EAA6B;CAMpE,OAAO;EACL,QAAQ,sBAAsB,UAAU;EACxC,SAAS,qBAAqB,WAAW;CAC3C;AACF;;;;;;;;;;;;AAaA,SAAgB,iBAAiB,YAAoB,aAA6B;CAChF,IAAI,YAAY,WAAW,GACzB,OAAO;CACT,IAAI,WAAW,WAAW,GACxB,OAAO,GAAG,uBAAuB,MAAM;CACzC,OAAO,GAAG,WAAW,MAAM,uBAAuB,MAAM;AAC1D;;;;;;;;;;;;;AAcA,SAAgB,oBAAoB,QAAgB,OAAuB;CACzE,IAAI,MAAM,WAAW,GACnB,OAAO;CACT,MAAM,EAAE,QAAQ,YAAY,YAAY,kBAAkB,MAAM;CAEhE,OAAO,iBADY,WAAW,WAAW,IAAI,QAAQ,GAAG,WAAW,MAAM,SACrC,OAAO;AAC7C;;;;;;;;;;;;;;AAeA,SAAgB,qBAAqB,QAAgB,OAAuB;CAC1E,IAAI,MAAM,WAAW,GACnB,OAAO;CACT,MAAM,EAAE,QAAQ,YAAY,YAAY,kBAAkB,MAAM;CAEhE,OAAO,iBAAiB,YADJ,QAAQ,WAAW,IAAI,QAAQ,GAAG,QAAQ,MAAM,OACrB;AACjD;;;;;;;;AASA,SAAgB,sBAAsB,QAAgB,MAAsB;CAC1E,MAAM,EAAE,QAAQ,eAAe,kBAAkB,MAAM;CACvD,OAAO,iBAAiB,YAAY,IAAI;AAC1C;;;;;;;;;;;;;AAcA,SAAgB,oBAAoB,QAAwB;CAC1D,IAAI,OAAO,WAAW,GACpB,OAAO;CACT,MAAM,QAAQ,kBAAkB,MAAM;CACtC,IAAI,MAAM,QAAQ,WAAW,GAC3B,OAAO,MAAM;CACf,IAAI,MAAM,OAAO,WAAW,GAC1B,OAAO,MAAM;CACf,OAAO,GAAG,MAAM,OAAO,MAAM,MAAM;AACrC;;AAGA,SAAgB,wBAAwB,QAAyB;CAC/D,OAAO,OAAO,SAAS,sBAAsB;AAC/C;;AAOA,SAAS,sBAAsB,GAAmB;CAEhD,IAAI,MAAM,EAAE;CACZ,IAAI,WAAW;CACf,OAAO,MAAM,KAAK,WAAW,GAAG;EAC9B,MAAM,KAAK,EAAE,WAAW,MAAM,CAAC;EAC/B,IAAI,OAAO,IAAM;GACf,YAAY;GACZ,OAAO;GACP;EACF;EACA,IAAI,OAAO,MAAQ,OAAO,GAAM;GAC9B,OAAO;GACP;EACF;EACA;CACF;CACA,OAAO,WAAW,IAAI,EAAE,MAAM,GAAG,GAAG,IAAI;AAC1C;;AAGA,SAAS,qBAAqB,GAAmB;CAC/C,IAAI,QAAQ;CACZ,IAAI,WAAW;CACf,OAAO,QAAQ,EAAE,UAAU,WAAW,GAAG;EACvC,MAAM,KAAK,EAAE,WAAW,KAAK;EAC7B,IAAI,OAAO,IAAM;GACf,YAAY;GACZ,SAAS;GACT;EACF;EACA,IAAI,OAAO,MAAQ,OAAO,GAAM;GAC9B,SAAS;GACT;EACF;EACA;CACF;CACA,OAAO,WAAW,IAAI,EAAE,MAAM,KAAK,IAAI;AACzC"}
@@ -0,0 +1,2 @@
1
+ import { An as planAnthropicThinking, Dn as anthropic, En as AnthropicThinkingPlan, On as applyAnthropicCacheBreakpoints, Tn as AnthropicParams, jn as resolveAnthropicBetas, kn as classifyAnthropicError, wn as AnthropicContextManagement } from "../agent-EFWt6uQ_.js";
2
+ export { AnthropicContextManagement, AnthropicParams, AnthropicThinkingPlan, anthropic, applyAnthropicCacheBreakpoints, classifyAnthropicError, planAnthropicThinking, resolveAnthropicBetas };
@@ -0,0 +1,2 @@
1
+ import { a as resolveAnthropicBetas, i as planAnthropicThinking, n as applyAnthropicCacheBreakpoints, r as classifyAnthropicError, t as anthropic } from "../anthropic-RGqsJlC8.js";
2
+ export { anthropic, applyAnthropicCacheBreakpoints, classifyAnthropicError, planAnthropicThinking, resolveAnthropicBetas };
@@ -0,0 +1,2 @@
1
+ import { Cn as arcee, Sn as ArceeParams } from "../agent-EFWt6uQ_.js";
2
+ export { ArceeParams, arcee };
@@ -0,0 +1,42 @@
1
+ import { m as openaiCompat } from "../openai-compat-0Y7jcncn.js";
2
+ //#region src/providers/arcee.ts
3
+ const BASE_URL = "https://api.arcee.ai/api/v1";
4
+ function getApiKey(params) {
5
+ if (typeof params?.apiKey === "string" && params.apiKey.length > 0) return params.apiKey;
6
+ if (process.env.ARCEE_API_KEY) return process.env.ARCEE_API_KEY;
7
+ throw new Error("No Arcee API key found. Pass `apiKey` or set ARCEE_API_KEY in your environment.");
8
+ }
9
+ /**
10
+ * Arcee provider (Trinity-Large-Thinking and friends).
11
+ *
12
+ * Thin wrapper around {@link openaiCompat} pinned to the `reasoning_content`
13
+ * round-trip mode: Trinity emits chain-of-thought in `<think>…</think>` blocks
14
+ * that vLLM parses into a plain `reasoning_content` string. We capture it and
15
+ * echo it back on every assistant message so the model resumes its prior
16
+ * reasoning across tool calls — without this, tool calls leak into the
17
+ * reasoning field as raw XML (Arcee's `xml_in_reasoning` pitfall). `content` is
18
+ * also normalized from `null` → `''` on tool-call turns per the same guidance.
19
+ *
20
+ * See https://docs.arcee.ai/capabilities/reasoning-traces.
21
+ */
22
+ function arcee(params) {
23
+ return openaiCompat({
24
+ name: "arcee",
25
+ apiKey: getApiKey(params),
26
+ baseURL: params?.baseURL || BASE_URL,
27
+ defaultModel: params?.defaultModel || "trinity-large-thinking",
28
+ capabilities: params?.capabilities ?? {
29
+ vision: false,
30
+ imageInToolResult: false
31
+ },
32
+ supportsReasoning: true,
33
+ reasoningMode: "reasoning_content",
34
+ reasoningContentField: params?.reasoningContentField ?? "reasoning",
35
+ normalizeNullContent: true,
36
+ extraHeaders: params?.extraHeaders
37
+ });
38
+ }
39
+ //#endregion
40
+ export { arcee };
41
+
42
+ //# sourceMappingURL=arcee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arcee.js","names":[],"sources":["../../src/providers/arcee.ts"],"sourcesContent":["import type { Provider, ProviderCapabilities } from '.'\nimport { openaiCompat } from './openai-compat'\n\n// Arcee Platform API (OpenAI-compatible). Exposes Trinity models by plain\n// slug (`trinity-large-thinking`, `trinity-mini`, …) and returns reasoning in\n// the `reasoning_content` / `reasoning` field. NOTE: this is the Platform API\n// (`api.arcee.ai/api/v1`), not Conductor (`conductor.arcee.ai/v1`) — the latter\n// routes via different model names (`auto`, `blitz`). For self-hosted vLLM,\n// override `baseURL` and use the HF slug (`arcee-ai/Trinity-Large-Thinking`).\nconst BASE_URL = 'https://api.arcee.ai/api/v1'\n\nexport interface ArceeParams {\n apiKey?: string\n defaultModel?: string\n /**\n * Override the base URL — e.g. point at a self-hosted vLLM deployment serving\n * Trinity-Thinking instead of Arcee's hosted Platform API.\n */\n baseURL?: string\n /**\n * Provider capability flags. Trinity models are text-only — default:\n * `{ vision: false, imageInToolResult: false }`.\n */\n capabilities?: ProviderCapabilities\n /**\n * Wire field used to echo plain reasoning back across turns. Arcee's hosted\n * API accepts both names; some self-hosted vLLM versions only read `reasoning`\n * on input (vllm#38488). Default: `'reasoning'`.\n */\n reasoningContentField?: 'reasoning_content' | 'reasoning'\n /**\n * Extra HTTP headers sent on every request. Forwarded to the underlying\n * {@link openaiCompat} client — use for routing/attribution headers a proxy\n * in front of `baseURL` consumes.\n */\n extraHeaders?: Record<string, string>\n}\n\nfunction getApiKey(params?: ArceeParams): string {\n // Resolution order aligned with the other providers: explicit > env > fail.\n if (typeof params?.apiKey === 'string' && params.apiKey.length > 0)\n return params.apiKey\n\n if (process.env.ARCEE_API_KEY)\n return process.env.ARCEE_API_KEY\n\n throw new Error('No Arcee API key found. Pass `apiKey` or set ARCEE_API_KEY in your environment.')\n}\n\n/**\n * Arcee provider (Trinity-Large-Thinking and friends).\n *\n * Thin wrapper around {@link openaiCompat} pinned to the `reasoning_content`\n * round-trip mode: Trinity emits chain-of-thought in `<think>…</think>` blocks\n * that vLLM parses into a plain `reasoning_content` string. We capture it and\n * echo it back on every assistant message so the model resumes its prior\n * reasoning across tool calls — without this, tool calls leak into the\n * reasoning field as raw XML (Arcee's `xml_in_reasoning` pitfall). `content` is\n * also normalized from `null` → `''` on tool-call turns per the same guidance.\n *\n * See https://docs.arcee.ai/capabilities/reasoning-traces.\n */\nexport function arcee(params?: ArceeParams): Provider {\n return openaiCompat({\n name: 'arcee',\n apiKey: getApiKey(params),\n baseURL: params?.baseURL || BASE_URL,\n defaultModel: params?.defaultModel || 'trinity-large-thinking',\n capabilities: params?.capabilities ?? { vision: false, imageInToolResult: false },\n supportsReasoning: true,\n reasoningMode: 'reasoning_content',\n reasoningContentField: params?.reasoningContentField ?? 'reasoning',\n normalizeNullContent: true,\n extraHeaders: params?.extraHeaders,\n })\n}\n"],"mappings":";;AASA,MAAM,WAAW;AA6BjB,SAAS,UAAU,QAA8B;CAE/C,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,OAAO,SAAS,GAC/D,OAAO,OAAO;CAEhB,IAAI,QAAQ,IAAI,eACd,OAAO,QAAQ,IAAI;CAErB,MAAM,IAAI,MAAM,iFAAiF;AACnG;;;;;;;;;;;;;;AAeA,SAAgB,MAAM,QAAgC;CACpD,OAAO,aAAa;EAClB,MAAM;EACN,QAAQ,UAAU,MAAM;EACxB,SAAS,QAAQ,WAAW;EAC5B,cAAc,QAAQ,gBAAgB;EACtC,cAAc,QAAQ,gBAAgB;GAAE,QAAQ;GAAO,mBAAmB;EAAM;EAChF,mBAAmB;EACnB,eAAe;EACf,uBAAuB,QAAQ,yBAAyB;EACxD,sBAAsB;EACtB,cAAc,QAAQ;CACxB,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ import { bn as baseten, xn as planBasetenReasoning, yn as BasetenParams } from "../agent-EFWt6uQ_.js";
2
+ export { BasetenParams, baseten, planBasetenReasoning };
@@ -0,0 +1,66 @@
1
+ import { m as openaiCompat } from "../openai-compat-0Y7jcncn.js";
2
+ //#region src/providers/baseten.ts
3
+ const BASE_URL = "https://inference.baseten.co/v1";
4
+ /**
5
+ * Models that take OpenAI-style `reasoning_effort` (low/medium/high) and
6
+ * reason by default. Everything else on Model APIs (Kimi, GLM, Nemotron) is
7
+ * opt-in via `chat_template_args: { enable_thinking: true }`.
8
+ * See https://docs.baseten.co/inference/model-apis/reasoning.
9
+ */
10
+ const EFFORT_MODELS = new Set(["deepseek-ai/DeepSeek-V4-Pro", "openai/gpt-oss-120b"]);
11
+ function getApiKey(params) {
12
+ if (typeof params?.apiKey === "string" && params.apiKey.length > 0) return params.apiKey;
13
+ if (process.env.BASETEN_API_KEY) return process.env.BASETEN_API_KEY;
14
+ throw new Error("No Baseten API key found. Pass `apiKey` or set BASETEN_API_KEY in your environment.");
15
+ }
16
+ /**
17
+ * Map zidane's thinking level to Baseten's per-model reasoning request shape:
18
+ *
19
+ * - `reasoning_effort` models (DeepSeek V4 Pro, GPT-OSS 120B) reason by
20
+ * default; the effort string tunes depth. `'minimal'` maps to `'low'`,
21
+ * Anthropic-only upper tiers map to `'high'`, `'adaptive'` sends nothing
22
+ * (server default = medium); `'off'` sends nothing (cannot be disabled).
23
+ * - All other models opt in via `chat_template_args.enable_thinking` — any
24
+ * non-off level enables it (the template arg is boolean, no depth knob).
25
+ *
26
+ * Exported for tests.
27
+ */
28
+ function planBasetenReasoning(ctx) {
29
+ const { model, thinking } = ctx;
30
+ if (!thinking || thinking === "off") return void 0;
31
+ if (EFFORT_MODELS.has(model)) {
32
+ if (thinking === "adaptive") return void 0;
33
+ return { reasoning_effort: thinking === "minimal" ? "low" : thinking === "xhigh" || thinking === "max" ? "high" : thinking };
34
+ }
35
+ return { chat_template_args: { enable_thinking: true } };
36
+ }
37
+ /**
38
+ * Baseten Model APIs provider.
39
+ *
40
+ * Thin wrapper around {@link openaiCompat} pinned to the `reasoning_content`
41
+ * round-trip mode: thinking arrives in the `reasoning_content` delta field and
42
+ * is echoed back on assistant messages under the same name so reasoning
43
+ * models resume their chain-of-thought across tool calls. The thinking level
44
+ * maps to Baseten's request shape via {@link planBasetenReasoning}.
45
+ */
46
+ function baseten(params) {
47
+ return openaiCompat({
48
+ name: "baseten",
49
+ apiKey: getApiKey(params),
50
+ baseURL: params?.baseURL || BASE_URL,
51
+ defaultModel: params?.defaultModel || "zai-org/GLM-5.1",
52
+ capabilities: params?.capabilities ?? {
53
+ vision: false,
54
+ imageInToolResult: false
55
+ },
56
+ supportsReasoning: true,
57
+ reasoningMode: "reasoning_content",
58
+ reasoningContentField: "reasoning_content",
59
+ planReasoningRequest: planBasetenReasoning,
60
+ extraHeaders: params?.extraHeaders
61
+ });
62
+ }
63
+ //#endregion
64
+ export { baseten, planBasetenReasoning };
65
+
66
+ //# sourceMappingURL=baseten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseten.js","names":[],"sources":["../../src/providers/baseten.ts"],"sourcesContent":["import type { Provider, ProviderCapabilities } from '.'\nimport type { ThinkingLevel } from '../types'\nimport { openaiCompat } from './openai-compat'\n\n// Baseten Model APIs (OpenAI-compatible, shared infrastructure). Models are\n// addressed by HF-style slugs (`zai-org/GLM-5.1`, `moonshotai/Kimi-K2.6`, …)\n// and reasoning text streams in the `reasoning_content` delta field.\n// See https://docs.baseten.co/inference/model-apis/overview.\nconst BASE_URL = 'https://inference.baseten.co/v1'\n\n/**\n * Models that take OpenAI-style `reasoning_effort` (low/medium/high) and\n * reason by default. Everything else on Model APIs (Kimi, GLM, Nemotron) is\n * opt-in via `chat_template_args: { enable_thinking: true }`.\n * See https://docs.baseten.co/inference/model-apis/reasoning.\n */\nconst EFFORT_MODELS = new Set([\n 'deepseek-ai/DeepSeek-V4-Pro',\n 'openai/gpt-oss-120b',\n])\n\nexport interface BasetenParams {\n apiKey?: string\n defaultModel?: string\n /**\n * Override the base URL — e.g. point at a dedicated Baseten deployment's\n * OpenAI-compatible bridge instead of the shared Model APIs endpoint.\n */\n baseURL?: string\n /**\n * Provider capability flags. Default: `{ vision: false, imageInToolResult: false }`\n * — conservative, since most Model APIs are text-only. Set `vision: true`\n * when pinning a Kimi K2.x model (the only vision-capable ones).\n */\n capabilities?: ProviderCapabilities\n /**\n * Extra HTTP headers sent on every request. Forwarded to the underlying\n * {@link openaiCompat} client.\n */\n extraHeaders?: Record<string, string>\n}\n\nfunction getApiKey(params?: BasetenParams): string {\n // Resolution order aligned with the other providers: explicit > env > fail.\n if (typeof params?.apiKey === 'string' && params.apiKey.length > 0)\n return params.apiKey\n\n if (process.env.BASETEN_API_KEY)\n return process.env.BASETEN_API_KEY\n\n throw new Error('No Baseten API key found. Pass `apiKey` or set BASETEN_API_KEY in your environment.')\n}\n\n/**\n * Map zidane's thinking level to Baseten's per-model reasoning request shape:\n *\n * - `reasoning_effort` models (DeepSeek V4 Pro, GPT-OSS 120B) reason by\n * default; the effort string tunes depth. `'minimal'` maps to `'low'`,\n * Anthropic-only upper tiers map to `'high'`, `'adaptive'` sends nothing\n * (server default = medium); `'off'` sends nothing (cannot be disabled).\n * - All other models opt in via `chat_template_args.enable_thinking` — any\n * non-off level enables it (the template arg is boolean, no depth knob).\n *\n * Exported for tests.\n */\nexport function planBasetenReasoning(\n ctx: { model: string, thinking?: ThinkingLevel },\n): Record<string, unknown> | undefined {\n const { model, thinking } = ctx\n if (!thinking || thinking === 'off')\n return undefined\n if (EFFORT_MODELS.has(model)) {\n if (thinking === 'adaptive')\n return undefined\n const effort = thinking === 'minimal' ? 'low' : thinking === 'xhigh' || thinking === 'max' ? 'high' : thinking\n return { reasoning_effort: effort }\n }\n return { chat_template_args: { enable_thinking: true } }\n}\n\n/**\n * Baseten Model APIs provider.\n *\n * Thin wrapper around {@link openaiCompat} pinned to the `reasoning_content`\n * round-trip mode: thinking arrives in the `reasoning_content` delta field and\n * is echoed back on assistant messages under the same name so reasoning\n * models resume their chain-of-thought across tool calls. The thinking level\n * maps to Baseten's request shape via {@link planBasetenReasoning}.\n */\nexport function baseten(params?: BasetenParams): Provider {\n return openaiCompat({\n name: 'baseten',\n apiKey: getApiKey(params),\n baseURL: params?.baseURL || BASE_URL,\n defaultModel: params?.defaultModel || 'zai-org/GLM-5.1',\n capabilities: params?.capabilities ?? { vision: false, imageInToolResult: false },\n supportsReasoning: true,\n reasoningMode: 'reasoning_content',\n reasoningContentField: 'reasoning_content',\n planReasoningRequest: planBasetenReasoning,\n extraHeaders: params?.extraHeaders,\n })\n}\n"],"mappings":";;AAQA,MAAM,WAAW;;;;;;;AAQjB,MAAM,gBAAgB,IAAI,IAAI,CAC5B,+BACA,qBACF,CAAC;AAuBD,SAAS,UAAU,QAAgC;CAEjD,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,OAAO,SAAS,GAC/D,OAAO,OAAO;CAEhB,IAAI,QAAQ,IAAI,iBACd,OAAO,QAAQ,IAAI;CAErB,MAAM,IAAI,MAAM,qFAAqF;AACvG;;;;;;;;;;;;;AAcA,SAAgB,qBACd,KACqC;CACrC,MAAM,EAAE,OAAO,aAAa;CAC5B,IAAI,CAAC,YAAY,aAAa,OAC5B,OAAO,KAAA;CACT,IAAI,cAAc,IAAI,KAAK,GAAG;EAC5B,IAAI,aAAa,YACf,OAAO,KAAA;EAET,OAAO,EAAE,kBADM,aAAa,YAAY,QAAQ,aAAa,WAAW,aAAa,QAAQ,SAAS,SACpE;CACpC;CACA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,KAAK,EAAE;AACzD;;;;;;;;;;AAWA,SAAgB,QAAQ,QAAkC;CACxD,OAAO,aAAa;EAClB,MAAM;EACN,QAAQ,UAAU,MAAM;EACxB,SAAS,QAAQ,WAAW;EAC5B,cAAc,QAAQ,gBAAgB;EACtC,cAAc,QAAQ,gBAAgB;GAAE,QAAQ;GAAO,mBAAmB;EAAM;EAChF,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,sBAAsB;EACtB,cAAc,QAAQ;CACxB,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ import { _n as CerebrasParams, vn as cerebras } from "../agent-EFWt6uQ_.js";
2
+ export { CerebrasParams, cerebras };
@@ -0,0 +1,31 @@
1
+ import { m as openaiCompat } from "../openai-compat-0Y7jcncn.js";
2
+ //#region src/providers/cerebras.ts
3
+ const BASE_URL = "https://api.cerebras.ai/v1";
4
+ function getApiKey(params) {
5
+ if (typeof params?.apiKey === "string" && params.apiKey.length > 0) return params.apiKey;
6
+ if (process.env.CEREBRAS_API_KEY) return process.env.CEREBRAS_API_KEY;
7
+ throw new Error("No Cerebras API key found. Pass `apiKey` or set CEREBRAS_API_KEY in your environment.");
8
+ }
9
+ /**
10
+ * Cerebras provider.
11
+ *
12
+ * Thin wrapper around {@link openaiCompat} with Cerebras-specific defaults
13
+ * (base URL, default model).
14
+ */
15
+ function cerebras(params) {
16
+ return openaiCompat({
17
+ name: "cerebras",
18
+ apiKey: getApiKey(params),
19
+ baseURL: BASE_URL,
20
+ defaultModel: params?.defaultModel || "zai-glm-4.7",
21
+ capabilities: params?.capabilities ?? {
22
+ vision: false,
23
+ imageInToolResult: false
24
+ },
25
+ extraHeaders: params?.extraHeaders
26
+ });
27
+ }
28
+ //#endregion
29
+ export { cerebras };
30
+
31
+ //# sourceMappingURL=cerebras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cerebras.js","names":[],"sources":["../../src/providers/cerebras.ts"],"sourcesContent":["import type { Provider, ProviderCapabilities } from '.'\nimport { openaiCompat } from './openai-compat'\n\nconst BASE_URL = 'https://api.cerebras.ai/v1'\n\nexport interface CerebrasParams {\n apiKey?: string\n defaultModel?: string\n /**\n * Provider capability flags. Cerebras currently serves text-only OSS models\n * (GLM, Llama-family, Qwen-family) — default: `{ vision: false, imageInToolResult: false }`.\n * Override when routing to a vision-capable deployment.\n */\n capabilities?: ProviderCapabilities\n /**\n * Extra HTTP headers sent on every request. Forwarded to the underlying\n * {@link openaiCompat} client — use for routing/attribution headers a proxy\n * in front of `baseURL` consumes.\n */\n extraHeaders?: Record<string, string>\n}\n\nfunction getApiKey(params?: CerebrasParams): string {\n // Resolution order is intentionally aligned with `anthropic` + `openai` —\n // explicit params > env var > fail. Host code that composes providers from\n // config (e.g. a YAML-driven CLI) relies on `params.apiKey` winning in all\n // providers, not just some.\n if (typeof params?.apiKey === 'string' && params.apiKey.length > 0)\n return params.apiKey\n\n if (process.env.CEREBRAS_API_KEY)\n return process.env.CEREBRAS_API_KEY\n\n throw new Error('No Cerebras API key found. Pass `apiKey` or set CEREBRAS_API_KEY in your environment.')\n}\n\n/**\n * Cerebras provider.\n *\n * Thin wrapper around {@link openaiCompat} with Cerebras-specific defaults\n * (base URL, default model).\n */\nexport function cerebras(params?: CerebrasParams): Provider {\n const apiKey = getApiKey(params)\n return openaiCompat({\n name: 'cerebras',\n apiKey,\n baseURL: BASE_URL,\n defaultModel: params?.defaultModel || 'zai-glm-4.7',\n capabilities: params?.capabilities ?? { vision: false, imageInToolResult: false },\n extraHeaders: params?.extraHeaders,\n })\n}\n"],"mappings":";;AAGA,MAAM,WAAW;AAmBjB,SAAS,UAAU,QAAiC;CAKlD,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,OAAO,SAAS,GAC/D,OAAO,OAAO;CAEhB,IAAI,QAAQ,IAAI,kBACd,OAAO,QAAQ,IAAI;CAErB,MAAM,IAAI,MAAM,uFAAuF;AACzG;;;;;;;AAQA,SAAgB,SAAS,QAAmC;CAE1D,OAAO,aAAa;EAClB,MAAM;EACN,QAHa,UAAU,MAGlB;EACL,SAAS;EACT,cAAc,QAAQ,gBAAgB;EACtC,cAAc,QAAQ,gBAAgB;GAAE,QAAQ;GAAO,mBAAmB;EAAM;EAChF,cAAc,QAAQ;CACxB,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ import { mn as local, pn as LocalParams } from "../agent-EFWt6uQ_.js";
2
+ export { LocalParams, local };
@@ -0,0 +1,44 @@
1
+ import { m as openaiCompat } from "../openai-compat-0Y7jcncn.js";
2
+ //#region src/providers/local.ts
3
+ function getBaseURL(params) {
4
+ if (typeof params?.baseURL === "string" && params.baseURL.length > 0) return params.baseURL;
5
+ if (process.env.LOCAL_LLM_BASE_URL) return process.env.LOCAL_LLM_BASE_URL;
6
+ throw new Error("No local LLM base URL found. Pass `baseURL` or set LOCAL_LLM_BASE_URL (e.g. http://localhost:11434/v1 for Ollama, http://localhost:8000/v1 for vLLM).");
7
+ }
8
+ function getApiKey(params) {
9
+ if (typeof params?.apiKey === "string" && params.apiKey.length > 0) return params.apiKey;
10
+ if (process.env.LOCAL_LLM_API_KEY) return process.env.LOCAL_LLM_API_KEY;
11
+ return "no-key";
12
+ }
13
+ function getDefaultModel(params) {
14
+ if (typeof params?.defaultModel === "string" && params.defaultModel.length > 0) return params.defaultModel;
15
+ if (process.env.LOCAL_LLM_DEFAULT_MODEL) return process.env.LOCAL_LLM_DEFAULT_MODEL;
16
+ }
17
+ /**
18
+ * Local OpenAI-compatible LLM provider.
19
+ *
20
+ * Thin wrapper around {@link openaiCompat} for self-hosted runtimes that
21
+ * speak the standard `POST /chat/completions` + SSE dialect: Ollama, vLLM,
22
+ * LM Studio, Lemonade, llama.cpp's server, text-generation-webui, etc.
23
+ *
24
+ * Caching and reasoning are left off — local runtimes typically strict-
25
+ * validate the request schema and would 400 on the extra fields. Override
26
+ * `capabilities` when pointing at a vision-capable deployment.
27
+ */
28
+ function local(params) {
29
+ return openaiCompat({
30
+ name: "local",
31
+ apiKey: getApiKey(params),
32
+ baseURL: getBaseURL(params),
33
+ defaultModel: getDefaultModel(params),
34
+ capabilities: params?.capabilities ?? {
35
+ vision: false,
36
+ imageInToolResult: false
37
+ },
38
+ extraHeaders: params?.extraHeaders
39
+ });
40
+ }
41
+ //#endregion
42
+ export { local };
43
+
44
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","names":[],"sources":["../../src/providers/local.ts"],"sourcesContent":["import type { Provider, ProviderCapabilities } from '.'\nimport { openaiCompat } from './openai-compat'\n\nexport interface LocalParams {\n /**\n * Base URL of the local OpenAI-compatible server. `/chat/completions` is\n * appended. Examples:\n * - Ollama: `http://localhost:11434/v1`\n * - vLLM: `http://localhost:8000/v1`\n * - LM Studio: `http://localhost:1234/v1`\n * - Lemonade: `http://localhost:8000/api/v1`\n * - llama.cpp: `http://localhost:8080/v1`\n *\n * Resolution order: explicit `params.baseURL` > `LOCAL_LLM_BASE_URL` env >\n * throw.\n */\n baseURL?: string\n /**\n * Optional bearer key. Most local servers don't authenticate; some (vLLM\n * with `--api-key`, gateway proxies, llama.cpp with `--api-key`) do.\n * Falls back to `LOCAL_LLM_API_KEY`, then to a placeholder string accepted\n * by unauthenticated endpoints.\n */\n apiKey?: string\n /**\n * Default model id. Local runtimes have no fixed catalogue — whatever the\n * user has loaded (e.g. `llama3.1:8b`, `qwen2.5-coder`, a HF repo path).\n * Falls back to `LOCAL_LLM_DEFAULT_MODEL`.\n */\n defaultModel?: string\n /**\n * Provider capability flags. Defaults to text-only — typical OSS local\n * deployment. Override when pointing at a vision-capable runtime (e.g.\n * Ollama serving a multimodal model, vLLM with a VLM).\n */\n capabilities?: ProviderCapabilities\n /**\n * Extra HTTP headers sent on every request. Forwarded to the underlying\n * {@link openaiCompat} client — use for auth/routing headers a self-hosted\n * gateway in front of `baseURL` consumes.\n */\n extraHeaders?: Record<string, string>\n}\n\nfunction getBaseURL(params?: LocalParams): string {\n if (typeof params?.baseURL === 'string' && params.baseURL.length > 0)\n return params.baseURL\n if (process.env.LOCAL_LLM_BASE_URL)\n return process.env.LOCAL_LLM_BASE_URL\n throw new Error(\n 'No local LLM base URL found. Pass `baseURL` or set LOCAL_LLM_BASE_URL '\n + '(e.g. http://localhost:11434/v1 for Ollama, http://localhost:8000/v1 for vLLM).',\n )\n}\n\nfunction getApiKey(params?: LocalParams): string {\n if (typeof params?.apiKey === 'string' && params.apiKey.length > 0)\n return params.apiKey\n if (process.env.LOCAL_LLM_API_KEY)\n return process.env.LOCAL_LLM_API_KEY\n // Most local servers don't authenticate; send a placeholder so the factory's\n // Authorization header is well-formed (servers that ignore the header are\n // unaffected; servers that strict-check will be configured via env anyway).\n return 'no-key'\n}\n\nfunction getDefaultModel(params?: LocalParams): string | undefined {\n if (typeof params?.defaultModel === 'string' && params.defaultModel.length > 0)\n return params.defaultModel\n if (process.env.LOCAL_LLM_DEFAULT_MODEL)\n return process.env.LOCAL_LLM_DEFAULT_MODEL\n return undefined\n}\n\n/**\n * Local OpenAI-compatible LLM provider.\n *\n * Thin wrapper around {@link openaiCompat} for self-hosted runtimes that\n * speak the standard `POST /chat/completions` + SSE dialect: Ollama, vLLM,\n * LM Studio, Lemonade, llama.cpp's server, text-generation-webui, etc.\n *\n * Caching and reasoning are left off — local runtimes typically strict-\n * validate the request schema and would 400 on the extra fields. Override\n * `capabilities` when pointing at a vision-capable deployment.\n */\nexport function local(params?: LocalParams): Provider {\n return openaiCompat({\n name: 'local',\n apiKey: getApiKey(params),\n baseURL: getBaseURL(params),\n defaultModel: getDefaultModel(params),\n capabilities: params?.capabilities ?? { vision: false, imageInToolResult: false },\n extraHeaders: params?.extraHeaders,\n })\n}\n"],"mappings":";;AA4CA,SAAS,WAAW,QAA8B;CAChD,IAAI,OAAO,QAAQ,YAAY,YAAY,OAAO,QAAQ,SAAS,GACjE,OAAO,OAAO;CAChB,IAAI,QAAQ,IAAI,oBACd,OAAO,QAAQ,IAAI;CACrB,MAAM,IAAI,MACR,uJAEF;AACF;AAEA,SAAS,UAAU,QAA8B;CAC/C,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,OAAO,SAAS,GAC/D,OAAO,OAAO;CAChB,IAAI,QAAQ,IAAI,mBACd,OAAO,QAAQ,IAAI;CAIrB,OAAO;AACT;AAEA,SAAS,gBAAgB,QAA0C;CACjE,IAAI,OAAO,QAAQ,iBAAiB,YAAY,OAAO,aAAa,SAAS,GAC3E,OAAO,OAAO;CAChB,IAAI,QAAQ,IAAI,yBACd,OAAO,QAAQ,IAAI;AAEvB;;;;;;;;;;;;AAaA,SAAgB,MAAM,QAAgC;CACpD,OAAO,aAAa;EAClB,MAAM;EACN,QAAQ,UAAU,MAAM;EACxB,SAAS,WAAW,MAAM;EAC1B,cAAc,gBAAgB,MAAM;EACpC,cAAc,QAAQ,gBAAgB;GAAE,QAAQ;GAAO,mBAAmB;EAAM;EAChF,cAAc,QAAQ;CACxB,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ import { $t as classifyOpenAICompatError, Gt as OpenAICompatHttpError, Ht as OAIMessage, Jt as TOOL_RESULTS_TAG, Kt as OpenAICompatParams, Qt as buildAssistantContent, Ut as OAITool, Vt as ASSISTANT_TOOL_CALLS_TAG, Wt as OpenAICompatAuthHeader, Xt as applyOAIToolCacheBreakpoint, Yt as applyOAICacheBreakpoints, Zt as assistantMessage, an as toOAIMessages, en as consumeSSE, in as openaiCompat, nn as mapOAIFinishReason, on as toolResultsMessage, qt as OpenAICompatStreamError, rn as openAICompatPromptMessage, sn as userMessage, tn as formatTools } from "../agent-EFWt6uQ_.js";
2
+ export { ASSISTANT_TOOL_CALLS_TAG, OAIMessage, OAITool, OpenAICompatAuthHeader, OpenAICompatHttpError, OpenAICompatParams, OpenAICompatStreamError, TOOL_RESULTS_TAG, applyOAICacheBreakpoints, applyOAIToolCacheBreakpoint, assistantMessage, buildAssistantContent, classifyOpenAICompatError, consumeSSE, formatTools, mapOAIFinishReason, openAICompatPromptMessage, openaiCompat, toOAIMessages, toolResultsMessage, userMessage };
@@ -0,0 +1,2 @@
1
+ import { _ as userMessage, a as applyOAICacheBreakpoints, c as buildAssistantContent, d as formatTools, f as mapOAIFinishReason, g as toolResultsMessage, h as toOAIMessages, i as TOOL_RESULTS_TAG, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, o as applyOAIToolCacheBreakpoint, p as openAICompatPromptMessage, r as OpenAICompatStreamError, s as assistantMessage, t as ASSISTANT_TOOL_CALLS_TAG, u as consumeSSE } from "../openai-compat-0Y7jcncn.js";
2
+ export { ASSISTANT_TOOL_CALLS_TAG, OpenAICompatHttpError, OpenAICompatStreamError, TOOL_RESULTS_TAG, applyOAICacheBreakpoints, applyOAIToolCacheBreakpoint, assistantMessage, buildAssistantContent, classifyOpenAICompatError, consumeSSE, formatTools, mapOAIFinishReason, openAICompatPromptMessage, openaiCompat, toOAIMessages, toolResultsMessage, userMessage };
@@ -0,0 +1,2 @@
1
+ import { cn as OpenAIParams, dn as openai, fn as toPiMessages, ln as classifyOpenAIError, un as mapCodexStopReason } from "../agent-EFWt6uQ_.js";
2
+ export { OpenAIParams, classifyOpenAIError, mapCodexStopReason, openai, toPiMessages };