zidane 5.14.5 → 6.0.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 (198) hide show
  1. package/dist/{acp-BpFEbCMQ.js → acp-Irby04Us.js} +7 -8
  2. package/dist/{acp-BpFEbCMQ.js.map → acp-Irby04Us.js.map} +1 -1
  3. package/dist/acp-cli.js +7 -7
  4. package/dist/acp.d.ts +2 -3
  5. package/dist/acp.d.ts.map +1 -1
  6. package/dist/acp.js +1 -1
  7. package/dist/{agent-DyI0YsAR.js → agent-DkSmGkDM.js} +10873 -5437
  8. package/dist/agent-DkSmGkDM.js.map +1 -0
  9. package/dist/agent.d.ts +1 -2
  10. package/dist/agent.js +2 -2
  11. package/dist/{anthropic-cbfW2RGg.js → anthropic-CTHsdFG9.js} +5 -4
  12. package/dist/{anthropic-cbfW2RGg.js.map → anthropic-CTHsdFG9.js.map} +1 -1
  13. package/dist/{auth-D9uj0nNr.js → auth-BDSu_0t3.js} +13 -86
  14. package/dist/auth-BDSu_0t3.js.map +1 -0
  15. package/dist/chat/pure.d.ts +4 -4
  16. package/dist/chat/pure.js +4 -3
  17. package/dist/chat.d.ts +29 -8
  18. package/dist/chat.d.ts.map +1 -1
  19. package/dist/chat.js +9 -6
  20. package/dist/chat.js.map +1 -1
  21. package/dist/completion-core-CXYSVhZo.js +147 -0
  22. package/dist/completion-core-CXYSVhZo.js.map +1 -0
  23. package/dist/{context-breakdown-kO-pDsay.js → context-breakdown-Dzo25N45.js} +2 -23
  24. package/dist/context-breakdown-Dzo25N45.js.map +1 -0
  25. package/dist/contexts/daytona.d.ts +3 -3
  26. package/dist/contexts/daytona.js +1 -1
  27. package/dist/contexts/docker.d.ts +10 -2
  28. package/dist/contexts/docker.d.ts.map +1 -1
  29. package/dist/contexts/docker.js +142 -103
  30. package/dist/contexts/docker.js.map +1 -1
  31. package/dist/contexts/e2b.d.ts +2 -2
  32. package/dist/contexts/e2b.js +1 -1
  33. package/dist/contexts/sandbox.d.ts +1 -1
  34. package/dist/contexts/sandbox.js +4 -1
  35. package/dist/contexts/sandbox.js.map +1 -1
  36. package/dist/{contexts-Lzf5huID.js → contexts-Vone3qQQ.js} +26 -37
  37. package/dist/contexts-Vone3qQQ.js.map +1 -0
  38. package/dist/contexts.d.ts +3 -3
  39. package/dist/contexts.js +1 -1
  40. package/dist/errors.d.ts +1 -2
  41. package/dist/errors.js +1 -1
  42. package/dist/eval.d.ts +1 -1
  43. package/dist/eval.js +3 -3
  44. package/dist/exec-file-size-PXkr-MGA.js +63 -0
  45. package/dist/exec-file-size-PXkr-MGA.js.map +1 -0
  46. package/dist/extensions.d.ts +2 -0
  47. package/dist/extensions.js +2 -0
  48. package/dist/generate-data-WL_yGVL6.js +324 -0
  49. package/dist/generate-data-WL_yGVL6.js.map +1 -0
  50. package/dist/headless.d.ts +1 -1
  51. package/dist/headless.js +15 -10
  52. package/dist/headless.js.map +1 -1
  53. package/dist/index-B8UtiZy7.d.ts +14967 -0
  54. package/dist/index-B8UtiZy7.d.ts.map +1 -0
  55. package/dist/{index-B3ciFUZx.d.ts → index-DsPQbyUn.d.ts} +2 -2
  56. package/dist/index-DsPQbyUn.d.ts.map +1 -0
  57. package/dist/index.d.ts +6 -12
  58. package/dist/index.js +20 -43
  59. package/dist/index.js.map +1 -1
  60. package/dist/{logger-Ktm-lj1s.js → logger-DBX9uYOw.js} +108 -5
  61. package/dist/logger-DBX9uYOw.js.map +1 -0
  62. package/dist/login-DOF8pMVM.js +539 -0
  63. package/dist/login-DOF8pMVM.js.map +1 -0
  64. package/dist/{mcp-Dn5W65Lv.js → mcp-CcvuVXB9.js} +2 -2
  65. package/dist/{mcp-Dn5W65Lv.js.map → mcp-CcvuVXB9.js.map} +1 -1
  66. package/dist/mcp.d.ts +1 -1
  67. package/dist/mcp.js +1 -1
  68. package/dist/{messages-CozesxbB.js → messages-CwujiS74.js} +4 -4
  69. package/dist/messages-CwujiS74.js.map +1 -0
  70. package/dist/{openai-compat-FII_9wJP.js → openai-compat-BvgYGSR1.js} +5 -4
  71. package/dist/{openai-compat-FII_9wJP.js.map → openai-compat-BvgYGSR1.js.map} +1 -1
  72. package/dist/output/stream-json.d.ts +1 -2
  73. package/dist/output/stream-json.d.ts.map +1 -1
  74. package/dist/output/terminal.d.ts +1 -2
  75. package/dist/output/terminal.d.ts.map +1 -1
  76. package/dist/{glob-DluQFSw1.js → output-cap-kBUHBlnq.js} +50 -2
  77. package/dist/output-cap-kBUHBlnq.js.map +1 -0
  78. package/dist/presets.d.ts +1 -2
  79. package/dist/presets.js +1 -1
  80. package/dist/providers/anthropic.d.ts +1 -1
  81. package/dist/providers/anthropic.js +1 -1
  82. package/dist/providers/arcee.d.ts +1 -1
  83. package/dist/providers/arcee.js +1 -1
  84. package/dist/providers/baseten.d.ts +1 -1
  85. package/dist/providers/baseten.js +1 -1
  86. package/dist/providers/cerebras.d.ts +1 -1
  87. package/dist/providers/cerebras.js +1 -1
  88. package/dist/providers/local.d.ts +1 -1
  89. package/dist/providers/local.js +1 -1
  90. package/dist/providers/openai-compat.d.ts +1 -1
  91. package/dist/providers/openai-compat.js +1 -1
  92. package/dist/providers/openai.d.ts +1 -1
  93. package/dist/providers/openai.js +3 -3
  94. package/dist/providers/openrouter.d.ts +1 -1
  95. package/dist/providers/openrouter.js +1 -1
  96. package/dist/providers/xai.d.ts +1 -1
  97. package/dist/providers/xai.js +1 -1
  98. package/dist/{providers-DYXj2LcE.js → providers-z6LDMAr3.js} +3 -3
  99. package/dist/{providers-DYXj2LcE.js.map → providers-z6LDMAr3.js.map} +1 -1
  100. package/dist/providers.d.ts +1 -1
  101. package/dist/providers.js +4 -4
  102. package/dist/{read-state-BymF41Jb.js → read-state-Dq_TXUX1.js} +2 -2
  103. package/dist/{read-state-BymF41Jb.js.map → read-state-Dq_TXUX1.js.map} +1 -1
  104. package/dist/{interpolate-BtIgcCuz.js → resolve-Cr8JSL_O.js} +562 -136
  105. package/dist/resolve-Cr8JSL_O.js.map +1 -0
  106. package/dist/restate.d.ts +2 -2
  107. package/dist/restate.js +2 -2
  108. package/dist/{sandbox-Dgy-m6UF.d.ts → sandbox-CgjG2VvQ.d.ts} +2 -2
  109. package/dist/{sandbox-Dgy-m6UF.d.ts.map → sandbox-CgjG2VvQ.d.ts.map} +1 -1
  110. package/dist/session/sqlite.d.ts +1 -1
  111. package/dist/{session-BRCsZsXa.js → session-CsdDIPY8.js} +108 -3
  112. package/dist/session-CsdDIPY8.js.map +1 -0
  113. package/dist/session.d.ts +2 -2
  114. package/dist/session.js +3 -3
  115. package/dist/skills-Bsb0rvWI.js +295 -0
  116. package/dist/skills-Bsb0rvWI.js.map +1 -0
  117. package/dist/skills.d.ts +2 -3
  118. package/dist/skills.js +3 -24
  119. package/dist/{errors-CkTvg97v.d.ts → timeout-8vSIRjzl.d.ts} +10 -2
  120. package/dist/timeout-8vSIRjzl.d.ts.map +1 -0
  121. package/dist/{timeout-kGGSXagK.js → timeout-BDetbuN6.js} +59 -2
  122. package/dist/timeout-BDetbuN6.js.map +1 -0
  123. package/dist/tool-formatters-DY0TDb1r.d.ts +378 -0
  124. package/dist/tool-formatters-DY0TDb1r.d.ts.map +1 -0
  125. package/dist/tools/fetch-url.d.ts +1 -1
  126. package/dist/tools/web-search.d.ts +1 -1
  127. package/dist/tools.d.ts +2 -3
  128. package/dist/tools.js +3 -4
  129. package/dist/{transcript-anchors-BEKMYhfo.d.ts → transcript-anchors-Cb-bDbNH.d.ts} +231 -638
  130. package/dist/transcript-anchors-Cb-bDbNH.d.ts.map +1 -0
  131. package/dist/{transcript-anchors-DR4URysA.js → transcript-anchors-DSRPWjiH.js} +189 -984
  132. package/dist/transcript-anchors-DSRPWjiH.js.map +1 -0
  133. package/dist/tui.d.ts +329 -11
  134. package/dist/tui.d.ts.map +1 -1
  135. package/dist/tui.js +5367 -1418
  136. package/dist/tui.js.map +1 -1
  137. package/dist/{turn-operations-BhglWus_.d.ts → turn-operations-CgMROLsr.d.ts} +29 -4
  138. package/dist/turn-operations-CgMROLsr.d.ts.map +1 -0
  139. package/dist/{turn-operations-tG0vuBNc.js → turn-operations-Dq9Kx7m2.js} +321 -81
  140. package/dist/turn-operations-Dq9Kx7m2.js.map +1 -0
  141. package/dist/{types-BqdTeBaC.d.ts → types-BDccavwj.d.ts} +42 -1
  142. package/dist/types-BDccavwj.d.ts.map +1 -0
  143. package/dist/{types-CyVGdbia.js → types-BIarq1qE.js} +90 -2
  144. package/dist/types-BIarq1qE.js.map +1 -0
  145. package/dist/types.d.ts +5 -6
  146. package/dist/types.js +1 -1
  147. package/dist/{xai-D9tfkrIe.js → xai-B_e6TOA8.js} +2 -2
  148. package/dist/{xai-D9tfkrIe.js.map → xai-B_e6TOA8.js.map} +1 -1
  149. package/docs/EXECUTION_CONTEXT.md +16 -0
  150. package/docs/EXTENSIONS.md +1063 -0
  151. package/docs/SKILL.md +16 -0
  152. package/docs/TUI.md +4 -0
  153. package/package.json +12 -3
  154. package/dist/agent-DCtsviti.d.ts +0 -6955
  155. package/dist/agent-DCtsviti.d.ts.map +0 -1
  156. package/dist/agent-DyI0YsAR.js.map +0 -1
  157. package/dist/auth-D9uj0nNr.js.map +0 -1
  158. package/dist/context-breakdown-kO-pDsay.js.map +0 -1
  159. package/dist/contexts-Lzf5huID.js.map +0 -1
  160. package/dist/errors-CkTvg97v.d.ts.map +0 -1
  161. package/dist/glob-DluQFSw1.js.map +0 -1
  162. package/dist/glob-shell-rJMoCIGb.js +0 -21
  163. package/dist/glob-shell-rJMoCIGb.js.map +0 -1
  164. package/dist/index-B3ciFUZx.d.ts.map +0 -1
  165. package/dist/index-CIbemeZd.d.ts +0 -316
  166. package/dist/index-CIbemeZd.d.ts.map +0 -1
  167. package/dist/index-DsIW6pmv.d.ts +0 -2738
  168. package/dist/index-DsIW6pmv.d.ts.map +0 -1
  169. package/dist/interpolate-BtIgcCuz.js.map +0 -1
  170. package/dist/logger-Ktm-lj1s.js.map +0 -1
  171. package/dist/logger-mw-311EC.d.ts +0 -102
  172. package/dist/logger-mw-311EC.d.ts.map +0 -1
  173. package/dist/login-CCA-1lgK.js +0 -267
  174. package/dist/login-CCA-1lgK.js.map +0 -1
  175. package/dist/messages-CozesxbB.js.map +0 -1
  176. package/dist/policy-DcGlpaNs.d.ts +0 -129
  177. package/dist/policy-DcGlpaNs.d.ts.map +0 -1
  178. package/dist/presets-DtyUA1-S.js +0 -114
  179. package/dist/presets-DtyUA1-S.js.map +0 -1
  180. package/dist/run-summary-BExU5Flb.d.ts +0 -249
  181. package/dist/run-summary-BExU5Flb.d.ts.map +0 -1
  182. package/dist/session-BRCsZsXa.js.map +0 -1
  183. package/dist/shell-quote-BmnhZmdM.js +0 -33
  184. package/dist/shell-quote-BmnhZmdM.js.map +0 -1
  185. package/dist/skills.js.map +0 -1
  186. package/dist/timeout-CpFm0jJ6.d.ts +0 -10
  187. package/dist/timeout-CpFm0jJ6.d.ts.map +0 -1
  188. package/dist/timeout-kGGSXagK.js.map +0 -1
  189. package/dist/tool-formatters-CpCEWwKt.d.ts +0 -1525
  190. package/dist/tool-formatters-CpCEWwKt.d.ts.map +0 -1
  191. package/dist/tools-NSzbC6Nr.js +0 -1739
  192. package/dist/tools-NSzbC6Nr.js.map +0 -1
  193. package/dist/transcript-anchors-BEKMYhfo.d.ts.map +0 -1
  194. package/dist/transcript-anchors-DR4URysA.js.map +0 -1
  195. package/dist/turn-operations-BhglWus_.d.ts.map +0 -1
  196. package/dist/turn-operations-tG0vuBNc.js.map +0 -1
  197. package/dist/types-BqdTeBaC.d.ts.map +0 -1
  198. package/dist/types-CyVGdbia.js.map +0 -1
@@ -1,5 +1,4 @@
1
- import { t as Agent } from "../agent-DCtsviti.js";
2
- import { Sn as HeadlessEvent, Tn as HeadlessResult, bn as FormattedHeadlessTurnEvent, wn as HeadlessOutputFormat, yn as FormattedHeadlessResult } from "../index-DsIW6pmv.js";
1
+ import { An as HeadlessEvent, Dn as FormattedHeadlessResult, Mi as Agent, Mn as HeadlessOutputFormat, Nn as HeadlessResult, On as FormattedHeadlessTurnEvent } from "../index-B8UtiZy7.js";
3
2
 
4
3
  //#region src/output/stream-json.d.ts
5
4
  type StreamJsonOutputFormat = HeadlessOutputFormat;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-json.d.ts","names":[],"sources":["../../src/output/stream-json.ts"],"mappings":";;;;KA2BY,sBAAA,GAAyB,oBAAoB;AAAA,KAC7C,mBAAA,GAAsB,OAAO,CAAC,aAAA;EAAiB,IAAA;AAAA;AAAA,UAE1C,uBAAA;EACf,MAAA,GAAS,sBAAsB;EAC/B,YAAA;AAAA;AAAA,UAGe,uBAAA,SAAgC,uBAAuB;EACtE,KAAA,IAAS,IAAA;AAAA;AAAA,iBAiBK,yBAAA,CACd,KAAA,EAAO,mBAAA,EACP,OAAA,GAAS,uBAAA,GACR,0BAAA;AAAA,iBAIa,0BAAA,CACd,KAAA,EAAO,mBAAA,EACP,OAAA,GAAS,uBAA4B;AAAA,iBAKvB,sBAAA,CACd,MAAA,EAAQ,cAAA,EACR,OAAA,GAAS,uBAAA,GACR,uBAAA;AAAA,iBAIa,uBAAA,CACd,MAAA,EAAQ,cAAA,EACR,OAAA,GAAS,uBAA4B;AAAA,iBAKvB,6BAAA,CACd,OAAA,GAAS,uBAAA,IACP,KAAA,EAAO,aAAa;AAAA,iBASR,qBAAA,CACd,KAAA,EAAO,KAAA,EACP,OAAA,GAAS,uBAA4B"}
1
+ {"version":3,"file":"stream-json.d.ts","names":[],"sources":["../../src/output/stream-json.ts"],"mappings":";;;KA2BY,sBAAA,GAAyB,oBAAoB;AAAA,KAC7C,mBAAA,GAAsB,OAAO,CAAC,aAAA;EAAiB,IAAA;AAAA;AAAA,UAE1C,uBAAA;EACf,MAAA,GAAS,sBAAsB;EAC/B,YAAA;AAAA;AAAA,UAGe,uBAAA,SAAgC,uBAAuB;EACtE,KAAA,IAAS,IAAA;AAAA;AAAA,iBAiBK,yBAAA,CACd,KAAA,EAAO,mBAAA,EACP,OAAA,GAAS,uBAAA,GACR,0BAAA;AAAA,iBAIa,0BAAA,CACd,KAAA,EAAO,mBAAA,EACP,OAAA,GAAS,uBAA4B;AAAA,iBAKvB,sBAAA,CACd,MAAA,EAAQ,cAAA,EACR,OAAA,GAAS,uBAAA,GACR,uBAAA;AAAA,iBAIa,uBAAA,CACd,MAAA,EAAQ,cAAA,EACR,OAAA,GAAS,uBAA4B;AAAA,iBAKvB,6BAAA,CACd,OAAA,GAAS,uBAAA,IACP,KAAA,EAAO,aAAa;AAAA,iBASR,qBAAA,CACd,KAAA,EAAO,KAAA,EACP,OAAA,GAAS,uBAA4B"}
@@ -1,5 +1,4 @@
1
- import { r as AgentHooks, t as Agent } from "../agent-DCtsviti.js";
2
- import { t as Preset } from "../index-DsIW6pmv.js";
1
+ import { Mi as Agent, Pi as AgentHooks, t as Preset } from "../index-B8UtiZy7.js";
3
2
 
4
3
  //#region src/output/terminal.d.ts
5
4
  interface TerminalOutputOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","names":[],"sources":["../../src/output/terminal.ts"],"mappings":";;;;UA+CiB,qBAAA;EACf,WAAA;EACA,KAAA;EACA,WAAA;EACA,mBAAA,IAAuB,GAAA,EAAK,UAAA,CAAW,UAAA;EACvC,kBAAA,IAAsB,KAAA,EAAO,UAAA,CAAW,UAAA;AAAA;AAAA,iBAG1B,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,KAAA,UAAe,MAAA,UAAgB,MAAA,EAAQ,MAAM,EAAE,KAAA;;;;;;;;;iBAsB3E,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,KAAA,UAAe,MAAA,UAAgB,MAAA,EAAQ,MAAA,EAAQ,OAAA,GAAS,qBAAA,GAA6B,OAAA"}
1
+ {"version":3,"file":"terminal.d.ts","names":[],"sources":["../../src/output/terminal.ts"],"mappings":";;;UA+CiB,qBAAA;EACf,WAAA;EACA,KAAA;EACA,WAAA;EACA,mBAAA,IAAuB,GAAA,EAAK,UAAA,CAAW,UAAA;EACvC,kBAAA,IAAsB,KAAA,EAAO,UAAA,CAAW,UAAA;AAAA;AAAA,iBAG1B,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,KAAA,UAAe,MAAA,UAAgB,MAAA,EAAQ,MAAM,EAAE,KAAA;;;;;;;;;iBAsB3E,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,KAAA,UAAe,MAAA,UAAgB,MAAA,EAAQ,MAAA,EAAQ,OAAA,GAAS,qBAAA,GAA6B,OAAA"}
@@ -265,6 +265,54 @@ async function globFilesLocal(pattern, cwd, options) {
265
265
  return globPortable(pattern, cwd, limit, includeMetadata, signal);
266
266
  }
267
267
  //#endregion
268
- export { parseGitLsFiles as i, globLiteralPrefix as n, GIT_LS_FILES_COMMAND as r, globFilesLocal as t };
268
+ //#region src/contexts/output-cap.ts
269
+ /** Default per-stream cap shared by exec transports. */
270
+ const DEFAULT_MAX_OUTPUT_BUFFER = 10 * 1024 * 1024;
271
+ /**
272
+ * Append `chunk` to `slot` under `maxBytes`. Returns:
273
+ *
274
+ * - `'ok'` — appended in full
275
+ * - `'overflow'` — partially appended up to the cap (cut on a UTF-8
276
+ * codepoint boundary); the caller should stop the
277
+ * producer and mark the result truncated
278
+ * - `'dropped'` — slot already full, nothing appended (still
279
+ * truncation: this chunk's data is lost)
280
+ */
281
+ function appendCapped(slot, chunk, maxBytes) {
282
+ if (slot.bytes >= maxBytes) return "dropped";
283
+ const room = maxBytes - slot.bytes;
284
+ if (chunk.length <= room) {
285
+ slot.text += chunk.toString("utf8");
286
+ slot.bytes += chunk.length;
287
+ return "ok";
288
+ }
289
+ let end = room;
290
+ while (end > 0 && (chunk[end] & 192) === 128) end--;
291
+ const piece = chunk.subarray(0, end);
292
+ slot.text += piece.toString("utf8");
293
+ slot.bytes += piece.length;
294
+ return "overflow";
295
+ }
296
+ /**
297
+ * The overflow message contract shared by every capped exec transport
298
+ * and by the tool-side consumers that must recognize it (`read_file` /
299
+ * `edit` surface transport overflows honestly instead of "File not
300
+ * found"). Producers MUST build the message through
301
+ * {@link outputExceededMessage} and consumers MUST detect it through
302
+ * {@link isOutputExceededMessage} — a reworded literal on either side
303
+ * would silently break the recognition and regress the misleading
304
+ * errors this contract exists to prevent.
305
+ */
306
+ const OUTPUT_EXCEEDED_MARKER = "output exceeded";
307
+ /** Build a transport overflow message. `detail` describes the transport's reaction. */
308
+ function outputExceededMessage(maxBytes, detail) {
309
+ return `${OUTPUT_EXCEEDED_MARKER} ${maxBytes}-byte buffer; ${detail}`;
310
+ }
311
+ /** Recognize a transport overflow in an error/stderr string. */
312
+ function isOutputExceededMessage(message) {
313
+ return message.includes(OUTPUT_EXCEEDED_MARKER);
314
+ }
315
+ //#endregion
316
+ export { globFilesLocal as a, parseGitLsFiles as c, outputExceededMessage as i, appendCapped as n, globLiteralPrefix as o, isOutputExceededMessage as r, GIT_LS_FILES_COMMAND as s, DEFAULT_MAX_OUTPUT_BUFFER as t };
269
317
 
270
- //# sourceMappingURL=glob-DluQFSw1.js.map
318
+ //# sourceMappingURL=output-cap-kBUHBlnq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-cap-kBUHBlnq.js","names":[],"sources":["../src/contexts/git-ls-files.ts","../src/contexts/git-ls-files-local.ts","../src/contexts/glob.ts","../src/contexts/output-cap.ts"],"sourcesContent":["/**\n * Pure (node-free) `git ls-files` helpers shared by the gitignore-aware paths\n * of the `glob` and `grep` tools.\n *\n * `git ls-files --cached --others --exclude-standard` lists tracked files plus\n * untracked-but-not-ignored files, applying `.gitignore`, `.git/info/exclude`,\n * and the user's global excludes. Git never descends ignored directories\n * (`node_modules`, build output, …), so this is both correct and sub-second on\n * large repos — unlike a raw filesystem walk.\n *\n * This module has ZERO node imports so it can be pulled into edge/workerd\n * bundles (e.g. via the `grep` tool, which drives git through the execution\n * context's `exec` seam). The node-spawn variant lives in\n * `./git-ls-files-local`.\n */\n\n/** Argv for `git ls-files`, NUL-delimited so paths with newlines stay intact. */\nexport const GIT_LS_FILES_ARGS = ['ls-files', '--cached', '--others', '--exclude-standard', '-z'] as const\n\n/** The same invocation as a shell command string for the `exec` seam. */\nexport const GIT_LS_FILES_COMMAND = `git ${GIT_LS_FILES_ARGS.join(' ')}`\n\n/** Split NUL-delimited `git ls-files -z` output into paths. */\nexport function parseGitLsFiles(stdout: string): string[] {\n return stdout.split('\\0').filter(p => p.length > 0)\n}\n","/**\n * Node-spawn `git ls-files` runner used by the local process context's glob.\n *\n * Kept separate from `./git-ls-files` (which stays node-free for edge bundles)\n * because this leg imports `node:child_process`.\n */\n\nimport { spawn } from 'node:child_process'\nimport { GIT_LS_FILES_ARGS, parseGitLsFiles } from './git-ls-files'\n\n/**\n * Run `git ls-files` in `cwd` and return its non-ignored paths (relative to\n * `cwd`). Returns `null` when the directory is not a git repo, git is missing,\n * or the call aborts — callers treat `null` as \"fall back to a filesystem\n * walk\". Never throws.\n */\nexport async function gitListFilesLocal(cwd: string, signal?: AbortSignal): Promise<string[] | null> {\n return new Promise<string[] | null>((resolveP) => {\n let child: ReturnType<typeof spawn>\n try {\n child = spawn('git', [...GIT_LS_FILES_ARGS], { cwd, stdio: ['ignore', 'pipe', 'pipe'] })\n }\n catch {\n resolveP(null)\n return\n }\n if (signal?.aborted) {\n child.kill('SIGTERM')\n resolveP(null)\n return\n }\n const stdoutChunks: string[] = []\n const onAbort = () => child.kill('SIGTERM')\n signal?.addEventListener('abort', onAbort, { once: true })\n child.stdout?.setEncoding('utf8')\n child.stdout?.on('data', chunk => stdoutChunks.push(chunk as string))\n child.on('error', () => {\n signal?.removeEventListener('abort', onAbort)\n resolveP(null)\n })\n child.on('close', (code) => {\n signal?.removeEventListener('abort', onAbort)\n if (code !== 0 || signal?.aborted) {\n resolveP(null)\n return\n }\n resolveP(parseGitLsFiles(stdoutChunks.join('')))\n })\n })\n}\n","import type { ListFileMetadata } from './types'\nimport { readdir, stat } from 'node:fs/promises'\nimport { dirname, resolve, sep } from 'node:path'\nimport { lazyAsync } from '../lazy'\nimport { gitListFilesLocal } from './git-ls-files-local'\n\ntype NodeGlob = (pattern: string, options: { cwd: string }) => AsyncIterable<string>\n\ninterface BunGlobInstance { scan: (options: { cwd: string, onlyFiles?: boolean, dot?: boolean }) => AsyncIterable<string> }\ntype BunGlobCtor = new (pattern: string) => BunGlobInstance\n\nconst loadNativeNodeGlob = lazyAsync(async (): Promise<NodeGlob | undefined> => {\n const candidate = (await import('node:fs/promises') as { glob?: unknown }).glob\n return typeof candidate === 'function' ? candidate as NodeGlob : undefined\n})\n\nfunction forcePortable(): boolean {\n return (globalThis as { __zidaneForcePortableGlobForTests?: boolean }).__zidaneForcePortableGlobForTests === true\n}\n\nasync function loadNodeGlob(): Promise<NodeGlob | undefined> {\n if (forcePortable())\n return undefined\n return loadNativeNodeGlob()\n}\n\n/**\n * Bun's `node:fs/promises.glob` buffers the entire directory walk before\n * yielding (so an early `limit` break never fires — a broad `**` pattern over\n * a large `node_modules` hangs). `Bun.Glob().scan()` streams incrementally and\n * is the fast path under Bun. Returns undefined off Bun or when tests force the\n * portable walker.\n */\nfunction loadBunGlob(): BunGlobCtor | undefined {\n if (forcePortable())\n return undefined\n const bun = (globalThis as { Bun?: { Glob?: unknown } }).Bun\n return bun && typeof bun.Glob === 'function' ? bun.Glob as BunGlobCtor : undefined\n}\n\nfunction escapeRegexChar(char: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(char) ? `\\\\${char}` : char\n}\n\nexport function expandBraces(pattern: string): string[] {\n const start = pattern.indexOf('{')\n if (start === -1)\n return [pattern]\n const end = pattern.indexOf('}', start + 1)\n if (end === -1)\n return [pattern]\n const body = pattern.slice(start + 1, end)\n if (!body || !body.includes(','))\n return [pattern]\n return body\n .split(',')\n .flatMap(part => expandBraces(`${pattern.slice(0, start)}${part}${pattern.slice(end + 1)}`))\n}\n\nexport function globPatternToRegex(pattern: string): RegExp {\n let out = '^'\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n const next = pattern[i + 1]\n if (char === '*') {\n if (next === '*') {\n const after = pattern[i + 2]\n if (after === '/') {\n out += '(?:[^/]+/)*'\n i += 2\n }\n else {\n out += '.*'\n i += 1\n }\n }\n else {\n out += '[^/]*'\n }\n }\n else if (char === '?') {\n out += '[^/]'\n }\n else if (char === '[') {\n const end = pattern.indexOf(']', i + 1)\n if (end === -1) {\n out += '\\\\['\n }\n else {\n let cls = pattern.slice(i + 1, end)\n if (cls.startsWith('!'))\n cls = `^${cls.slice(1)}`\n out += `[${cls}]`\n i = end\n }\n }\n else {\n out += escapeRegexChar(char)\n }\n }\n return new RegExp(`${out}$`)\n}\n\nexport function globLiteralPrefix(pattern: string): string {\n const firstMeta = pattern.search(/[*?[\\]{}]/)\n const prefix = firstMeta === -1 ? dirname(pattern) : pattern.slice(0, firstMeta)\n const slash = prefix.lastIndexOf('/')\n if (slash === -1)\n return ''\n return prefix.slice(0, slash)\n}\n\nexport function hasGlobPattern(path: string): boolean {\n return /[*?[\\]{}]/.test(path)\n}\n\n/**\n * True when a pattern can match files outside `cwd` — an absolute path, a\n * Windows drive, or any `..` segment. Such patterns can't use the `git\n * ls-files` path (git only knows files under the repo) and fall back to the\n * filesystem walk.\n */\nfunction patternEscapesCwd(pattern: string): boolean {\n const norm = pattern.split(sep).join('/')\n if (norm.startsWith('/') || /^[a-z]:/i.test(norm))\n return true\n return norm.split('/').includes('..')\n}\n\nasync function addMetadata(cwd: string, rel: string, includeMetadata: boolean): Promise<ListFileMetadata | null> {\n try {\n const s = await stat(resolve(cwd, rel))\n if (!s.isFile())\n return null\n return includeMetadata ? { path: rel, size: s.size, mtimeMs: s.mtimeMs } : { path: rel }\n }\n catch {\n return null\n }\n}\n\nfunction compilePattern(pattern: string): RegExp[] {\n return expandBraces(pattern.split(sep).join('/')).map(globPatternToRegex)\n}\n\n/** Match the (already non-ignored) `git ls-files` set against the glob pattern. */\nasync function matchGitFiles(\n gitFiles: readonly string[],\n pattern: string,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[]> {\n const regexes = compilePattern(pattern)\n const out: ListFileMetadata[] = []\n for (const rel of gitFiles) {\n if (signal?.aborted || out.length >= limit)\n break\n if (!regexes.some(regex => regex.test(rel)))\n continue\n out.push(includeMetadata ? await addMetadata(cwd, rel, true) ?? { path: rel } : { path: rel })\n }\n return out.sort((a, b) => a.path.localeCompare(b.path))\n}\n\n/** Depth-first walk that matches against `regexes` and stops at `limit`. */\nasync function walkMatch(\n root: string,\n prefix: string,\n regexes: RegExp[],\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n out: ListFileMetadata[],\n): Promise<void> {\n if (out.length >= limit || signal?.aborted)\n return\n let entries: Array<{ name: string, isDirectory: () => boolean, isFile: () => boolean }>\n try {\n entries = await readdir(resolve(root, prefix), { encoding: 'utf8', withFileTypes: true })\n }\n catch {\n return\n }\n for (const entry of entries) {\n if (out.length >= limit || signal?.aborted)\n return\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isDirectory()) {\n await walkMatch(root, rel, regexes, cwd, limit, includeMetadata, signal, out)\n }\n else if (entry.isFile() && regexes.some(regex => regex.test(rel))) {\n out.push(includeMetadata ? await addMetadata(cwd, rel, true) ?? { path: rel } : { path: rel })\n }\n }\n}\n\nasync function globPortable(\n pattern: string,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[]> {\n const normalized = pattern.split(sep).join('/')\n const startPrefix = globLiteralPrefix(normalized)\n const regexes = expandBraces(normalized).map(globPatternToRegex)\n const out: ListFileMetadata[] = []\n await walkMatch(cwd, startPrefix, regexes, cwd, limit, includeMetadata, signal, out)\n return out.sort((a, b) => a.path.localeCompare(b.path))\n}\n\nasync function collectFromIterable(\n iter: AsyncIterable<string>,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[] | null> {\n const results: ListFileMetadata[] = []\n // A native scan can throw mid-iteration on a pathological tree (e.g. a\n // recursive symlink cycle → ENAMETOOLONG) and there's no way to resume it.\n // Signal the caller (null) to recover via the portable walk, which recurses\n // only into real directories and isolates per-directory errors.\n try {\n for await (const rel of iter) {\n if (signal?.aborted)\n break\n const entry = await addMetadata(cwd, rel, includeMetadata)\n if (!entry)\n continue\n results.push(entry)\n if (results.length >= limit)\n break\n }\n }\n catch {\n return null\n }\n return results.sort((a, b) => a.path.localeCompare(b.path))\n}\n\nfunction globViaBun(\n BunGlob: BunGlobCtor,\n pattern: string,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[] | null> {\n // `dot: true` keeps dotfile matching consistent with the Node + portable\n // paths; `onlyFiles: true` mirrors their file-only results.\n const scan = new BunGlob(pattern).scan({ cwd, onlyFiles: true, dot: true })\n return collectFromIterable(scan, cwd, limit, includeMetadata, signal)\n}\n\nexport async function globFilesLocal(\n pattern: string,\n cwd: string,\n options: { limit: number, metadata?: boolean, gitignore?: boolean, signal?: AbortSignal },\n): Promise<ListFileMetadata[]> {\n const includeMetadata = options.metadata === true\n const { limit, signal } = options\n\n // Default path: intersect the pattern with git's non-ignored file set. Git\n // skips `.gitignore`d trees (`node_modules`, build dirs) entirely, so this is\n // both correct and fast — and never triggers the Bun `fs.glob` hang. The\n // test-only force-portable flag also bypasses it so the filesystem walker\n // stays directly exercisable.\n if (options.gitignore !== false && !forcePortable() && !patternEscapesCwd(pattern)) {\n const gitFiles = await gitListFilesLocal(cwd, signal)\n if (gitFiles)\n return matchGitFiles(gitFiles, pattern, cwd, limit, includeMetadata, signal)\n }\n\n // Fallback path: filesystem glob (gitignore disabled, not a git repo, or the\n // pattern escapes cwd). Prefer a fast native scanner; if it throws on a\n // pathological tree (null), recover via the portable walk.\n const bunGlob = loadBunGlob()\n if (bunGlob) {\n const viaBun = await globViaBun(bunGlob, pattern, cwd, limit, includeMetadata, signal)\n if (viaBun)\n return viaBun\n }\n else {\n const nodeGlob = await loadNodeGlob()\n if (nodeGlob) {\n const viaNode = await collectFromIterable(nodeGlob(pattern, { cwd }), cwd, limit, includeMetadata, signal)\n if (viaNode)\n return viaNode\n }\n }\n\n return globPortable(pattern, cwd, limit, includeMetadata, signal)\n}\n\n// `globFilesViaShell` moved to `./glob-shell` (node-free) so remote-only\n// contexts can import it without pulling this module's `node:fs` imports.\n// Re-exported here for back-compat.\nexport { globFilesViaShell } from './glob-shell'\n","/**\n * Byte-capped output accumulation — the shared primitive behind every\n * exec transport's stdout/stderr buffering. A context that buffers\n * command output in host memory MUST bound it: an uncapped `cat` of a\n * multi-GB file (directly, or via a `readFile`-through-exec\n * implementation like docker's) OOMs the HOST process regardless of any\n * limits inside the container/sandbox.\n *\n * The math lives here so process + docker (and future transports) share\n * one definition of \"capped\": byte accounting (not UTF-16 `.length`,\n * which undercounts multi-byte UTF-8) and codepoint-boundary cuts (a\n * blind byte slice can split a UTF-8 sequence and corrupt the tail).\n * Overflow ORCHESTRATION stays with each transport — process kills the\n * child's process group, docker destroys the stream and lets the\n * server-side `timeout` wrapper reap the command.\n */\n\nimport type { Buffer } from 'node:buffer'\n\n/** Default per-stream cap shared by exec transports. */\nexport const DEFAULT_MAX_OUTPUT_BUFFER = 10 * 1024 * 1024\n\nexport interface CappedSlot {\n text: string\n bytes: number\n}\n\n/**\n * Append `chunk` to `slot` under `maxBytes`. Returns:\n *\n * - `'ok'` — appended in full\n * - `'overflow'` — partially appended up to the cap (cut on a UTF-8\n * codepoint boundary); the caller should stop the\n * producer and mark the result truncated\n * - `'dropped'` — slot already full, nothing appended (still\n * truncation: this chunk's data is lost)\n */\nexport function appendCapped(slot: CappedSlot, chunk: Buffer, maxBytes: number): 'ok' | 'overflow' | 'dropped' {\n if (slot.bytes >= maxBytes)\n return 'dropped'\n const room = maxBytes - slot.bytes\n if (chunk.length <= room) {\n slot.text += chunk.toString('utf8')\n slot.bytes += chunk.length\n return 'ok'\n }\n // Cut on a UTF-8 codepoint boundary: if the byte right after the cut is\n // a continuation byte (0b10xxxxxx), back off until it isn't.\n let end = room\n while (end > 0 && ((chunk[end] as number) & 0xC0) === 0x80)\n end--\n const piece = chunk.subarray(0, end)\n slot.text += piece.toString('utf8')\n slot.bytes += piece.length\n return 'overflow'\n}\n\n/**\n * The overflow message contract shared by every capped exec transport\n * and by the tool-side consumers that must recognize it (`read_file` /\n * `edit` surface transport overflows honestly instead of \"File not\n * found\"). Producers MUST build the message through\n * {@link outputExceededMessage} and consumers MUST detect it through\n * {@link isOutputExceededMessage} — a reworded literal on either side\n * would silently break the recognition and regress the misleading\n * errors this contract exists to prevent.\n */\nconst OUTPUT_EXCEEDED_MARKER = 'output exceeded'\n\n/** Build a transport overflow message. `detail` describes the transport's reaction. */\nexport function outputExceededMessage(maxBytes: number, detail: string): string {\n return `${OUTPUT_EXCEEDED_MARKER} ${maxBytes}-byte buffer; ${detail}`\n}\n\n/** Recognize a transport overflow in an error/stderr string. */\nexport function isOutputExceededMessage(message: string): boolean {\n return message.includes(OUTPUT_EXCEEDED_MARKER)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiBA,MAAa,oBAAoB;CAAC;CAAY;CAAY;CAAY;CAAsB;AAAI;;AAGhG,MAAa,uBAAuB,OAAO,kBAAkB,KAAK,GAAG;;AAGrE,SAAgB,gBAAgB,QAA0B;CACxD,OAAO,OAAO,MAAM,IAAI,EAAE,QAAO,MAAK,EAAE,SAAS,CAAC;AACpD;;;;;;;;;;;;;;;ACTA,eAAsB,kBAAkB,KAAa,QAAgD;CACnG,OAAO,IAAI,SAA0B,aAAa;EAChD,IAAI;EACJ,IAAI;GACF,QAAQ,MAAM,OAAO,CAAC,GAAG,iBAAiB,GAAG;IAAE;IAAK,OAAO;KAAC;KAAU;KAAQ;IAAM;GAAE,CAAC;EACzF,QACM;GACJ,SAAS,IAAI;GACb;EACF;EACA,IAAI,QAAQ,SAAS;GACnB,MAAM,KAAK,SAAS;GACpB,SAAS,IAAI;GACb;EACF;EACA,MAAM,eAAyB,CAAC;EAChC,MAAM,gBAAgB,MAAM,KAAK,SAAS;EAC1C,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACzD,MAAM,QAAQ,YAAY,MAAM;EAChC,MAAM,QAAQ,GAAG,SAAQ,UAAS,aAAa,KAAK,KAAe,CAAC;EACpE,MAAM,GAAG,eAAe;GACtB,QAAQ,oBAAoB,SAAS,OAAO;GAC5C,SAAS,IAAI;EACf,CAAC;EACD,MAAM,GAAG,UAAU,SAAS;GAC1B,QAAQ,oBAAoB,SAAS,OAAO;GAC5C,IAAI,SAAS,KAAK,QAAQ,SAAS;IACjC,SAAS,IAAI;IACb;GACF;GACA,SAAS,gBAAgB,aAAa,KAAK,EAAE,CAAC,CAAC;EACjD,CAAC;CACH,CAAC;AACH;;;ACtCA,MAAM,qBAAqB,UAAU,YAA2C;CAC9E,MAAM,aAAa,MAAM,OAAO,qBAA2C;CAC3E,OAAO,OAAO,cAAc,aAAa,YAAwB,KAAA;AACnE,CAAC;AAED,SAAS,gBAAyB;CAChC,OAAQ,WAA+D,sCAAsC;AAC/G;AAEA,eAAe,eAA8C;CAC3D,IAAI,cAAc,GAChB,OAAO,KAAA;CACT,OAAO,mBAAmB;AAC5B;;;;;;;;AASA,SAAS,cAAuC;CAC9C,IAAI,cAAc,GAChB,OAAO,KAAA;CACT,MAAM,MAAO,WAA4C;CACzD,OAAO,OAAO,OAAO,IAAI,SAAS,aAAa,IAAI,OAAsB,KAAA;AAC3E;AAEA,SAAS,gBAAgB,MAAsB;CAC7C,OAAO,qBAAqB,KAAK,IAAI,IAAI,KAAK,SAAS;AACzD;AAEA,SAAgB,aAAa,SAA2B;CACtD,MAAM,QAAQ,QAAQ,QAAQ,GAAG;CACjC,IAAI,UAAU,IACZ,OAAO,CAAC,OAAO;CACjB,MAAM,MAAM,QAAQ,QAAQ,KAAK,QAAQ,CAAC;CAC1C,IAAI,QAAQ,IACV,OAAO,CAAC,OAAO;CACjB,MAAM,OAAO,QAAQ,MAAM,QAAQ,GAAG,GAAG;CACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,GAAG,GAC7B,OAAO,CAAC,OAAO;CACjB,OAAO,KACJ,MAAM,GAAG,EACT,SAAQ,SAAQ,aAAa,GAAG,QAAQ,MAAM,GAAG,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM,CAAC,GAAG,CAAC;AAC/F;AAEA,SAAgB,mBAAmB,SAAyB;CAC1D,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,SAAS,KACX,IAAI,SAAS,KAEX,IADc,QAAQ,IAAI,OACZ,KAAK;GACjB,OAAO;GACP,KAAK;EACP,OACK;GACH,OAAO;GACP,KAAK;EACP;OAGA,OAAO;OAGN,IAAI,SAAS,KAChB,OAAO;OAEJ,IAAI,SAAS,KAAK;GACrB,MAAM,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC;GACtC,IAAI,QAAQ,IACV,OAAO;QAEJ;IACH,IAAI,MAAM,QAAQ,MAAM,IAAI,GAAG,GAAG;IAClC,IAAI,IAAI,WAAW,GAAG,GACpB,MAAM,IAAI,IAAI,MAAM,CAAC;IACvB,OAAO,IAAI,IAAI;IACf,IAAI;GACN;EACF,OAEE,OAAO,gBAAgB,IAAI;CAE/B;CACA,OAAO,IAAI,OAAO,GAAG,IAAI,EAAE;AAC7B;AAEA,SAAgB,kBAAkB,SAAyB;CACzD,MAAM,YAAY,QAAQ,OAAO,WAAW;CAC5C,MAAM,SAAS,cAAc,KAAK,QAAQ,OAAO,IAAI,QAAQ,MAAM,GAAG,SAAS;CAC/E,MAAM,QAAQ,OAAO,YAAY,GAAG;CACpC,IAAI,UAAU,IACZ,OAAO;CACT,OAAO,OAAO,MAAM,GAAG,KAAK;AAC9B;;;;;;;AAYA,SAAS,kBAAkB,SAA0B;CACnD,MAAM,OAAO,QAAQ,MAAM,GAAG,EAAE,KAAK,GAAG;CACxC,IAAI,KAAK,WAAW,GAAG,KAAK,WAAW,KAAK,IAAI,GAC9C,OAAO;CACT,OAAO,KAAK,MAAM,GAAG,EAAE,SAAS,IAAI;AACtC;AAEA,eAAe,YAAY,KAAa,KAAa,iBAA4D;CAC/G,IAAI;EACF,MAAM,IAAI,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;EACtC,IAAI,CAAC,EAAE,OAAO,GACZ,OAAO;EACT,OAAO,kBAAkB;GAAE,MAAM;GAAK,MAAM,EAAE;GAAM,SAAS,EAAE;EAAQ,IAAI,EAAE,MAAM,IAAI;CACzF,QACM;EACJ,OAAO;CACT;AACF;AAEA,SAAS,eAAe,SAA2B;CACjD,OAAO,aAAa,QAAQ,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,kBAAkB;AAC1E;;AAGA,eAAe,cACb,UACA,SACA,KACA,OACA,iBACA,QAC6B;CAC7B,MAAM,UAAU,eAAe,OAAO;CACtC,MAAM,MAA0B,CAAC;CACjC,KAAK,MAAM,OAAO,UAAU;EAC1B,IAAI,QAAQ,WAAW,IAAI,UAAU,OACnC;EACF,IAAI,CAAC,QAAQ,MAAK,UAAS,MAAM,KAAK,GAAG,CAAC,GACxC;EACF,IAAI,KAAK,kBAAkB,MAAM,YAAY,KAAK,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,CAAC;CAC/F;CACA,OAAO,IAAI,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACxD;;AAGA,eAAe,UACb,MACA,QACA,SACA,KACA,OACA,iBACA,QACA,KACe;CACf,IAAI,IAAI,UAAU,SAAS,QAAQ,SACjC;CACF,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,QAAQ,QAAQ,MAAM,MAAM,GAAG;GAAE,UAAU;GAAQ,eAAe;EAAK,CAAC;CAC1F,QACM;EACJ;CACF;CACA,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,IAAI,UAAU,SAAS,QAAQ,SACjC;EACF,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,SAAS,MAAM;EACvD,IAAI,MAAM,YAAY,GACpB,MAAM,UAAU,MAAM,KAAK,SAAS,KAAK,OAAO,iBAAiB,QAAQ,GAAG;OAEzE,IAAI,MAAM,OAAO,KAAK,QAAQ,MAAK,UAAS,MAAM,KAAK,GAAG,CAAC,GAC9D,IAAI,KAAK,kBAAkB,MAAM,YAAY,KAAK,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,CAAC;CAEjG;AACF;AAEA,eAAe,aACb,SACA,KACA,OACA,iBACA,QAC6B;CAC7B,MAAM,aAAa,QAAQ,MAAM,GAAG,EAAE,KAAK,GAAG;CAC9C,MAAM,cAAc,kBAAkB,UAAU;CAChD,MAAM,UAAU,aAAa,UAAU,EAAE,IAAI,kBAAkB;CAC/D,MAAM,MAA0B,CAAC;CACjC,MAAM,UAAU,KAAK,aAAa,SAAS,KAAK,OAAO,iBAAiB,QAAQ,GAAG;CACnF,OAAO,IAAI,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACxD;AAEA,eAAe,oBACb,MACA,KACA,OACA,iBACA,QACoC;CACpC,MAAM,UAA8B,CAAC;CAKrC,IAAI;EACF,WAAW,MAAM,OAAO,MAAM;GAC5B,IAAI,QAAQ,SACV;GACF,MAAM,QAAQ,MAAM,YAAY,KAAK,KAAK,eAAe;GACzD,IAAI,CAAC,OACH;GACF,QAAQ,KAAK,KAAK;GAClB,IAAI,QAAQ,UAAU,OACpB;EACJ;CACF,QACM;EACJ,OAAO;CACT;CACA,OAAO,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC5D;AAEA,SAAS,WACP,SACA,SACA,KACA,OACA,iBACA,QACoC;CAIpC,OAAO,oBADM,IAAI,QAAQ,OAAO,EAAE,KAAK;EAAE;EAAK,WAAW;EAAM,KAAK;CAAK,CAC3C,GAAG,KAAK,OAAO,iBAAiB,MAAM;AACtE;AAEA,eAAsB,eACpB,SACA,KACA,SAC6B;CAC7B,MAAM,kBAAkB,QAAQ,aAAa;CAC7C,MAAM,EAAE,OAAO,WAAW;CAO1B,IAAI,QAAQ,cAAc,SAAS,CAAC,cAAc,KAAK,CAAC,kBAAkB,OAAO,GAAG;EAClF,MAAM,WAAW,MAAM,kBAAkB,KAAK,MAAM;EACpD,IAAI,UACF,OAAO,cAAc,UAAU,SAAS,KAAK,OAAO,iBAAiB,MAAM;CAC/E;CAKA,MAAM,UAAU,YAAY;CAC5B,IAAI,SAAS;EACX,MAAM,SAAS,MAAM,WAAW,SAAS,SAAS,KAAK,OAAO,iBAAiB,MAAM;EACrF,IAAI,QACF,OAAO;CACX,OACK;EACH,MAAM,WAAW,MAAM,aAAa;EACpC,IAAI,UAAU;GACZ,MAAM,UAAU,MAAM,oBAAoB,SAAS,SAAS,EAAE,IAAI,CAAC,GAAG,KAAK,OAAO,iBAAiB,MAAM;GACzG,IAAI,SACF,OAAO;EACX;CACF;CAEA,OAAO,aAAa,SAAS,KAAK,OAAO,iBAAiB,MAAM;AAClE;;;;ACpRA,MAAa,4BAA4B,KAAK,OAAO;;;;;;;;;;;AAiBrD,SAAgB,aAAa,MAAkB,OAAe,UAAiD;CAC7G,IAAI,KAAK,SAAS,UAChB,OAAO;CACT,MAAM,OAAO,WAAW,KAAK;CAC7B,IAAI,MAAM,UAAU,MAAM;EACxB,KAAK,QAAQ,MAAM,SAAS,MAAM;EAClC,KAAK,SAAS,MAAM;EACpB,OAAO;CACT;CAGA,IAAI,MAAM;CACV,OAAO,MAAM,MAAO,MAAM,OAAkB,SAAU,KACpD;CACF,MAAM,QAAQ,MAAM,SAAS,GAAG,GAAG;CACnC,KAAK,QAAQ,MAAM,SAAS,MAAM;CAClC,KAAK,SAAS,MAAM;CACpB,OAAO;AACT;;;;;;;;;;;AAYA,MAAM,yBAAyB;;AAG/B,SAAgB,sBAAsB,UAAkB,QAAwB;CAC9E,OAAO,GAAG,uBAAuB,GAAG,SAAS,gBAAgB;AAC/D;;AAGA,SAAgB,wBAAwB,SAA0B;CAChE,OAAO,QAAQ,SAAS,sBAAsB;AAChD"}
package/dist/presets.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- import { n as AgentHookMap } from "./agent-DCtsviti.js";
2
- import { a as basicTools, i as _default, n as composePresets, r as definePreset, t as Preset } from "./index-DsIW6pmv.js";
1
+ import { Ni as AgentHookMap, a as basicTools, i as _default, n as composePresets, r as definePreset, t as Preset } from "./index-B8UtiZy7.js";
3
2
  export { type AgentHookMap, Preset, _default as basic, basicTools, composePresets, definePreset };
package/dist/presets.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as basic_default, n as definePreset, r as basicTools, t as composePresets } from "./presets-DtyUA1-S.js";
1
+ import { at as definePreset, it as composePresets, ot as basicTools, st as basic_default } from "./agent-DkSmGkDM.js";
2
2
  export { basic_default as basic, basicTools, composePresets, definePreset };
@@ -1,2 +1,2 @@
1
- import { An as defaultAnthropicMaxTokens, Dn as anthropic, En as AnthropicThinkingPlan, Mn as resolveAnthropicBetas, Nn as resolveAnthropicMaxOutput, On as applyAnthropicCacheBreakpoints, Tn as AnthropicParams, jn as planAnthropicThinking, kn as classifyAnthropicError, wn as AnthropicContextManagement } from "../agent-DCtsviti.js";
1
+ import { Sm as resolveAnthropicMaxOutput, _m as applyAnthropicCacheBreakpoints, bm as planAnthropicThinking, gm as anthropic, hm as AnthropicThinkingPlan, mm as AnthropicParams, pm as AnthropicContextManagement, vm as classifyAnthropicError, xm as resolveAnthropicBetas, ym as defaultAnthropicMaxTokens } from "../index-B8UtiZy7.js";
2
2
  export { AnthropicContextManagement, AnthropicParams, AnthropicThinkingPlan, anthropic, applyAnthropicCacheBreakpoints, classifyAnthropicError, defaultAnthropicMaxTokens, planAnthropicThinking, resolveAnthropicBetas, resolveAnthropicMaxOutput };
@@ -1,2 +1,2 @@
1
- import { a as planAnthropicThinking, i as defaultAnthropicMaxTokens, n as applyAnthropicCacheBreakpoints, o as resolveAnthropicBetas, r as classifyAnthropicError, s as resolveAnthropicMaxOutput, t as anthropic } from "../anthropic-cbfW2RGg.js";
1
+ import { a as planAnthropicThinking, i as defaultAnthropicMaxTokens, n as applyAnthropicCacheBreakpoints, o as resolveAnthropicBetas, r as classifyAnthropicError, s as resolveAnthropicMaxOutput, t as anthropic } from "../anthropic-CTHsdFG9.js";
2
2
  export { anthropic, applyAnthropicCacheBreakpoints, classifyAnthropicError, defaultAnthropicMaxTokens, planAnthropicThinking, resolveAnthropicBetas, resolveAnthropicMaxOutput };
@@ -1,2 +1,2 @@
1
- import { Cn as arcee, Sn as ArceeParams } from "../agent-DCtsviti.js";
1
+ import { dm as ArceeParams, fm as arcee } from "../index-B8UtiZy7.js";
2
2
  export { ArceeParams, arcee };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-FII_9wJP.js";
1
+ import { m as openaiCompat } from "../openai-compat-BvgYGSR1.js";
2
2
  //#region src/providers/arcee.ts
3
3
  const BASE_URL = "https://api.arcee.ai/api/v1";
4
4
  function getApiKey(params) {
@@ -1,2 +1,2 @@
1
- import { bn as baseten, xn as planBasetenReasoning, yn as BasetenParams } from "../agent-DCtsviti.js";
1
+ import { cm as BasetenParams, lm as baseten, um as planBasetenReasoning } from "../index-B8UtiZy7.js";
2
2
  export { BasetenParams, baseten, planBasetenReasoning };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-FII_9wJP.js";
1
+ import { m as openaiCompat } from "../openai-compat-BvgYGSR1.js";
2
2
  //#region src/providers/baseten.ts
3
3
  const BASE_URL = "https://inference.baseten.co/v1";
4
4
  /**
@@ -1,2 +1,2 @@
1
- import { _n as CerebrasParams, vn as cerebras } from "../agent-DCtsviti.js";
1
+ import { om as CerebrasParams, sm as cerebras } from "../index-B8UtiZy7.js";
2
2
  export { CerebrasParams, cerebras };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-FII_9wJP.js";
1
+ import { m as openaiCompat } from "../openai-compat-BvgYGSR1.js";
2
2
  //#region src/providers/cerebras.ts
3
3
  const BASE_URL = "https://api.cerebras.ai/v1";
4
4
  function getApiKey(params) {
@@ -1,2 +1,2 @@
1
- import { mn as local, pn as LocalParams } from "../agent-DCtsviti.js";
1
+ import { nm as LocalParams, rm as local } from "../index-B8UtiZy7.js";
2
2
  export { LocalParams, local };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-FII_9wJP.js";
1
+ import { m as openaiCompat } from "../openai-compat-BvgYGSR1.js";
2
2
  //#region src/providers/local.ts
3
3
  function getBaseURL(params) {
4
4
  if (typeof params?.baseURL === "string" && params.baseURL.length > 0) return params.baseURL;
@@ -1,2 +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-DCtsviti.js";
1
+ import { Ap as ASSISTANT_TOOL_CALLS_TAG, Bp as assistantMessage, Fp as OpenAICompatParams, Gp as mapOAIFinishReason, Hp as classifyOpenAICompatError, Ip as OpenAICompatStreamError, Jp as toOAIMessages, Kp as openAICompatPromptMessage, Lp as TOOL_RESULTS_TAG, Mp as OAITool, Np as OpenAICompatAuthHeader, Pp as OpenAICompatHttpError, Rp as applyOAICacheBreakpoints, Up as consumeSSE, Vp as buildAssistantContent, Wp as formatTools, Xp as userMessage, Yp as toolResultsMessage, jp as OAIMessage, qp as openaiCompat, zp as applyOAIToolCacheBreakpoint } from "../index-B8UtiZy7.js";
2
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 };
@@ -1,2 +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-FII_9wJP.js";
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-BvgYGSR1.js";
2
2
  export { ASSISTANT_TOOL_CALLS_TAG, OpenAICompatHttpError, OpenAICompatStreamError, TOOL_RESULTS_TAG, applyOAICacheBreakpoints, applyOAIToolCacheBreakpoint, assistantMessage, buildAssistantContent, classifyOpenAICompatError, consumeSSE, formatTools, mapOAIFinishReason, openAICompatPromptMessage, openaiCompat, toOAIMessages, toolResultsMessage, userMessage };
@@ -1,2 +1,2 @@
1
- import { cn as OpenAIParams, dn as openai, fn as toPiMessages, ln as classifyOpenAIError, un as mapCodexStopReason } from "../agent-DCtsviti.js";
1
+ import { $p as mapCodexStopReason, Qp as classifyOpenAIError, Zp as OpenAIParams, em as openai, tm as toPiMessages } from "../index-B8UtiZy7.js";
2
2
  export { OpenAIParams, classifyOpenAIError, mapCodexStopReason, openai, toPiMessages };
@@ -1,8 +1,8 @@
1
- import { i as documentBlockMarker, n as assertResolvedMediaBlock } from "../types-CyVGdbia.js";
1
+ import { i as documentBlockMarker, n as assertResolvedMediaBlock } from "../types-BIarq1qE.js";
2
2
  import { c as classifyErrorPrelude, d as isRetryableHttpStatus, f as matchesContextExceeded, p as matchesToolPairingError } from "../errors-DJUxZg9b.js";
3
- import { _ as userMessage, b as fillEstimatedCost, g as toolResultsMessage, s as assistantMessage, w as unsupportedMediaError, y as sanitizeToolSpecs } from "../openai-compat-FII_9wJP.js";
3
+ import { _ as userMessage, b as fillEstimatedCost, g as toolResultsMessage, s as assistantMessage, w as unsupportedMediaError, y as sanitizeToolSpecs } from "../openai-compat-BvgYGSR1.js";
4
4
  import { renderSystemForWire } from "../prompt.js";
5
- import { n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER } from "../messages-CozesxbB.js";
5
+ import { n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER } from "../messages-CwujiS74.js";
6
6
  import { i as resolveOAuthApiKey, t as extractRuntimeCredentials } from "../oauth-8LqbeI_Q.js";
7
7
  import { getModel } from "@earendil-works/pi-ai";
8
8
  import { streamOpenAICodexResponses } from "@earendil-works/pi-ai/openai-codex-responses";
@@ -1,2 +1,2 @@
1
- import { Bt as openrouter, Rt as OpenRouterParams, zt as normalizeOpenRouterModelId } from "../agent-DCtsviti.js";
1
+ import { Dp as OpenRouterParams, Op as normalizeOpenRouterModelId, kp as openrouter } from "../index-B8UtiZy7.js";
2
2
  export { OpenRouterParams, normalizeOpenRouterModelId, openrouter };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-FII_9wJP.js";
1
+ import { m as openaiCompat } from "../openai-compat-BvgYGSR1.js";
2
2
  //#region src/providers/openrouter.ts
3
3
  const BASE_URL = "https://openrouter.ai/api/v1";
4
4
  const DEFAULT_MODEL = "anthropic/claude-sonnet-4.6";
@@ -1,2 +1,2 @@
1
- import { Mt as xai, jt as XaiParams } from "../agent-DCtsviti.js";
1
+ import { bp as XaiParams, xp as xai } from "../index-B8UtiZy7.js";
2
2
  export { XaiParams, xai };
@@ -1,2 +1,2 @@
1
- import { t as xai } from "../xai-D9tfkrIe.js";
1
+ import { t as xai } from "../xai-B_e6TOA8.js";
2
2
  export { xai };
@@ -1,6 +1,6 @@
1
- import { m as openaiCompat } from "./openai-compat-FII_9wJP.js";
1
+ import { m as openaiCompat } from "./openai-compat-BvgYGSR1.js";
2
2
  import { i as resolveOAuthApiKey } from "./oauth-8LqbeI_Q.js";
3
- import { r as generatePkce } from "./xai-D9tfkrIe.js";
3
+ import { r as generatePkce } from "./xai-B_e6TOA8.js";
4
4
  //#region src/chat/oauth-page/cursor.ts
5
5
  /** pi-ai / zidane OAuth provider id. Also the credentials-file key. */
6
6
  const CURSOR_OAUTH_PROVIDER_ID = "cursor";
@@ -165,4 +165,4 @@ function cursor(params) {
165
165
  //#endregion
166
166
  export { createCursorOAuthProvider as n, cursor as t };
167
167
 
168
- //# sourceMappingURL=providers-DYXj2LcE.js.map
168
+ //# sourceMappingURL=providers-z6LDMAr3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers-DYXj2LcE.js","names":[],"sources":["../src/chat/oauth-page/cursor.ts","../src/providers/cursor.ts"],"sourcesContent":["/**\n * Cursor OAuth flow.\n *\n * Unlike Anthropic / OpenAI Codex (loopback-redirect PKCE), Cursor uses a\n * **poll-based** PKCE flow with no local callback server:\n *\n * 1. Generate a PKCE verifier + challenge and a random UUID.\n * 2. Open the browser to `cursor.com/loginDeepControl?challenge&uuid&mode&redirectTarget`.\n * 3. Poll `api2.cursor.sh/auth/poll?uuid&verifier` until tokens come back\n * (HTTP 404 = \"not ready yet\", keep polling with backoff).\n * 4. Refresh via `POST api2.cursor.sh/auth/exchange_user_api_key` with\n * `Authorization: Bearer <refresh>`.\n *\n * Token expiry is derived from the access token's JWT `exp` claim (minus a\n * 5-minute safety margin), falling back to +1h when the claim is missing.\n *\n * Flow adapted from https://github.com/ndraiman/pi-cursor-provider, itself\n * derived from https://github.com/ephraimduncan/opencode-cursor.\n *\n * Cursor's auth + inference protocol is unofficial and undocumented — re-verify\n * the endpoints/params below if login starts failing.\n */\n\nimport type {\n OAuthCredentials,\n OAuthLoginCallbacks,\n OAuthProviderInterface,\n} from '@earendil-works/pi-ai/oauth'\nimport { generatePkce } from './pkce'\n\n/** pi-ai / zidane OAuth provider id. Also the credentials-file key. */\nexport const CURSOR_OAUTH_PROVIDER_ID = 'cursor'\n\nconst CURSOR_LOGIN_URL = 'https://cursor.com/loginDeepControl'\nconst CURSOR_POLL_URL = 'https://api2.cursor.sh/auth/poll'\nconst CURSOR_REFRESH_URL = 'https://api2.cursor.sh/auth/exchange_user_api_key'\n\nconst POLL_MAX_ATTEMPTS = 150\nconst POLL_BASE_DELAY_MS = 1000\nconst POLL_MAX_DELAY_MS = 10_000\nconst POLL_BACKOFF_MULTIPLIER = 1.2\nconst POLL_MAX_CONSECUTIVE_ERRORS = 3\n\n/** Fallback lifetime when the JWT carries no `exp`. */\nconst DEFAULT_TOKEN_TTL_MS = 3600 * 1000\n/** Refresh slightly early so requests don't race expiry. */\nconst TOKEN_EXPIRY_SKEW_MS = 5 * 60 * 1000\n\ninterface CursorTokenResponse {\n accessToken: string\n refreshToken: string\n}\n\n/**\n * Derive expiry (epoch ms) from a JWT's `exp` claim, minus a safety skew.\n * Returns `now + 1h` for malformed tokens so a missing claim never wedges\n * refresh into an immediate-expire loop.\n */\nexport function cursorTokenExpiry(token: string): number {\n try {\n const parts = token.split('.')\n const payload = parts[1]\n if (parts.length !== 3 || !payload)\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n\n const json = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/'))) as { exp?: unknown }\n if (typeof json.exp === 'number')\n return json.exp * 1000 - TOKEN_EXPIRY_SKEW_MS\n }\n catch {\n // fall through to default\n }\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms))\n}\n\n/**\n * Poll Cursor's auth endpoint until login completes. `404` means the user\n * hasn't finished the browser flow yet; anything else non-2xx is a hard error.\n */\nasync function pollForTokens(\n uuid: string,\n verifier: string,\n callbacks: OAuthLoginCallbacks,\n): Promise<CursorTokenResponse> {\n let wait = POLL_BASE_DELAY_MS\n let consecutiveErrors = 0\n\n for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n\n await delay(wait)\n\n try {\n const url = `${CURSOR_POLL_URL}?uuid=${encodeURIComponent(uuid)}&verifier=${encodeURIComponent(verifier)}`\n const response = await fetch(url, { signal: callbacks.signal })\n\n if (response.status === 404) {\n consecutiveErrors = 0\n wait = Math.min(wait * POLL_BACKOFF_MULTIPLIER, POLL_MAX_DELAY_MS)\n continue\n }\n\n if (response.ok) {\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken || !data.refreshToken)\n throw new Error(`Cursor poll response missing tokens: ${JSON.stringify(data)}`)\n return { accessToken: data.accessToken, refreshToken: data.refreshToken }\n }\n\n throw new Error(`Cursor poll failed (${response.status})`)\n }\n catch (err) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n consecutiveErrors++\n if (consecutiveErrors >= POLL_MAX_CONSECUTIVE_ERRORS)\n throw err instanceof Error ? err : new Error(String(err))\n callbacks.onProgress?.('Waiting for Cursor login to complete…')\n }\n }\n\n throw new Error('Cursor authentication timed out')\n}\n\nexport async function loginCursor(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, challenge } = await generatePkce()\n const uuid = crypto.randomUUID()\n\n const authUrl = new URL(CURSOR_LOGIN_URL)\n authUrl.searchParams.set('challenge', challenge)\n authUrl.searchParams.set('uuid', uuid)\n authUrl.searchParams.set('mode', 'login')\n authUrl.searchParams.set('redirectTarget', 'cli')\n\n callbacks.onAuth({\n url: authUrl.toString(),\n instructions: 'A browser window should open. Complete login in Cursor to finish.',\n })\n\n const tokens = await pollForTokens(uuid, verifier, callbacks)\n\n return {\n access: tokens.accessToken,\n refresh: tokens.refreshToken,\n expires: cursorTokenExpiry(tokens.accessToken),\n }\n}\n\nexport async function refreshCursorToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n const response = await fetch(CURSOR_REFRESH_URL, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.refresh}`,\n 'Content-Type': 'application/json',\n },\n body: '{}',\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`Cursor token refresh failed (${response.status}): ${text || response.statusText}`)\n }\n\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken)\n throw new Error(`Cursor token refresh response missing access token: ${JSON.stringify(data)}`)\n\n return {\n access: data.accessToken,\n // Cursor may omit a rotated refresh token — keep the existing one.\n refresh: data.refreshToken || credentials.refresh,\n expires: cursorTokenExpiry(data.accessToken),\n }\n}\n\n/**\n * Build a Cursor `OAuthProviderInterface`. Shape matches Anthropic / Codex so\n * it drops into `BUILTIN_PROVIDERS` and `src/auth.ts` unchanged.\n *\n * No `renderPage` parameter: Cursor's poll flow has no local callback server,\n * so there is no post-redirect page to theme.\n */\nexport function createCursorOAuthProvider(): OAuthProviderInterface {\n return {\n id: CURSOR_OAUTH_PROVIDER_ID,\n name: 'Cursor',\n usesCallbackServer: false,\n login: loginCursor,\n refreshToken: refreshCursorToken,\n getApiKey: credentials => credentials.access,\n }\n}\n","import type { Provider, StreamCallbacks } from '.'\nimport { CURSOR_OAUTH_PROVIDER_ID } from '../chat/oauth-page/cursor'\nimport { resolveOAuthApiKey } from './oauth'\nimport { openaiCompat } from './openai-compat'\n\n/**\n * Cursor provider (OAuth).\n *\n * Auth is fully wired: `bun run auth --cursor` (or the TUI wizard) logs in via\n * Cursor's poll-based PKCE flow and persists credentials; this provider resolves\n * + refreshes the OAuth token on every turn via {@link resolveOAuthApiKey}.\n *\n * Inference is **not** wired yet. Cursor does not expose an OpenAI-compatible\n * HTTP endpoint — it speaks a protobuf/Connect agent protocol over HTTP/2 to\n * `api2.cursor.sh`. Implementing `stream()` requires porting that transport\n * (generated protobuf schemas + an HTTP/2 streaming client) in-process, which\n * is intentionally left as a follow-up. Until then `stream()` resolves the\n * token (proving auth works) and then throws a clear, actionable error.\n *\n * The `openaiCompat` base supplies the message-format helpers (`formatTools`,\n * `userMessage`, `toolResultsMessage`, …) so the provider satisfies the full\n * `Provider` contract and slots into the registry; only `stream` is overridden.\n */\nexport interface CursorParams {\n /** Bypass OAuth resolution with an explicit token (mainly for tests). */\n apiKey?: string\n defaultModel?: string\n /**\n * Extra HTTP headers for the eventual Cursor transport. Accepted for API\n * parity with the other providers and forwarded to the openai-compat base,\n * but inert until Cursor inference is implemented (the `stream` override\n * currently throws before any request is made).\n */\n extraHeaders?: Record<string, string>\n}\n\nconst DEFAULT_MODEL = 'claude-4.6-sonnet'\n\nconst NOT_IMPLEMENTED_MESSAGE\n = 'Cursor OAuth login works, but inference over Cursor is not implemented yet. '\n + 'Cursor uses a protobuf/HTTP-2 agent protocol (not an OpenAI-compatible API), '\n + 'so the streaming transport still needs to be ported. Use another provider for now.'\n\nexport function cursor(params?: CursorParams): Provider {\n const defaultModel = params?.defaultModel || DEFAULT_MODEL\n\n // Base only provides the format/serialization methods; `baseURL` is never\n // hit because we override `stream` below.\n const base = openaiCompat({\n name: 'cursor',\n apiKey: params?.apiKey ?? 'oauth',\n baseURL: 'https://api2.cursor.sh',\n defaultModel,\n capabilities: { vision: true, imageInToolResult: false },\n extraHeaders: params?.extraHeaders,\n })\n\n return {\n ...base,\n meta: { ...base.meta, defaultModel },\n async stream(options, callbacks: StreamCallbacks) {\n // Resolve (and lazily refresh) the OAuth token so auth failures surface\n // here with the right remediation, distinct from the not-implemented path.\n await resolveOAuthApiKey(\n {\n provider: 'cursor',\n providerId: CURSOR_OAUTH_PROVIDER_ID,\n params,\n missingError: 'No Cursor credentials found. Run `bun run auth --cursor` first.',\n refreshError: reason => `Cursor OAuth token refresh failed. Run \\`bun run auth --cursor\\` again. ${reason}`,\n },\n callbacks,\n )\n void options\n throw new Error(NOT_IMPLEMENTED_MESSAGE)\n },\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"providers-z6LDMAr3.js","names":[],"sources":["../src/chat/oauth-page/cursor.ts","../src/providers/cursor.ts"],"sourcesContent":["/**\n * Cursor OAuth flow.\n *\n * Unlike Anthropic / OpenAI Codex (loopback-redirect PKCE), Cursor uses a\n * **poll-based** PKCE flow with no local callback server:\n *\n * 1. Generate a PKCE verifier + challenge and a random UUID.\n * 2. Open the browser to `cursor.com/loginDeepControl?challenge&uuid&mode&redirectTarget`.\n * 3. Poll `api2.cursor.sh/auth/poll?uuid&verifier` until tokens come back\n * (HTTP 404 = \"not ready yet\", keep polling with backoff).\n * 4. Refresh via `POST api2.cursor.sh/auth/exchange_user_api_key` with\n * `Authorization: Bearer <refresh>`.\n *\n * Token expiry is derived from the access token's JWT `exp` claim (minus a\n * 5-minute safety margin), falling back to +1h when the claim is missing.\n *\n * Flow adapted from https://github.com/ndraiman/pi-cursor-provider, itself\n * derived from https://github.com/ephraimduncan/opencode-cursor.\n *\n * Cursor's auth + inference protocol is unofficial and undocumented — re-verify\n * the endpoints/params below if login starts failing.\n */\n\nimport type {\n OAuthCredentials,\n OAuthLoginCallbacks,\n OAuthProviderInterface,\n} from '@earendil-works/pi-ai/oauth'\nimport { generatePkce } from './pkce'\n\n/** pi-ai / zidane OAuth provider id. Also the credentials-file key. */\nexport const CURSOR_OAUTH_PROVIDER_ID = 'cursor'\n\nconst CURSOR_LOGIN_URL = 'https://cursor.com/loginDeepControl'\nconst CURSOR_POLL_URL = 'https://api2.cursor.sh/auth/poll'\nconst CURSOR_REFRESH_URL = 'https://api2.cursor.sh/auth/exchange_user_api_key'\n\nconst POLL_MAX_ATTEMPTS = 150\nconst POLL_BASE_DELAY_MS = 1000\nconst POLL_MAX_DELAY_MS = 10_000\nconst POLL_BACKOFF_MULTIPLIER = 1.2\nconst POLL_MAX_CONSECUTIVE_ERRORS = 3\n\n/** Fallback lifetime when the JWT carries no `exp`. */\nconst DEFAULT_TOKEN_TTL_MS = 3600 * 1000\n/** Refresh slightly early so requests don't race expiry. */\nconst TOKEN_EXPIRY_SKEW_MS = 5 * 60 * 1000\n\ninterface CursorTokenResponse {\n accessToken: string\n refreshToken: string\n}\n\n/**\n * Derive expiry (epoch ms) from a JWT's `exp` claim, minus a safety skew.\n * Returns `now + 1h` for malformed tokens so a missing claim never wedges\n * refresh into an immediate-expire loop.\n */\nexport function cursorTokenExpiry(token: string): number {\n try {\n const parts = token.split('.')\n const payload = parts[1]\n if (parts.length !== 3 || !payload)\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n\n const json = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/'))) as { exp?: unknown }\n if (typeof json.exp === 'number')\n return json.exp * 1000 - TOKEN_EXPIRY_SKEW_MS\n }\n catch {\n // fall through to default\n }\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms))\n}\n\n/**\n * Poll Cursor's auth endpoint until login completes. `404` means the user\n * hasn't finished the browser flow yet; anything else non-2xx is a hard error.\n */\nasync function pollForTokens(\n uuid: string,\n verifier: string,\n callbacks: OAuthLoginCallbacks,\n): Promise<CursorTokenResponse> {\n let wait = POLL_BASE_DELAY_MS\n let consecutiveErrors = 0\n\n for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n\n await delay(wait)\n\n try {\n const url = `${CURSOR_POLL_URL}?uuid=${encodeURIComponent(uuid)}&verifier=${encodeURIComponent(verifier)}`\n const response = await fetch(url, { signal: callbacks.signal })\n\n if (response.status === 404) {\n consecutiveErrors = 0\n wait = Math.min(wait * POLL_BACKOFF_MULTIPLIER, POLL_MAX_DELAY_MS)\n continue\n }\n\n if (response.ok) {\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken || !data.refreshToken)\n throw new Error(`Cursor poll response missing tokens: ${JSON.stringify(data)}`)\n return { accessToken: data.accessToken, refreshToken: data.refreshToken }\n }\n\n throw new Error(`Cursor poll failed (${response.status})`)\n }\n catch (err) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n consecutiveErrors++\n if (consecutiveErrors >= POLL_MAX_CONSECUTIVE_ERRORS)\n throw err instanceof Error ? err : new Error(String(err))\n callbacks.onProgress?.('Waiting for Cursor login to complete…')\n }\n }\n\n throw new Error('Cursor authentication timed out')\n}\n\nexport async function loginCursor(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, challenge } = await generatePkce()\n const uuid = crypto.randomUUID()\n\n const authUrl = new URL(CURSOR_LOGIN_URL)\n authUrl.searchParams.set('challenge', challenge)\n authUrl.searchParams.set('uuid', uuid)\n authUrl.searchParams.set('mode', 'login')\n authUrl.searchParams.set('redirectTarget', 'cli')\n\n callbacks.onAuth({\n url: authUrl.toString(),\n instructions: 'A browser window should open. Complete login in Cursor to finish.',\n })\n\n const tokens = await pollForTokens(uuid, verifier, callbacks)\n\n return {\n access: tokens.accessToken,\n refresh: tokens.refreshToken,\n expires: cursorTokenExpiry(tokens.accessToken),\n }\n}\n\nexport async function refreshCursorToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n const response = await fetch(CURSOR_REFRESH_URL, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.refresh}`,\n 'Content-Type': 'application/json',\n },\n body: '{}',\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`Cursor token refresh failed (${response.status}): ${text || response.statusText}`)\n }\n\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken)\n throw new Error(`Cursor token refresh response missing access token: ${JSON.stringify(data)}`)\n\n return {\n access: data.accessToken,\n // Cursor may omit a rotated refresh token — keep the existing one.\n refresh: data.refreshToken || credentials.refresh,\n expires: cursorTokenExpiry(data.accessToken),\n }\n}\n\n/**\n * Build a Cursor `OAuthProviderInterface`. Shape matches Anthropic / Codex so\n * it drops into `BUILTIN_PROVIDERS` and `src/auth.ts` unchanged.\n *\n * No `renderPage` parameter: Cursor's poll flow has no local callback server,\n * so there is no post-redirect page to theme.\n */\nexport function createCursorOAuthProvider(): OAuthProviderInterface {\n return {\n id: CURSOR_OAUTH_PROVIDER_ID,\n name: 'Cursor',\n usesCallbackServer: false,\n login: loginCursor,\n refreshToken: refreshCursorToken,\n getApiKey: credentials => credentials.access,\n }\n}\n","import type { Provider, StreamCallbacks } from '.'\nimport { CURSOR_OAUTH_PROVIDER_ID } from '../chat/oauth-page/cursor'\nimport { resolveOAuthApiKey } from './oauth'\nimport { openaiCompat } from './openai-compat'\n\n/**\n * Cursor provider (OAuth).\n *\n * Auth is fully wired: `bun run auth --cursor` (or the TUI wizard) logs in via\n * Cursor's poll-based PKCE flow and persists credentials; this provider resolves\n * + refreshes the OAuth token on every turn via {@link resolveOAuthApiKey}.\n *\n * Inference is **not** wired yet. Cursor does not expose an OpenAI-compatible\n * HTTP endpoint — it speaks a protobuf/Connect agent protocol over HTTP/2 to\n * `api2.cursor.sh`. Implementing `stream()` requires porting that transport\n * (generated protobuf schemas + an HTTP/2 streaming client) in-process, which\n * is intentionally left as a follow-up. Until then `stream()` resolves the\n * token (proving auth works) and then throws a clear, actionable error.\n *\n * The `openaiCompat` base supplies the message-format helpers (`formatTools`,\n * `userMessage`, `toolResultsMessage`, …) so the provider satisfies the full\n * `Provider` contract and slots into the registry; only `stream` is overridden.\n */\nexport interface CursorParams {\n /** Bypass OAuth resolution with an explicit token (mainly for tests). */\n apiKey?: string\n defaultModel?: string\n /**\n * Extra HTTP headers for the eventual Cursor transport. Accepted for API\n * parity with the other providers and forwarded to the openai-compat base,\n * but inert until Cursor inference is implemented (the `stream` override\n * currently throws before any request is made).\n */\n extraHeaders?: Record<string, string>\n}\n\nconst DEFAULT_MODEL = 'claude-4.6-sonnet'\n\nconst NOT_IMPLEMENTED_MESSAGE\n = 'Cursor OAuth login works, but inference over Cursor is not implemented yet. '\n + 'Cursor uses a protobuf/HTTP-2 agent protocol (not an OpenAI-compatible API), '\n + 'so the streaming transport still needs to be ported. Use another provider for now.'\n\nexport function cursor(params?: CursorParams): Provider {\n const defaultModel = params?.defaultModel || DEFAULT_MODEL\n\n // Base only provides the format/serialization methods; `baseURL` is never\n // hit because we override `stream` below.\n const base = openaiCompat({\n name: 'cursor',\n apiKey: params?.apiKey ?? 'oauth',\n baseURL: 'https://api2.cursor.sh',\n defaultModel,\n capabilities: { vision: true, imageInToolResult: false },\n extraHeaders: params?.extraHeaders,\n })\n\n return {\n ...base,\n meta: { ...base.meta, defaultModel },\n async stream(options, callbacks: StreamCallbacks) {\n // Resolve (and lazily refresh) the OAuth token so auth failures surface\n // here with the right remediation, distinct from the not-implemented path.\n await resolveOAuthApiKey(\n {\n provider: 'cursor',\n providerId: CURSOR_OAUTH_PROVIDER_ID,\n params,\n missingError: 'No Cursor credentials found. Run `bun run auth --cursor` first.',\n refreshError: reason => `Cursor OAuth token refresh failed. Run \\`bun run auth --cursor\\` again. ${reason}`,\n },\n callbacks,\n )\n void options\n throw new Error(NOT_IMPLEMENTED_MESSAGE)\n },\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { $t as classifyOpenAICompatError, At as TurnResult, Bt as openrouter, Cn as arcee, Ct as ProviderCapabilities, Dn as anthropic, Dt as ToolCall, Et as TokenCountPayload, Ft as SchemaSanitizeResult, Gt as OpenAICompatHttpError, It as sanitizeToolSchema, Kt as OpenAICompatParams, Lt as sanitizeToolSpecs, Mt as xai, Nt as SchemaSanitizeOptions, On as applyAnthropicCacheBreakpoints, Ot as ToolResult, Pt as SchemaSanitizeProfile, Rt as OpenRouterParams, Sn as ArceeParams, St as Provider, Tn as AnthropicParams, Tt as StreamOptions, Wt as OpenAICompatAuthHeader, _n as CerebrasParams, bn as baseten, cn as OpenAIParams, dn as openai, gn as cursor, hn as CursorParams, in as openaiCompat, jt as XaiParams, kt as ToolSpec, mn as local, nn as mapOAIFinishReason, pn as LocalParams, vn as cerebras, wt as StreamCallbacks, xn as planBasetenReasoning, yn as BasetenParams } from "./agent-DCtsviti.js";
1
+ import { Cp as SchemaSanitizeProfile, Dp as OpenRouterParams, Ep as sanitizeToolSpecs, Fp as OpenAICompatParams, Gp as mapOAIFinishReason, Hp as classifyOpenAICompatError, Np as OpenAICompatAuthHeader, Pp as OpenAICompatHttpError, Sp as SchemaSanitizeOptions, Tp as sanitizeToolSchema, Zp as OpenAIParams, _m as applyAnthropicCacheBreakpoints, _p as ToolResult, am as cursor, bp as XaiParams, cm as BasetenParams, dm as ArceeParams, dp as Provider, em as openai, fm as arcee, fp as ProviderCapabilities, gm as anthropic, gp as ToolCall, hp as TokenCountPayload, im as CursorParams, kp as openrouter, lm as baseten, mm as AnthropicParams, mp as StreamOptions, nm as LocalParams, om as CerebrasParams, pp as StreamCallbacks, qp as openaiCompat, rm as local, sm as cerebras, um as planBasetenReasoning, vp as ToolSpec, wp as SchemaSanitizeResult, xp as xai, yp as TurnResult } from "./index-B8UtiZy7.js";
2
2
  export { type AnthropicParams, type ArceeParams, type BasetenParams, type CerebrasParams, type CursorParams, type LocalParams, type OpenAICompatAuthHeader, OpenAICompatHttpError, type OpenAICompatParams, type OpenAIParams, type OpenRouterParams, Provider, ProviderCapabilities, type SchemaSanitizeOptions, type SchemaSanitizeProfile, type SchemaSanitizeResult, StreamCallbacks, StreamOptions, TokenCountPayload, ToolCall, ToolResult, ToolSpec, TurnResult, type XaiParams, anthropic, applyAnthropicCacheBreakpoints, arcee, baseten, cerebras, classifyOpenAICompatError, cursor, local, mapOAIFinishReason, openai, openaiCompat, openrouter, planBasetenReasoning, sanitizeToolSchema, sanitizeToolSpecs, xai };
package/dist/providers.js CHANGED
@@ -1,10 +1,10 @@
1
- import { f as mapOAIFinishReason, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, v as sanitizeToolSchema, y as sanitizeToolSpecs } from "./openai-compat-FII_9wJP.js";
2
- import { n as applyAnthropicCacheBreakpoints, t as anthropic } from "./anthropic-cbfW2RGg.js";
1
+ import { f as mapOAIFinishReason, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, v as sanitizeToolSchema, y as sanitizeToolSpecs } from "./openai-compat-BvgYGSR1.js";
2
+ import { n as applyAnthropicCacheBreakpoints, t as anthropic } from "./anthropic-CTHsdFG9.js";
3
3
  import { arcee } from "./providers/arcee.js";
4
4
  import { baseten, planBasetenReasoning } from "./providers/baseten.js";
5
5
  import { cerebras } from "./providers/cerebras.js";
6
- import { t as xai } from "./xai-D9tfkrIe.js";
7
- import { t as cursor } from "./providers-DYXj2LcE.js";
6
+ import { t as xai } from "./xai-B_e6TOA8.js";
7
+ import { t as cursor } from "./providers-z6LDMAr3.js";
8
8
  import { local } from "./providers/local.js";
9
9
  import { openai } from "./providers/openai.js";
10
10
  import { openrouter } from "./providers/openrouter.js";
@@ -1,5 +1,5 @@
1
1
  import { t as fnv1aBase36 } from "./hash-DJRzmcPI.js";
2
- import { s as toolResultToText } from "./types-CyVGdbia.js";
2
+ import { l as toolResultToText } from "./types-BIarq1qE.js";
3
3
  import { i as styleReplacementForVia, n as resolveOldString } from "./edit-utils-EGosADZq.js";
4
4
  import { resolve } from "node:path";
5
5
  //#region src/aliasing.ts
@@ -600,4 +600,4 @@ function getToolDedupState(session) {
600
600
  //#endregion
601
601
  export { hydrateReadStateFromSessionAsync as a, resolveReadStateMap as c, buildSanitizedWireAliases as d, rewriteContentToCanonical as f, toWireName as h, hydrateReadStateFromSession as i, augmentMcpDoubleUnderscoreAliases as l, toCanonicalName as m, getToolDedupState as n, markReadStateElided as o, rewriteMessagesToWire as p, hashContent as r, readStateKey as s, getReadState as t, buildAliasMaps as u };
602
602
 
603
- //# sourceMappingURL=read-state-BymF41Jb.js.map
603
+ //# sourceMappingURL=read-state-Dq_TXUX1.js.map