@witqq/agent-sdk 0.8.0 → 0.9.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.
- package/dist/{agent-DxY68NZL.d.cts → agent-C6H2CgJA.d.cts} +2 -0
- package/dist/{agent-CW9XbmG_.d.ts → agent-F7oB6eKp.d.ts} +2 -0
- package/dist/backends/claude.cjs.map +1 -1
- package/dist/backends/claude.d.cts +2 -2
- package/dist/backends/claude.d.ts +2 -2
- package/dist/backends/claude.js.map +1 -1
- package/dist/backends/copilot.cjs +8 -15
- package/dist/backends/copilot.cjs.map +1 -1
- package/dist/backends/copilot.d.cts +2 -2
- package/dist/backends/copilot.d.ts +2 -2
- package/dist/backends/copilot.js +8 -15
- package/dist/backends/copilot.js.map +1 -1
- package/dist/backends/mock-llm.cjs +719 -0
- package/dist/backends/mock-llm.cjs.map +1 -0
- package/dist/backends/mock-llm.d.cts +37 -0
- package/dist/backends/mock-llm.d.ts +37 -0
- package/dist/backends/mock-llm.js +717 -0
- package/dist/backends/mock-llm.js.map +1 -0
- package/dist/backends/vercel-ai.cjs +8 -1
- package/dist/backends/vercel-ai.cjs.map +1 -1
- package/dist/backends/vercel-ai.d.cts +2 -2
- package/dist/backends/vercel-ai.d.ts +2 -2
- package/dist/backends/vercel-ai.js +8 -1
- package/dist/backends/vercel-ai.js.map +1 -1
- package/dist/backends-Cno0gZjy.d.cts +114 -0
- package/dist/backends-Cno0gZjy.d.ts +114 -0
- package/dist/chat/accumulator.cjs.map +1 -1
- package/dist/chat/accumulator.d.cts +2 -2
- package/dist/chat/accumulator.d.ts +2 -2
- package/dist/chat/accumulator.js.map +1 -1
- package/dist/chat/backends.cjs +350 -77
- package/dist/chat/backends.cjs.map +1 -1
- package/dist/chat/backends.d.cts +7 -7
- package/dist/chat/backends.d.ts +7 -7
- package/dist/chat/backends.js +349 -78
- package/dist/chat/backends.js.map +1 -1
- package/dist/chat/context.d.cts +2 -2
- package/dist/chat/context.d.ts +2 -2
- package/dist/chat/core.cjs +35 -25
- package/dist/chat/core.cjs.map +1 -1
- package/dist/chat/core.d.cts +15 -5
- package/dist/chat/core.d.ts +15 -5
- package/dist/chat/core.js +35 -26
- package/dist/chat/core.js.map +1 -1
- package/dist/chat/events.d.cts +2 -2
- package/dist/chat/events.d.ts +2 -2
- package/dist/chat/index.cjs +418 -122
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +7 -7
- package/dist/chat/index.d.ts +7 -7
- package/dist/chat/index.js +418 -124
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react.cjs +216 -12
- package/dist/chat/react.cjs.map +1 -1
- package/dist/chat/react.d.cts +78 -4
- package/dist/chat/react.d.ts +78 -4
- package/dist/chat/react.js +215 -13
- package/dist/chat/react.js.map +1 -1
- package/dist/chat/runtime.cjs +6 -2
- package/dist/chat/runtime.cjs.map +1 -1
- package/dist/chat/runtime.d.cts +2 -2
- package/dist/chat/runtime.d.ts +2 -2
- package/dist/chat/runtime.js +6 -2
- package/dist/chat/runtime.js.map +1 -1
- package/dist/chat/server.cjs +15 -5
- package/dist/chat/server.cjs.map +1 -1
- package/dist/chat/server.d.cts +3 -3
- package/dist/chat/server.d.ts +3 -3
- package/dist/chat/server.js +15 -5
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/sessions.cjs +39 -23
- package/dist/chat/sessions.cjs.map +1 -1
- package/dist/chat/sessions.d.cts +2 -2
- package/dist/chat/sessions.d.ts +2 -2
- package/dist/chat/sessions.js +40 -24
- package/dist/chat/sessions.js.map +1 -1
- package/dist/chat/sqlite.cjs +95 -0
- package/dist/chat/sqlite.cjs.map +1 -1
- package/dist/chat/sqlite.d.cts +39 -3
- package/dist/chat/sqlite.d.ts +39 -3
- package/dist/chat/sqlite.js +93 -1
- package/dist/chat/sqlite.js.map +1 -1
- package/dist/chat/state.d.cts +2 -2
- package/dist/chat/state.d.ts +2 -2
- package/dist/chat/storage.cjs +39 -23
- package/dist/chat/storage.cjs.map +1 -1
- package/dist/chat/storage.d.cts +7 -3
- package/dist/chat/storage.d.ts +7 -3
- package/dist/chat/storage.js +40 -24
- package/dist/chat/storage.js.map +1 -1
- package/dist/{in-process-transport-C1JnJGVR.d.ts → in-process-transport-7EIit9Xk.d.ts} +51 -17
- package/dist/{in-process-transport-C7DSqPyX.d.cts → in-process-transport-Ct9YcX8I.d.cts} +51 -17
- package/dist/index.cjs +14 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/testing.cjs +724 -0
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +14 -2
- package/dist/testing.d.ts +14 -2
- package/dist/testing.js +724 -0
- package/dist/testing.js.map +1 -1
- package/dist/{transport-Cdh3M0tS.d.cts → transport-DLWCN18G.d.cts} +1 -1
- package/dist/{transport-Ciap4PWK.d.ts → transport-DsuS-GeM.d.ts} +1 -1
- package/dist/{types-ajANVzf7.d.ts → types-DgtI1hzh.d.ts} +2 -1
- package/dist/{types-DRgd_9R7.d.cts → types-DkSXALKg.d.cts} +2 -1
- package/package.json +18 -7
- package/LICENSE +0 -21
- package/README.md +0 -1054
- package/dist/backends-BSrsBYFn.d.cts +0 -39
- package/dist/backends-BSrsBYFn.d.ts +0 -39
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testing/mock-agent-service.ts","../src/chat/types.ts","../src/testing/mock-data.ts","../src/testing/mock-runtime.ts","../src/testing/mock-chat-client.ts"],"names":[],"mappings":";;;AAgCA,IAAM,YAAN,MAAkC;AAAA,EACvB,SAAA,GAAgC,MAAA;AAAA,EACjC,MAAA,GAAqB,MAAA;AAAA,EACZ,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CAAY,QAAyB,OAAA,EAAmC;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,SAAS,OAAA,EAAS,KAAA;AACvB,IAAA,IAAA,CAAK,YAAY,OAAA,EAAS,QAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAwB,OAAA,EAA2C;AAC3E,IAAA,IAAI,KAAK,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAO,CAAA;AACnD,IAAA,OAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,gBAAA,EAAkB,MAAA,EAAW,WAAW,EAAC,EAAG,QAAA,EAAU,IAAI,KAAA,EAAO,EAAE,cAAc,EAAA,EAAI,gBAAA,EAAkB,GAAE,EAAE;AAAA,EAC/I;AAAA,EAEA,MAAM,cAAA,CAAe,QAAA,EAAqB,OAAA,EAA2C;AACnF,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,OAAO,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,SAAA;AACtE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,aAAA,CACJ,MAAA,EACA,OAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,OAAO,CAAA;AAC3C,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAkB,MAAA,EAAuD;AAAA,EAC7F;AAAA,EAEA,OAAO,MAAA,CAAO,MAAA,EAAwB,OAAA,EAAgD;AACpF,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AACrC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAA,EAAQ;AAC1C,IAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAA,EAAW;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,eAAA,EAAgB;AAAA,EACrD;AAAA,EAEA,OAAO,iBAAA,CAAkB,QAAA,EAAqB,OAAA,EAAgD;AAC5F,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,OAAO,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,SAAA;AACtE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAA,GAA2B;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AAAA,EAChB;AACF,CAAA;AAWO,SAAS,sBAAA,CAAuB,OAAA,GAAmC,EAAC,EAAkB;AAC3F,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,MAAA;AAC7B,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,YAAY,MAAA,EAAiC;AAC3C,MAAA,OAAO,IAAI,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,MAAM,UAAA,GAAmC;AACvC,MAAA,OAAO,QAAQ,MAAA,IAAU;AAAA,QACvB,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAA,EAAM,cAAA,EAAe;AAAA,QAC3C,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAA,EAAM,cAAA;AAAe,OAC7C;AAAA,IACF,CAAA;AAAA,IACA,MAAM,QAAA,GAAsC;AAC1C,MAAA,OAAO,QAAQ,gBAAA,IAAoB,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AAAA,IAC/D,CAAA;AAAA,IACA,MAAM,OAAA,GAAyB;AAAA,IAE/B;AAAA,GACF;AACF;;;AChHO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,OAAO,UAAA,EAAW;AAC3B;AAGA,IAAM,OAAA,GAAU,wEAAA;AAUT,SAAS,SAAS,KAAA,EAAuB;AAC9C,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,iBAAA,EAAoB,KAAK,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,KAAA;AACT;;;ACNO,SAAS,iBAAA,CAAkB,OAAA,GAA8B,EAAC,EAAgB;AAC/E,EAAA,MAAM,EAAA,GAAM,OAAA,CAAQ,EAAA,IAAM,YAAA,EAAa;AACvC,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,KAAA,EAAO,QAAQ,KAAA,IAAS,cAAA;AAAA,IACxB,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,EAAC;AAAA,IAC/B,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,YAAA;AAAA,MAChC,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAQ,OAAA,IAAW,cAAA;AAAA,MACpC,YAAA,EAAc,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB;AAAA,KAChD;AAAA,IACA,QAAA,EAAU;AAAA,MACR,YAAA,EAAc,OAAA,CAAQ,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,MAC1C,WAAA,EAAa,CAAA;AAAA,MACb,MAAA,EAAQ,OAAA,CAAQ,QAAA,IAAY;AAAC,KAC/B;AAAA,IACA,MAAA,EAAQ,QAAQ,MAAA,IAAU,QAAA;AAAA,IAC1B,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AACF;AASO,SAAS,iBAAA,CAAkB,OAAA,GAA8B,EAAC,EAAgB;AAC/E,EAAA,MAAM,KAAK,YAAA,EAAa;AACxB,EAAA,MAAM,KAAA,GAAuB,OAAA,CAAQ,KAAA,KAAU,OAAA,CAAQ,IAAA,GACnD,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,UAAA,EAAqB,CAAA,GAC3E,CAAC,EAAE,IAAA,EAAM,QAAiB,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,UAAA,EAAqB,CAAA,CAAA;AACjF,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,IACtB,KAAA;AAAA,IACA,MAAA,EAAQ,QAAQ,MAAA,IAAU,UAAA;AAAA,IAC1B,SAAA,EAAW,GAAA;AAAA,IACX,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,GACjC;AACF;;;AC3CO,SAAS,iBAAA,CAAkB,OAAA,GAA8B,EAAC,EAAiB;AAChF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA4B;AAE9C,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAgB;AAC7C,EAAA,IAAI,cAAA,GAAiB,QAAQ,cAAA,IAAkB,MAAA;AAC/C,EAAA,IAAI,MAAA,GAAwB,MAAA;AAG5B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACtB;AAEA,EAAA,SAAS,mBAAA,GAAsB;AAC7B,IAAA,KAAA,MAAW,MAAM,gBAAA,EAAkB;AACjC,MAAA,IAAI;AAAE,QAAA,EAAA,EAAG;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAiB;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAwB;AAAA,IAC5B,IAAI,MAAA,GAAS;AAAE,MAAA,OAAO,MAAA;AAAA,IAAQ,CAAA;AAAA,IAC9B,IAAI,eAAA,GAAkB;AAAE,MAAA,OAAO,KAAA;AAAA,IAA8C,CAAA;AAAA,IAE7E,MAAM,cAAc,IAAA,EAAkD;AACpE,MAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,QAChC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,YAAA;AAAA,UAC7B,OAAA,EAAS,IAAA,CAAK,MAAA,EAAQ,OAAA,IAAW,cAAA;AAAA,UACjC,YAAA,EAAc,KAAK,MAAA,EAAQ;AAAA,SAC7B;AAAA,QACA,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AACD,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAChC,MAAA,mBAAA,EAAoB;AACpB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,WAAW,EAAA,EAA6C;AAC5D,MAAA,OAAO,SAAS,GAAA,CAAI,QAAA,CAAS,OAAO,EAAE,CAAC,CAAC,CAAA,IAAK,IAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,aAAa,KAAA,EAAoD;AACrE,MAAA,OAAO,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,IAC9B,CAAA;AAAA,IAEA,MAAM,cAAc,EAAA,EAA+B;AACjD,MAAA,QAAA,CAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACpC,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAAA,IAEA,IAAA,CAAK,SAAA,EAAuB,OAAA,EAAiB,QAAA,EAAyD;AACpG,MAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,QAAQ,MAAA,CAAO,SAAA,EAAW,SAAS,QAAQ,CAAA;AAEtE,MAAA,gBAAgB,aAAA,GAA0C;AACxD,QAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,QAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,KAAA,EAAM;AAChD,QAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,YAAA,EAAa;AAClD,QAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAA,EAAW,KAAA,EAAM;AACnD,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,YAAA,EAAa;AAEhD,QAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,SAAS,MAAA,CAAO,SAAS,CAAC,CAAC,CAAA;AACxD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,QAAA,CAAS,KAAK,iBAAA,CAAkB,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,CAAC,CAAA;AAClF,UAAA,OAAA,CAAQ,QAAA,CAAS,YAAA,GAAe,OAAA,CAAQ,QAAA,CAAS,MAAA;AAAA,QACnD;AACA,QAAA,mBAAA,EAAoB;AAAA,MACtB;AACA,MAAA,OAAO,aAAA,EAAc;AAAA,IACvB,CAAA;AAAA,IAEA,KAAA,GAAc;AAAA,IAAc,CAAA;AAAA,IAE5B,MAAM,UAAA,GAAmC;AACvC,MAAA,OAAO,OAAA,CAAQ,UAAU,CAAC,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,cAAc,CAAA;AAAA,IACpE,CAAA;AAAA,IAEA,MAAM,YAAA,GAAuC;AAC3C,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA;AAAA,IAClC,CAAA;AAAA,IAEA,gBAAgB,QAAA,EAAkC;AAChD,MAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAC7B,MAAA,OAAO,MAAM;AAAE,QAAA,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,MAAG,CAAA;AAAA,IACpD,CAAA;AAAA,IAEA,aAAa,IAAA,EAA4B;AACvC,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,WAAW,IAAA,EAAoB;AAC7B,MAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IAEA,IAAI,EAAA,EAA0B;AACV,IACpB,CAAA;AAAA,IAEA,iBAAiB,EAAA,EAA0B;AAEH,IACxC,CAAA;AAAA,IAEA,MAAM,gBAAgB,UAAA,EAAsD;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,OAAA,GAAyB;AAC7B,MAAA,MAAA,GAAS,UAAA;AACT,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,KAAA,CAAM,KAAA,EAAM;AAEZ,MAAA,gBAAA,CAAiB,KAAA,EAAM;AAAA,IACzB;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT;;;ACvHO,SAAS,oBAAA,CAAqB,OAAA,GAAiC,EAAC,EAAgB;AACrF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4B;AAClD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAgB;AAC7C,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAyC;AACxE,EAAA,IAAI,eAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,kBAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,MAAA,GAAwB,MAAA;AAG5B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACtB;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,SAAA,IAAa,EAAC,EAAG;AACvC,IAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,SAAS,mBAAA,GAAsB;AAC7B,IAAA,KAAA,MAAW,MAAM,gBAAA,EAAkB;AACjC,MAAA,IAAI;AAAE,QAAA,EAAA,EAAG;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAiB;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,IAAI,MAAA,GAAS;AAAE,MAAA,OAAO,MAAA;AAAA,IAAQ,CAAA;AAAA,IAC9B,IAAI,eAAA,GAAkB;AAAE,MAAA,OAAO,eAAA;AAAA,IAAiB,CAAA;AAAA,IAEhD,MAAM,cAAc,IAAA,EAAkD;AACpE,MAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,QAChC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,YAAA;AAAA,UAC7B,OAAA,EAAS,IAAA,CAAK,MAAA,EAAQ,OAAA,IAAW,MAAA;AAAA,UACjC,YAAA,EAAc,KAAK,MAAA,EAAQ;AAAA;AAC7B,OACD,CAAA;AACD,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAChC,MAAA,eAAA,GAAkB,OAAA,CAAQ,EAAA;AAC1B,MAAA,mBAAA,EAAoB;AACpB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,WAAW,EAAA,EAA6C;AAC5D,MAAA,OAAO,SAAS,GAAA,CAAI,QAAA,CAAS,OAAO,EAAE,CAAC,CAAC,CAAA,IAAK,IAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,aAAa,KAAA,EAAoD;AACrE,MAAA,OAAO,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,IAC9B,CAAA;AAAA,IAEA,MAAM,cAAc,EAAA,EAA+B;AACjD,MAAA,QAAA,CAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACpC,MAAA,IAAI,eAAA,KAAoB,MAAA,CAAO,EAAE,CAAA,EAAG,eAAA,GAAkB,IAAA;AACtD,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAAA,IAEA,MAAM,cAAc,EAAA,EAAsC;AACxD,MAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,SAAS,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACjD,MAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,EAAE,CAAA,UAAA,CAAY,CAAA;AACvD,MAAA,eAAA,GAAkB,OAAA,CAAQ,EAAA;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,IAAA,CAAK,SAAA,EAAuB,OAAA,EAAiB,QAAA,EAAyD;AACpG,MAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,QAAQ,MAAA,CAAO,SAAA,EAAW,SAAS,QAAQ,CAAA;AACtE,MAAA,gBAAgB,aAAA,GAA0C;AACxD,QAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,QAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,KAAA,EAAM;AAChD,QAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,YAAA,EAAa;AAClD,QAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAA,EAAW,KAAA,EAAM;AACnD,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,YAAA,EAAa;AAChD,QAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,SAAS,MAAA,CAAO,SAAS,CAAC,CAAC,CAAA;AACxD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,QAAA,CAAS,KAAK,iBAAA,CAAkB,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,CAAC,CAAA;AAClF,UAAA,OAAA,CAAQ,QAAA,CAAS,YAAA,GAAe,OAAA,CAAQ,QAAA,CAAS,MAAA;AAAA,QACnD;AACA,QAAA,mBAAA,EAAoB;AAAA,MACtB;AACA,MAAA,OAAO,aAAA,EAAc;AAAA,IACvB,CAAA;AAAA,IAEA,KAAA,GAAc;AAAA,IAAc,CAAA;AAAA;AAAA,IAG5B,IAAI,kBAAA,GAAqB;AAAE,MAAA,OAAO,kBAAA;AAAA,IAAoB,CAAA;AAAA,IACtD,eAAe,UAAA,EAA0B;AACvC,MAAA,kBAAA,GAAqB,UAAA;AACrB,MAAA,KAAA,MAAW,MAAM,kBAAA,EAAoB;AACnC,QAAA,IAAI;AAAE,UAAA,EAAA,CAAG,UAAU,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAiB;AAAA,MACjD;AAAA,IACF,CAAA;AAAA,IACA,kBAAkB,QAAA,EAA2D;AAC3E,MAAA,kBAAA,CAAmB,IAAI,QAAQ,CAAA;AAC/B,MAAA,OAAO,MAAM;AAAE,QAAA,kBAAA,CAAmB,OAAO,QAAQ,CAAA;AAAA,MAAG,CAAA;AAAA,IACtD,CAAA;AAAA,IAEA,MAAM,UAAA,GAAmC;AACvC,MAAA,OAAO,OAAA,CAAQ,UAAU,CAAC,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,cAAc,CAAA;AAAA,IACpE,CAAA;AAAA,IAEA,MAAM,YAAA,GAAuC;AAC3C,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,gBAAgB,QAAA,EAAkC;AAChD,MAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAC7B,MAAA,OAAO,MAAM;AAAE,QAAA,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,MAAG,CAAA;AAAA,IACpD,CAAA;AAAA,IAEA,MAAM,gBAAgB,UAAA,EAAsD;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA;AAAA,IAGA,MAAM,aAAA,GAA2C;AAC/C,MAAA,OAAO,CAAC,GAAG,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,eAAe,MAAA,EAA2E;AAC9F,MAAA,MAAM,QAAA,GAA2B;AAAA,QAC/B,GAAG,MAAA;AAAA,QACH,IAAI,YAAA,EAAa;AAAA,QACjB,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AACnC,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,cAAA,CAAe,EAAA,EAAY,OAAA,EAA2E;AAC1G,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACjC,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,EAAE,CAAA,UAAA,CAAY,CAAA;AACzD,MAAA,SAAA,CAAU,IAAI,EAAA,EAAI,EAAE,GAAG,QAAA,EAAU,GAAG,SAAS,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,eAAe,EAAA,EAA2B;AAC9C,MAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,OAAA,GAAyB;AAC7B,MAAA,MAAA,GAAS,UAAA;AACT,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,SAAA,CAAU,KAAA,EAAM;AAChB,MAAA,gBAAA,CAAiB,KAAA,EAAM;AACvB,MAAA,kBAAA,CAAmB,KAAA,EAAM;AAAA,IAC3B;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"testing.cjs","sourcesContent":["/**\n * Mock IAgentService factory for testing.\n */\nimport type {\n IAgentService,\n IAgent,\n FullAgentConfig,\n ModelInfo,\n ValidationResult,\n AgentResult,\n AgentEvent,\n Message,\n MessageContent,\n RunOptions,\n StructuredOutputConfig,\n AgentState,\n} from \"../types.js\";\n\n/** Options for createMockAgentService. */\nexport interface MockAgentServiceOptions {\n /** Service name. Default: \"mock\". */\n name?: string;\n /** Models to return from listModels(). */\n models?: ModelInfo[];\n /** Custom validation result. Default: { valid: true, errors: [] }. */\n validationResult?: ValidationResult;\n /** Custom run handler. Default: returns \"Mock response\". */\n onRun?: (prompt: MessageContent, options?: RunOptions) => Promise<AgentResult>;\n /** Custom stream handler. Default: yields text_delta + result events. */\n onStream?: (prompt: MessageContent, options?: RunOptions) => AsyncIterable<AgentEvent>;\n}\n\nclass MockAgent implements IAgent {\n readonly sessionId: string | undefined = undefined;\n private _state: AgentState = \"idle\";\n private readonly _config: FullAgentConfig;\n private readonly _onRun?: MockAgentServiceOptions[\"onRun\"];\n private readonly _onStream?: MockAgentServiceOptions[\"onStream\"];\n\n constructor(config: FullAgentConfig, options?: MockAgentServiceOptions) {\n this._config = config;\n this._onRun = options?.onRun;\n this._onStream = options?.onStream;\n }\n\n async run(prompt: MessageContent, options: RunOptions): Promise<AgentResult> {\n if (this._onRun) return this._onRun(prompt, options);\n return { output: \"Mock response\", structuredOutput: undefined, toolCalls: [], messages: [], usage: { promptTokens: 10, completionTokens: 5 } };\n }\n\n async runWithContext(messages: Message[], options: RunOptions): Promise<AgentResult> {\n const lastMsg = messages[messages.length - 1];\n const text = typeof lastMsg?.content === \"string\" ? lastMsg.content : \"context\";\n return this.run(text, options);\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n _schema: StructuredOutputConfig<T>,\n options: RunOptions,\n ): Promise<AgentResult<T>> {\n const base = await this.run(prompt, options);\n return { ...base, structuredOutput: undefined as unknown as T extends void ? undefined : T };\n }\n\n async *stream(prompt: MessageContent, options: RunOptions): AsyncIterable<AgentEvent> {\n if (this._onStream) {\n yield* this._onStream(prompt, options);\n return;\n }\n yield { type: \"text_delta\", text: \"Mock \" };\n yield { type: \"text_delta\", text: \"response\" };\n yield { type: \"done\", finalOutput: \"Mock response\" };\n }\n\n async *streamWithContext(messages: Message[], options: RunOptions): AsyncIterable<AgentEvent> {\n const lastMsg = messages[messages.length - 1];\n const text = typeof lastMsg?.content === \"string\" ? lastMsg.content : \"context\";\n yield* this.stream(text, options);\n }\n\n abort(): void {\n this._state = \"idle\";\n }\n\n async interrupt(): Promise<void> {\n this._state = \"idle\";\n }\n\n getState(): AgentState {\n return this._state;\n }\n\n getConfig(): Readonly<FullAgentConfig> {\n return this._config;\n }\n\n dispose(): void {\n this._state = \"disposed\";\n }\n}\n\n/**\n * Create a mock IAgentService for testing agent-level code.\n *\n * ```ts\n * const service = createMockAgentService({ name: \"test\" });\n * const agent = service.createAgent({ model: \"gpt-5-mini\" });\n * const result = await agent.run(\"Hello\");\n * ```\n */\nexport function createMockAgentService(options: MockAgentServiceOptions = {}): IAgentService {\n const name = options.name ?? \"mock\";\n return {\n name,\n createAgent(config: FullAgentConfig): IAgent {\n return new MockAgent(config, options);\n },\n async listModels(): Promise<ModelInfo[]> {\n return options.models ?? [\n { id: \"mock-model-1\", name: \"Mock Model 1\" },\n { id: \"mock-model-2\", name: \"Mock Model 2\" },\n ];\n },\n async validate(): Promise<ValidationResult> {\n return options.validationResult ?? { valid: true, errors: [] };\n },\n async dispose(): Promise<void> {\n // no-op\n },\n };\n}\n","/**\n * @witqq/agent-sdk — Chat domain types\n *\n * All type definitions and interfaces for the chat layer.\n * Pure types + ChatId generation (tightly coupled to branded type).\n */\n\nimport type { UsageData, ToolDefinition, ErrorCode } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Session metadata tracking usage statistics and custom extensions.\n *\n * Updated automatically by session stores on each `addMessage()` call.\n * The generic `TCustom` parameter allows type-safe application-specific\n * metadata via the `custom` field.\n *\n * @typeParam TCustom - Shape of the `custom` field (defaults to `Record<string, unknown>`)\n */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Number of messages in the session (updated by session store) */\n messageCount: number;\n /** Total token count across all messages in the session */\n totalTokens: number;\n /** Optional tags for session categorization and filtering */\n tags?: string[];\n /** Application-specific metadata — typed via the TCustom generic parameter */\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages (pure serializable data) */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n}\n\n/**\n * Reactive wrapper around ChatSession — provides subscribe/getSnapshot for\n * React useSyncExternalStore integration and lastMessage convenience getter.\n * Session stores may optionally return ObservableSession instances.\n */\nexport interface ObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>\n extends ChatSession<TCustom> {\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage: ChatMessage | undefined;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n code?: ErrorCode;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend. Return null to reject the send. */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | null | Promise<ChatMessage | null>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n /** Model to use for this request. Required for server-side runtime.send(). */\n model?: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Options for runtime.send() — requires backend routing info */\nexport interface RuntimeSendOptions {\n /** Backend to route this request to (key in backends map) */\n backend: string;\n /** Authentication credentials for the backend factory */\n credentials: AuthToken;\n /** Model to use for this request */\n model: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n /** Abort signal */\n signal?: AbortSignal;\n /** Request-scoped context */\n context?: Record<string, unknown>;\n /** Additional tools */\n tools?: ToolDefinition[];\n}\n\n/**\n * @deprecated IChatProvider has been inlined into IChatBackend.\n * Import IChatBackend from \"@witqq/agent-sdk/chat/backends\" instead.\n * Kept as type alias for backward compatibility.\n */\nexport type IChatProvider = import(\"./backends/types.js\").IChatBackend;\n\n// ─── Factory Functions ─────────────────────────────────────────\n\n/**\n * Create a simple text ChatMessage.\n *\n * @param text - Message text content\n * @param role - Message role (default: \"user\")\n * @returns A complete ChatMessage with a single TextPart\n */\nexport function createTextMessage(text: string, role: ChatRole = \"user\"): ChatMessage {\n return {\n id: createChatId(),\n role,\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n}\n\n/** Type guard: checks if a session has reactive API (subscribe/getSnapshot) */\nexport function isObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>(\n session: ChatSession<TCustom>,\n): session is ObservableSession<TCustom> {\n return \"subscribe\" in session && typeof (session as ObservableSession<TCustom>).subscribe === \"function\"\n && \"getSnapshot\" in session && typeof (session as ObservableSession<TCustom>).getSnapshot === \"function\";\n}\n","/**\n * Mock data factories for creating test ChatSession and ChatMessage instances.\n */\nimport type { ChatSession, ChatMessage, MessagePart, ChatSessionConfig, ChatId } from \"../chat/core.js\";\nimport { createChatId } from \"../chat/core.js\";\n\n/** Options for createMockSession. */\nexport interface MockSessionOptions {\n id?: string;\n title?: string;\n messages?: ChatMessage[];\n config?: Partial<ChatSessionConfig>;\n metadata?: Record<string, unknown>;\n status?: \"active\";\n}\n\n/** Options for createMockMessage. */\nexport interface MockMessageOptions {\n id?: string;\n role?: \"user\" | \"assistant\" | \"system\";\n text?: string;\n parts?: MessagePart[];\n status?: \"pending\" | \"streaming\" | \"complete\" | \"error\";\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Create a mock ChatSession for testing.\n *\n * ```ts\n * const session = createMockSession({ title: \"Test chat\" });\n * ```\n */\nexport function createMockSession(options: MockSessionOptions = {}): ChatSession {\n const id = (options.id ?? createChatId()) as ChatId;\n const now = new Date().toISOString();\n return {\n id,\n title: options.title ?? \"Test Session\",\n messages: options.messages ?? [],\n config: {\n model: options.config?.model ?? \"test-model\",\n backend: options.config?.backend ?? \"test-backend\",\n systemPrompt: options.config?.systemPrompt ?? \"\",\n },\n metadata: {\n messageCount: options.messages?.length ?? 0,\n totalTokens: 0,\n custom: options.metadata ?? {},\n },\n status: options.status ?? \"active\",\n createdAt: now,\n updatedAt: now,\n };\n}\n\n/**\n * Create a mock ChatMessage for testing.\n *\n * ```ts\n * const msg = createMockMessage({ role: \"user\", text: \"Hello\" });\n * ```\n */\nexport function createMockMessage(options: MockMessageOptions = {}): ChatMessage {\n const id = createChatId();\n const parts: MessagePart[] = options.parts ?? (options.text\n ? [{ type: \"text\" as const, text: options.text, status: \"complete\" as const }]\n : [{ type: \"text\" as const, text: \"Test message\", status: \"complete\" as const }]);\n const now = new Date().toISOString();\n return {\n id,\n role: options.role ?? \"user\",\n parts,\n status: options.status ?? \"complete\",\n createdAt: now,\n metadata: options.metadata ?? {},\n };\n}\n","/**\n * Mock IChatRuntime factory for testing chat runtime consumers.\n */\nimport type { IChatRuntime, BackendInfo } from \"../chat/runtime.js\";\nimport type { CreateSessionOptions, SessionListOptions } from \"../chat/sessions.js\";\nimport type { ChatSession, ChatEvent, ChatIdLike, ChatMiddleware, RuntimeStatus } from \"../chat/core.js\";\nimport type { RuntimeSendOptions } from \"../chat/types.js\";\nimport type { ContextStats } from \"../chat/context.js\";\nimport type { ToolDefinition, ModelInfo } from \"../types.js\";\nimport { createChatId, toChatId } from \"../chat/core.js\";\nimport { createMockSession, createMockMessage } from \"./mock-data.js\";\n\n/** Options for createMockRuntime. */\nexport interface MockRuntimeOptions {\n /** Default backend name. Default: \"mock\". */\n defaultBackend?: string;\n /** Default model. */\n defaultModel?: string;\n /** Pre-seeded sessions. */\n sessions?: ChatSession[];\n /** Models to return from listModels(). */\n models?: ModelInfo[];\n /** Custom send handler. When not provided, yields a single text_delta + done event. */\n onSend?: (sessionId: ChatIdLike, message: string, options?: RuntimeSendOptions) => AsyncIterable<ChatEvent>;\n}\n\n/**\n * Create a mock IChatRuntime for testing chat UI hooks and components.\n *\n * ```ts\n * const runtime = createMockRuntime({ defaultModel: \"gpt-5-mini\" });\n * const session = await runtime.createSession({});\n * ```\n */\nexport function createMockRuntime(options: MockRuntimeOptions = {}): IChatRuntime {\n const sessions = new Map<string, ChatSession>();\n const tools = new Map<string, ToolDefinition>();\n const middleware: ChatMiddleware[] = [];\n const sessionListeners = new Set<() => void>();\n let currentBackend = options.defaultBackend ?? \"mock\";\n let status: RuntimeStatus = \"idle\";\n\n // Seed initial sessions\n for (const s of options.sessions ?? []) {\n sessions.set(s.id, s);\n }\n\n function notifySessionChange() {\n for (const cb of sessionListeners) {\n try { cb(); } catch { /* isolated */ }\n }\n }\n\n const runtime: IChatRuntime = {\n get status() { return status; },\n get registeredTools() { return tools as ReadonlyMap<string, ToolDefinition>; },\n\n async createSession(opts: CreateSessionOptions): Promise<ChatSession> {\n const session = createMockSession({\n title: opts.title,\n config: {\n model: opts.config?.model ?? \"mock-model\",\n backend: opts.config?.backend ?? currentBackend,\n systemPrompt: opts.config?.systemPrompt,\n },\n metadata: opts.custom as Record<string, unknown>,\n });\n sessions.set(session.id, session);\n notifySessionChange();\n return session;\n },\n\n async getSession(id: ChatIdLike): Promise<ChatSession | null> {\n return sessions.get(toChatId(String(id))) ?? null;\n },\n\n async listSessions(_opts?: SessionListOptions): Promise<ChatSession[]> {\n return [...sessions.values()];\n },\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n sessions.delete(toChatId(String(id)));\n notifySessionChange();\n },\n\n send(sessionId: ChatIdLike, message: string, sendOpts?: RuntimeSendOptions): AsyncIterable<ChatEvent> {\n if (options.onSend) return options.onSend(sessionId, message, sendOpts);\n // Default: yield a simple response\n async function* defaultStream(): AsyncIterable<ChatEvent> {\n const msgId = createChatId();\n yield { type: \"message:start\", messageId: msgId } as ChatEvent;\n yield { type: \"message:delta\", text: \"Mock reply\" } as ChatEvent;\n yield { type: \"message:complete\", messageId: msgId } as ChatEvent;\n yield { type: \"done\", finalOutput: \"Mock reply\" } as ChatEvent;\n // Add assistant message to session\n const session = sessions.get(toChatId(String(sessionId)));\n if (session) {\n session.messages.push(createMockMessage({ role: \"assistant\", text: \"Mock reply\" }));\n session.metadata.messageCount = session.messages.length;\n }\n notifySessionChange();\n }\n return defaultStream();\n },\n\n abort(): void { /* no-op */ },\n\n async listModels(): Promise<ModelInfo[]> {\n return options.models ?? [{ id: \"mock-model\", name: \"Mock Model\" }];\n },\n\n async listBackends(): Promise<BackendInfo[]> {\n return [{ name: currentBackend }];\n },\n\n onSessionChange(callback: () => void): () => void {\n sessionListeners.add(callback);\n return () => { sessionListeners.delete(callback); };\n },\n\n registerTool(tool: ToolDefinition): void {\n tools.set(tool.name, tool);\n },\n\n removeTool(name: string): void {\n tools.delete(name);\n },\n\n use(mw: ChatMiddleware): void {\n middleware.push(mw);\n },\n\n removeMiddleware(mw: ChatMiddleware): void {\n const idx = middleware.indexOf(mw);\n if (idx >= 0) middleware.splice(idx, 1);\n },\n\n async getContextStats(_sessionId: ChatIdLike): Promise<ContextStats | null> {\n return null;\n },\n\n async dispose(): Promise<void> {\n status = \"disposed\";\n sessions.clear();\n tools.clear();\n middleware.length = 0;\n sessionListeners.clear();\n },\n };\n\n return runtime;\n}\n","/**\n * Mock IChatClient factory for testing remote chat client consumers.\n */\nimport type { IChatClient, BackendInfo } from \"../chat/runtime.js\";\nimport type { CreateSessionOptions, SessionListOptions } from \"../chat/sessions.js\";\nimport type { ChatSession, ChatEvent, ChatId, ChatIdLike, SendMessageOptions, RuntimeStatus } from \"../chat/core.js\";\nimport type { ProviderConfig } from \"../chat/provider-types.js\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { ContextStats } from \"../chat/context.js\";\nimport { createChatId, toChatId } from \"../chat/core.js\";\nimport { createMockSession, createMockMessage } from \"./mock-data.js\";\n\n/** Options for createMockChatClient. */\nexport interface MockChatClientOptions {\n /** Pre-seeded sessions. */\n sessions?: ChatSession[];\n /** Models to return from listModels(). */\n models?: ModelInfo[];\n /** Providers to return from listProviders(). */\n providers?: ProviderConfig[];\n /** Custom send handler. */\n onSend?: (sessionId: ChatIdLike, message: string, options?: SendMessageOptions) => AsyncIterable<ChatEvent>;\n}\n\n/**\n * Create a mock IChatClient for testing React hooks that talk to RemoteChatClient.\n *\n * ```ts\n * const client = createMockChatClient({ providers: [{ id: \"p1\", backend: \"copilot\", model: \"gpt-5-mini\", label: \"GPT Mini\", createdAt: \"\" }] });\n * const providers = await client.listProviders();\n * ```\n */\nexport function createMockChatClient(options: MockChatClientOptions = {}): IChatClient {\n const sessions = new Map<string, ChatSession>();\n const providers = new Map<string, ProviderConfig>();\n const sessionListeners = new Set<() => void>();\n const selectionListeners = new Set<(providerId: string | null) => void>();\n let activeSessionId: ChatId | null = null;\n let selectedProviderId: string | null = null;\n let status: RuntimeStatus = \"idle\";\n\n // Seed sessions\n for (const s of options.sessions ?? []) {\n sessions.set(s.id, s);\n }\n // Seed providers\n for (const p of options.providers ?? []) {\n providers.set(p.id, p);\n }\n\n function notifySessionChange() {\n for (const cb of sessionListeners) {\n try { cb(); } catch { /* isolated */ }\n }\n }\n\n const client: IChatClient = {\n get status() { return status; },\n get activeSessionId() { return activeSessionId; },\n\n async createSession(opts: CreateSessionOptions): Promise<ChatSession> {\n const session = createMockSession({\n title: opts.title,\n config: {\n model: opts.config?.model ?? \"mock-model\",\n backend: opts.config?.backend ?? \"mock\",\n systemPrompt: opts.config?.systemPrompt,\n },\n });\n sessions.set(session.id, session);\n activeSessionId = session.id;\n notifySessionChange();\n return session;\n },\n\n async getSession(id: ChatIdLike): Promise<ChatSession | null> {\n return sessions.get(toChatId(String(id))) ?? null;\n },\n\n async listSessions(_opts?: SessionListOptions): Promise<ChatSession[]> {\n return [...sessions.values()];\n },\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n sessions.delete(toChatId(String(id)));\n if (activeSessionId === String(id)) activeSessionId = null;\n notifySessionChange();\n },\n\n async switchSession(id: ChatIdLike): Promise<ChatSession> {\n const session = sessions.get(toChatId(String(id)));\n if (!session) throw new Error(`Session ${id} not found`);\n activeSessionId = session.id;\n return session;\n },\n\n send(sessionId: ChatIdLike, message: string, sendOpts?: SendMessageOptions): AsyncIterable<ChatEvent> {\n if (options.onSend) return options.onSend(sessionId, message, sendOpts);\n async function* defaultStream(): AsyncIterable<ChatEvent> {\n const msgId = createChatId();\n yield { type: \"message:start\", messageId: msgId } as ChatEvent;\n yield { type: \"message:delta\", text: \"Mock reply\" } as ChatEvent;\n yield { type: \"message:complete\", messageId: msgId } as ChatEvent;\n yield { type: \"done\", finalOutput: \"Mock reply\" } as ChatEvent;\n const session = sessions.get(toChatId(String(sessionId)));\n if (session) {\n session.messages.push(createMockMessage({ role: \"assistant\", text: \"Mock reply\" }));\n session.metadata.messageCount = session.messages.length;\n }\n notifySessionChange();\n }\n return defaultStream();\n },\n\n abort(): void { /* no-op */ },\n\n // ── Provider Selection ──\n get selectedProviderId() { return selectedProviderId; },\n selectProvider(providerId: string): void {\n selectedProviderId = providerId;\n for (const cb of selectionListeners) {\n try { cb(providerId); } catch { /* isolated */ }\n }\n },\n onSelectionChange(callback: (providerId: string | null) => void): () => void {\n selectionListeners.add(callback);\n return () => { selectionListeners.delete(callback); };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n return options.models ?? [{ id: \"mock-model\", name: \"Mock Model\" }];\n },\n\n async listBackends(): Promise<BackendInfo[]> {\n return [{ name: \"mock\" }];\n },\n\n onSessionChange(callback: () => void): () => void {\n sessionListeners.add(callback);\n return () => { sessionListeners.delete(callback); };\n },\n\n async getContextStats(_sessionId: ChatIdLike): Promise<ContextStats | null> {\n return null;\n },\n\n // ── Provider CRUD ──\n async listProviders(): Promise<ProviderConfig[]> {\n return [...providers.values()];\n },\n\n async createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig> {\n const provider: ProviderConfig = {\n ...config,\n id: createChatId(),\n createdAt: Date.now(),\n };\n providers.set(provider.id, provider);\n return provider;\n },\n\n async updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void> {\n const existing = providers.get(id);\n if (!existing) throw new Error(`Provider ${id} not found`);\n providers.set(id, { ...existing, ...changes });\n },\n\n async deleteProvider(id: string): Promise<void> {\n providers.delete(id);\n },\n\n async dispose(): Promise<void> {\n status = \"disposed\";\n sessions.clear();\n providers.clear();\n sessionListeners.clear();\n selectionListeners.clear();\n },\n };\n\n return client;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/errors.ts","../src/errors.ts","../src/base-agent.ts","../src/backends/mock-llm.ts","../src/testing/mock-agent-service.ts","../src/chat/types.ts","../src/testing/mock-data.ts","../src/testing/mock-runtime.ts","../src/testing/mock-chat-client.ts"],"names":[],"mappings":"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","file":"testing.cjs","sourcesContent":["// ─── Unified Error Code Enum ───────────────────────────────────\n\n/** Unified error codes for all SDK errors — single source of truth. */\nexport enum ErrorCode {\n // Auth\n AUTH_EXPIRED = \"AUTH_EXPIRED\",\n AUTH_INVALID = \"AUTH_INVALID\",\n\n // Rate limiting\n RATE_LIMIT = \"RATE_LIMIT\",\n\n // Network\n NETWORK = \"NETWORK\",\n TIMEOUT = \"TIMEOUT\",\n\n // Provider\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MODEL_NOT_FOUND = \"MODEL_NOT_FOUND\",\n MODEL_OVERLOADED = \"MODEL_OVERLOADED\",\n CONTEXT_OVERFLOW = \"CONTEXT_OVERFLOW\",\n\n // Input / Response\n INVALID_INPUT = \"INVALID_INPUT\",\n INVALID_RESPONSE = \"INVALID_RESPONSE\",\n\n // SDK internal\n REENTRANCY = \"REENTRANCY\",\n DISPOSED = \"DISPOSED\",\n ABORTED = \"ABORTED\",\n INVALID_TRANSITION = \"INVALID_TRANSITION\",\n DEPENDENCY_MISSING = \"DEPENDENCY_MISSING\",\n BACKEND_NOT_INSTALLED = \"BACKEND_NOT_INSTALLED\",\n\n // Tool\n TOOL_EXECUTION = \"TOOL_EXECUTION\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Session\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n SESSION_EXPIRED = \"SESSION_EXPIRED\",\n\n // Provider resolution\n PROVIDER_NOT_FOUND = \"PROVIDER_NOT_FOUND\",\n AUTH_REQUIRED = \"AUTH_REQUIRED\",\n\n // Storage (generic)\n STORAGE_ERROR = \"STORAGE_ERROR\",\n // Storage (specific)\n STORAGE_NOT_FOUND = \"STORAGE_NOT_FOUND\",\n STORAGE_DUPLICATE_KEY = \"STORAGE_DUPLICATE_KEY\",\n STORAGE_IO_ERROR = \"STORAGE_IO_ERROR\",\n STORAGE_SERIALIZATION_ERROR = \"STORAGE_SERIALIZATION_ERROR\",\n}\n\n// ─── Classification ────────────────────────────────────────────\n\n/** Error codes that are typically recoverable (retry-safe) */\nconst RECOVERABLE_CODES = new Set<ErrorCode>([\n ErrorCode.TIMEOUT,\n ErrorCode.RATE_LIMIT,\n ErrorCode.NETWORK,\n ErrorCode.TOOL_EXECUTION,\n ErrorCode.MODEL_OVERLOADED,\n ErrorCode.PROVIDER_ERROR,\n]);\n\n/** Check if an error code is recoverable */\nexport function isRecoverableErrorCode(code: ErrorCode): boolean {\n return RECOVERABLE_CODES.has(code);\n}\n\n/** Classify an error message string into an ErrorCode */\nexport function classifyAgentError(error: string | Error): ErrorCode {\n const msg = (error instanceof Error ? error.message : error).toLowerCase();\n\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\") || msg.includes(\"timedout\") || msg.includes(\"etimedout\")) {\n return ErrorCode.TIMEOUT;\n }\n\n if (msg.includes(\"rate limit\") || msg.includes(\"rate_limit\") || msg.includes(\"429\") || msg.includes(\"too many requests\")) {\n return ErrorCode.RATE_LIMIT;\n }\n\n if (msg.includes(\"unauthorized\") || msg.includes(\"401\") || msg.includes(\"auth\") && (msg.includes(\"expired\") || msg.includes(\"invalid\") || msg.includes(\"denied\") || msg.includes(\"failed\"))) {\n return ErrorCode.AUTH_EXPIRED;\n }\n\n if (msg.includes(\"econnrefused\") || msg.includes(\"econnreset\") || msg.includes(\"enotfound\") || msg.includes(\"network\") || msg.includes(\"fetch failed\") || msg.includes(\"socket hang up\")) {\n return ErrorCode.NETWORK;\n }\n\n if (msg.includes(\"subprocess\") || msg.includes(\"process exited\") || msg.includes(\"spawn\") || msg.includes(\"enoent\") || msg.includes(\"killed\")) {\n return ErrorCode.DEPENDENCY_MISSING;\n }\n\n if (msg.includes(\"abort\") || msg.includes(\"cancel\")) {\n return ErrorCode.ABORTED;\n }\n\n if (msg.includes(\"500\") || msg.includes(\"502\") || msg.includes(\"503\") || msg.includes(\"internal server error\") || msg.includes(\"service unavailable\") || msg.includes(\"bad gateway\") || msg.includes(\"overloaded\")) {\n return ErrorCode.PROVIDER_ERROR;\n }\n\n return ErrorCode.PROVIDER_ERROR;\n}\n","import { ErrorCode } from \"./types/errors.js\";\n\n/** Options for constructing an AgentSDKError */\nexport interface AgentSDKErrorOptions extends ErrorOptions {\n /** Machine-readable error code */\n code?: string;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** HTTP status code hint (e.g. 401, 429, 500) */\n httpStatus?: number;\n}\n\n/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n /** Machine-readable error code. Prefer values from the ErrorCode enum. */\n readonly code?: string;\n /** Whether this error is safe to retry */\n readonly retryable: boolean;\n /** HTTP status code hint for error classification */\n readonly httpStatus?: number;\n\n constructor(message: string, options?: AgentSDKErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n this.code = options?.code;\n this.retryable = options?.retryable ?? false;\n this.httpStatus = options?.httpStatus;\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\", {\n code: ErrorCode.REENTRANCY,\n });\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`, {\n code: ErrorCode.DISPOSED,\n });\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n { code: ErrorCode.BACKEND_NOT_INSTALLED },\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, { ...options, code: ErrorCode.DEPENDENCY_MISSING });\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`, {\n code: ErrorCode.DEPENDENCY_MISSING,\n });\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\", { code: ErrorCode.ABORTED });\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, { ...options, code: ErrorCode.TOOL_EXECUTION });\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when a stream has no activity within the configured timeout */\nexport class ActivityTimeoutError extends AgentSDKError {\n constructor(timeoutMs: number) {\n super(`Stream activity timeout: no event received within ${timeoutMs}ms.`, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n });\n this.name = \"ActivityTimeoutError\";\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, { ...options, code: ErrorCode.INVALID_RESPONSE });\n this.name = \"StructuredOutputError\";\n }\n}\n","import type {\n IAgent,\n FullAgentConfig,\n AgentState,\n AgentResult,\n AgentEvent,\n MessageContent,\n Message,\n RunOptions,\n RetryConfig,\n StructuredOutputConfig,\n UsageData,\n ToolDefinition,\n StreamMiddleware,\n StreamContext,\n} from \"./types.js\";\nimport { ReentrancyError, DisposedError, AbortError, ActivityTimeoutError } from \"./errors.js\";\nimport { AgentSDKError } from \"./errors.js\";\nimport { isRecoverableErrorCode } from \"./types/errors.js\";\n\n/** Abstract base agent with shared lifecycle logic.\n * Concrete backends extend this and implement the protected _run/_stream methods. */\nexport abstract class BaseAgent implements IAgent {\n protected state: AgentState = \"idle\";\n protected abortController: AbortController | null = null;\n protected readonly config: FullAgentConfig;\n private _cleanupExternalSignal: (() => void) | null = null;\n private _streamMiddleware: StreamMiddleware[] = [];\n\n /** Backend identifier (e.g. \"copilot\", \"claude\", \"vercel-ai\") */\n protected abstract readonly backendName: string;\n\n /** CLI session ID for persistent mode. Override in backends that support it. */\n get sessionId(): string | undefined {\n return undefined;\n }\n\n constructor(config: FullAgentConfig) {\n this.config = Object.freeze({ ...config });\n }\n\n // ─── Public Interface ─────────────────────────────────────────\n\n async run(\n prompt: MessageContent,\n options: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.withRetry(\n () => this.executeRun(messages, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runWithContext(\n messages: Message[],\n options: RunOptions,\n ): Promise<AgentResult> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const result = await this.withRetry(\n () => this.executeRun(messages, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n ): Promise<AgentResult<T>> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"running\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n const result = await this.withRetry(\n () => this.executeRunStructured(messages, schema, options, ac.signal), options,\n );\n this.enrichAndNotifyUsage(result, options);\n return result;\n } finally {\n this.cleanupRun();\n }\n }\n\n async *stream(\n prompt: MessageContent,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n yield* this.streamWithRetry(\n () => this.applyStreamPipeline(this.executeStream(messages, options, ac.signal), options, ac),\n options,\n );\n } finally {\n this.cleanupRun();\n }\n }\n\n async *streamWithContext(\n messages: Message[],\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n this.guardReentrancy();\n this.guardDisposed();\n\n const ac = this.createAbortController(options?.signal);\n this.state = \"streaming\";\n\n try {\n yield* this.streamWithRetry(\n () => this.applyStreamPipeline(this.executeStream(messages, options, ac.signal), options, ac),\n options,\n );\n } finally {\n this.cleanupRun();\n }\n }\n\n /** Register a stream middleware. Applied in registration order after built-in transforms. */\n addStreamMiddleware(middleware: StreamMiddleware): void {\n this.guardDisposed();\n this._streamMiddleware.push(middleware);\n }\n\n /** Apply built-in transforms (enrich→timeout→heartbeat) then custom middleware */\n private async *applyStreamPipeline(\n source: AsyncIterable<AgentEvent>,\n options: RunOptions,\n ac: AbortController,\n ): AsyncIterable<AgentEvent> {\n // Built-in pipeline\n let stream: AsyncIterable<AgentEvent> = this.enrichStream(source, options);\n stream = this.activityTimeoutStream(stream, options?.activityTimeoutMs, ac);\n stream = this.heartbeatStream(stream);\n\n // Custom middleware\n if (this._streamMiddleware.length > 0) {\n const ctx: StreamContext = {\n model: options.model,\n backend: this.backendName,\n abortController: ac,\n config: Object.freeze({ ...this.config }),\n };\n for (const mw of this._streamMiddleware) {\n stream = mw(stream, ctx);\n }\n }\n\n yield* stream;\n }\n\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** Default interrupt — falls back to abort(). Backends may override with graceful shutdown. */\n async interrupt(): Promise<void> {\n this.abort();\n }\n\n getState(): AgentState {\n return this.state;\n }\n\n getConfig(): Readonly<FullAgentConfig> {\n return this.config;\n }\n\n /** Mark agent as disposed. Override to add cleanup. */\n dispose(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.abort();\n this.state = \"disposed\";\n }\n\n // ─── Abstract Methods (implemented by backends) ───────────────\n\n /** Execute a blocking run. Backend implements the actual LLM call. */\n protected abstract executeRun(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult>;\n\n /** Execute a structured output run. Backend implements parsing. */\n protected abstract executeRunStructured<T>(\n messages: Message[],\n schema: StructuredOutputConfig<T>,\n options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>>;\n\n /** Execute a streaming run. Backend yields events. */\n protected abstract executeStream(\n messages: Message[],\n options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent>;\n\n // ─── Retry Logic ─────────────────────────────────────────────\n\n /** Check if an error should be retried given the retry configuration. */\n private isRetryableError(error: unknown, retry: RetryConfig): boolean {\n // Abort and reentrancy errors are never retryable\n if (error instanceof AbortError || error instanceof ReentrancyError || error instanceof DisposedError) {\n return false;\n }\n if (AgentSDKError.is(error)) {\n // If specific retryable error codes configured, check against them\n if (retry.retryableErrors && retry.retryableErrors.length > 0 && error.code) {\n return retry.retryableErrors.includes(error.code as typeof retry.retryableErrors[number]);\n }\n // Otherwise check the retryable flag or recoverable code\n if (error.retryable) return true;\n if (error.code) return isRecoverableErrorCode(error.code as Parameters<typeof isRecoverableErrorCode>[0]);\n }\n return false;\n }\n\n /** Execute a function with retry logic per RetryConfig. */\n private async withRetry<T>(\n fn: () => Promise<T>,\n options: RunOptions,\n ): Promise<T> {\n const retry = options?.retry;\n if (!retry || !retry.maxRetries || retry.maxRetries <= 0) {\n return fn();\n }\n\n const maxRetries = retry.maxRetries;\n const initialDelay = retry.initialDelayMs ?? 1000;\n const multiplier = retry.backoffMultiplier ?? 2;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt >= maxRetries || !this.isRetryableError(err, retry)) {\n throw err;\n }\n // Exponential backoff\n const delay = initialDelay * Math.pow(multiplier, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n // Check abort between retries\n if (options?.signal?.aborted || this.abortController?.signal.aborted) {\n throw err;\n }\n }\n }\n throw lastError;\n }\n\n /** Execute a stream factory with pre-stream retry: retries until first event, then committed. */\n private async *streamWithRetry(\n factory: () => AsyncIterable<AgentEvent>,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n const retry = options?.retry;\n if (!retry || !retry.maxRetries || retry.maxRetries <= 0) {\n yield* factory();\n return;\n }\n\n const maxRetries = retry.maxRetries;\n const initialDelay = retry.initialDelayMs ?? 1000;\n const multiplier = retry.backoffMultiplier ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const stream = factory();\n const iterator = stream[Symbol.asyncIterator]();\n // Try to get first event — this is the \"pre-stream\" phase\n const first = await iterator.next();\n if (first.done) return;\n // First event received — stream committed, no more retries\n yield first.value;\n // Yield remaining events\n while (true) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n return;\n } catch (err) {\n if (attempt >= maxRetries || !this.isRetryableError(err, retry)) {\n throw err;\n }\n const delay = initialDelay * Math.pow(multiplier, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n if (options?.signal?.aborted || this.abortController?.signal.aborted) {\n throw err;\n }\n }\n }\n }\n\n // ─── CallOptions Resolution ──────────────────────────────────\n\n /** Resolve tools to use for this call (per-call override > config default) */\n protected resolveTools(options?: RunOptions): ToolDefinition[] {\n return options?.tools ?? this.config.tools ?? [];\n }\n\n // ─── Usage Enrichment ───────────────────────────────────────────\n\n /** Enrich result usage with model/backend and fire onUsage callback */\n private enrichAndNotifyUsage(result: AgentResult<unknown>, options: RunOptions): void {\n if (result.usage) {\n result.usage = {\n ...result.usage,\n model: options.model,\n backend: this.backendName,\n };\n this.callOnUsage(result.usage);\n }\n }\n\n /** Wrap a stream to enrich usage_update events and fire onUsage callback */\n private async *enrichStream(\n source: AsyncIterable<AgentEvent>,\n options: RunOptions,\n ): AsyncIterable<AgentEvent> {\n const model = options.model;\n for await (const event of source) {\n if (event.type === \"usage_update\") {\n const usage: UsageData = {\n promptTokens: event.promptTokens,\n completionTokens: event.completionTokens,\n model,\n backend: this.backendName,\n };\n this.callOnUsage(usage);\n yield { type: \"usage_update\", ...usage };\n } else {\n yield event;\n }\n }\n }\n\n /** Fire onUsage callback (fire-and-forget: errors logged, not propagated) */\n private callOnUsage(usage: UsageData): void {\n if (!this.config.onUsage) return;\n try {\n this.config.onUsage(usage);\n } catch (e) {\n console.warn(\n \"[agent-sdk] onUsage callback error:\",\n e instanceof Error ? e.message : String(e),\n );\n }\n }\n\n // ─── Heartbeat ───────────────────────────────────────────────\n\n /** Wrap a stream to emit heartbeat events at configured intervals.\n * When heartbeatInterval is not set, passes through directly. */\n private async *heartbeatStream(\n source: AsyncIterable<AgentEvent>,\n ): AsyncIterable<AgentEvent> {\n const interval = this.config.heartbeatInterval;\n if (!interval || interval <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let pendingEvent: Promise<IteratorResult<AgentEvent>> | null = null;\n let heartbeatResolve: (() => void) | null = null;\n\n const timer = setInterval(() => {\n if (heartbeatResolve) {\n const resolve = heartbeatResolve;\n heartbeatResolve = null;\n resolve();\n }\n }, interval);\n\n try {\n while (true) {\n if (!pendingEvent) {\n pendingEvent = iterator.next();\n }\n\n const heartbeatPromise = new Promise<void>((resolve) => {\n heartbeatResolve = resolve;\n });\n\n const eventDone = pendingEvent.then(\n (r) => ({ kind: \"event\" as const, result: r }),\n );\n const heartbeatDone = heartbeatPromise.then(\n () => ({ kind: \"heartbeat\" as const }),\n );\n\n const winner = await Promise.race([eventDone, heartbeatDone]);\n\n if (winner.kind === \"heartbeat\") {\n yield { type: \"heartbeat\" };\n } else {\n pendingEvent = null;\n heartbeatResolve = null;\n if (winner.result.done) break;\n yield winner.result.value;\n }\n }\n } finally {\n clearInterval(timer);\n heartbeatResolve = null;\n }\n }\n\n // ─── Activity Timeout ────────────────────────────────────────\n\n /** Wrap a stream to abort on inactivity. Resets timer on every event.\n * When timeoutMs is not set, passes through directly. */\n private async *activityTimeoutStream(\n source: AsyncIterable<AgentEvent>,\n timeoutMs: number | undefined,\n ac: AbortController,\n ): AsyncIterable<AgentEvent> {\n if (!timeoutMs || timeoutMs <= 0) {\n yield* source;\n return;\n }\n\n const iterator = source[Symbol.asyncIterator]();\n let timerId: ReturnType<typeof setTimeout> | undefined;\n try {\n while (true) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new ActivityTimeoutError(timeoutMs)), timeoutMs);\n });\n const result = await Promise.race([iterator.next(), timeoutPromise]);\n clearTimeout(timerId);\n if (result.done) break;\n yield result.value;\n }\n } catch (err) {\n if (err instanceof ActivityTimeoutError) {\n ac.abort(err);\n }\n throw err;\n } finally {\n clearTimeout(timerId);\n }\n }\n\n // ─── Guards ───────────────────────────────────────────────────\n\n protected guardReentrancy(): void {\n if (this.state === \"running\" || this.state === \"streaming\") {\n throw new ReentrancyError();\n }\n }\n\n protected guardDisposed(): void {\n if (this.state === \"disposed\") {\n throw new DisposedError(\"Agent\");\n }\n }\n\n /** Throw AbortError if signal is already aborted */\n protected checkAbort(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new AbortError();\n }\n }\n\n // ─── Internal Helpers ─────────────────────────────────────────\n\n /** Clean up after a run completes (success, error, or abort). */\n private cleanupRun(): void {\n this._cleanupExternalSignal?.();\n this._cleanupExternalSignal = null;\n this.state = \"idle\";\n this.abortController = null;\n }\n\n private createAbortController(externalSignal?: AbortSignal): AbortController {\n const ac = new AbortController();\n this.abortController = ac;\n this._cleanupExternalSignal = null;\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n ac.abort();\n } else {\n const listener = () => ac.abort();\n externalSignal.addEventListener(\"abort\", listener, { once: true });\n this._cleanupExternalSignal = () => externalSignal.removeEventListener(\"abort\", listener);\n }\n }\n\n return ac;\n }\n}\n","/**\n * Mock LLM backend — a fully functional backend for automated testing.\n *\n * Implements IAgentService using BaseAgent, providing configurable response\n * modes (echo, static, scripted, error) with full streaming support.\n * Unlike the lightweight testing mock (createMockAgentService), this backend\n * participates in the full BaseAgent lifecycle: retry, heartbeat, activity\n * timeout, middleware pipeline, and usage enrichment.\n *\n * Advanced capabilities:\n * - Latency simulation (fixed or random delay)\n * - Streaming chunk control (chunk size, inter-chunk delay)\n * - Configurable finishReason in done events\n * - Permission simulation (auto-approve, deny, or delegate to supervisor)\n */\nimport { BaseAgent } from \"../base-agent.js\";\nimport { AgentSDKError } from \"../errors.js\";\nimport type {\n IAgentService,\n IAgent,\n FullAgentConfig,\n ModelInfo,\n ValidationResult,\n AgentResult,\n AgentEvent,\n Message,\n RunOptions,\n StructuredOutputConfig,\n MockLLMBackendOptions,\n MockLLMResponseMode,\n MockLLMLatency,\n MockLLMStreamingOptions,\n MockLLMPermissionOptions,\n MockLLMToolCall,\n JSONValue,\n} from \"../types.js\";\n\n// ─── Helpers ────────────────────────────────────────────────────\n\n/** Extract the user's prompt text from the last message */\nfunction extractPrompt(messages: Message[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"user\") {\n return typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { type: \"text\"; text: string }).text)\n .join(\"\");\n }\n }\n return \"\";\n}\n\n/** Resolve the response text for the given mode and call index */\nfunction resolveResponse(\n mode: MockLLMResponseMode,\n messages: Message[],\n callIndex: number,\n): string {\n switch (mode.type) {\n case \"echo\":\n return extractPrompt(messages);\n case \"static\":\n return mode.response;\n case \"scripted\": {\n if (mode.loop) {\n return mode.responses[callIndex % mode.responses.length];\n }\n if (callIndex < mode.responses.length) {\n return mode.responses[callIndex];\n }\n return mode.responses[mode.responses.length - 1];\n }\n case \"error\":\n throw new AgentSDKError(mode.error, {\n code: mode.code ?? \"backend_error\",\n retryable: mode.recoverable ?? false,\n });\n }\n}\n\n/** Apply latency delay if configured */\nasync function applyLatency(\n latency: MockLLMLatency | undefined,\n signal: AbortSignal,\n): Promise<void> {\n if (!latency) return;\n const ms =\n latency.type === \"fixed\"\n ? latency.ms\n : latency.minMs + Math.random() * (latency.maxMs - latency.minMs);\n if (ms <= 0) return;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n if (signal.aborted) {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/** Split text into chunks based on streaming options */\nfunction chunkText(\n text: string,\n streaming: MockLLMStreamingOptions | undefined,\n): string[] {\n if (streaming?.chunkSize && streaming.chunkSize > 0) {\n const chunks: string[] = [];\n for (let i = 0; i < text.length; i += streaming.chunkSize) {\n chunks.push(text.slice(i, i + streaming.chunkSize));\n }\n return chunks;\n }\n // Default: word-boundary splitting\n return text.split(/(\\s+)/).filter(Boolean);\n}\n\n/** Delay between stream chunks if configured */\nasync function chunkDelay(\n streaming: MockLLMStreamingOptions | undefined,\n signal: AbortSignal,\n): Promise<void> {\n const ms = streaming?.chunkDelayMs;\n if (!ms || ms <= 0) return;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n if (signal.aborted) {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n// ─── MockLLMAgent ──────────────────────────────────────────────\n\nclass MockLLMAgent extends BaseAgent {\n protected readonly backendName = \"mock-llm\";\n private readonly mode: MockLLMResponseMode;\n private readonly latency: MockLLMLatency | undefined;\n private readonly streaming: MockLLMStreamingOptions | undefined;\n private readonly finishReason: string;\n private readonly permissions: MockLLMPermissionOptions | undefined;\n private readonly toolCallConfigs: MockLLMToolCall[];\n private readonly configuredStructuredOutput: unknown;\n private callIndex = 0;\n\n constructor(config: FullAgentConfig, options: MockLLMBackendOptions) {\n super(config);\n this.mode = options.mode ?? { type: \"echo\" };\n this.latency = options.latency;\n this.streaming = options.streaming;\n this.finishReason = options.finishReason ?? \"stop\";\n this.permissions = options.permissions;\n this.toolCallConfigs = options.toolCalls ?? [];\n this.configuredStructuredOutput = options.structuredOutput;\n }\n\n protected async executeRun(\n messages: Message[],\n _options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult> {\n this.checkAbort(signal);\n await applyLatency(this.latency, signal);\n this.checkAbort(signal);\n\n const idx = this.callIndex++;\n const output = resolveResponse(this.mode, messages, idx);\n const toolCalls = this.toolCallConfigs.map((tc) => ({\n toolName: tc.toolName,\n args: (tc.args ?? {}) as JSONValue,\n result: (tc.result ?? null) as JSONValue,\n approved: true,\n }));\n\n return {\n output,\n structuredOutput: undefined,\n toolCalls,\n messages: [\n ...messages,\n { role: \"assistant\" as const, content: output },\n ],\n usage: { promptTokens: 10, completionTokens: output.length },\n };\n }\n\n protected async executeRunStructured<T>(\n messages: Message[],\n _schema: StructuredOutputConfig<T>,\n _options: RunOptions,\n signal: AbortSignal,\n ): Promise<AgentResult<T>> {\n this.checkAbort(signal);\n await applyLatency(this.latency, signal);\n this.checkAbort(signal);\n\n const idx = this.callIndex++;\n const output = resolveResponse(this.mode, messages, idx);\n\n let parsed: T;\n if (this.configuredStructuredOutput !== undefined) {\n parsed = this.configuredStructuredOutput as T;\n } else {\n try {\n parsed = JSON.parse(output) as T;\n } catch {\n parsed = output as unknown as T;\n }\n }\n\n return {\n output,\n structuredOutput: parsed as T extends void ? undefined : T,\n toolCalls: [],\n messages: [\n ...messages,\n { role: \"assistant\" as const, content: output },\n ],\n usage: { promptTokens: 10, completionTokens: output.length },\n };\n }\n\n protected async *executeStream(\n messages: Message[],\n _options: RunOptions,\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n this.checkAbort(signal);\n await applyLatency(this.latency, signal);\n this.checkAbort(signal);\n\n // Permission simulation — emit before generating response\n if (this.permissions) {\n yield* this.simulatePermissions(signal);\n }\n\n // Tool call simulation — emit tool_call_start/end pairs\n if (this.toolCallConfigs.length > 0) {\n yield* this.simulateToolCalls(signal);\n }\n\n const idx = this.callIndex++;\n const output = resolveResponse(this.mode, messages, idx);\n\n const chunks = chunkText(output, this.streaming);\n for (let i = 0; i < chunks.length; i++) {\n this.checkAbort(signal);\n if (i > 0) {\n await chunkDelay(this.streaming, signal);\n }\n yield { type: \"text_delta\", text: chunks[i] };\n }\n\n yield {\n type: \"usage_update\",\n promptTokens: 10,\n completionTokens: output.length,\n };\n\n yield {\n type: \"done\",\n finalOutput: output,\n finishReason: this.finishReason,\n };\n }\n\n private async *simulateToolCalls(\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n for (let i = 0; i < this.toolCallConfigs.length; i++) {\n this.checkAbort(signal);\n const tc = this.toolCallConfigs[i];\n const toolCallId = tc.toolCallId ?? `mock-tc-${i}`;\n\n yield {\n type: \"tool_call_start\",\n toolCallId,\n toolName: tc.toolName,\n args: (tc.args ?? {}) as JSONValue,\n };\n\n yield {\n type: \"tool_call_end\",\n toolCallId,\n toolName: tc.toolName,\n result: (tc.result ?? null) as JSONValue,\n };\n }\n }\n\n private async *simulatePermissions(\n signal: AbortSignal,\n ): AsyncIterable<AgentEvent> {\n const perms = this.permissions!;\n for (const toolName of perms.toolNames) {\n this.checkAbort(signal);\n\n const request = {\n toolName,\n toolArgs: {},\n };\n\n yield { type: \"permission_request\", request };\n\n // Determine decision\n if (perms.denyTools?.includes(toolName)) {\n yield {\n type: \"permission_response\",\n toolName,\n decision: { allowed: false, reason: \"Denied by mock configuration\" },\n };\n } else if (perms.autoApprove) {\n yield {\n type: \"permission_response\",\n toolName,\n decision: { allowed: true, scope: \"once\" as const },\n };\n } else {\n // Delegate to supervisor callback if available\n const supervisor = this.getConfig().supervisor;\n if (supervisor?.onPermission) {\n const decision = await supervisor.onPermission(request, signal);\n yield { type: \"permission_response\", toolName, decision };\n } else {\n // No supervisor — auto-approve (headless mode)\n yield {\n type: \"permission_response\",\n toolName,\n decision: { allowed: true, scope: \"once\" as const },\n };\n }\n }\n }\n }\n}\n\n// ─── MockLLMService ─────────────────────────────────────────────\n\nclass MockLLMService implements IAgentService {\n readonly name = \"mock-llm\";\n private readonly options: MockLLMBackendOptions;\n private readonly models: ModelInfo[];\n\n constructor(options: MockLLMBackendOptions = {}) {\n this.options = options;\n this.models = (options.models ?? [\n { id: \"mock-fast\", name: \"Mock Fast\" },\n { id: \"mock-quality\", name: \"Mock Quality\" },\n ]).map((m) => ({\n id: m.id,\n name: m.name,\n description: m.description,\n }));\n }\n\n createAgent(config: FullAgentConfig): IAgent {\n return new MockLLMAgent(config, this.options);\n }\n\n async listModels(): Promise<ModelInfo[]> {\n return this.models;\n }\n\n async validate(): Promise<ValidationResult> {\n return { valid: true, errors: [] };\n }\n\n async dispose(): Promise<void> {\n // no-op — mock has no resources to release\n }\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/** Create a mock LLM backend service for automated testing.\n *\n * Unlike the lightweight `createMockAgentService` (from `@witqq/agent-sdk/testing`),\n * this backend extends `BaseAgent` and participates in the full agent lifecycle:\n * retry, heartbeat, activity timeout, middleware pipeline, and usage enrichment.\n *\n * @example\n * ```ts\n * import { createMockLLMService } from \"@witqq/agent-sdk/mock-llm\";\n *\n * // Basic echo mode\n * const service = createMockLLMService({ mode: { type: \"echo\" } });\n *\n * // With latency simulation and streaming control\n * const realisticService = createMockLLMService({\n * mode: { type: \"static\", response: \"Hello!\" },\n * latency: { type: \"fixed\", ms: 100 },\n * streaming: { chunkSize: 5, chunkDelayMs: 10 },\n * finishReason: \"stop\",\n * });\n *\n * // With permission simulation\n * const permService = createMockLLMService({\n * mode: { type: \"echo\" },\n * permissions: { toolNames: [\"bash\", \"file_write\"], autoApprove: true },\n * });\n * ```\n */\nexport function createMockLLMService(\n options: MockLLMBackendOptions = {},\n): IAgentService {\n return new MockLLMService(options);\n}\n\nexport type {\n MockLLMBackendOptions,\n MockLLMResponseMode,\n MockLLMLatency,\n MockLLMStreamingOptions,\n MockLLMPermissionOptions,\n MockLLMToolCall,\n};\n","/**\n * Mock IAgentService factory for testing.\n */\nimport type {\n IAgentService,\n IAgent,\n FullAgentConfig,\n ModelInfo,\n ValidationResult,\n AgentResult,\n AgentEvent,\n Message,\n MessageContent,\n RunOptions,\n StructuredOutputConfig,\n AgentState,\n MockLLMBackendOptions,\n} from \"../types.js\";\nimport { createMockLLMService } from \"../backends/mock-llm.js\";\n\n/** Options for createMockAgentService. */\nexport interface MockAgentServiceOptions {\n /** Service name. Default: \"mock\". */\n name?: string;\n /** Models to return from listModels(). */\n models?: ModelInfo[];\n /** Custom validation result. Default: { valid: true, errors: [] }. */\n validationResult?: ValidationResult;\n /** Custom run handler. Default: returns \"Mock response\". */\n onRun?: (prompt: MessageContent, options?: RunOptions) => Promise<AgentResult>;\n /** Custom stream handler. Default: yields text_delta + result events. */\n onStream?: (prompt: MessageContent, options?: RunOptions) => AsyncIterable<AgentEvent>;\n /** Opt-in: delegate to Mock LLM backend for richer simulation.\n * When provided, createAgent() returns a full MockLLMAgent that participates\n * in the BaseAgent lifecycle (retry, heartbeat, middleware, usage enrichment). */\n mockLLMBackend?: MockLLMBackendOptions;\n}\n\nclass MockAgent implements IAgent {\n readonly sessionId: string | undefined = undefined;\n private _state: AgentState = \"idle\";\n private readonly _config: FullAgentConfig;\n private readonly _onRun?: MockAgentServiceOptions[\"onRun\"];\n private readonly _onStream?: MockAgentServiceOptions[\"onStream\"];\n\n constructor(config: FullAgentConfig, options?: MockAgentServiceOptions) {\n this._config = config;\n this._onRun = options?.onRun;\n this._onStream = options?.onStream;\n }\n\n async run(prompt: MessageContent, options: RunOptions): Promise<AgentResult> {\n if (this._onRun) return this._onRun(prompt, options);\n return { output: \"Mock response\", structuredOutput: undefined, toolCalls: [], messages: [], usage: { promptTokens: 10, completionTokens: 5 } };\n }\n\n async runWithContext(messages: Message[], options: RunOptions): Promise<AgentResult> {\n const lastMsg = messages[messages.length - 1];\n const text = typeof lastMsg?.content === \"string\" ? lastMsg.content : \"context\";\n return this.run(text, options);\n }\n\n async runStructured<T>(\n prompt: MessageContent,\n _schema: StructuredOutputConfig<T>,\n options: RunOptions,\n ): Promise<AgentResult<T>> {\n const base = await this.run(prompt, options);\n return { ...base, structuredOutput: undefined as unknown as T extends void ? undefined : T };\n }\n\n async *stream(prompt: MessageContent, options: RunOptions): AsyncIterable<AgentEvent> {\n if (this._onStream) {\n yield* this._onStream(prompt, options);\n return;\n }\n yield { type: \"text_delta\", text: \"Mock \" };\n yield { type: \"text_delta\", text: \"response\" };\n yield { type: \"done\", finalOutput: \"Mock response\" };\n }\n\n async *streamWithContext(messages: Message[], options: RunOptions): AsyncIterable<AgentEvent> {\n const lastMsg = messages[messages.length - 1];\n const text = typeof lastMsg?.content === \"string\" ? lastMsg.content : \"context\";\n yield* this.stream(text, options);\n }\n\n abort(): void {\n this._state = \"idle\";\n }\n\n async interrupt(): Promise<void> {\n this._state = \"idle\";\n }\n\n getState(): AgentState {\n return this._state;\n }\n\n getConfig(): Readonly<FullAgentConfig> {\n return this._config;\n }\n\n dispose(): void {\n this._state = \"disposed\";\n }\n}\n\n/**\n * Create a mock IAgentService for testing agent-level code.\n *\n * ```ts\n * const service = createMockAgentService({ name: \"test\" });\n * const agent = service.createAgent({ model: \"gpt-5-mini\" });\n * const result = await agent.run(\"Hello\");\n * ```\n *\n * For richer simulation with full BaseAgent lifecycle, pass `mockLLMBackend`:\n * ```ts\n * const service = createMockAgentService({\n * mockLLMBackend: { mode: { type: \"echo\" }, latency: { type: \"fixed\", ms: 50 } },\n * });\n * ```\n */\nexport function createMockAgentService(options: MockAgentServiceOptions = {}): IAgentService {\n // When mockLLMBackend is provided, delegate entirely to Mock LLM backend\n if (options.mockLLMBackend) {\n const llmService = createMockLLMService(options.mockLLMBackend);\n return {\n name: options.name ?? \"mock\",\n createAgent: (config: FullAgentConfig) => llmService.createAgent(config),\n listModels: () => llmService.listModels(),\n validate: () => llmService.validate(),\n dispose: () => llmService.dispose(),\n };\n }\n\n const name = options.name ?? \"mock\";\n return {\n name,\n createAgent(config: FullAgentConfig): IAgent {\n return new MockAgent(config, options);\n },\n async listModels(): Promise<ModelInfo[]> {\n return options.models ?? [\n { id: \"mock-model-1\", name: \"Mock Model 1\" },\n { id: \"mock-model-2\", name: \"Mock Model 2\" },\n ];\n },\n async validate(): Promise<ValidationResult> {\n return options.validationResult ?? { valid: true, errors: [] };\n },\n async dispose(): Promise<void> {\n // no-op\n },\n };\n}\n","/**\n * @witqq/agent-sdk — Chat domain types\n *\n * All type definitions and interfaces for the chat layer.\n * Pure types + ChatId generation (tightly coupled to branded type).\n */\n\nimport type { UsageData, ToolDefinition, ErrorCode } from \"../types.js\";\nimport type { AuthToken } from \"../auth/types.js\";\n\n// ─── Unique ID ─────────────────────────────────────────────────\n\n/** Branded type for unique identifiers */\nexport type ChatId = string & { readonly __brand: \"ChatId\" };\n\n/**\n * Generate a new unique ChatId (crypto.randomUUID-based)\n * @returns Branded ChatId string\n */\nexport function createChatId(): ChatId {\n return crypto.randomUUID() as ChatId;\n}\n\n/** UUID v4 pattern for ChatId validation */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Cast a string to ChatId with UUID format validation.\n * Use this instead of manual `as ChatId` type assertions.\n *\n * @param value - String to validate and cast\n * @returns Branded ChatId\n * @throws {TypeError} If value is not a valid UUID v4 format\n */\nexport function toChatId(value: string): ChatId {\n if (!UUID_RE.test(value)) {\n throw new TypeError(`Invalid ChatId: \"${value}\" is not a valid UUID`);\n }\n return value as ChatId;\n}\n\n/**\n * Accepts either a plain string or branded ChatId for API convenience.\n * Use this in public API signatures so consumers don't need `as ChatId` casts.\n */\nexport type ChatIdLike = string | ChatId;\n\n// ─── Status Types ──────────────────────────────────────────────\n\n/** Lifecycle status of a message part (text, reasoning, etc.) */\nexport type PartStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n/** Lifecycle status of a tool call within a message */\nexport type ToolCallStatus = \"pending\" | \"running\" | \"requires_approval\" | \"complete\" | \"error\" | \"denied\";\n/** Lifecycle status of an entire message */\nexport type MessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\" | \"cancelled\";\n/** Lifecycle status of a chat session */\nexport type SessionStatus = \"active\";\n/** Lifecycle status of the chat runtime */\nexport type RuntimeStatus = \"idle\" | \"streaming\" | \"error\" | \"disposed\";\n\n// ─── Message Parts (union) ─────────────────────────────────────\n\n/** Plain text content part */\nexport interface TextPart { type: \"text\"; text: string; status: PartStatus; }\n/** Model reasoning/thinking content part */\nexport interface ReasoningPart { type: \"reasoning\"; text: string; status: PartStatus; }\n/** Tool invocation part with call ID, arguments, optional result */\nexport interface ToolCallPart { type: \"tool_call\"; toolCallId: string; name: string; args: unknown; result?: unknown; status: ToolCallStatus; error?: string; }\n/** Source reference part (URL citation) */\nexport interface SourcePart { type: \"source\"; url: string; title?: string; status: PartStatus; }\n/** File attachment part (base64-encoded data) */\nexport interface FilePart { type: \"file\"; name: string; mimeType: string; data: string; status: PartStatus; }\n/** Union of all message part types */\nexport type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;\n\n// ─── Chat Message ──────────────────────────────────────────────\n\n/** Role of message author */\nexport type ChatRole = \"user\" | \"assistant\" | \"system\";\n\n/** Metadata attached to messages — useful preset for the TMetadata generic */\nexport interface ChatMessageMetadata {\n model?: string;\n backend?: string;\n usage?: UsageData;\n isSummary?: boolean;\n estimatedTokens?: number;\n custom?: Record<string, unknown>;\n}\n\n/** Message status */\nexport type ChatMessageStatus = MessageStatus;\n\n/** A single chat message — the fundamental unit of conversation */\nexport interface ChatMessage<TMetadata = unknown> {\n id: ChatId;\n role: ChatRole;\n parts: MessagePart[];\n metadata?: TMetadata;\n createdAt: string;\n updatedAt?: string;\n status: MessageStatus;\n}\n\n// ─── Supporting Types ──────────────────────────────────────────\n\n// ─── Chat Session ──────────────────────────────────────────────\n\n/** Session configuration snapshot */\nexport interface ChatSessionConfig {\n model: string;\n backend: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Session metadata tracking usage statistics and custom extensions.\n *\n * Updated automatically by session stores on each `addMessage()` call.\n * The generic `TCustom` parameter allows type-safe application-specific\n * metadata via the `custom` field.\n *\n * @typeParam TCustom - Shape of the `custom` field (defaults to `Record<string, unknown>`)\n */\nexport interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n /** Number of messages in the session (updated by session store) */\n messageCount: number;\n /** Total token count across all messages in the session */\n totalTokens: number;\n /** Optional tags for session categorization and filtering */\n tags?: string[];\n /** Application-specific metadata — typed via the TCustom generic parameter */\n custom?: TCustom;\n}\n\n/** Chat session — a conversation with ordered messages (pure serializable data) */\nexport interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {\n id: ChatId;\n title?: string;\n messages: ChatMessage[];\n config: ChatSessionConfig;\n metadata: ChatSessionMetadata<TCustom>;\n status: SessionStatus;\n createdAt: string;\n updatedAt: string;\n backendSessionId?: string;\n}\n\n/**\n * Reactive wrapper around ChatSession — provides subscribe/getSnapshot for\n * React useSyncExternalStore integration and lastMessage convenience getter.\n * Session stores may optionally return ObservableSession instances.\n */\nexport interface ObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>\n extends ChatSession<TCustom> {\n /** Subscribe to session changes (for React useSyncExternalStore) */\n subscribe(callback: () => void): () => void;\n /** Get immutable snapshot of session state (for React useSyncExternalStore) */\n getSnapshot(): ChatSession<TCustom>;\n /** Last message in the session */\n readonly lastMessage: ChatMessage | undefined;\n}\n\n/** Lightweight session info for listing (without full message array) */\nexport interface SessionInfo {\n id: ChatId;\n title?: string;\n status: SessionStatus;\n messageCount: number;\n lastMessage?: ChatMessage;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Chat Events ───────────────────────────────────────────────\n\n/** Events emitted during chat operation */\nexport type ChatEvent =\n | { type: \"message:start\"; messageId: ChatId; role: ChatRole }\n | { type: \"message:delta\"; messageId: ChatId; text: string }\n | { type: \"message:complete\"; messageId: ChatId; message: ChatMessage }\n | {\n type: \"tool:start\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n }\n | {\n type: \"tool:complete\";\n messageId: ChatId;\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n }\n | { type: \"thinking:start\"; messageId: ChatId }\n | { type: \"thinking:delta\"; messageId: ChatId; text: string }\n | { type: \"thinking:end\"; messageId: ChatId }\n | {\n type: \"permission:request\";\n messageId: ChatId;\n toolName: string;\n toolArgs: Record<string, unknown>;\n }\n | {\n type: \"permission:response\";\n messageId: ChatId;\n toolName: string;\n allowed: boolean;\n }\n | {\n type: \"usage\";\n promptTokens: number;\n completionTokens: number;\n model?: string;\n }\n | { type: \"session:created\"; sessionId: ChatId }\n | { type: \"session:updated\"; sessionId: ChatId }\n | {\n type: \"error\";\n error: string;\n recoverable: boolean;\n code?: ErrorCode;\n messageId?: ChatId;\n }\n | { type: \"typing:start\" }\n | { type: \"typing:end\" }\n | { type: \"heartbeat\" }\n | { type: \"done\"; finalOutput?: string; finishReason?: string };\n\n/** All possible ChatEvent type strings */\nexport type ChatEventType = ChatEvent[\"type\"];\n\n// ─── Chat Middleware ───────────────────────────────────────────\n\n/** Context passed to ChatMiddleware hooks */\nexport interface ChatMiddlewareContext {\n sessionId: ChatId;\n signal: AbortSignal;\n}\n\n/** Runtime-level middleware for the send/receive lifecycle.\n * Different from EventMiddleware which operates at the event bus level. */\nexport interface ChatMiddleware {\n /** Transform message before sending to backend. Return null to reject the send. */\n onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | null | Promise<ChatMessage | null>;\n /** Transform/intercept stream events */\n onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;\n /** Transform completed message after receiving from backend */\n onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;\n /** Intercept errors — return null to suppress, return error to propagate */\n onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;\n}\n\n// ─── Chat Provider Abstraction ─────────────────────────────────\n\n/** Options for sending a message to a provider */\nexport interface SendMessageOptions {\n signal?: AbortSignal;\n /** Model to use for this request. Required for server-side runtime.send(). */\n model?: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n context?: Record<string, unknown>;\n /** Additional tools to include in this request */\n tools?: ToolDefinition[];\n}\n\n/** Options for runtime.send() — requires backend routing info */\nexport interface RuntimeSendOptions {\n /** Backend to route this request to (key in backends map) */\n backend: string;\n /** Authentication credentials for the backend factory */\n credentials: AuthToken;\n /** Model to use for this request */\n model: string;\n /** Per-call system prompt override (forwarded to the backend agent) */\n systemPrompt?: string;\n /** Abort signal */\n signal?: AbortSignal;\n /** Request-scoped context */\n context?: Record<string, unknown>;\n /** Additional tools */\n tools?: ToolDefinition[];\n}\n\n/**\n * @deprecated IChatProvider has been inlined into IChatBackend.\n * Import IChatBackend from \"@witqq/agent-sdk/chat/backends\" instead.\n * Kept as type alias for backward compatibility.\n */\nexport type IChatProvider = import(\"./backends/types.js\").IChatBackend;\n\n// ─── Factory Functions ─────────────────────────────────────────\n\n/**\n * Create a simple text ChatMessage.\n *\n * @param text - Message text content\n * @param role - Message role (default: \"user\")\n * @returns A complete ChatMessage with a single TextPart\n */\nexport function createTextMessage(text: string, role: ChatRole = \"user\"): ChatMessage {\n return {\n id: createChatId(),\n role,\n parts: [{ type: \"text\", text, status: \"complete\" }],\n createdAt: new Date().toISOString(),\n status: \"complete\",\n };\n}\n\n/** Type guard: checks if a session has reactive API (subscribe/getSnapshot) */\nexport function isObservableSession<TCustom extends Record<string, unknown> = Record<string, unknown>>(\n session: ChatSession<TCustom>,\n): session is ObservableSession<TCustom> {\n return \"subscribe\" in session && typeof (session as ObservableSession<TCustom>).subscribe === \"function\"\n && \"getSnapshot\" in session && typeof (session as ObservableSession<TCustom>).getSnapshot === \"function\";\n}\n","/**\n * Mock data factories for creating test ChatSession and ChatMessage instances.\n */\nimport type { ChatSession, ChatMessage, MessagePart, ChatSessionConfig, ChatId } from \"../chat/core.js\";\nimport { createChatId } from \"../chat/core.js\";\n\n/** Options for createMockSession. */\nexport interface MockSessionOptions {\n id?: string;\n title?: string;\n messages?: ChatMessage[];\n config?: Partial<ChatSessionConfig>;\n metadata?: Record<string, unknown>;\n status?: \"active\";\n}\n\n/** Options for createMockMessage. */\nexport interface MockMessageOptions {\n id?: string;\n role?: \"user\" | \"assistant\" | \"system\";\n text?: string;\n parts?: MessagePart[];\n status?: \"pending\" | \"streaming\" | \"complete\" | \"error\";\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Create a mock ChatSession for testing.\n *\n * ```ts\n * const session = createMockSession({ title: \"Test chat\" });\n * ```\n */\nexport function createMockSession(options: MockSessionOptions = {}): ChatSession {\n const id = (options.id ?? createChatId()) as ChatId;\n const now = new Date().toISOString();\n return {\n id,\n title: options.title ?? \"Test Session\",\n messages: options.messages ?? [],\n config: {\n model: options.config?.model ?? \"test-model\",\n backend: options.config?.backend ?? \"test-backend\",\n systemPrompt: options.config?.systemPrompt ?? \"\",\n },\n metadata: {\n messageCount: options.messages?.length ?? 0,\n totalTokens: 0,\n custom: options.metadata ?? {},\n },\n status: options.status ?? \"active\",\n createdAt: now,\n updatedAt: now,\n };\n}\n\n/**\n * Create a mock ChatMessage for testing.\n *\n * ```ts\n * const msg = createMockMessage({ role: \"user\", text: \"Hello\" });\n * ```\n */\nexport function createMockMessage(options: MockMessageOptions = {}): ChatMessage {\n const id = createChatId();\n const parts: MessagePart[] = options.parts ?? (options.text\n ? [{ type: \"text\" as const, text: options.text, status: \"complete\" as const }]\n : [{ type: \"text\" as const, text: \"Test message\", status: \"complete\" as const }]);\n const now = new Date().toISOString();\n return {\n id,\n role: options.role ?? \"user\",\n parts,\n status: options.status ?? \"complete\",\n createdAt: now,\n metadata: options.metadata ?? {},\n };\n}\n","/**\n * Mock IChatRuntime factory for testing chat runtime consumers.\n */\nimport type { IChatRuntime, BackendInfo } from \"../chat/runtime.js\";\nimport type { CreateSessionOptions, SessionListOptions } from \"../chat/sessions.js\";\nimport type { ChatSession, ChatEvent, ChatIdLike, ChatMiddleware, RuntimeStatus } from \"../chat/core.js\";\nimport type { RuntimeSendOptions } from \"../chat/types.js\";\nimport type { ContextStats } from \"../chat/context.js\";\nimport type { ToolDefinition, ModelInfo } from \"../types.js\";\nimport { createChatId, toChatId } from \"../chat/core.js\";\nimport { createMockSession, createMockMessage } from \"./mock-data.js\";\n\n/** Options for createMockRuntime. */\nexport interface MockRuntimeOptions {\n /** Default backend name. Default: \"mock\". */\n defaultBackend?: string;\n /** Default model. */\n defaultModel?: string;\n /** Pre-seeded sessions. */\n sessions?: ChatSession[];\n /** Models to return from listModels(). */\n models?: ModelInfo[];\n /** Custom send handler. When not provided, yields a single text_delta + done event. */\n onSend?: (sessionId: ChatIdLike, message: string, options?: RuntimeSendOptions) => AsyncIterable<ChatEvent>;\n}\n\n/**\n * Create a mock IChatRuntime for testing chat UI hooks and components.\n *\n * ```ts\n * const runtime = createMockRuntime({ defaultModel: \"gpt-5-mini\" });\n * const session = await runtime.createSession({});\n * ```\n */\nexport function createMockRuntime(options: MockRuntimeOptions = {}): IChatRuntime {\n const sessions = new Map<string, ChatSession>();\n const tools = new Map<string, ToolDefinition>();\n const middleware: ChatMiddleware[] = [];\n const sessionListeners = new Set<() => void>();\n let currentBackend = options.defaultBackend ?? \"mock\";\n let status: RuntimeStatus = \"idle\";\n\n // Seed initial sessions\n for (const s of options.sessions ?? []) {\n sessions.set(s.id, s);\n }\n\n function notifySessionChange() {\n for (const cb of sessionListeners) {\n try { cb(); } catch { /* isolated */ }\n }\n }\n\n const runtime: IChatRuntime = {\n get status() { return status; },\n get registeredTools() { return tools as ReadonlyMap<string, ToolDefinition>; },\n\n async createSession(opts: CreateSessionOptions): Promise<ChatSession> {\n const session = createMockSession({\n title: opts.title,\n config: {\n model: opts.config?.model ?? \"mock-model\",\n backend: opts.config?.backend ?? currentBackend,\n systemPrompt: opts.config?.systemPrompt,\n },\n metadata: opts.custom as Record<string, unknown>,\n });\n sessions.set(session.id, session);\n notifySessionChange();\n return session;\n },\n\n async getSession(id: ChatIdLike): Promise<ChatSession | null> {\n return sessions.get(toChatId(String(id))) ?? null;\n },\n\n async listSessions(_opts?: SessionListOptions): Promise<ChatSession[]> {\n return [...sessions.values()];\n },\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n sessions.delete(toChatId(String(id)));\n notifySessionChange();\n },\n\n send(sessionId: ChatIdLike, message: string, sendOpts?: RuntimeSendOptions): AsyncIterable<ChatEvent> {\n if (options.onSend) return options.onSend(sessionId, message, sendOpts);\n // Default: yield a simple response\n async function* defaultStream(): AsyncIterable<ChatEvent> {\n const msgId = createChatId();\n yield { type: \"message:start\", messageId: msgId } as ChatEvent;\n yield { type: \"message:delta\", text: \"Mock reply\" } as ChatEvent;\n yield { type: \"message:complete\", messageId: msgId } as ChatEvent;\n yield { type: \"done\", finalOutput: \"Mock reply\" } as ChatEvent;\n // Add assistant message to session\n const session = sessions.get(toChatId(String(sessionId)));\n if (session) {\n session.messages.push(createMockMessage({ role: \"assistant\", text: \"Mock reply\" }));\n session.metadata.messageCount = session.messages.length;\n }\n notifySessionChange();\n }\n return defaultStream();\n },\n\n abort(): void { /* no-op */ },\n\n async listModels(): Promise<ModelInfo[]> {\n return options.models ?? [{ id: \"mock-model\", name: \"Mock Model\" }];\n },\n\n async listBackends(): Promise<BackendInfo[]> {\n return [{ name: currentBackend }];\n },\n\n onSessionChange(callback: () => void): () => void {\n sessionListeners.add(callback);\n return () => { sessionListeners.delete(callback); };\n },\n\n registerTool(tool: ToolDefinition): void {\n tools.set(tool.name, tool);\n },\n\n removeTool(name: string): void {\n tools.delete(name);\n },\n\n use(mw: ChatMiddleware): void {\n middleware.push(mw);\n },\n\n removeMiddleware(mw: ChatMiddleware): void {\n const idx = middleware.indexOf(mw);\n if (idx >= 0) middleware.splice(idx, 1);\n },\n\n async getContextStats(_sessionId: ChatIdLike): Promise<ContextStats | null> {\n return null;\n },\n\n async dispose(): Promise<void> {\n status = \"disposed\";\n sessions.clear();\n tools.clear();\n middleware.length = 0;\n sessionListeners.clear();\n },\n };\n\n return runtime;\n}\n","/**\n * Mock IChatClient factory for testing remote chat client consumers.\n */\nimport type { IChatClient, BackendInfo } from \"../chat/runtime.js\";\nimport type { CreateSessionOptions, SessionListOptions } from \"../chat/sessions.js\";\nimport type { ChatSession, ChatEvent, ChatId, ChatIdLike, SendMessageOptions, RuntimeStatus } from \"../chat/core.js\";\nimport type { ProviderConfig } from \"../chat/provider-types.js\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { ContextStats } from \"../chat/context.js\";\nimport { createChatId, toChatId } from \"../chat/core.js\";\nimport { createMockSession, createMockMessage } from \"./mock-data.js\";\n\n/** Options for createMockChatClient. */\nexport interface MockChatClientOptions {\n /** Pre-seeded sessions. */\n sessions?: ChatSession[];\n /** Models to return from listModels(). */\n models?: ModelInfo[];\n /** Providers to return from listProviders(). */\n providers?: ProviderConfig[];\n /** Custom send handler. */\n onSend?: (sessionId: ChatIdLike, message: string, options?: SendMessageOptions) => AsyncIterable<ChatEvent>;\n}\n\n/**\n * Create a mock IChatClient for testing React hooks that talk to RemoteChatClient.\n *\n * ```ts\n * const client = createMockChatClient({ providers: [{ id: \"p1\", backend: \"copilot\", model: \"gpt-5-mini\", label: \"GPT Mini\", createdAt: \"\" }] });\n * const providers = await client.listProviders();\n * ```\n */\nexport function createMockChatClient(options: MockChatClientOptions = {}): IChatClient {\n const sessions = new Map<string, ChatSession>();\n const providers = new Map<string, ProviderConfig>();\n const sessionListeners = new Set<() => void>();\n const selectionListeners = new Set<(providerId: string | null) => void>();\n let activeSessionId: ChatId | null = null;\n let selectedProviderId: string | null = null;\n let status: RuntimeStatus = \"idle\";\n\n // Seed sessions\n for (const s of options.sessions ?? []) {\n sessions.set(s.id, s);\n }\n // Seed providers\n for (const p of options.providers ?? []) {\n providers.set(p.id, p);\n }\n\n function notifySessionChange() {\n for (const cb of sessionListeners) {\n try { cb(); } catch { /* isolated */ }\n }\n }\n\n const client: IChatClient = {\n get status() { return status; },\n get activeSessionId() { return activeSessionId; },\n\n async createSession(opts: CreateSessionOptions): Promise<ChatSession> {\n const session = createMockSession({\n title: opts.title,\n config: {\n model: opts.config?.model ?? \"mock-model\",\n backend: opts.config?.backend ?? \"mock\",\n systemPrompt: opts.config?.systemPrompt,\n },\n });\n sessions.set(session.id, session);\n activeSessionId = session.id;\n notifySessionChange();\n return session;\n },\n\n async getSession(id: ChatIdLike): Promise<ChatSession | null> {\n return sessions.get(toChatId(String(id))) ?? null;\n },\n\n async listSessions(_opts?: SessionListOptions): Promise<ChatSession[]> {\n return [...sessions.values()];\n },\n\n async deleteSession(id: ChatIdLike): Promise<void> {\n sessions.delete(toChatId(String(id)));\n if (activeSessionId === String(id)) activeSessionId = null;\n notifySessionChange();\n },\n\n async switchSession(id: ChatIdLike): Promise<ChatSession> {\n const session = sessions.get(toChatId(String(id)));\n if (!session) throw new Error(`Session ${id} not found`);\n activeSessionId = session.id;\n return session;\n },\n\n send(sessionId: ChatIdLike, message: string, sendOpts?: SendMessageOptions): AsyncIterable<ChatEvent> {\n if (options.onSend) return options.onSend(sessionId, message, sendOpts);\n async function* defaultStream(): AsyncIterable<ChatEvent> {\n const msgId = createChatId();\n yield { type: \"message:start\", messageId: msgId } as ChatEvent;\n yield { type: \"message:delta\", text: \"Mock reply\" } as ChatEvent;\n yield { type: \"message:complete\", messageId: msgId } as ChatEvent;\n yield { type: \"done\", finalOutput: \"Mock reply\" } as ChatEvent;\n const session = sessions.get(toChatId(String(sessionId)));\n if (session) {\n session.messages.push(createMockMessage({ role: \"assistant\", text: \"Mock reply\" }));\n session.metadata.messageCount = session.messages.length;\n }\n notifySessionChange();\n }\n return defaultStream();\n },\n\n abort(): void { /* no-op */ },\n\n // ── Provider Selection ──\n get selectedProviderId() { return selectedProviderId; },\n selectProvider(providerId: string): void {\n selectedProviderId = providerId;\n for (const cb of selectionListeners) {\n try { cb(providerId); } catch { /* isolated */ }\n }\n },\n onSelectionChange(callback: (providerId: string | null) => void): () => void {\n selectionListeners.add(callback);\n return () => { selectionListeners.delete(callback); };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n return options.models ?? [{ id: \"mock-model\", name: \"Mock Model\" }];\n },\n\n async listBackends(): Promise<BackendInfo[]> {\n return [{ name: \"mock\" }];\n },\n\n onSessionChange(callback: () => void): () => void {\n sessionListeners.add(callback);\n return () => { sessionListeners.delete(callback); };\n },\n\n async getContextStats(_sessionId: ChatIdLike): Promise<ContextStats | null> {\n return null;\n },\n\n // ── Provider CRUD ──\n async listProviders(): Promise<ProviderConfig[]> {\n return [...providers.values()];\n },\n\n async createProvider(config: Omit<ProviderConfig, \"id\" | \"createdAt\">): Promise<ProviderConfig> {\n const provider: ProviderConfig = {\n ...config,\n id: createChatId(),\n createdAt: Date.now(),\n };\n providers.set(provider.id, provider);\n return provider;\n },\n\n async updateProvider(id: string, changes: Partial<Omit<ProviderConfig, \"id\" | \"createdAt\">>): Promise<void> {\n const existing = providers.get(id);\n if (!existing) throw new Error(`Provider ${id} not found`);\n providers.set(id, { ...existing, ...changes });\n },\n\n async deleteProvider(id: string): Promise<void> {\n providers.delete(id);\n },\n\n async dispose(): Promise<void> {\n status = \"disposed\";\n sessions.clear();\n providers.clear();\n sessionListeners.clear();\n selectionListeners.clear();\n },\n };\n\n return client;\n}\n"]}
|
package/dist/testing.d.cts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { M as ModelInfo, V as ValidationResult, a as MessageContent, R as RunOptions, b as AgentResult, A as AgentEvent, I as IAgentService } from './agent-
|
|
1
|
+
import { M as ModelInfo, V as ValidationResult, a as MessageContent, R as RunOptions, b as AgentResult, A as AgentEvent, I as IAgentService } from './agent-C6H2CgJA.cjs';
|
|
2
|
+
import { M as MockLLMBackendOptions } from './backends-Cno0gZjy.cjs';
|
|
2
3
|
import { IChatRuntime, IChatClient } from './chat/runtime.cjs';
|
|
3
|
-
import { g as ChatSession, f as ChatIdLike, h as RuntimeSendOptions, a as ChatEvent, S as SendMessageOptions, p as MessagePart, c as ChatMessage, j as ChatSessionConfig } from './types-
|
|
4
|
+
import { g as ChatSession, f as ChatIdLike, h as RuntimeSendOptions, a as ChatEvent, S as SendMessageOptions, p as MessagePart, c as ChatMessage, j as ChatSessionConfig } from './types-DkSXALKg.cjs';
|
|
4
5
|
import { P as ProviderConfig } from './provider-types-PTSlRPNB.cjs';
|
|
5
6
|
import 'zod';
|
|
6
7
|
import './errors-C-so0M4t.cjs';
|
|
@@ -26,6 +27,10 @@ interface MockAgentServiceOptions {
|
|
|
26
27
|
onRun?: (prompt: MessageContent, options?: RunOptions) => Promise<AgentResult>;
|
|
27
28
|
/** Custom stream handler. Default: yields text_delta + result events. */
|
|
28
29
|
onStream?: (prompt: MessageContent, options?: RunOptions) => AsyncIterable<AgentEvent>;
|
|
30
|
+
/** Opt-in: delegate to Mock LLM backend for richer simulation.
|
|
31
|
+
* When provided, createAgent() returns a full MockLLMAgent that participates
|
|
32
|
+
* in the BaseAgent lifecycle (retry, heartbeat, middleware, usage enrichment). */
|
|
33
|
+
mockLLMBackend?: MockLLMBackendOptions;
|
|
29
34
|
}
|
|
30
35
|
/**
|
|
31
36
|
* Create a mock IAgentService for testing agent-level code.
|
|
@@ -35,6 +40,13 @@ interface MockAgentServiceOptions {
|
|
|
35
40
|
* const agent = service.createAgent({ model: "gpt-5-mini" });
|
|
36
41
|
* const result = await agent.run("Hello");
|
|
37
42
|
* ```
|
|
43
|
+
*
|
|
44
|
+
* For richer simulation with full BaseAgent lifecycle, pass `mockLLMBackend`:
|
|
45
|
+
* ```ts
|
|
46
|
+
* const service = createMockAgentService({
|
|
47
|
+
* mockLLMBackend: { mode: { type: "echo" }, latency: { type: "fixed", ms: 50 } },
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
38
50
|
*/
|
|
39
51
|
declare function createMockAgentService(options?: MockAgentServiceOptions): IAgentService;
|
|
40
52
|
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { M as ModelInfo, V as ValidationResult, a as MessageContent, R as RunOptions, b as AgentResult, A as AgentEvent, I as IAgentService } from './agent-
|
|
1
|
+
import { M as ModelInfo, V as ValidationResult, a as MessageContent, R as RunOptions, b as AgentResult, A as AgentEvent, I as IAgentService } from './agent-F7oB6eKp.js';
|
|
2
|
+
import { M as MockLLMBackendOptions } from './backends-Cno0gZjy.js';
|
|
2
3
|
import { IChatRuntime, IChatClient } from './chat/runtime.js';
|
|
3
|
-
import { g as ChatSession, f as ChatIdLike, h as RuntimeSendOptions, a as ChatEvent, S as SendMessageOptions, p as MessagePart, c as ChatMessage, j as ChatSessionConfig } from './types-
|
|
4
|
+
import { g as ChatSession, f as ChatIdLike, h as RuntimeSendOptions, a as ChatEvent, S as SendMessageOptions, p as MessagePart, c as ChatMessage, j as ChatSessionConfig } from './types-DgtI1hzh.js';
|
|
4
5
|
import { P as ProviderConfig } from './provider-types-PTSlRPNB.js';
|
|
5
6
|
import 'zod';
|
|
6
7
|
import './errors-C-so0M4t.js';
|
|
@@ -26,6 +27,10 @@ interface MockAgentServiceOptions {
|
|
|
26
27
|
onRun?: (prompt: MessageContent, options?: RunOptions) => Promise<AgentResult>;
|
|
27
28
|
/** Custom stream handler. Default: yields text_delta + result events. */
|
|
28
29
|
onStream?: (prompt: MessageContent, options?: RunOptions) => AsyncIterable<AgentEvent>;
|
|
30
|
+
/** Opt-in: delegate to Mock LLM backend for richer simulation.
|
|
31
|
+
* When provided, createAgent() returns a full MockLLMAgent that participates
|
|
32
|
+
* in the BaseAgent lifecycle (retry, heartbeat, middleware, usage enrichment). */
|
|
33
|
+
mockLLMBackend?: MockLLMBackendOptions;
|
|
29
34
|
}
|
|
30
35
|
/**
|
|
31
36
|
* Create a mock IAgentService for testing agent-level code.
|
|
@@ -35,6 +40,13 @@ interface MockAgentServiceOptions {
|
|
|
35
40
|
* const agent = service.createAgent({ model: "gpt-5-mini" });
|
|
36
41
|
* const result = await agent.run("Hello");
|
|
37
42
|
* ```
|
|
43
|
+
*
|
|
44
|
+
* For richer simulation with full BaseAgent lifecycle, pass `mockLLMBackend`:
|
|
45
|
+
* ```ts
|
|
46
|
+
* const service = createMockAgentService({
|
|
47
|
+
* mockLLMBackend: { mode: { type: "echo" }, latency: { type: "fixed", ms: 50 } },
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
38
50
|
*/
|
|
39
51
|
declare function createMockAgentService(options?: MockAgentServiceOptions): IAgentService;
|
|
40
52
|
|