@animalabs/membrane 0.5.75 → 0.5.77

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 (40) hide show
  1. package/dist/formatters/native.d.ts.map +1 -1
  2. package/dist/formatters/native.js +13 -0
  3. package/dist/formatters/native.js.map +1 -1
  4. package/dist/membrane.d.ts.map +1 -1
  5. package/dist/membrane.js +282 -25
  6. package/dist/membrane.js.map +1 -1
  7. package/dist/providers/bedrock.d.ts +17 -0
  8. package/dist/providers/bedrock.d.ts.map +1 -1
  9. package/dist/providers/bedrock.js +95 -13
  10. package/dist/providers/bedrock.js.map +1 -1
  11. package/dist/types/config.d.ts +31 -1
  12. package/dist/types/config.d.ts.map +1 -1
  13. package/dist/types/config.js +8 -0
  14. package/dist/types/config.js.map +1 -1
  15. package/dist/types/errors.d.ts +12 -0
  16. package/dist/types/errors.d.ts.map +1 -1
  17. package/dist/types/errors.js +19 -0
  18. package/dist/types/errors.js.map +1 -1
  19. package/dist/types/index.d.ts +1 -1
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/index.js +1 -1
  22. package/dist/types/index.js.map +1 -1
  23. package/dist/types/response.d.ts +1 -1
  24. package/dist/types/response.d.ts.map +1 -1
  25. package/dist/types/response.js.map +1 -1
  26. package/dist/types/streaming.d.ts +10 -0
  27. package/dist/types/streaming.d.ts.map +1 -1
  28. package/dist/types/yielding-stream.d.ts +12 -0
  29. package/dist/types/yielding-stream.d.ts.map +1 -1
  30. package/dist/types/yielding-stream.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/formatters/native.ts +12 -0
  33. package/src/membrane.ts +308 -23
  34. package/src/providers/bedrock.ts +109 -13
  35. package/src/types/config.ts +48 -4
  36. package/src/types/errors.ts +18 -0
  37. package/src/types/index.ts +1 -0
  38. package/src/types/response.ts +5 -1
  39. package/src/types/streaming.ts +11 -0
  40. package/src/types/yielding-stream.ts +13 -0
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAEZ,QAAQ,EACR,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EAMhB,MAAM,YAAY,CAAC;AAIpB;;;yEAGyE;AACzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAMtF;AAMD,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyGD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,GAAE,qBAA0B;IAY9C,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW;IAqJhF,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM;IAchD,kBAAkB,IAAI,YAAY;IAIlC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAM3C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAYnD;yEACqE;IACrE,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAiBxC,OAAO,CAAC,cAAc;IA0GtB,OAAO,CAAC,oBAAoB;CAO7B"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAEZ,QAAQ,EACR,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EAMhB,MAAM,YAAY,CAAC;AAIpB;;;yEAGyE;AACzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAMtF;AAMD,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyGD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,GAAE,qBAA0B;IAY9C,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW;IAiKhF,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM;IAchD,kBAAkB,IAAI,YAAY;IAIlC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAM3C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAYnD;yEACqE;IACrE,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAiBxC,OAAO,CAAC,cAAc;IA0GtB,OAAO,CAAC,oBAAoB;CAO7B"}
@@ -191,6 +191,19 @@ export class NativeFormatter {
191
191
  }
192
192
  }
193
193
  }
194
+ // Block-level cache_control can also arrive via convertContent passthrough
195
+ // (stale request-time markers on imported/stored blocks — Arc exports carry
196
+ // them). Recount ALL message-level cache_control blocks — deliberate marks
197
+ // and passthroughs alike — so the system fallback below can't stack on top.
198
+ markedBreakpoints = 0;
199
+ for (const msg of providerMessages) {
200
+ if (!Array.isArray(msg.content))
201
+ continue;
202
+ for (const b of msg.content) {
203
+ if (b.cache_control)
204
+ markedBreakpoints++;
205
+ }
206
+ }
194
207
  // Tool-pair normalizer: wire-boundary safety net for Anthropic's
195
208
  // structural rules on tool cycles. See `normalize-tool-pairs.ts`
196
209
  // for the full rationale. Runs BEFORE mergeConsecutiveRoles so the
@@ -1 +1 @@
1
- {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAE7F;;;yEAGyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,MAAsC;IAC5E,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAA0B,CAAC;QAChD,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,mBAAmB;YAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAcD,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,iBAAiB;IACb,WAAW,GAAG,EAAE,CAAC;IACjB,UAAU,GAAG,CAAC,CAAC;IACf,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,CAAC,KAAa;QACxB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QAEF,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,kCAAkC;QAClC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,UAAU,GAAe;gBAC7B,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,IAAI,CAAC,UAAU;gBACtB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;aACxB,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,KAAK;QACH,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,aAAa,GAAe;gBAChC,KAAK,EAAE,gBAAgB;gBACvB,KAAK,EAAE,IAAI,CAAC,UAAU;gBACtB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;aACnD,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7D,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC;IAC9B,CAAC;IAED,mBAAmB;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,aAAa;QACX,4CAA4C;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS;QACP,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,oBAAoB;QAClB,gDAAgD;IAClD,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,KAAK,CAAC;IAErB,MAAM,CAAkC;IAEhD,YAAY,SAAgC,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,UAAU;YAC3C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,OAAO;YACpD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;SACxC,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E,aAAa,CAAC,QAA6B,EAAE,OAAqB;QAChE,MAAM,EACJ,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,aAAa,GAAG,KAAK,EACrB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,uBAAuB,GACxB,GAAG,OAAO,CAAC;QAEZ,0DAA0D;QAC1D,MAAM,YAAY,GAAwC,aAAa;YACrE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YAC/D,CAAC,CAAC,SAAS,CAAC;QAEd,2EAA2E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,6EAA6E;QAC7E,0EAA0E;QAC1E,yEAAyE;QACzE,oDAAoD;QACpD,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAE1B,MAAM,gBAAgB,GAAsB,EAAE,CAAC;QAE/C,yEAAyE;QACzE,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,WAAW,GAA4B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACnF,IAAI,aAAa,IAAI,YAAY,EAAE,CAAC;gBAClC,WAAW,CAAC,aAAa,GAAG,YAAY,CAAC;gBACzC,iBAAiB,EAAE,CAAC;YACtB,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,WAAW,CAAC;aACvB,CAAC,CAAC;QACL,CAAC;QAED,oCAAoC;QACpC,IAAI,eAAe,KAAK,QAAQ,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,iBAAiB;YACjB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,oBAAoB,CAAC;YAEjE,sCAAsC;YACtC,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,gBAAgB,EAAE,CAAC;oBAC7D,MAAM,IAAI,KAAK,CACb,iDAAiD,gBAAgB,UAAU,oBAAoB,KAAK;wBACpG,SAAS,OAAO,CAAC,WAAW,gEAAgE,CAC7F,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAyB,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;YAEtE,kBAAkB;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;gBACxE,YAAY,EAAE,eAAe,KAAK,WAAW,IAAI,CAAC,WAAW;aAC9D,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,SAAS,CAAC,sBAAsB;YAClC,CAAC;YAED,4FAA4F;YAC5F,IAAI,cAAc,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,YAAY,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChG,MAAM,OAAO,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;gBAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAoC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvG,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;gBACrD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;oBACjB,WAAW,CAAC,OAAO,CAAE,CAAC,aAAa,GAAG,YAAY,CAAC;oBACnD,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;YAED,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAEzC,2EAA2E;YAC3E,IAAI,OAAO,CAAC,eAAe,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAoC,CAAC,CAAC;gBAC5E,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACd,OAAO,CAAC,KAAK,CAA6B,CAAC,aAAa,GAAG,YAAY,CAAC;oBACzE,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,iEAAiE;QACjE,mEAAmE;QACnE,qCAAqC;QACrC,MAAM,UAAU,GAAG,kBAAkB,CAAC,gBAAgB,EAAE;YACtD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,OAAO,EAAE,OAAO,CAAC,WAAW;SAC7B,CAAC,CAAC;QAEH,kEAAkE;QAClE,MAAM,cAAc,GAAG,qBAAqB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAElE,4EAA4E;QAC5E,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,WAAW,GAAG,YAAY,IAAI,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,IAAI,aAAsB,CAAC;QAC3B,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,WAAW,EAAE,CAAC;gBAChB,kDAAkD;gBAClD,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,YAAY,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,IAAI,WAAW,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,6CAA6C;gBAC7C,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBAC9C,IAAI,GAAG,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpC,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;oBAClD,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,YAAY,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,eAAe;QACf,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjF,OAAO;YACL,QAAQ,EAAE,cAAc;YACxB,aAAa;YACb,aAAa,EAAE,uBAAuB,IAAI,EAAE;YAC5C,WAAW;YACX,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,OAAqB;QACrC,iEAAiE;QACjE,0CAA0C;QAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,WAAW,EAAE,CAAC,CAAC,SAAS;YACxB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,OAAO;SACpB,CAAC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E,kBAAkB;QAChB,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,0EAA0E;QAC1E,iEAAiE;QACjE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,oEAAoE;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB,CAAC,OAAe;QAChC,sCAAsC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E;yEACqE;IAC7D,MAAM,CAAC,yBAAyB,CAAC,OAAgB;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1B,IACE,IAAI;gBACJ,OAAO,IAAI,KAAK,QAAQ;gBACvB,IAA0B,CAAC,IAAI,KAAK,OAAO,EAC5C,CAAC;gBACD,MAAM,GAAG,GAAI,IAA6C,CAAC,MAAM,CAAC;gBAClE,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC;oBAC/C,OAAO,wBAAwB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CACpB,OAAuB,EACvB,WAAmB,EACnB,OAAkC;QAElC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,sEAAsE;gBACtE,qEAAqE;gBACrE,oEAAoE;gBACpE,+CAA+C;gBAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE;oBAAE,SAAS;gBAChC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBACtB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;oBACrE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;gBACvB,CAAC;gBACD,MAAM,SAAS,GAA4B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAClE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;oBACxB,SAAS,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;gBAChD,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;wBACtD,8DAA8D;wBAC9D,sDAAsD;wBACtD,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;oBAChE,CAAC;yBAAM,CAAC;wBACN,MAAM,UAAU,GAA4B;4BAC1C,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;gCAClC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;6BACxB;yBACF,CAAC;wBACF,qEAAqE;wBACrE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;4BACpB,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;wBACzC,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,gEAAgE;gBAChE,uEAAuE;gBACvE,uEAAuE;gBACvE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;4BAClC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;yBACxB;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,KAAK,CAAC,SAAS;oBAC5B,OAAO,EAAE,eAAe,CAAC,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC;oBACjE,QAAQ,EAAE,KAAK,CAAC,OAAO;iBACxB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,qEAAqE;gBACrE,oEAAoE;gBACpE,mEAAmE;gBACnE,+DAA+D;gBAC/D,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,GAAG,CAAE,KAAgC,CAAC,SAAS;wBAC7C,CAAC,CAAC,EAAE,SAAS,EAAG,KAAgC,CAAC,SAAS,EAAE;wBAC5D,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBAC9C,uDAAuD;gBACvD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAI,KAA4C,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,KAAK,OAAO,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAC;YACxH,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,oBAAoB,CAAC,KAAuB;QAClD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,WAAW;SAC/B,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"membrane.d.ts","sourceRoot":"","sources":["../src/membrane.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAEf,eAAe,EAEf,cAAc,EACd,aAAa,EACb,eAAe,EAYhB,MAAM,kBAAkB,CAAC;AAoB1B,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EAGtB,MAAM,4BAA4B,CAAC;AAiBpC,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAmB;gBAGlC,OAAO,EAAE,eAAe,EACxB,MAAM,GAAE,cAAmB;IAc7B;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IA6E9B;;;;;;;;;;;;;;;;;OAiBG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,kBAAkB,GAAG,eAAe,CAAC;IA+BhD;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;;OAMG;YACW,kBAAkB;IAwehC;;OAEG;YACW,qBAAqB;IAwOnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiN9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuD5B;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B;IAkBrC;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IA+BnC;;;;;;;OAOG;YACW,sBAAsB;IASpC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAIpC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;YA4EV,UAAU;IA+BxB,OAAO,CAAC,wBAAwB;IA8ChC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kCAAkC;IAoD1C,OAAO,CAAC,iBAAiB;IAqIzB,OAAO,CAAC,kBAAkB;IAkF1B,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,cAAc;IAItB,qFAAqF;IACrF,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,KAAK;IAcb;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,cAAc,CACZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,qBAA0B,GAClC,cAAc;IAWjB;;OAEG;YACW,mBAAmB;IAwejC;;OAEG;YACW,sBAAsB;CAqTrC"}
1
+ {"version":3,"file":"membrane.d.ts","sourceRoot":"","sources":["../src/membrane.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAEf,eAAe,EAEf,cAAc,EACd,aAAa,EACb,eAAe,EAYhB,MAAM,kBAAkB,CAAC;AAqB1B,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EAGtB,MAAM,4BAA4B,CAAC;AAiBpC,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAmB;gBAGlC,OAAO,EAAE,eAAe,EACxB,MAAM,GAAE,cAAmB;IAkB7B;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAwF9B;;;;;;;;;;;;;;;;;OAiBG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,kBAAkB,GAAG,eAAe,CAAC;IA8FhD;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;;OAMG;YACW,kBAAkB;IA8kBhC;;OAEG;YACW,qBAAqB;IAwOnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwN9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuD5B;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B;IAkBrC;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IA+BnC;;;;;;;OAOG;YACW,sBAAsB;IASpC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAIpC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;YA4EV,UAAU;IA+BxB,OAAO,CAAC,wBAAwB;IA8ChC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kCAAkC;IAoD1C,OAAO,CAAC,iBAAiB;IAqIzB,OAAO,CAAC,kBAAkB;IAkF1B,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,cAAc;IAItB,qFAAqF;IACrF,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,KAAK;IAcb;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,cAAc,CACZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,qBAA0B,GAClC,cAAc;IAWjB;;OAEG;YACW,mBAAmB;IAokBjC;;OAEG;YACW,sBAAsB;CAqTrC"}
package/dist/membrane.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * A selective boundary that transforms what passes through.
5
5
  */
6
6
  import { lastCacheableBlockIndex } from './formatters/native.js';
7
- import { DEFAULT_RETRY_CONFIG, MembraneError, classifyError, } from './types/index.js';
7
+ import { DEFAULT_RETRY_CONFIG, MembraneError, classifyError, isOverloadedError, } from './types/index.js';
8
8
  import { parseToolCalls, formatToolResults, parseAccumulatedIntoBlocks, hasImageInToolResults, formatToolResultsForSplitTurn, } from './utils/tool-parser.js';
9
9
  import { AnthropicXmlFormatter } from './formatters/anthropic-xml.js';
10
10
  import { normalizeToolPairs, mergeConsecutiveRoles } from './formatters/normalize-tool-pairs.js';
@@ -24,7 +24,11 @@ export class Membrane {
24
24
  constructor(adapter, config = {}) {
25
25
  this.adapter = adapter;
26
26
  this.registry = config.registry;
27
- this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...config.retry };
27
+ this.retryConfig = {
28
+ ...DEFAULT_RETRY_CONFIG,
29
+ ...config.retry,
30
+ overloaded: { ...DEFAULT_RETRY_CONFIG.overloaded, ...config.retry?.overloaded },
31
+ };
28
32
  this.config = config;
29
33
  // Use provided formatter or default to AnthropicXmlFormatter
30
34
  this.formatter = config.formatter ?? new AnthropicXmlFormatter();
@@ -69,12 +73,22 @@ export class Membrane {
69
73
  catch (error) {
70
74
  const errorInfo = classifyError(error);
71
75
  errorInfo.rawRequest = rawRequest;
72
- // Rate limits (429) always retry up to 5 attempts regardless of config.
73
- // Other retryable errors only retry when maxRetries > 0.
76
+ // Rate limits (429) always retry up to 5 attempts regardless of
77
+ // config, and overloaded (529) always retries on its own longer
78
+ // schedule — both are transient by definition, and the default
79
+ // maxRetries of 0 would otherwise turn a capacity blip into a dead
80
+ // turn. Other retryable errors only retry when maxRetries > 0.
81
+ // overloaded.maxRetries: 0 disables the dedicated policy entirely;
82
+ // the 529 then follows the base config like any retryable server
83
+ // error (exactly the pre-policy behavior), rather than being
84
+ // silently re-promoted to the long schedule by a positive base limit.
74
85
  const isRateLimit = errorInfo.type === 'rate_limit';
86
+ const isOverloaded = isOverloadedError(errorInfo) && this.retryConfig.overloaded.maxRetries > 0;
75
87
  const effectiveMax = isRateLimit
76
88
  ? Math.max(this.retryConfig.maxRetries, 5)
77
- : this.retryConfig.maxRetries;
89
+ : isOverloaded
90
+ ? Math.max(this.retryConfig.maxRetries, this.retryConfig.overloaded.maxRetries)
91
+ : this.retryConfig.maxRetries;
78
92
  if (errorInfo.retryable && attempts < effectiveMax) {
79
93
  // Check hook for retry decision
80
94
  if (this.config.hooks?.onError) {
@@ -84,7 +98,7 @@ export class Membrane {
84
98
  }
85
99
  }
86
100
  // Wait before retry (abort-aware)
87
- const delay = this.calculateRetryDelay(attempts);
101
+ const delay = this.calculateRetryDelay(attempts, isOverloaded);
88
102
  await this.sleep(delay, options.signal);
89
103
  continue;
90
104
  }
@@ -132,11 +146,69 @@ export class Membrane {
132
146
  }
133
147
  // Determine tool mode
134
148
  const toolMode = this.resolveToolMode(request);
135
- if (toolMode === 'native' && request.tools && request.tools.length > 0) {
136
- return this.streamWithNativeTools(request, options);
137
- }
138
- else {
139
- return this.streamWithXmlTools(request, options);
149
+ const useNative = toolMode === 'native' && !!request.tools && request.tools.length > 0;
150
+ // Overloaded (529) pre-emission retry. The streaming paths have no retry
151
+ // loop of their own, so a capacity error used to kill the turn outright —
152
+ // and 529s most often arrive INSTEAD of a stream, before anything reaches
153
+ // the caller, where retrying is transparent. Once any callback has
154
+ // delivered output (tokens, blocks, usage), retrying would replay content
155
+ // the caller already consumed, so mid-stream errors still throw.
156
+ let attempts = 0;
157
+ const retryDelaysMs = [];
158
+ while (true) {
159
+ attempts++;
160
+ let emitted = false;
161
+ const mark = (fn) => fn && ((...args) => { emitted = true; return fn(...args); });
162
+ const tracked = {
163
+ ...options,
164
+ onChunk: mark(options.onChunk),
165
+ onContentBlockUpdate: mark(options.onContentBlockUpdate),
166
+ onToolCalls: mark(options.onToolCalls),
167
+ onPreToolContent: mark(options.onPreToolContent),
168
+ onUsage: mark(options.onUsage),
169
+ onBlock: mark(options.onBlock),
170
+ onResponse: mark(options.onResponse),
171
+ // onRequest fires before the send — it is not an emission.
172
+ };
173
+ try {
174
+ const result = useNative
175
+ ? await this.streamWithNativeTools(request, tracked)
176
+ : await this.streamWithXmlTools(request, tracked);
177
+ // The inner paths report attempts: 1 — they can't see this wrapper.
178
+ // A call that succeeded after N overloaded retries must not look like
179
+ // a first-attempt success in durable logs, so patch the real count
180
+ // (and the waits) into the response telemetry.
181
+ if (attempts > 1 && 'details' in result) {
182
+ result.details.timing.attempts = attempts;
183
+ result.details.timing.retryDelaysMs = retryDelaysMs;
184
+ }
185
+ return result;
186
+ }
187
+ catch (error) {
188
+ const errorInfo = classifyError(error);
189
+ // Same semantics as complete(): maxRetries bounds total attempts,
190
+ // the overloaded floor applies over the base config, and
191
+ // overloaded.maxRetries: 0 opts out of stream retries entirely
192
+ // (streaming had no retry before this policy existed).
193
+ const overloadedEnabled = this.retryConfig.overloaded.maxRetries > 0;
194
+ const maxOverloaded = Math.max(this.retryConfig.maxRetries, this.retryConfig.overloaded.maxRetries);
195
+ if (!emitted && overloadedEnabled && isOverloadedError(errorInfo) && attempts < maxOverloaded) {
196
+ // Honor the same pre-retry hook contract as complete(): hosts use
197
+ // onError for circuit-breaking, and its 'abort' decision must work
198
+ // on the streaming path too.
199
+ if (this.config.hooks?.onError) {
200
+ const decision = await this.config.hooks.onError(errorInfo, attempts);
201
+ if (decision === 'abort') {
202
+ throw error;
203
+ }
204
+ }
205
+ const delay = this.calculateRetryDelay(attempts, true);
206
+ retryDelaysMs.push(delay);
207
+ await this.sleep(delay, options.signal);
208
+ continue;
209
+ }
210
+ throw error;
211
+ }
140
212
  }
141
213
  }
142
214
  /**
@@ -216,13 +288,56 @@ export class Membrane {
216
288
  // blocks inherited from prefill context (e.g., unclosed <thinking> from other bots)
217
289
  // from blocks the model itself opened during generation
218
290
  const prefillDepths = parser.getDepths();
291
+ // Resumption spin guards (issue #39). Observed live on Ash 2026-07-26:
292
+ // each automatic resumption re-sent ~172k input tokens, streamed ~6
293
+ // output tokens, and stopped on the same (dropped) stop sequence — 43
294
+ // rounds, ~7M input tokens, zero progress, found only because a human
295
+ // noticed. Two guards, both scoped to AUTOMATIC false-positive
296
+ // resumptions — tool rounds are real caller-governed work (maxToolDepth
297
+ // / the yielding API's uncapped contract) and are never counted here:
298
+ // - stall guard: several CONSECUTIVE resumptions that each stream
299
+ // almost nothing and stop identically end the turn ('no_progress').
300
+ // One short repeated round is low progress, not proof of none — a
301
+ // stop sequence inside legitimate tool-argument text can cause a
302
+ // couple of short resumptions on the way to completing.
303
+ // - round cap: a hard bound on resumptions per turn ('round_limit'),
304
+ // the backstop for a spin that keeps technically progressing.
305
+ const MIN_ROUND_PROGRESS_CHARS = 16;
306
+ const MAX_CONSECUTIVE_STALLED_RESUMPTIONS = 3;
307
+ const RESUMPTION_WARN_ROUNDS = 5;
308
+ const maxResumptionRounds = options.maxResumptionRounds ?? 24;
309
+ let resumptionRounds = 0;
310
+ let consecutiveStalledResumptions = 0;
311
+ let enteredViaResumption = false;
312
+ let prevRoundStopSequence;
313
+ const warnLog = this.config.logger ?? console;
314
+ /** Count an automatic resumption; emits the visibility warning at the
315
+ * threshold and returns false when the cap says the turn should end. */
316
+ const registerResumptionRound = () => {
317
+ resumptionRounds++;
318
+ if (resumptionRounds === RESUMPTION_WARN_ROUNDS) {
319
+ warnLog.warn(`[membrane] automatic resumption at round ${resumptionRounds} ` +
320
+ `(${totalUsage.inputTokens} input tokens so far this turn) — ` +
321
+ `a spin shows up here before it shows up on the bill`);
322
+ }
323
+ if (resumptionRounds > maxResumptionRounds) {
324
+ warnLog.warn(`[membrane] automatic resumption cap (${maxResumptionRounds}) reached — ` +
325
+ `ending turn with stopReason 'round_limit'. ` +
326
+ `${totalUsage.inputTokens} input tokens spent this turn.`);
327
+ return false;
328
+ }
329
+ return true;
330
+ };
219
331
  try {
220
332
  // Tool execution loop
221
333
  while (toolDepth <= maxToolDepth) {
222
334
  // Track if we manually detected a stop sequence (API doesn't always stop)
223
335
  let detectedStopSequence = null;
224
336
  let truncatedAccumulated = null;
225
- // Track where to start checking for stop sequences (skip already-processed content)
337
+ // Track where to start checking for stop sequences (skip already-processed content).
338
+ // Also the round's progress baseline: XML we pushed ourselves at the
339
+ // end of the previous round (tool results, closing tags) sits below
340
+ // this index and doesn't count as model progress.
226
341
  const checkFromIndex = parser.getAccumulated().length;
227
342
  // Stream from provider
228
343
  const streamResult = await this.streamOnce(providerRequest, {
@@ -332,6 +447,34 @@ export class Membrane {
332
447
  }
333
448
  // Get accumulated text from parser
334
449
  const accumulated = parser.getAccumulated();
450
+ // Stall accounting (issue #39): only rounds ENTERED via automatic
451
+ // resumption can stall — tool rounds are caller-governed work and a
452
+ // real tool call is longer than the threshold anyway. A stall is a
453
+ // resumption that streamed almost nothing and stopped identically to
454
+ // the previous round; the turn ends only after several IN A ROW
455
+ // (one short repeated round is low progress, not proof of none —
456
+ // a stop sequence inside legitimate tool-argument text can cause a
457
+ // couple of short resumptions on the way to completing).
458
+ const streamedThisRound = accumulated.length - checkFromIndex;
459
+ if (enteredViaResumption &&
460
+ lastStopReason === 'stop_sequence' &&
461
+ streamedThisRound < MIN_ROUND_PROGRESS_CHARS &&
462
+ lastStopSequence === prevRoundStopSequence) {
463
+ consecutiveStalledResumptions++;
464
+ if (consecutiveStalledResumptions >= MAX_CONSECUTIVE_STALLED_RESUMPTIONS) {
465
+ warnLog.warn(`[membrane] ${consecutiveStalledResumptions} consecutive automatic resumptions ` +
466
+ `made no progress (${streamedThisRound} chars this round, stop ` +
467
+ `${JSON.stringify(lastStopSequence ?? null)} repeated) — ending turn with ` +
468
+ `stopReason 'no_progress'. ${totalUsage.inputTokens} input tokens spent this turn.`);
469
+ lastStopReason = 'no_progress';
470
+ break;
471
+ }
472
+ }
473
+ else {
474
+ consecutiveStalledResumptions = 0;
475
+ }
476
+ prevRoundStopSequence = lastStopSequence;
477
+ enteredViaResumption = false;
335
478
  // Check for tool calls (if handler provided)
336
479
  if (onToolCalls && streamResult.stopSequence === '</function_calls>') {
337
480
  // Append the closing tag (we truncated before it, or API stopped before it)
@@ -341,8 +484,11 @@ export class Membrane {
341
484
  const parsed = parseToolCalls(parser.getAccumulated());
342
485
  if (parsed && parsed.calls.length > 0) {
343
486
  // Notify about pre-tool content
344
- if (onPreToolContent && parsed.beforeText.trim()) {
345
- await onPreToolContent(parsed.beforeText);
487
+ // Slice the seeded prefill off: beforeText starts with the whole
488
+ // flattened document in XML mode (see ToolContext note below).
489
+ const preToolNew = parsed.beforeText.slice(initialPrefillLength);
490
+ if (onPreToolContent && preToolNew.trim()) {
491
+ await onPreToolContent(preToolNew);
346
492
  }
347
493
  // Emit block events for each tool call
348
494
  for (const call of parsed.calls) {
@@ -366,13 +512,24 @@ export class Membrane {
366
512
  }
367
513
  // Track the tool calls
368
514
  executedToolCalls.push(...parsed.calls);
369
- // Execute tools
515
+ // Execute tools.
516
+ // preamble/accumulated must expose the MODEL'S text only. The
517
+ // parser is seeded with the entire assistant prefill (the whole
518
+ // flattened document in XML mode), so parsed.beforeText starts
519
+ // with it — consumers that persist the preamble as "what the
520
+ // agent said this round" would otherwise write the full document
521
+ // back into the store as an assistant message (observed on Ash,
522
+ // 2026-07-26: a died-mid-rounds turn flushed a ~720k-char
523
+ // document echo into her message store as 62 sharded messages).
524
+ // The turn-END path already slices (newContent =
525
+ // fullAccumulated.slice(initialPrefillLength)); the tool-round
526
+ // path must match it.
370
527
  const context = {
371
528
  rawText: parsed.fullMatch,
372
- preamble: parsed.beforeText,
529
+ preamble: parsed.beforeText.slice(initialPrefillLength),
373
530
  depth: toolDepth,
374
531
  previousResults: executedToolResults,
375
- accumulated: parser.getAccumulated(),
532
+ accumulated: parser.getAccumulated().slice(initialPrefillLength),
376
533
  };
377
534
  const results = await onToolCalls(parsed.calls, context);
378
535
  if (!Array.isArray(results)) {
@@ -476,7 +633,9 @@ export class Membrane {
476
633
  prefillResult.assistantPrefill = parser.getAccumulated();
477
634
  providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
478
635
  }
479
- // Reset parser state for new streaming iteration
636
+ // Reset parser state for new streaming iteration. Tool rounds
637
+ // are the caller's work — they count against maxToolDepth only,
638
+ // never against the resumption guards (issue #39 review).
480
639
  parser.resetForNewIteration();
481
640
  toolDepth++;
482
641
  continue;
@@ -509,6 +668,11 @@ export class Membrane {
509
668
  if (toolDepth > maxToolDepth) {
510
669
  break;
511
670
  }
671
+ if (!registerResumptionRound()) {
672
+ lastStopReason = 'round_limit';
673
+ break;
674
+ }
675
+ enteredViaResumption = true;
512
676
  prefillResult.assistantPrefill = parser.getAccumulated();
513
677
  providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
514
678
  // Reset parser state for new streaming iteration
@@ -773,6 +937,13 @@ export class Membrane {
773
937
  const textBlock = { type: 'text', text };
774
938
  if (block.cache_control) {
775
939
  textBlock.cache_control = block.cache_control;
940
+ // A block-level passthrough occupies one of the 4 breakpoint slots
941
+ // exactly like a marked message — count it, so the tools/system
942
+ // fallback below doesn't stack more on top. (Imported/seeded
943
+ // conversations can carry stale request-time cache_control on
944
+ // stored blocks — first seen wedging Sill 2026-07-25: 3 cm markers
945
+ // + 2 stale Arc-export blocks = 5 → hard 400 on every inference.)
946
+ messageBreakpoints++;
776
947
  }
777
948
  content.push(textBlock);
778
949
  }
@@ -1502,10 +1673,15 @@ export class Membrane {
1502
1673
  const pricing = this.resolvePricing(model);
1503
1674
  return pricing ? calculateCost(usage, pricing) : undefined;
1504
1675
  }
1505
- calculateRetryDelay(attempt) {
1506
- const { retryDelayMs, backoffMultiplier, maxRetryDelayMs } = this.retryConfig;
1507
- const delay = retryDelayMs * Math.pow(backoffMultiplier, attempt - 1);
1508
- return Math.min(delay, maxRetryDelayMs);
1676
+ calculateRetryDelay(attempt, overloaded = false) {
1677
+ const { retryDelayMs, backoffMultiplier, maxRetryDelayMs } = overloaded
1678
+ ? this.retryConfig.overloaded
1679
+ : this.retryConfig;
1680
+ const delay = Math.min(retryDelayMs * Math.pow(backoffMultiplier, attempt - 1), maxRetryDelayMs);
1681
+ // Equal jitter on the overloaded schedule only: a capacity storm is
1682
+ // exactly the case where a fleet retrying in sync re-creates the
1683
+ // stampede it's backing off from. [delay/2, delay) keeps the wait long.
1684
+ return overloaded ? Math.floor(delay / 2 + Math.random() * (delay / 2)) : delay;
1509
1685
  }
1510
1686
  attachRawRequest(error, rawRequest) {
1511
1687
  const errorInfo = classifyError(error);
@@ -1613,6 +1789,27 @@ export class Membrane {
1613
1789
  const maxToolDepth = maxToolDepthOpt === undefined || maxToolDepthOpt === -1
1614
1790
  ? Infinity
1615
1791
  : maxToolDepthOpt;
1792
+ // Resumption spin guards (issue #39). This is the path the Ash spin ran
1793
+ // on: tool depth here is unlimited BY DESIGN (the caller budgets its own
1794
+ // tool work — that contract stands untouched), and the false-positive
1795
+ // resumption path counted against that same unlimited bound — 43 rounds
1796
+ // × ~172k input tokens of zero progress. Only AUTOMATIC resumptions are
1797
+ // guarded: a stall guard (consecutive no-progress resumptions →
1798
+ // 'no_progress') and a hard resumption cap ('round_limit'). Tool rounds
1799
+ // are never counted. See streamWithXmlTools for the rationale details.
1800
+ const MIN_ROUND_PROGRESS_CHARS = 16;
1801
+ const MAX_CONSECUTIVE_STALLED_RESUMPTIONS = 3;
1802
+ const RESUMPTION_WARN_ROUNDS = 5;
1803
+ const maxResumptionRounds = options.maxResumptionRounds === undefined
1804
+ ? 24
1805
+ : options.maxResumptionRounds === -1
1806
+ ? Infinity
1807
+ : options.maxResumptionRounds;
1808
+ let resumptionRounds = 0;
1809
+ let consecutiveStalledResumptions = 0;
1810
+ let enteredViaResumption = false;
1811
+ let prevRoundStopSequence;
1812
+ const warnLog = this.config.logger ?? console;
1616
1813
  // Initialize parser from formatter for format-specific tracking
1617
1814
  const formatter = this.formatter;
1618
1815
  const parser = formatter.createStreamParser();
@@ -1652,6 +1849,23 @@ export class Membrane {
1652
1849
  // blocks inherited from prefill context (e.g., unclosed <thinking> from other bots)
1653
1850
  // from blocks the model itself opened during generation
1654
1851
  const prefillDepths = parser.getDepths();
1852
+ /** Count an automatic resumption; emits the visibility warning at the
1853
+ * threshold and returns false when the cap says the turn should end. */
1854
+ const registerResumptionRound = () => {
1855
+ resumptionRounds++;
1856
+ if (resumptionRounds === RESUMPTION_WARN_ROUNDS) {
1857
+ warnLog.warn(`[membrane] automatic resumption at round ${resumptionRounds} ` +
1858
+ `(${totalUsage.inputTokens} input tokens so far this turn) — ` +
1859
+ `a spin shows up here before it shows up on the bill`);
1860
+ }
1861
+ if (resumptionRounds > maxResumptionRounds) {
1862
+ warnLog.warn(`[membrane] automatic resumption cap (${maxResumptionRounds}) reached — ` +
1863
+ `ending turn with stopReason 'round_limit'. ` +
1864
+ `${totalUsage.inputTokens} input tokens spent this turn.`);
1865
+ return false;
1866
+ }
1867
+ return true;
1868
+ };
1655
1869
  try {
1656
1870
  // Tool execution loop
1657
1871
  while (toolDepth <= maxToolDepth) {
@@ -1765,6 +1979,30 @@ export class Membrane {
1765
1979
  stream.emit({ type: 'block', event: emission.event });
1766
1980
  }
1767
1981
  }
1982
+ // Stall accounting (issue #39): only rounds ENTERED via automatic
1983
+ // resumption can stall; the turn ends only after several consecutive
1984
+ // stalls. Tool rounds are never counted. Mirrors streamWithXmlTools —
1985
+ // see the detailed rationale there.
1986
+ const streamedThisRound = parser.getAccumulated().length - checkFromIndex;
1987
+ if (enteredViaResumption &&
1988
+ lastStopReason === 'stop_sequence' &&
1989
+ streamedThisRound < MIN_ROUND_PROGRESS_CHARS &&
1990
+ lastStopSequence === prevRoundStopSequence) {
1991
+ consecutiveStalledResumptions++;
1992
+ if (consecutiveStalledResumptions >= MAX_CONSECUTIVE_STALLED_RESUMPTIONS) {
1993
+ warnLog.warn(`[membrane] ${consecutiveStalledResumptions} consecutive automatic resumptions ` +
1994
+ `made no progress (${streamedThisRound} chars this round, stop ` +
1995
+ `${JSON.stringify(lastStopSequence ?? null)} repeated) — ending turn with ` +
1996
+ `stopReason 'no_progress'. ${totalUsage.inputTokens} input tokens spent this turn.`);
1997
+ lastStopReason = 'no_progress';
1998
+ break;
1999
+ }
2000
+ }
2001
+ else {
2002
+ consecutiveStalledResumptions = 0;
2003
+ }
2004
+ prevRoundStopSequence = lastStopSequence;
2005
+ enteredViaResumption = false;
1768
2006
  // Check for tool calls
1769
2007
  if (streamResult.stopSequence === '</function_calls>') {
1770
2008
  const closeTag = '</function_calls>';
@@ -1801,13 +2039,24 @@ export class Membrane {
1801
2039
  }
1802
2040
  // Track the tool calls
1803
2041
  executedToolCalls.push(...parsed.calls);
1804
- // Build tool context
2042
+ // Build tool context.
2043
+ // preamble/accumulated must expose the MODEL'S text only: the
2044
+ // parser was seeded with the entire assistant prefill (the whole
2045
+ // flattened document in XML mode), so parsed.beforeText starts
2046
+ // with it. Consumers persist the preamble as "what the agent said
2047
+ // this round" — unsliced, a turn that dies mid-rounds flushes the
2048
+ // full document back into the agent's store as its own message
2049
+ // (observed on Ash 2026-07-26: ~720k-char document echo persisted
2050
+ // as 62 sharded assistant messages, doubling her store and
2051
+ // wedging every subsequent compile). The turn-END path already
2052
+ // slices (newContent = fullAccumulated.slice(initialPrefillLength));
2053
+ // the tool-round path must match it.
1805
2054
  const context = {
1806
2055
  rawText: parsed.fullMatch,
1807
- preamble: parsed.beforeText,
2056
+ preamble: parsed.beforeText.slice(initialPrefillLength),
1808
2057
  depth: toolDepth,
1809
2058
  previousResults: executedToolResults,
1810
- accumulated: parser.getAccumulated(),
2059
+ accumulated: parser.getAccumulated().slice(initialPrefillLength),
1811
2060
  };
1812
2061
  // Yield control for tool execution
1813
2062
  const toolCallsEvent = {
@@ -1934,6 +2183,9 @@ export class Membrane {
1934
2183
  prefillResult.assistantPrefill = parser.getAccumulated();
1935
2184
  providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
1936
2185
  }
2186
+ // Tool rounds are the caller's work — they count against
2187
+ // maxToolDepth only, never against the resumption guards
2188
+ // (issue #39 review: the uncapped tool-loop contract stands).
1937
2189
  parser.resetForNewIteration();
1938
2190
  toolDepth++;
1939
2191
  continue;
@@ -1961,6 +2213,11 @@ export class Membrane {
1961
2213
  if (toolDepth > maxToolDepth) {
1962
2214
  break;
1963
2215
  }
2216
+ if (!registerResumptionRound()) {
2217
+ lastStopReason = 'round_limit';
2218
+ break;
2219
+ }
2220
+ enteredViaResumption = true;
1964
2221
  prefillResult.assistantPrefill = parser.getAccumulated();
1965
2222
  providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
1966
2223
  parser.resetForNewIteration();