@resolveio/server-lib 20.13.11 → 20.14.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/collections/ai-terminal-conversation.collection.d.ts +2 -0
- package/collections/ai-terminal-conversation.collection.js +133 -0
- package/collections/ai-terminal-conversation.collection.js.map +1 -0
- package/collections/ai-terminal-message.collection.d.ts +2 -0
- package/collections/ai-terminal-message.collection.js +113 -0
- package/collections/ai-terminal-message.collection.js.map +1 -0
- package/collections/communication-metric.collection.d.ts +2 -0
- package/collections/communication-metric.collection.js +133 -0
- package/collections/communication-metric.collection.js.map +1 -0
- package/collections/openai-usage-ledger.collection.d.ts +2 -0
- package/collections/openai-usage-ledger.collection.js +120 -0
- package/collections/openai-usage-ledger.collection.js.map +1 -0
- package/managers/communication-metric.manager.d.ts +16 -0
- package/managers/communication-metric.manager.js +134 -0
- package/managers/communication-metric.manager.js.map +1 -0
- package/managers/method.manager.d.ts +2 -0
- package/managers/method.manager.js +162 -45
- package/managers/method.manager.js.map +1 -1
- package/managers/openai-usage-ledger.manager.d.ts +14 -0
- package/managers/openai-usage-ledger.manager.js +137 -0
- package/managers/openai-usage-ledger.manager.js.map +1 -0
- package/managers/subscription.manager.js +2 -0
- package/managers/subscription.manager.js.map +1 -1
- package/methods/ai-terminal.d.ts +1 -0
- package/methods/ai-terminal.js +1200 -0
- package/methods/ai-terminal.js.map +1 -0
- package/methods/report-builder.js +741 -0
- package/methods/report-builder.js.map +1 -1
- package/methods.ts +27 -0
- package/models/ai-terminal-conversation.model.d.ts +16 -0
- package/models/ai-terminal-conversation.model.js +4 -0
- package/models/ai-terminal-conversation.model.js.map +1 -0
- package/models/ai-terminal-message.model.d.ts +22 -0
- package/models/ai-terminal-message.model.js +4 -0
- package/models/ai-terminal-message.model.js.map +1 -0
- package/models/communication-metric.model.d.ts +20 -0
- package/models/communication-metric.model.js +4 -0
- package/models/communication-metric.model.js.map +1 -0
- package/models/openai-usage-ledger.model.d.ts +14 -0
- package/models/openai-usage-ledger.model.js +4 -0
- package/models/openai-usage-ledger.model.js.map +1 -0
- package/package.json +5 -1
- package/public_api.d.ts +13 -0
- package/public_api.js +13 -0
- package/public_api.js.map +1 -1
- package/publications/ai-terminal.d.ts +1 -0
- package/publications/ai-terminal.js +58 -0
- package/publications/ai-terminal.js.map +1 -0
- package/publications.ts +6 -0
- package/services/codex-client.d.ts +81 -0
- package/services/codex-client.js +991 -0
- package/services/codex-client.js.map +1 -0
- package/services/openai-client.d.ts +46 -0
- package/services/openai-client.js +315 -0
- package/services/openai-client.js.map +1 -0
- package/util/common.js +20 -53
- package/util/common.js.map +1 -1
- package/util/tokenizer.d.ts +5 -0
- package/util/tokenizer.js +35 -0
- package/util/tokenizer.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/codex-client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yBAAoC;AACpC,uBAAyB;AACzB,2BAA6B;AAC7B,4CAA6D;AAsC7D;IAeC,qBAAY,MAAmB;QAbvB,UAAK,GAAe,IAAI,CAAC;QACzB,cAAS,GAAyB,IAAI,CAAC;QAC9B,gBAAW,GAAG,IAAI,GAAG,EAA+C,CAAC;QACrE,iBAAY,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;QACtF,kBAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5C,wBAAmB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACjE,YAAO,GAAkB,IAAI,CAAC;QACrB,qBAAgB,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAClD,yBAAoB,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC1D,gBAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxC,kBAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAI5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;IAEK,yBAAG,GAAT,UAAU,MAAc,EAAE,OAAyB;;;;;;wBAC5C,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC9D,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;wBACpE,OAAO,GAAG,CAAC,CAAC;wBACZ,SAAS,GAAY,IAAI,CAAC;6BAC1B,CAAA,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA,EAA9C,wBAA8C;wBACjD,qBAAM,IAAI,CAAC,OAAO,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAC,EAAA;;wBAA1C,SAA0C,CAAC;;;6BAErC,CAAA,OAAO,IAAI,UAAU,CAAA;;;;wBAE1B,IAAI,CAAC,GAAG,CAAC,sBAAe,OAAO,GAAG,CAAC,cAAI,UAAU,GAAG,CAAC,CAAE,CAAC,CAAC;6BACrD,CAAA,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA,EAAhD,wBAAgD;wBAC5C,qBAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAA;4BAAlD,sBAAO,SAA2C,EAAC;4BAE7C,qBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAA;4BAA1C,sBAAO,SAAmC,EAAC;;;wBAG3C,SAAS,GAAG,OAAK,CAAC;wBACZ,OAAO,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,IAAI,eAAe,CAAC,CAAC;wBAC1F,IAAI,CAAC,GAAG,CAAC,sBAAe,OAAO,GAAG,CAAC,sBAAY,OAAO,CAAE,CAAC,CAAC;wBAC1D,IAAI,OAAO,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAK,CAAC,EAAE,CAAC;4BAC5D,yBAAM;wBACP,CAAC;wBACK,KAAK,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBAClD,qBAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA;;wBAAvB,SAAuB,CAAC;wBACxB,OAAO,IAAI,CAAC,CAAC;;;6BAGf,MAAM,SAAS,CAAC;;;;KAChB;IAEa,qCAAe,GAA7B,UAA8B,MAAc,EAAE,OAAyB;;;;;;;;;wBAChE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,0CAAmC,MAAM,CAAC,MAAM,MAAG,CAAC,CAAC;wBAC/C,qBAAM,IAAI,CAAC,WAAW,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,EAAA;;wBAAjG,MAAM,GAAG,SAAwF;wBACjG,SAAS,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,IAAI,CAAC,gBAAgB,CAAC;wBACxD,UAAU,GAAG,OAAO,eAAe,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBACnF,SAAS,GAAG,UAAU;4BAC3B,CAAC,CAAC,UAAU,CAAC,cAAM,OAAA,UAAU,CAAC,KAAK,EAAE,EAAlB,CAAkB,EAAE,SAAS,CAAC;4BACjD,CAAC,CAAC,IAAI,CAAC;wBACJ,aAAa,GAAG,EAAE,CAAC;wBACnB,QAAQ,GAAG,EAAE,CAAC;;;;wBAEE,qBAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAA;;wBAAnG,MAAM,GAAK,CAAA,SAAwF,CAAA,OAA7F;;;;mCACY,WAAA,cAAA,MAAM,CAAA;;;;;wBAAN,sBAAM;wBAAN,WAAM;wBAAf,YAAK,CAAA;6BACjB,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAA,EAAtB,yBAAsB;;;;wBAExB,qBAAM,OAAO,CAAC,aAAa,CAAC,OAAK,CAAC,EAAA;;wBAAlC,SAAkC,CAAC;;;;wBAG7B,OAAO,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,IAAI,eAAe,CAAC,CAAC;wBAC1F,IAAI,CAAC,GAAG,CAAC,gCAAyB,OAAO,CAAE,CAAC,CAAC;;6BAG/C,qBAAM,IAAI,CAAC,iBAAiB,CAAC,OAAK,EAAE,UAAO,IAAY;;;;;wCAChD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;wCACxB,IAAI,CAAC,IAAI,EAAE,CAAC;4CACX,sBAAO;wCACR,CAAC;wCACK,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;6CACzE,KAAK,EAAL,wBAAK;wCACR,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;6CACtB,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,CAAA,EAArB,wBAAqB;;;;wCAEvB,qBAAM,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;;wCAAvC,SAAuC,CAAC;;;;wCAGlC,OAAO,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,IAAI,eAAe,CAAC,CAAC;wCAC1F,IAAI,CAAC,GAAG,CAAC,+BAAwB,OAAO,CAAE,CAAC,CAAC;;;wCAI/C,QAAQ,GAAG,IAAI,CAAC;wCAChB,aAAa,GAAG,IAAI,CAAC;;;;6BACrB,CAAC,EAAA;;wBApBF,SAoBE,CAAC;wBACH,IAAI,CAAA,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,IAAI,MAAK,aAAa,EAAE,CAAC;4BACnC,MAAM,IAAI,KAAK,CAAC,CAAA,MAAA,OAAK,CAAC,KAAK,0CAAE,OAAO,KAAI,oBAAoB,CAAC,CAAC;wBAC/D,CAAC;wBACD,IAAI,CAAA,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,IAAI,MAAK,OAAO,EAAE,CAAC;4BAC7B,MAAM,IAAI,KAAK,CAAC,OAAK,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC;wBACzD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;wBAIF,IAAI,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAE,OAAO,EAAE,CAAC;4BACjC,IAAI,CAAC,GAAG,CAAC,4CAAqC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,MAAG,CAAC,CAAC;4BACzE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;wBAC7C,CAAC;wBACK,OAAO,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,IAAI,eAAe,CAAC,CAAC;wBAC1F,IAAI,CAAC,GAAG,CAAC,yCAAkC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,gBAAM,OAAO,CAAE,CAAC,CAAC;wBAClF,MAAM,OAAK,CAAC;;wBAGZ,IAAI,SAAS,EAAE,CAAC;4BACf,YAAY,CAAC,SAAS,CAAC,CAAC;wBACzB,CAAC;;;wBAEF,IAAI,CAAC,aAAa,EAAE,CAAC;4BACpB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;wBAC1D,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,8CAAuC,aAAa,CAAC,MAAM,0BAAgB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,MAAG,CAAC,CAAC;wBAC/G,sBAAO,aAAa,CAAC,IAAI,EAAE,EAAC;;;;KAC5B;IAEa,6BAAO,GAArB,UAAsB,MAAc,EAAE,OAAyB;;;;;;;wBACxD,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CAAC,sCAA+B,MAAM,CAAC,MAAM,MAAG,CAAC,CAAC;;;;wBAE1C,qBAAM,IAAI,CAAC,WAAW,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,EAAA;;wBAAjG,MAAM,GAAG,SAAwF;wBACjG,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAChC,SAAS,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,IAAI,CAAC,gBAAgB,CAAC;wBAC9D,IAAI,CAAC,GAAG,CAAC,6CAAsC,SAAS,MAAG,CAAC,CAAC;wBAC9C,qBAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,EAAA;;wBAAtD,MAAM,GAAG,SAA6C;wBACtD,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;4BACd,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;wBAC1D,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,0CAAmC,OAAO,CAAC,MAAM,0BAAgB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,MAAG,CAAC,CAAC;wBACrG,sBAAO,OAAO,EAAC;;;wBAGT,OAAO,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,IAAI,eAAe,CAAC,CAAC;wBAC1F,IAAI,CAAC,GAAG,CAAC,qCAA8B,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,gBAAM,OAAO,CAAE,CAAC,CAAC;wBAC9E,MAAM,OAAK,CAAC;;;;;KAEb;IAEa,iCAAW,GAAzB;4DAA0B,aAAkC,EAAE,SAAkB,EAAE,WAAkB;;YAAlB,4BAAA,EAAA,kBAAkB;;;4BACnG,qBAAM,IAAI,CAAC,WAAW,EAAE,EAAA;;wBAAxB,SAAwB,CAAC;wBACnB,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;wBACvD,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;wBACpE,IAAI,WAAW,IAAI,QAAQ,EAAE,CAAC;4BACvB,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;4BAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;gCACnF,IAAI,CAAC,GAAG,CAAC,6BAAsB,QAAQ,MAAG,CAAC,CAAC;gCAC5C,sBAAO,QAAQ,CAAC,MAAM,EAAC;4BACxB,CAAC;wBACF,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,6BAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,MAAG,CAAC,CAAC;wBAClE,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,EAAE,CAAC;4BAC1B,IAAI,CAAC,GAAG,CAAC,+BAAwB,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAE,CAAC,CAAC;4BACtE,WAAS,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;4BACrD,IAAI,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;4BACpD,IAAI,QAAQ,EAAE,CAAC;gCACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,UAAA,EAAE,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;4BACnG,CAAC;4BACD,sBAAO,QAAM,EAAC;wBACf,CAAC;wBACD,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;4BACxD,IAAI,CAAC,GAAG,CAAC,+BAAwB,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAE,CAAC,CAAC;wBAC7E,CAAC;wBACK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;wBACrD,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;wBAChC,IAAI,QAAQ,EAAE,CAAC;4BACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,QAAA,EAAE,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;wBACnG,CAAC;wBACD,sBAAO,MAAM,EAAC;;;;KACd;IAEO,oCAAc,GAAtB,UAAuB,MAAW;QAAlC,iBAgEC;QA/DA,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAM,WAAW,GAAG,yBAAI,MAAM,CAAC,KAAK,UAAE,OAAO,EAAE,CAAC,IAAI,CAAC,UAAC,IAAS,IAAK,OAAA,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,eAAe,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAA/D,CAA+D,CAAC,CAAC;YACrI,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,EAAE,CAAC;gBACvB,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;QACF,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAM,IAAI,GAAG,MAAM,CAAC,OAAO;iBACzB,GAAG,CAAC,UAAC,IAAS,IAAK,OAAA,KAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAA1B,CAA0B,CAAC;iBAC9C,IAAI,CAAC,EAAE,CAAC;iBACR,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAM,IAAI,GAAG,MAAM,CAAC,MAAM;iBACxB,GAAG,CAAC,UAAC,IAAS;gBACd,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,OAAO,EAAE,CAAC;gBACX,CAAC;gBACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC9B,OAAO,IAAI,CAAC;gBACb,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAC,IAAI,CAAC;gBAClB,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC,OAAO,CAAC;gBACrB,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAS,IAAK,OAAA,KAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAA1B,CAA0B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO,EAAE,CAAC;YACX,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC;iBACR,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAEa,uCAAiB,GAA/B,UAAgC,KAAU,EAAE,cAAmC;;;;;;wBAC9E,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;4BAC3B,sBAAO;wBACR,CAAC;wBACO,KAAA,KAAK,CAAC,IAAI,CAAA;;iCACZ,gBAAgB,CAAC,CAAjB,wBAAgB;iCAGhB,cAAc,CAAC,CAAf,wBAAc;iCAGd,gBAAgB,CAAC,CAAjB,wBAAgB;iCAGhB,cAAc,CAAC,CAAf,wBAAc;iCACd,cAAc,CAAC,CAAf,wBAAc;iCACd,gBAAgB,CAAC,CAAjB,wBAAgB;;;;wBAVpB,IAAI,CAAC,GAAG,CAAC,oCAA6B,KAAK,CAAC,SAAS,IAAI,SAAS,MAAG,CAAC,CAAC;wBACvE,wBAAM;;wBAEN,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;wBAChC,wBAAM;;wBAEN,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;wBAClC,wBAAM;4BAIN,qBAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,EAAA;;wBAAvD,SAAuD,CAAC;wBACxD,wBAAM;4BAEN,wBAAM;;;;;KAER;IAEa,sCAAgB,GAA9B,UAA+B,IAAS,EAAE,cAAmC;;;;;;;wBAC5E,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;4BACzB,sBAAO;wBACR,CAAC;wBACO,KAAA,IAAI,CAAC,IAAI,CAAA;;iCACX,eAAe,CAAC,CAAhB,wBAAe;iCAGf,mBAAmB,CAAC,CAApB,wBAAmB;iCAWnB,aAAa,CAAC,CAAd,wBAAa;iCAMb,eAAe,CAAC,CAAhB,wBAAe;iCAQf,YAAY,CAAC,CAAb,wBAAY;iCAKZ,WAAW,CAAC,CAAZ,wBAAW;iCAOX,WAAW,CAAC,CAAZ,wBAAW;iCAMX,OAAO,CAAC,CAAR,wBAAO;;;4BA7CX,qBAAM,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAA;;wBAArC,SAAqC,CAAC;wBACtC,yBAAM;;wBAEN,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BAClB,IAAI,CAAC,GAAG,CAAC,0BAAmB,IAAI,CAAC,OAAO,eAAK,IAAI,CAAC,MAAM,IAAI,SAAS,MAAG,CAAC,CAAC;wBAC3E,CAAC;wBACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;4BACtB,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,GAAG;gCACjD,CAAC,CAAC,UAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,QAAK;gCAC9C,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;4BAC1B,IAAI,CAAC,GAAG,CAAC,iCAA0B,MAAM,CAAE,CAAC,CAAC;wBAC9C,CAAC;wBACD,yBAAM;;wBAEN,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BAClD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,MAAW,IAAK,OAAA,UAAG,MAAM,CAAC,IAAI,cAAI,MAAM,CAAC,IAAI,CAAE,EAA/B,CAA+B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC9F,IAAI,CAAC,GAAG,CAAC,8BAAuB,IAAI,CAAC,MAAM,IAAI,SAAS,gBAAM,OAAO,CAAE,CAAC,CAAC;wBAC1E,CAAC;wBACD,yBAAM;;wBAEN,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACf,IAAI,CAAC,GAAG,CAAC,4BAAqB,IAAI,CAAC,IAAI,eAAK,IAAI,CAAC,MAAM,IAAI,SAAS,MAAG,CAAC,CAAC;wBAC1E,CAAC;wBACD,IAAI,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,EAAE,CAAC;4BACzB,IAAI,CAAC,GAAG,CAAC,kCAA2B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC;wBAC3D,CAAC;wBACD,yBAAM;;wBAEN,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BAChB,IAAI,CAAC,GAAG,CAAC,6BAAsB,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC;wBAC9C,CAAC;wBACD,yBAAM;;wBAEN,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;4BACzB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;4BAC1B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAC,KAAU,IAAK,OAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,EAAhB,CAAgB,CAAC,CAAC,MAAM,CAAC;4BACxE,IAAI,CAAC,GAAG,CAAC,4BAAqB,IAAI,cAAI,KAAK,eAAY,CAAC,CAAC;wBAC1D,CAAC;wBACD,yBAAM;;wBAEN,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACT,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,UAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,QAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;4BACrF,IAAI,CAAC,GAAG,CAAC,4BAAqB,OAAO,CAAE,CAAC,CAAC;wBAC1C,CAAC;wBACD,yBAAM;;wBAEN,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BAClB,IAAI,CAAC,GAAG,CAAC,wBAAiB,IAAI,CAAC,OAAO,CAAE,CAAC,CAAC;wBAC3C,CAAC;wBACD,yBAAM;6BAEN,yBAAM;;;;;KAER;IAEO,mCAAa,GAArB,UAAsB,IAAY;;QACjC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QACD,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;;YAClC,KAAmB,IAAA,UAAA,SAAA,KAAK,CAAA,4BAAA,+CAAE,CAAC;gBAAtB,IAAM,IAAI,kBAAA;gBACd,IAAI,CAAC,GAAG,CAAC,kBAAW,IAAI,CAAE,CAAC,CAAC;YAC7B,CAAC;;;;;;;;;IACF,CAAC;IAEO,qCAAe,GAAvB,UAAwB,IAAS;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,IAAI,CAAC;QAClB,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,OAAO,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAEa,iCAAW,GAAzB,UAA6B,OAAmB,EAAE,SAAiB;;;;;;;wBAC9D,IAAI,GAAG,KAAK,CAAC;wBACX,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBACvB,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1E,cAAc,GAAG,CAAC;;;;;6CAChB,CAAC,IAAI;wCACL,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wCACvC,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;4CAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;wCAC7C,CAAC;wCACK,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;wCACtC,qBAAM,IAAA,qBAAY,EAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,EAAA;;wCAApD,SAAoD,CAAC;6CACjD,IAAI,EAAJ,wBAAI;wCACA,qBAAM,OAAO,EAAA;4CAApB,sBAAO,SAAa,EAAC;;wCAEhB,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wCAC9C,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;4CACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;wCAC7C,CAAC;wCACK,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC,CAAC;wCACjE,IAAI,CAAC,GAAG,CAAC,qCAA8B,cAAc,2BAAiB,gBAAgB,MAAG,CAAC,CAAC;;4CAErF,qBAAM,OAAO,EAAA;4CAApB,sBAAO,SAAa,EAAC;;;6BACrB,CAAC,EAAE,CAAC;;;;wBAEG,qBAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAA;4BAApD,sBAAO,SAA6C,EAAC;;wBAGrD,IAAI,GAAG,IAAI,CAAC;;;;;;KAEb;IAEO,yCAAmB,GAA3B,UAA4B,KAAc;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,CAAC;QACV,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAEO,yCAAmB,GAA3B,UAA4B,KAAc;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAEO,sCAAgB,GAAxB,UAAyB,KAAc;QACtC,IAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,0EAA0E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjG,CAAC;IAEa,2BAAK,GAAnB,UAAoB,EAAU;;;;4BAC7B,qBAAM,IAAA,qBAAY,EAAC,EAAE,CAAC,EAAA;;wBAAtB,SAAsB,CAAC;;;;;KACvB;IAEa,iCAAW,GAAzB;;;;;;wBACC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BAChB,sBAAO;wBACR,CAAC;6BACG,CAAA,IAAI,CAAC,SAAS,KAAK,IAAI,CAAA,EAAvB,wBAAuB;wBAC1B,qBAAM,IAAI,CAAC,SAAS,EAAA;;wBAApB,SAAoB,CAAC;wBACrB,sBAAO;;wBAER,IAAI,CAAC,SAAS,GAAG,CAAC;;;;;;wCACjB,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;wCAClC,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAkB,CAAC;wCAC5E,qBAAM,QAAQ,CAAC,mBAAmB,CAAC,EAAA;;wCAAzC,GAAG,GAAG,SAAmC;wCACzC,SAAS,GAAG,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,KAAK,MAAI,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,0CAAE,KAAK,CAAA,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAA,IAAI,GAAG,CAAC;wCAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;4CAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;wCAChD,CAAC;wCACD,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;wCACzB,qBAAM,IAAI,CAAC,aAAa,EAAE,EAAA;;wCAAhC,GAAG,GAAG,SAA0B;wCACtC,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC;4CAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;4CAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;4CAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;4CACxB,GAAG,KAAA;yCACH,CAAC,CAAC;wCACH,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;;;;6BACtC,CAAC,EAAE,CAAC;wBACL,qBAAM,IAAI,CAAC,SAAS,EAAA;;wBAApB,SAAoB,CAAC;;;;;KACrB;IAEO,yBAAG,GAAX,UAAY,OAAe;QAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gCAAyB,OAAO,CAAE,CAAC,CAAC;IACjD,CAAC;IAEO,6CAAuB,GAA/B;QACC,IAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3G,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,0CAAoB,GAA5B;QACC,IAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/E,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEO,gDAA0B,GAAlC;;QACC,IAAM,GAAG,GAAG,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtF,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAEa,mCAAa,GAA3B;;;;;;;wBACO,GAAG,GAA2B,EAAE,CAAC;;4BACvC,KAA2B,KAAA,SAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,4CAAE,CAAC;gCAA9C,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;gCACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oCAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gCAClB,CAAC;4BACF,CAAC;;;;;;;;;6BACG,IAAI,CAAC,mBAAmB,EAAxB,wBAAwB;wBAC3B,KAAA,GAAG,CAAA;wBAAW,qBAAM,IAAI,CAAC,aAAa,EAAE,EAAA;;wBAAxC,GAAI,OAAO,GAAG,SAA0B,CAAC;;4BAE1C,sBAAO,GAAG,EAAC;;;;KACX;IAEa,mCAAa,GAA3B;;;;;;wBACC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BAClB,sBAAO,IAAI,CAAC,OAAO,EAAC;wBACrB,CAAC;wBACK,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;wBACjE,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;wBAChE,qBAAM,aAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAA;;wBAAxC,SAAwC,CAAC;wBACzC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;wBACnB,sBAAO,GAAG,EAAC;;;;KACX;IAEO,wCAAkB,GAA1B;QACC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IAEO,0CAAoB,GAA5B;QACC,IAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,iDAA2B,GAAnC;QACC,IAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QACpG,IAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,CAAC;QAC9G,IAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;QACpG,IAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAClG,IAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QACzG,IAAM,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QACjH,IAAM,oBAAoB,GAAG,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjH,OAAO;YACN,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,cAAc,gBAAA;YACd,WAAW,aAAA;YACX,gBAAgB,kBAAA;YAChB,aAAa,eAAA;YACb,gBAAgB,kBAAA;YAChB,oBAAoB,sBAAA;YACpB,oBAAoB,sBAAA;SACpB,CAAC;IACH,CAAC;IAEO,wCAAkB,GAA1B,UAA2B,SAA8B;QACxD,IAAM,MAAM,yBACR,IAAI,CAAC,oBAAoB,GACzB,CAAC,SAAS,IAAI,EAAE,CAAC,CACpB,CAAC;QACF,IAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,EAAY;gBAAZ,KAAA,aAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAC9D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBAC3D,OAAO,GAAG,CAAC;YACZ,CAAC;YACA,GAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,OAAO,GAAG,CAAC;QACZ,CAAC,EAAE,EAAwB,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC;IAEO,6CAAuB,GAA/B,UAAgC,KAAc;QAC7C,IAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YACxH,OAAO,UAAkD,CAAC;QAC3D,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,0CAAoB,GAA5B,UAA6B,KAAc,EAAE,QAAyD;QAAzD,yBAAA,EAAA,sBAAyD;QACrG,IAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,iBAAiB,IAAI,UAAU,KAAK,oBAAoB,EAAE,CAAC;YAC3G,OAAO,UAA+C,CAAC;QACxD,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEO,4CAAsB,GAA9B,UAA+B,KAAc;QAC5C,IAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YACnF,OAAO,UAAiD,CAAC;QAC1D,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,mDAA6B,GAArC,UAAsC,KAAc;QACnD,IAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YACpI,OAAO,UAAwD,CAAC;QACjE,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,sCAAgB,GAAxB,UAAyB,KAAyB,EAAE,QAAiB;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QACjB,CAAC;QACD,IAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEO,yCAAmB,GAA3B,UAA4B,OAA2B;QACtD,IAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAC,EAAY;gBAAZ,KAAA,aAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC3C,OAAO;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAEO,2CAAqB,GAA7B,UAA8B,OAA4B;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aAClB,IAAI,EAAE;aACN,OAAO,CAAC,UAAC,GAAG;YACZ,IAAM,KAAK,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC3C,OAAO;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAEO,yCAAmB,GAA3B,UAA4B,SAA6B,EAAE,OAA4B;QACtF,IAAI,SAAS,EAAE,CAAC;YACf,OAAO,iBAAU,SAAS,CAAE,CAAC;QAC9B,CAAC;QACD,IAAM,KAAK,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,KAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAClD,IAAM,gBAAgB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC;QACnD,IAAI,CAAC,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,sBAAe,KAAK,IAAI,SAAS,cAAI,gBAAgB,IAAI,MAAM,CAAE,CAAC;IAC1E,CAAC;IAEO,kCAAY,GAApB,UAAqB,MAAc;QAClC,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,WAAW,CAAC;IAClD,CAAC;IAEa,6BAAO,GAArB,UAAsB,aAAkC;;;;;;wBACvD,IAAI,CAAC,GAAG,CAAC,mCAA4B,IAAI,CAAC,aAAa,MAAG,CAAC,CAAC;;;;wBAE3C,qBAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE;gCAC3D,SAAS,EAAE,IAAI,CAAC,aAAa;gCAC7B,aAAa,eAAA;gCACb,WAAW,EAAE,KAAK;6BAClB,CAAC,EAAA;;wBAJI,OAAO,GAAG,SAId;wBACI,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;wBACzB,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,UAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,WAAG,CAAC,CAAC,CAAC,OAAO,CAAC;wBAC3E,IAAI,CAAC,GAAG,CAAC,4BAAqB,OAAO,CAAE,CAAC,CAAC;;;;wBAGnC,OAAO,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,IAAI,eAAe,CAAC,CAAC;wBAC1F,IAAI,CAAC,GAAG,CAAC,0BAAmB,OAAO,CAAE,CAAC,CAAC;wBACvC,MAAM,OAAK,CAAC;;;;;KAEb;IA7pBuB,uBAAW,GAAG,YAAH,AAAe,CAAC;IA8pBpD,kBAAC;CA/pBD,AA+pBC,IAAA;AA/pBY,kCAAW","file":"codex-client.js","sourcesContent":["import { promises as fs } from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { setTimeout as sleepTimeout } from 'timers/promises';\nexport interface CodexConfig {\n\tapiKey?: string;\n\tbaseUrl?: string;\n\tmodel?: string;\n\tmaxRetries?: number;\n\tretryDelayMs?: number;\n}\n\n/* eslint-disable no-unused-vars -- Function type params are required for clarity. */\ntype StreamEventHandler = (event: any) => void | Promise<void>;\ntype StreamTextHandler = (delta: string, fullText: string) => void | Promise<void>;\ntype AgentMessageHandler = (text: string) => void | Promise<void>;\ntype DynamicImport = (specifier: string) => Promise<any>;\n/* eslint-enable no-unused-vars */\n\nexport interface CodexRunOptions {\n\ttimeoutMs?: number;\n\tthreadOptions?: CodexThreadOptions;\n\tthreadKey?: string;\n\treuseThread?: boolean;\n\tonStreamEvent?: StreamEventHandler;\n\tonStreamText?: StreamTextHandler;\n}\n\nexport type CodexThreadOptions = {\n\tmodel?: string;\n\tsandboxMode?: 'read-only' | 'workspace-write' | 'danger-full-access';\n\tworkingDirectory?: string;\n\tskipGitRepoCheck?: boolean;\n\tmodelReasoningEffort?: 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n\tnetworkAccessEnabled?: boolean;\n\twebSearchMode?: 'disabled' | 'cached' | 'live';\n\twebSearchEnabled?: boolean;\n\tapprovalPolicy?: 'never' | 'on-request' | 'on-failure' | 'untrusted';\n\tadditionalDirectories?: string[];\n};\n\nexport class CodexClient {\n\tprivate static readonly PING_PROMPT = \"Say 'pong'\";\n\tprivate codex: any | null = null;\n\tprivate codexInit: Promise<void> | null = null;\n\tprivate readonly threadCache = new Map<string, { thread: any; optionsKey: string }>();\n\tprivate readonly debugEnabled = (process.env.AI_DASHBOARD_DEBUG || '').trim().toLowerCase() === 'true';\n\tprivate readonly streamEnabled = this.resolveStreamEnabled();\n\tprivate readonly cleanZdotdirEnabled = this.resolveCleanZdotdirEnabled();\n\tprivate zDotDir: string | null = null;\n\tprivate readonly defaultTimeoutMs = this.resolveDefaultTimeoutMs();\n\tprivate readonly defaultThreadOptions = this.resolveDefaultThreadOptions();\n\tprivate readonly pingEnabled = this.resolvePingEnabled();\n\tprivate readonly pingTimeoutMs = this.resolvePingTimeoutMs();\n\tprivate readonly config: CodexConfig;\n\n\tconstructor(config: CodexConfig) {\n\t\tthis.config = config;\n\t\tif (!this.config.apiKey) {\n\t\t\tthrow new Error('OPENAI_API_KEY is required for CodexClient');\n\t\t}\n\t}\n\n\tasync run(prompt: string, options?: CodexRunOptions): Promise<string> {\n\t\tconst maxRetries = this.normalizeRetryCount(this.config.maxRetries);\n\t\tconst retryDelayMs = this.normalizeRetryDelay(this.config.retryDelayMs);\n\t\tlet attempt = 0;\n\t\tlet lastError: unknown = null;\n\t\tif (this.pingEnabled && !this.isPingPrompt(prompt)) {\n\t\t\tawait this.runPing(options?.threadOptions);\n\t\t}\n\t\twhile (attempt <= maxRetries) {\n\t\t\ttry {\n\t\t\t\tthis.log(`run attempt ${attempt + 1}/${maxRetries + 1}`);\n\t\t\t\tif (this.streamEnabled && !this.isPingPrompt(prompt)) {\n\t\t\t\t\treturn await this.runStreamedOnce(prompt, options);\n\t\t\t\t}\n\t\t\t\treturn await this.runOnce(prompt, options);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tlastError = error;\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error || 'Unknown error');\n\t\t\t\tthis.log(`run attempt ${attempt + 1} failed: ${message}`);\n\t\t\t\tif (attempt >= maxRetries || !this.isRetryableError(error)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst delay = retryDelayMs * Math.pow(2, attempt);\n\t\t\t\tawait this.sleep(delay);\n\t\t\t\tattempt += 1;\n\t\t\t}\n\t\t}\n\t\tthrow lastError;\n\t}\n\n\tprivate async runStreamedOnce(prompt: string, options?: CodexRunOptions): Promise<string> {\n\t\tconst startedAt = Date.now();\n\t\tthis.log(`runStreamed start (promptLength=${prompt.length})`);\n\t\tconst thread = await this.startThread(options?.threadOptions, options?.threadKey, options?.reuseThread);\n\t\tconst timeoutMs = options?.timeoutMs ?? this.defaultTimeoutMs;\n\t\tconst controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n\t\tconst timeoutId = controller\n\t\t\t? setTimeout(() => controller.abort(), timeoutMs)\n\t\t\t: null;\n\t\tlet finalResponse = '';\n\t\tlet lastText = '';\n\t\ttry {\n\t\t\tconst { events } = await thread.runStreamed(prompt, controller ? { signal: controller.signal } : undefined);\n\t\t\tfor await (const event of events) {\n\t\t\t\tif (options?.onStreamEvent) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait options.onStreamEvent(event);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (error) {\n\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error || 'Unknown error');\n\t\t\t\t\t\tthis.log(`onStreamEvent failed: ${message}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.handleStreamEvent(event, async (text: string) => {\n\t\t\t\t\tconst next = text || '';\n\t\t\t\t\tif (!next) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst delta = next.startsWith(lastText) ? next.slice(lastText.length) : next;\n\t\t\t\t\tif (delta) {\n\t\t\t\t\t\tthis.logStreamText(delta);\n\t\t\t\t\t\tif (options?.onStreamText) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait options.onStreamText(delta, next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (error) {\n\t\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error || 'Unknown error');\n\t\t\t\t\t\t\t\tthis.log(`onStreamText failed: ${message}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlastText = next;\n\t\t\t\t\tfinalResponse = next;\n\t\t\t\t});\n\t\t\t\tif (event?.type === 'turn.failed') {\n\t\t\t\t\tthrow new Error(event.error?.message || 'Codex turn failed.');\n\t\t\t\t}\n\t\t\t\tif (event?.type === 'error') {\n\t\t\t\t\tthrow new Error(event.message || 'Codex stream error.');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (error) {\n\t\t\tif (controller?.signal?.aborted) {\n\t\t\t\tthis.log(`runStreamed timed out (durationMs=${Date.now() - startedAt})`);\n\t\t\t\tthrow new Error('Codex request timed out.');\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error || 'Unknown error');\n\t\t\tthis.log(`runStreamed failed (durationMs=${Date.now() - startedAt}): ${message}`);\n\t\t\tthrow error;\n\t\t}\n\t\tfinally {\n\t\t\tif (timeoutId) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t}\n\t\t}\n\t\tif (!finalResponse) {\n\t\t\tthrow new Error('Codex returned no completion content.');\n\t\t}\n\t\tthis.log(`runStreamed complete (contentLength=${finalResponse.length}, durationMs=${Date.now() - startedAt})`);\n\t\treturn finalResponse.trim();\n\t}\n\n\tprivate async runOnce(prompt: string, options?: CodexRunOptions): Promise<string> {\n\t\tconst startedAt = Date.now();\n\t\tthis.log(`runOnce start (promptLength=${prompt.length})`);\n\t\ttry {\n\t\t\tconst thread = await this.startThread(options?.threadOptions, options?.threadKey, options?.reuseThread);\n\t\t\tconst runPromise = thread.run(prompt);\n\t\t\tconst timeoutMs = options?.timeoutMs ?? this.defaultTimeoutMs;\n\t\t\tthis.log(`runOnce awaiting result (timeoutMs=${timeoutMs})`);\n\t\t\tconst result = await this.withTimeout(runPromise, timeoutMs);\n\t\t\tconst content = this.extractContent(result);\n\t\t\tif (!content) {\n\t\t\t\tthrow new Error('Codex returned no completion content.');\n\t\t\t}\n\t\t\tthis.log(`runOnce complete (contentLength=${content.length}, durationMs=${Date.now() - startedAt})`);\n\t\t\treturn content;\n\t\t}\n\t\tcatch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error || 'Unknown error');\n\t\t\tthis.log(`runOnce failed (durationMs=${Date.now() - startedAt}): ${message}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async startThread(threadOptions?: CodexThreadOptions, threadKey?: string, reuseThread = true): Promise<any> {\n\t\tawait this.ensureCodex();\n\t\tconst mergedOptions = this.mergeThreadOptions(threadOptions);\n\t\tconst cacheKey = this.buildThreadCacheKey(threadKey, mergedOptions);\n\t\tif (reuseThread && cacheKey) {\n\t\t\tconst existing = this.threadCache.get(cacheKey);\n\t\t\tif (existing && existing.optionsKey === this.buildThreadOptionsKey(mergedOptions)) {\n\t\t\t\tthis.log(`startThread reuse (${cacheKey})`);\n\t\t\t\treturn existing.thread;\n\t\t\t}\n\t\t}\n\t\tthis.log(`startThread (model=${this.config.model || 'default'})`);\n\t\tif (mergedOptions?.model) {\n\t\t\tthis.log(`startThread options: ${this.formatThreadOptions(mergedOptions)}`);\n\t\t\tconst thread = this.codex.startThread(mergedOptions);\n\t\t\tthis.log('startThread created with model override');\n\t\t\tif (cacheKey) {\n\t\t\t\tthis.threadCache.set(cacheKey, { thread, optionsKey: this.buildThreadOptionsKey(mergedOptions) });\n\t\t\t}\n\t\t\treturn thread;\n\t\t}\n\t\tif (mergedOptions && Object.keys(mergedOptions).length) {\n\t\t\tthis.log(`startThread options: ${this.formatThreadOptions(mergedOptions)}`);\n\t\t}\n\t\tconst thread = this.codex.startThread(mergedOptions);\n\t\tthis.log('startThread created');\n\t\tif (cacheKey) {\n\t\t\tthis.threadCache.set(cacheKey, { thread, optionsKey: this.buildThreadOptionsKey(mergedOptions) });\n\t\t}\n\t\treturn thread;\n\t}\n\n\tprivate extractContent(result: any): string {\n\t\tif (!result) {\n\t\t\treturn '';\n\t\t}\n\t\tif (typeof result.finalResponse === 'string') {\n\t\t\treturn result.finalResponse.trim();\n\t\t}\n\t\tif (typeof result === 'string') {\n\t\t\treturn result.trim();\n\t\t}\n\t\tif (Array.isArray(result.items)) {\n\t\t\tconst lastMessage = [...result.items].reverse().find((item: any) => item?.type === 'agent_message' && typeof item.text === 'string');\n\t\t\tif (lastMessage?.text) {\n\t\t\t\treturn lastMessage.text.trim();\n\t\t\t}\n\t\t}\n\t\tif (typeof result.output_text === 'string') {\n\t\t\treturn result.output_text.trim();\n\t\t}\n\t\tif (typeof result.outputText === 'string') {\n\t\t\treturn result.outputText.trim();\n\t\t}\n\t\tif (typeof result.content === 'string') {\n\t\t\treturn result.content.trim();\n\t\t}\n\t\tif (typeof result.text === 'string') {\n\t\t\treturn result.text.trim();\n\t\t}\n\t\tif (Array.isArray(result.content)) {\n\t\t\tconst text = result.content\n\t\t\t\t.map((part: any) => this.extractPartText(part))\n\t\t\t\t.join('')\n\t\t\t\t.trim();\n\t\t\tif (text) {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t}\n\t\tif (Array.isArray(result.output)) {\n\t\t\tconst text = result.output\n\t\t\t\t.map((item: any) => {\n\t\t\t\t\tif (!item) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof item === 'string') {\n\t\t\t\t\t\treturn item;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof item.text === 'string') {\n\t\t\t\t\t\treturn item.text;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof item.content === 'string') {\n\t\t\t\t\t\treturn item.content;\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(item.content)) {\n\t\t\t\t\t\treturn item.content.map((part: any) => this.extractPartText(part)).join('');\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.trim();\n\t\t\tif (text) {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t}\n\n\tprivate async handleStreamEvent(event: any, onAgentMessage: AgentMessageHandler): Promise<void> {\n\t\tif (!event || !event.type) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (event.type) {\n\t\t\tcase 'thread.started':\n\t\t\t\tthis.log(`stream thread.started (id=${event.thread_id || 'unknown'})`);\n\t\t\t\tbreak;\n\t\t\tcase 'turn.started':\n\t\t\t\tthis.log('stream turn.started');\n\t\t\t\tbreak;\n\t\t\tcase 'turn.completed':\n\t\t\t\tthis.log('stream turn.completed');\n\t\t\t\tbreak;\n\t\t\tcase 'item.started':\n\t\t\tcase 'item.updated':\n\t\t\tcase 'item.completed':\n\t\t\t\tawait this.handleStreamItem(event.item, onAgentMessage);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate async handleStreamItem(item: any, onAgentMessage: AgentMessageHandler): Promise<void> {\n\t\tif (!item || !item.type) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (item.type) {\n\t\t\tcase 'agent_message':\n\t\t\t\tawait onAgentMessage(item.text || '');\n\t\t\t\tbreak;\n\t\t\tcase 'command_execution':\n\t\t\t\tif (item.command) {\n\t\t\t\t\tthis.log(`stream command: ${item.command} (${item.status || 'unknown'})`);\n\t\t\t\t}\n\t\t\t\tif (item.aggregated_output) {\n\t\t\t\t\tconst output = item.aggregated_output.length > 800\n\t\t\t\t\t\t? `${item.aggregated_output.slice(0, 800)}...`\n\t\t\t\t\t\t: item.aggregated_output;\n\t\t\t\t\tthis.log(`stream command output: ${output}`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'file_change':\n\t\t\t\tif (Array.isArray(item.changes) && item.changes.length) {\n\t\t\t\t\tconst summary = item.changes.map((change: any) => `${change.kind}:${change.path}`).join(', ');\n\t\t\t\t\tthis.log(`stream file_change (${item.status || 'unknown'}): ${summary}`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'mcp_tool_call':\n\t\t\t\tif (item.tool) {\n\t\t\t\t\tthis.log(`stream tool_call: ${item.tool} (${item.status || 'unknown'})`);\n\t\t\t\t}\n\t\t\t\tif (item.error?.message) {\n\t\t\t\t\tthis.log(`stream tool_call error: ${item.error.message}`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'web_search':\n\t\t\t\tif (item.query) {\n\t\t\t\t\tthis.log(`stream web_search: ${item.query}`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'todo_list':\n\t\t\t\tif (Array.isArray(item.items)) {\n\t\t\t\t\tconst total = item.items.length;\n\t\t\t\t\tconst done = item.items.filter((entry: any) => entry?.completed).length;\n\t\t\t\t\tthis.log(`stream todo_list: ${done}/${total} completed`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'reasoning':\n\t\t\t\tif (item.text) {\n\t\t\t\t\tconst snippet = item.text.length > 200 ? `${item.text.slice(0, 200)}...` : item.text;\n\t\t\t\t\tthis.log(`stream reasoning: ${snippet}`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'error':\n\t\t\t\tif (item.message) {\n\t\t\t\t\tthis.log(`stream error: ${item.message}`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate logStreamText(text: string): void {\n\t\tif (!this.debugEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tconst lines = text.split(/\\r?\\n/);\n\t\tfor (const line of lines) {\n\t\t\tthis.log(`stream: ${line}`);\n\t\t}\n\t}\n\n\tprivate extractPartText(part: any): string {\n\t\tif (!part) {\n\t\t\treturn '';\n\t\t}\n\t\tif (typeof part === 'string') {\n\t\t\treturn part;\n\t\t}\n\t\tif (typeof part.text === 'string') {\n\t\t\treturn part.text;\n\t\t}\n\t\tif (typeof part.content === 'string') {\n\t\t\treturn part.content;\n\t\t}\n\t\treturn '';\n\t}\n\n\tprivate async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n\t\tlet done = false;\n\t\tconst startedAt = Date.now();\n\t\tconst heartbeatMs = Math.max(10000, Math.min(30000, Math.floor(timeoutMs / 4)));\n\t\tconst timeoutPromise = (async (): Promise<T> => {\n\t\t\twhile (!done) {\n\t\t\t\tconst elapsed = Date.now() - startedAt;\n\t\t\t\tif (elapsed >= timeoutMs) {\n\t\t\t\t\tthrow new Error('Codex request timed out.');\n\t\t\t\t}\n\t\t\t\tconst remaining = timeoutMs - elapsed;\n\t\t\t\tawait sleepTimeout(Math.min(heartbeatMs, remaining));\n\t\t\t\tif (done) {\n\t\t\t\t\treturn await promise;\n\t\t\t\t}\n\t\t\t\tconst currentElapsed = Date.now() - startedAt;\n\t\t\t\tif (currentElapsed >= timeoutMs) {\n\t\t\t\t\tthrow new Error('Codex request timed out.');\n\t\t\t\t}\n\t\t\t\tconst currentRemaining = Math.max(0, timeoutMs - currentElapsed);\n\t\t\t\tthis.log(`runOnce waiting (elapsedMs=${currentElapsed}, remainingMs=${currentRemaining})`);\n\t\t\t}\n\t\t\treturn await promise;\n\t\t})();\n\t\ttry {\n\t\t\treturn await Promise.race([promise, timeoutPromise]);\n\t\t}\n\t\tfinally {\n\t\t\tdone = true;\n\t\t}\n\t}\n\n\tprivate normalizeRetryCount(value?: number): number {\n\t\tif (typeof value !== 'number' || Number.isNaN(value)) {\n\t\t\treturn 2;\n\t\t}\n\t\treturn Math.max(0, Math.floor(value));\n\t}\n\n\tprivate normalizeRetryDelay(value?: number): number {\n\t\tif (typeof value !== 'number' || Number.isNaN(value)) {\n\t\t\treturn 500;\n\t\t}\n\t\treturn Math.max(100, Math.floor(value));\n\t}\n\n\tprivate isRetryableError(error: unknown): boolean {\n\t\tconst message = error instanceof Error ? error.message : String(error || '');\n\t\tif (/Codex returned no completion content/i.test(message)) {\n\t\t\treturn true;\n\t\t}\n\t\tconst statusMatch = message.match(/\\\\b(429|5\\\\d{2})\\\\b/);\n\t\tif (statusMatch) {\n\t\t\treturn true;\n\t\t}\n\t\treturn /ECONNRESET|ETIMEDOUT|EAI_AGAIN|ENOTFOUND|fetch failed|timed out|timeout/i.test(message);\n\t}\n\n\tprivate async sleep(ms: number): Promise<void> {\n\t\tawait sleepTimeout(ms);\n\t}\n\n\tprivate async ensureCodex(): Promise<void> {\n\t\tif (this.codex) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.codexInit !== null) {\n\t\t\tawait this.codexInit;\n\t\t\treturn;\n\t\t}\n\t\tthis.codexInit = (async () => {\n\t\t\tthis.log('Loading Codex SDK module...');\n\t\t\tconst importer = new Function('specifier', 'return import(specifier)') as DynamicImport;\n\t\t\tconst mod = await importer('@openai/codex-sdk');\n\t\t\tconst CodexCtor = mod?.Codex || mod?.default?.Codex || mod?.default || mod;\n\t\t\tif (!CodexCtor) {\n\t\t\t\tthrow new Error('Codex SDK export not found.');\n\t\t\t}\n\t\t\tthis.log('Codex SDK module loaded.');\n\t\t\tconst env = await this.buildCodexEnv();\n\t\t\tthis.codex = new CodexCtor({\n\t\t\t\tapiKey: this.config.apiKey,\n\t\t\t\tbaseUrl: this.config.baseUrl,\n\t\t\t\tmodel: this.config.model,\n\t\t\t\tenv\n\t\t\t});\n\t\t\tthis.log('Codex client initialized.');\n\t\t})();\n\t\tawait this.codexInit;\n\t}\n\n\tprivate log(message: string): void {\n\t\tif (!this.debugEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(`[AI-Dashboard][Codex] ${message}`);\n\t}\n\n\tprivate resolveDefaultTimeoutMs(): number {\n\t\tconst raw = Number(process.env.AI_DASHBOARD_CODEX_TIMEOUT_MS || process.env.AI_DASHBOARD_AGENT_TIMEOUT_MS);\n\t\tif (Number.isFinite(raw) && raw > 0) {\n\t\t\treturn Math.floor(raw);\n\t\t}\n\t\treturn 600000;\n\t}\n\n\tprivate resolveStreamEnabled(): boolean {\n\t\tconst raw = (process.env.AI_DASHBOARD_CODEX_STREAM || '').trim().toLowerCase();\n\t\tif (!raw) {\n\t\t\treturn this.debugEnabled;\n\t\t}\n\t\tif (['true', '1', 'yes', 'y', 'on'].includes(raw)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (['false', '0', 'no', 'n', 'off'].includes(raw)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.debugEnabled;\n\t}\n\n\tprivate resolveCleanZdotdirEnabled(): boolean {\n\t\tconst raw = (process.env.AI_DASHBOARD_CODEX_CLEAN_ZDOTDIR ?? '').trim().toLowerCase();\n\t\tif (!raw) {\n\t\t\treturn true;\n\t\t}\n\t\tif (['false', '0', 'no', 'n', 'off'].includes(raw)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (['true', '1', 'yes', 'y', 'on'].includes(raw)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate async buildCodexEnv(): Promise<Record<string, string>> {\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const [key, value] of Object.entries(process.env)) {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tenv[key] = value;\n\t\t\t}\n\t\t}\n\t\tif (this.cleanZdotdirEnabled) {\n\t\t\tenv.ZDOTDIR = await this.ensureZdotdir();\n\t\t}\n\t\treturn env;\n\t}\n\n\tprivate async ensureZdotdir(): Promise<string> {\n\t\tif (this.zDotDir) {\n\t\t\treturn this.zDotDir;\n\t\t}\n\t\tconst override = (process.env.AI_DASHBOARD_CODEX_ZDOTDIR || '').trim();\n\t\tconst dir = override || path.join(os.tmpdir(), 'codex-zdotdir');\n\t\tawait fs.mkdir(dir, { recursive: true });\n\t\tthis.zDotDir = dir;\n\t\treturn dir;\n\t}\n\n\tprivate resolvePingEnabled(): boolean {\n\t\treturn this.normalizeBoolean(process.env.AI_DASHBOARD_CODEX_PING, false);\n\t}\n\n\tprivate resolvePingTimeoutMs(): number {\n\t\tconst raw = Number(process.env.AI_DASHBOARD_CODEX_PING_TIMEOUT_MS);\n\t\tif (Number.isFinite(raw) && raw > 0) {\n\t\t\treturn Math.floor(raw);\n\t\t}\n\t\treturn 10000;\n\t}\n\n\tprivate resolveDefaultThreadOptions(): CodexThreadOptions {\n\t\tconst approvalPolicy = this.normalizeApprovalPolicy(process.env.AI_DASHBOARD_CODEX_APPROVAL_POLICY);\n\t\tconst sandboxMode = this.normalizeSandboxMode(process.env.AI_DASHBOARD_CODEX_SANDBOX_MODE, 'workspace-write');\n\t\tconst skipGitRepoCheck = this.normalizeBoolean(process.env.AI_DASHBOARD_CODEX_SKIP_GIT_CHECK, true);\n\t\tconst webSearchMode = this.normalizeWebSearchMode(process.env.AI_DASHBOARD_CODEX_WEB_SEARCH_MODE);\n\t\tconst webSearchEnabled = this.normalizeBoolean(process.env.AI_DASHBOARD_CODEX_WEB_SEARCH_ENABLED, false);\n\t\tconst networkAccessEnabled = this.normalizeBoolean(process.env.AI_DASHBOARD_CODEX_NETWORK_ACCESS_ENABLED, false);\n\t\tconst modelReasoningEffort = this.normalizeModelReasoningEffort(process.env.AI_DASHBOARD_CODEX_REASONING_EFFORT);\n\t\treturn {\n\t\t\tmodel: this.config.model,\n\t\t\tapprovalPolicy,\n\t\t\tsandboxMode,\n\t\t\tskipGitRepoCheck,\n\t\t\twebSearchMode,\n\t\t\twebSearchEnabled,\n\t\t\tnetworkAccessEnabled,\n\t\t\tmodelReasoningEffort\n\t\t};\n\t}\n\n\tprivate mergeThreadOptions(overrides?: CodexThreadOptions): CodexThreadOptions | undefined {\n\t\tconst merged: CodexThreadOptions = {\n\t\t\t...this.defaultThreadOptions,\n\t\t\t...(overrides || {})\n\t\t};\n\t\tconst cleaned = Object.entries(merged).reduce((acc, [key, value]) => {\n\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\treturn acc;\n\t\t\t}\n\t\t\t(acc as any)[key] = value;\n\t\t\treturn acc;\n\t\t}, {} as CodexThreadOptions);\n\t\treturn Object.keys(cleaned).length ? cleaned : undefined;\n\t}\n\n\tprivate normalizeApprovalPolicy(value?: string): CodexThreadOptions['approvalPolicy'] {\n\t\tconst normalized = (value || '').trim().toLowerCase();\n\t\tif (normalized === 'never' || normalized === 'on-request' || normalized === 'on-failure' || normalized === 'untrusted') {\n\t\t\treturn normalized as CodexThreadOptions['approvalPolicy'];\n\t\t}\n\t\treturn 'never';\n\t}\n\n\tprivate normalizeSandboxMode(value?: string, fallback: CodexThreadOptions['sandboxMode'] = 'read-only'): CodexThreadOptions['sandboxMode'] {\n\t\tconst normalized = (value || '').trim().toLowerCase();\n\t\tif (normalized === 'read-only' || normalized === 'workspace-write' || normalized === 'danger-full-access') {\n\t\t\treturn normalized as CodexThreadOptions['sandboxMode'];\n\t\t}\n\t\treturn fallback;\n\t}\n\n\tprivate normalizeWebSearchMode(value?: string): CodexThreadOptions['webSearchMode'] | undefined {\n\t\tconst normalized = (value || '').trim().toLowerCase();\n\t\tif (normalized === 'disabled' || normalized === 'cached' || normalized === 'live') {\n\t\t\treturn normalized as CodexThreadOptions['webSearchMode'];\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate normalizeModelReasoningEffort(value?: string): CodexThreadOptions['modelReasoningEffort'] | undefined {\n\t\tconst normalized = (value || '').trim().toLowerCase();\n\t\tif (normalized === 'minimal' || normalized === 'low' || normalized === 'medium' || normalized === 'high' || normalized === 'xhigh') {\n\t\t\treturn normalized as CodexThreadOptions['modelReasoningEffort'];\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate normalizeBoolean(value: string | undefined, fallback: boolean): boolean {\n\t\tif (!value) {\n\t\t\treturn fallback;\n\t\t}\n\t\tconst normalized = value.trim().toLowerCase();\n\t\tif (['true', '1', 'yes', 'y', 'on'].includes(normalized)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (['false', '0', 'no', 'n', 'off'].includes(normalized)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fallback;\n\t}\n\n\tprivate formatThreadOptions(options: CodexThreadOptions): string {\n\t\tconst summary: Record<string, string> = {};\n\t\tObject.entries(options).forEach(([key, value]) => {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsummary[key] = String(value);\n\t\t});\n\t\treturn JSON.stringify(summary);\n\t}\n\n\tprivate buildThreadOptionsKey(options?: CodexThreadOptions): string {\n\t\tif (!options) {\n\t\t\treturn '';\n\t\t}\n\t\tconst ordered: Record<string, string> = {};\n\t\tObject.keys(options)\n\t\t\t.sort()\n\t\t\t.forEach((key) => {\n\t\t\t\tconst value = (options as Record<string, unknown>)[key];\n\t\t\t\tif (value === undefined || value === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tordered[key] = Array.isArray(value) ? JSON.stringify(value) : String(value);\n\t\t\t});\n\t\treturn JSON.stringify(ordered);\n\t}\n\n\tprivate buildThreadCacheKey(threadKey: string | undefined, options?: CodexThreadOptions): string | null {\n\t\tif (threadKey) {\n\t\t\treturn `thread:${threadKey}`;\n\t\t}\n\t\tconst model = options?.model || this.config.model;\n\t\tconst workingDirectory = options?.workingDirectory;\n\t\tif (!model && !workingDirectory) {\n\t\t\treturn null;\n\t\t}\n\t\treturn `thread:auto:${model || 'default'}:${workingDirectory || 'root'}`;\n\t}\n\n\tprivate isPingPrompt(prompt: string): boolean {\n\t\treturn prompt.trim() === CodexClient.PING_PROMPT;\n\t}\n\n\tprivate async runPing(threadOptions?: CodexThreadOptions): Promise<void> {\n\t\tthis.log(`runPing start (timeoutMs=${this.pingTimeoutMs})`);\n\t\ttry {\n\t\t\tconst content = await this.runOnce(CodexClient.PING_PROMPT, {\n\t\t\t\ttimeoutMs: this.pingTimeoutMs,\n\t\t\t\tthreadOptions,\n\t\t\t\treuseThread: false\n\t\t\t});\n\t\t\tconst trimmed = content.trim();\n\t\t\tconst preview = trimmed.length > 80 ? `${trimmed.slice(0, 80)}…` : trimmed;\n\t\t\tthis.log(`runPing response: ${preview}`);\n\t\t}\n\t\tcatch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error || 'Unknown error');\n\t\t\tthis.log(`runPing failed: ${message}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type OpenAIResponseFormat = 'text' | 'json' | 'json_object' | {
|
|
2
|
+
type: string;
|
|
3
|
+
[key: string]: any;
|
|
4
|
+
};
|
|
5
|
+
export interface OpenAIConfig {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
fallbackModel?: string;
|
|
10
|
+
temperature?: number;
|
|
11
|
+
maxRetries?: number;
|
|
12
|
+
retryDelayMs?: number;
|
|
13
|
+
maxTokens?: number;
|
|
14
|
+
responseFormat?: OpenAIResponseFormat;
|
|
15
|
+
}
|
|
16
|
+
export interface OpenAIChatOptions {
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
responseFormat?: OpenAIResponseFormat;
|
|
19
|
+
}
|
|
20
|
+
export interface OpenAIUsageSummary {
|
|
21
|
+
inputTokens: number;
|
|
22
|
+
outputTokens: number;
|
|
23
|
+
totalTokens: number;
|
|
24
|
+
}
|
|
25
|
+
export interface OpenAIChatResult {
|
|
26
|
+
content: string;
|
|
27
|
+
usage?: OpenAIUsageSummary;
|
|
28
|
+
model?: string;
|
|
29
|
+
requestId?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class OpenAIClient {
|
|
32
|
+
private readonly config;
|
|
33
|
+
constructor(config: OpenAIConfig);
|
|
34
|
+
chat(messages: Array<{
|
|
35
|
+
role: 'system' | 'user' | 'assistant';
|
|
36
|
+
content: any;
|
|
37
|
+
}>, options?: OpenAIChatOptions): Promise<OpenAIChatResult>;
|
|
38
|
+
private extractContent;
|
|
39
|
+
private extractUsage;
|
|
40
|
+
private normalizeTokenValue;
|
|
41
|
+
private normalizeTokenCount;
|
|
42
|
+
private normalizeRetryCount;
|
|
43
|
+
private normalizeRetryDelay;
|
|
44
|
+
private isRetryableError;
|
|
45
|
+
private sleep;
|
|
46
|
+
}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.OpenAIClient = void 0;
|
|
51
|
+
var promises_1 = require("timers/promises");
|
|
52
|
+
var common_1 = require("../util/common");
|
|
53
|
+
var OpenAIClient = /** @class */ (function () {
|
|
54
|
+
function OpenAIClient(config) {
|
|
55
|
+
this.config = config;
|
|
56
|
+
if (!this.config.apiKey) {
|
|
57
|
+
throw new Error('OPENAI_API_KEY is required for OpenAIClient');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
OpenAIClient.prototype.chat = function (messages, options) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
62
|
+
var baseUrl, primaryModel, fallbackModel, maxRetries, retryDelayMs, payload, responseFormat, normalized, runRequest, runWithRetry, result, error_1, result;
|
|
63
|
+
var _this = this;
|
|
64
|
+
var _a, _b;
|
|
65
|
+
return __generator(this, function (_c) {
|
|
66
|
+
switch (_c.label) {
|
|
67
|
+
case 0:
|
|
68
|
+
baseUrl = (this.config.baseUrl || 'https://api.openai.com/v1').replace(/\/+$/, '');
|
|
69
|
+
primaryModel = this.config.model || 'gpt-5.1';
|
|
70
|
+
fallbackModel = (this.config.fallbackModel || '').trim();
|
|
71
|
+
maxRetries = this.normalizeRetryCount(this.config.maxRetries);
|
|
72
|
+
retryDelayMs = this.normalizeRetryDelay(this.config.retryDelayMs);
|
|
73
|
+
payload = {
|
|
74
|
+
model: primaryModel,
|
|
75
|
+
messages: messages,
|
|
76
|
+
temperature: (_a = this.config.temperature) !== null && _a !== void 0 ? _a : 0.2
|
|
77
|
+
};
|
|
78
|
+
responseFormat = (_b = options === null || options === void 0 ? void 0 : options.responseFormat) !== null && _b !== void 0 ? _b : this.config.responseFormat;
|
|
79
|
+
if (responseFormat) {
|
|
80
|
+
normalized = typeof responseFormat === 'string' ? responseFormat.toLowerCase() : '';
|
|
81
|
+
if (normalized === 'json' || normalized === 'json_object') {
|
|
82
|
+
payload.response_format = { type: 'json_object' };
|
|
83
|
+
}
|
|
84
|
+
else if (typeof responseFormat === 'object') {
|
|
85
|
+
payload.response_format = responseFormat;
|
|
86
|
+
}
|
|
87
|
+
else if (normalized && normalized !== 'text') {
|
|
88
|
+
payload.response_format = { type: normalized };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (Number.isFinite(this.config.maxTokens)) {
|
|
92
|
+
payload.max_completion_tokens = this.normalizeTokenCount(this.config.maxTokens);
|
|
93
|
+
}
|
|
94
|
+
runRequest = function (model) { return __awaiter(_this, void 0, void 0, function () {
|
|
95
|
+
var timeoutMs, controller, timeoutId, response, requestId, error_2, responseText, data, message, content, refusal, usage;
|
|
96
|
+
var _a, _b, _c;
|
|
97
|
+
return __generator(this, function (_d) {
|
|
98
|
+
switch (_d.label) {
|
|
99
|
+
case 0:
|
|
100
|
+
timeoutMs = options === null || options === void 0 ? void 0 : options.timeoutMs;
|
|
101
|
+
controller = timeoutMs ? new AbortController() : null;
|
|
102
|
+
timeoutId = controller ? setTimeout(function () { return controller.abort(); }, timeoutMs) : null;
|
|
103
|
+
requestId = '';
|
|
104
|
+
_d.label = 1;
|
|
105
|
+
case 1:
|
|
106
|
+
_d.trys.push([1, 3, 4, 5]);
|
|
107
|
+
return [4 /*yield*/, fetch("".concat(baseUrl, "/chat/completions"), {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: {
|
|
110
|
+
'Content-Type': 'application/json',
|
|
111
|
+
Authorization: "Bearer ".concat(this.config.apiKey)
|
|
112
|
+
},
|
|
113
|
+
body: JSON.stringify(__assign(__assign({}, payload), { model: model })),
|
|
114
|
+
signal: controller === null || controller === void 0 ? void 0 : controller.signal
|
|
115
|
+
})];
|
|
116
|
+
case 2:
|
|
117
|
+
response = _d.sent();
|
|
118
|
+
requestId = response.headers.get('x-request-id') || '';
|
|
119
|
+
return [3 /*break*/, 5];
|
|
120
|
+
case 3:
|
|
121
|
+
error_2 = _d.sent();
|
|
122
|
+
if ((_a = controller === null || controller === void 0 ? void 0 : controller.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
|
|
123
|
+
throw new Error('OpenAI request timed out.');
|
|
124
|
+
}
|
|
125
|
+
throw error_2;
|
|
126
|
+
case 4:
|
|
127
|
+
if (timeoutId) {
|
|
128
|
+
clearTimeout(timeoutId);
|
|
129
|
+
}
|
|
130
|
+
return [7 /*endfinally*/];
|
|
131
|
+
case 5: return [4 /*yield*/, response.text()];
|
|
132
|
+
case 6:
|
|
133
|
+
responseText = _d.sent();
|
|
134
|
+
if (!response.ok) {
|
|
135
|
+
throw new Error("OpenAI request failed (".concat(response.status, "): ").concat(responseText));
|
|
136
|
+
}
|
|
137
|
+
data = responseText ? JSON.parse(responseText) : {};
|
|
138
|
+
message = ((_c = (_b = data === null || data === void 0 ? void 0 : data.choices) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.message) || {};
|
|
139
|
+
content = this.extractContent(message);
|
|
140
|
+
if (!content) {
|
|
141
|
+
refusal = (message === null || message === void 0 ? void 0 : message.refusal) ? " Refusal: ".concat(message.refusal) : '';
|
|
142
|
+
throw new Error("OpenAI returned no completion content.".concat(refusal));
|
|
143
|
+
}
|
|
144
|
+
usage = this.extractUsage(data === null || data === void 0 ? void 0 : data.usage);
|
|
145
|
+
return [2 /*return*/, {
|
|
146
|
+
content: content,
|
|
147
|
+
usage: usage,
|
|
148
|
+
model: (data === null || data === void 0 ? void 0 : data.model) || model,
|
|
149
|
+
requestId: (data === null || data === void 0 ? void 0 : data.id) || requestId,
|
|
150
|
+
responseText: responseText
|
|
151
|
+
}];
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}); };
|
|
155
|
+
runWithRetry = function (model) { return __awaiter(_this, void 0, void 0, function () {
|
|
156
|
+
var attempt, lastError, error_3, delay;
|
|
157
|
+
return __generator(this, function (_a) {
|
|
158
|
+
switch (_a.label) {
|
|
159
|
+
case 0:
|
|
160
|
+
attempt = 0;
|
|
161
|
+
lastError = null;
|
|
162
|
+
_a.label = 1;
|
|
163
|
+
case 1:
|
|
164
|
+
if (!(attempt <= maxRetries)) return [3 /*break*/, 7];
|
|
165
|
+
_a.label = 2;
|
|
166
|
+
case 2:
|
|
167
|
+
_a.trys.push([2, 4, , 6]);
|
|
168
|
+
return [4 /*yield*/, runRequest(model)];
|
|
169
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
170
|
+
case 4:
|
|
171
|
+
error_3 = _a.sent();
|
|
172
|
+
lastError = error_3;
|
|
173
|
+
if (attempt >= maxRetries || !this.isRetryableError(error_3)) {
|
|
174
|
+
return [3 /*break*/, 7];
|
|
175
|
+
}
|
|
176
|
+
delay = retryDelayMs * Math.pow(2, attempt);
|
|
177
|
+
return [4 /*yield*/, this.sleep(delay)];
|
|
178
|
+
case 5:
|
|
179
|
+
_a.sent();
|
|
180
|
+
attempt += 1;
|
|
181
|
+
return [3 /*break*/, 6];
|
|
182
|
+
case 6: return [3 /*break*/, 1];
|
|
183
|
+
case 7: throw lastError;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}); };
|
|
187
|
+
_c.label = 1;
|
|
188
|
+
case 1:
|
|
189
|
+
_c.trys.push([1, 3, , 5]);
|
|
190
|
+
return [4 /*yield*/, runWithRetry(primaryModel)];
|
|
191
|
+
case 2:
|
|
192
|
+
result = _c.sent();
|
|
193
|
+
return [2 /*return*/, {
|
|
194
|
+
content: result.content,
|
|
195
|
+
usage: result.usage,
|
|
196
|
+
model: result.model,
|
|
197
|
+
requestId: result.requestId
|
|
198
|
+
}];
|
|
199
|
+
case 3:
|
|
200
|
+
error_1 = _c.sent();
|
|
201
|
+
if (!fallbackModel || fallbackModel === primaryModel) {
|
|
202
|
+
throw error_1;
|
|
203
|
+
}
|
|
204
|
+
return [4 /*yield*/, runWithRetry(fallbackModel)];
|
|
205
|
+
case 4:
|
|
206
|
+
result = _c.sent();
|
|
207
|
+
return [2 /*return*/, {
|
|
208
|
+
content: result.content,
|
|
209
|
+
usage: result.usage,
|
|
210
|
+
model: result.model,
|
|
211
|
+
requestId: result.requestId
|
|
212
|
+
}];
|
|
213
|
+
case 5: return [2 /*return*/];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
OpenAIClient.prototype.extractContent = function (message) {
|
|
219
|
+
if (!message) {
|
|
220
|
+
return '';
|
|
221
|
+
}
|
|
222
|
+
var content = message.content;
|
|
223
|
+
if (typeof content === 'string') {
|
|
224
|
+
return content.trim();
|
|
225
|
+
}
|
|
226
|
+
if (Array.isArray(content)) {
|
|
227
|
+
return content
|
|
228
|
+
.map(function (part) {
|
|
229
|
+
if (!part) {
|
|
230
|
+
return '';
|
|
231
|
+
}
|
|
232
|
+
if (typeof part === 'string') {
|
|
233
|
+
return part;
|
|
234
|
+
}
|
|
235
|
+
if (typeof (part === null || part === void 0 ? void 0 : part.text) === 'string') {
|
|
236
|
+
return part.text;
|
|
237
|
+
}
|
|
238
|
+
if (typeof (part === null || part === void 0 ? void 0 : part.content) === 'string') {
|
|
239
|
+
return part.content;
|
|
240
|
+
}
|
|
241
|
+
return '';
|
|
242
|
+
})
|
|
243
|
+
.join('')
|
|
244
|
+
.trim();
|
|
245
|
+
}
|
|
246
|
+
return '';
|
|
247
|
+
};
|
|
248
|
+
OpenAIClient.prototype.extractUsage = function (usage) {
|
|
249
|
+
var _a, _b, _c;
|
|
250
|
+
if (!usage) {
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
var inputTokens = this.normalizeTokenValue((_a = usage.prompt_tokens) !== null && _a !== void 0 ? _a : usage.input_tokens);
|
|
254
|
+
var outputTokens = this.normalizeTokenValue((_b = usage.completion_tokens) !== null && _b !== void 0 ? _b : usage.output_tokens);
|
|
255
|
+
var totalTokens = this.normalizeTokenValue((_c = usage.total_tokens) !== null && _c !== void 0 ? _c : (inputTokens + outputTokens));
|
|
256
|
+
if (!totalTokens && !inputTokens && !outputTokens) {
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
inputTokens: inputTokens,
|
|
261
|
+
outputTokens: outputTokens,
|
|
262
|
+
totalTokens: totalTokens
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
OpenAIClient.prototype.normalizeTokenValue = function (value) {
|
|
266
|
+
var parsed = Number(value);
|
|
267
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
268
|
+
return 0;
|
|
269
|
+
}
|
|
270
|
+
return (0, common_1.round)(parsed);
|
|
271
|
+
};
|
|
272
|
+
OpenAIClient.prototype.normalizeTokenCount = function (value) {
|
|
273
|
+
if (!Number.isFinite(value)) {
|
|
274
|
+
return 0;
|
|
275
|
+
}
|
|
276
|
+
var rounded = (0, common_1.round)(value || 0);
|
|
277
|
+
return rounded < 0 ? 0 : rounded;
|
|
278
|
+
};
|
|
279
|
+
OpenAIClient.prototype.normalizeRetryCount = function (value) {
|
|
280
|
+
if (!Number.isFinite(value)) {
|
|
281
|
+
return 0;
|
|
282
|
+
}
|
|
283
|
+
return Math.max(0, (0, common_1.round)(value || 0));
|
|
284
|
+
};
|
|
285
|
+
OpenAIClient.prototype.normalizeRetryDelay = function (value) {
|
|
286
|
+
if (!Number.isFinite(value)) {
|
|
287
|
+
return 750;
|
|
288
|
+
}
|
|
289
|
+
return Math.max(250, (0, common_1.round)(value || 0));
|
|
290
|
+
};
|
|
291
|
+
OpenAIClient.prototype.isRetryableError = function (error) {
|
|
292
|
+
var message = error instanceof Error ? error.message.toLowerCase() : String(error || '').toLowerCase();
|
|
293
|
+
return message.includes('timeout') || message.includes('429') || message.includes('rate limit');
|
|
294
|
+
};
|
|
295
|
+
OpenAIClient.prototype.sleep = function (ms) {
|
|
296
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
297
|
+
return __generator(this, function (_a) {
|
|
298
|
+
switch (_a.label) {
|
|
299
|
+
case 0:
|
|
300
|
+
if (!ms) {
|
|
301
|
+
return [2 /*return*/];
|
|
302
|
+
}
|
|
303
|
+
return [4 /*yield*/, (0, promises_1.setTimeout)(ms)];
|
|
304
|
+
case 1:
|
|
305
|
+
_a.sent();
|
|
306
|
+
return [2 /*return*/];
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
return OpenAIClient;
|
|
312
|
+
}());
|
|
313
|
+
exports.OpenAIClient = OpenAIClient;
|
|
314
|
+
|
|
315
|
+
//# sourceMappingURL=openai-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/openai-client.ts"],"names":[],"mappings":"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","file":"openai-client.js","sourcesContent":["import { setTimeout as sleepTimeout } from 'timers/promises';\nimport { round } from '../util/common';\n\nexport type OpenAIResponseFormat = 'text' | 'json' | 'json_object' | { type: string; [key: string]: any };\n\nexport interface OpenAIConfig {\n\tapiKey: string;\n\tbaseUrl?: string;\n\tmodel?: string;\n\tfallbackModel?: string;\n\ttemperature?: number;\n\tmaxRetries?: number;\n\tretryDelayMs?: number;\n\tmaxTokens?: number;\n\tresponseFormat?: OpenAIResponseFormat;\n}\n\nexport interface OpenAIChatOptions {\n\ttimeoutMs?: number;\n\tresponseFormat?: OpenAIResponseFormat;\n}\n\nexport interface OpenAIUsageSummary {\n\tinputTokens: number;\n\toutputTokens: number;\n\ttotalTokens: number;\n}\n\nexport interface OpenAIChatResult {\n\tcontent: string;\n\tusage?: OpenAIUsageSummary;\n\tmodel?: string;\n\trequestId?: string;\n}\n\nexport class OpenAIClient {\n\tprivate readonly config: OpenAIConfig;\n\n\tconstructor(config: OpenAIConfig) {\n\t\tthis.config = config;\n\t\tif (!this.config.apiKey) {\n\t\t\tthrow new Error('OPENAI_API_KEY is required for OpenAIClient');\n\t\t}\n\t}\n\n\tasync chat(\n\t\tmessages: Array<{role: 'system' | 'user' | 'assistant'; content: any}>,\n\t\toptions?: OpenAIChatOptions\n\t): Promise<OpenAIChatResult> {\n\t\tconst baseUrl = (this.config.baseUrl || 'https://api.openai.com/v1').replace(/\\/+$/, '');\n\t\tconst primaryModel = this.config.model || 'gpt-5.1';\n\t\tconst fallbackModel = (this.config.fallbackModel || '').trim();\n\t\tconst maxRetries = this.normalizeRetryCount(this.config.maxRetries);\n\t\tconst retryDelayMs = this.normalizeRetryDelay(this.config.retryDelayMs);\n\t\tconst payload: any = {\n\t\t\tmodel: primaryModel,\n\t\t\tmessages,\n\t\t\ttemperature: this.config.temperature ?? 0.2\n\t\t};\n\t\tconst responseFormat = options?.responseFormat ?? this.config.responseFormat;\n\t\tif (responseFormat) {\n\t\t\tconst normalized = typeof responseFormat === 'string' ? responseFormat.toLowerCase() : '';\n\t\t\tif (normalized === 'json' || normalized === 'json_object') {\n\t\t\t\tpayload.response_format = { type: 'json_object' };\n\t\t\t}\n\t\t\telse if (typeof responseFormat === 'object') {\n\t\t\t\tpayload.response_format = responseFormat;\n\t\t\t}\n\t\t\telse if (normalized && normalized !== 'text') {\n\t\t\t\tpayload.response_format = { type: normalized };\n\t\t\t}\n\t\t}\n\t\tif (Number.isFinite(this.config.maxTokens)) {\n\t\t\tpayload.max_completion_tokens = this.normalizeTokenCount(this.config.maxTokens);\n\t\t}\n\n\t\tconst runRequest = async (model: string): Promise<OpenAIChatResult & { responseText: string }> => {\n\t\t\tconst timeoutMs = options?.timeoutMs;\n\t\t\tconst controller = timeoutMs ? new AbortController() : null;\n\t\t\tconst timeoutId = controller ? setTimeout(() => controller.abort(), timeoutMs) : null;\n\t\t\tlet response: Response;\n\t\t\tlet requestId = '';\n\t\t\ttry {\n\t\t\t\tresponse = await fetch(`${baseUrl}/chat/completions`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.config.apiKey}`\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ ...payload, model }),\n\t\t\t\t\tsignal: controller?.signal\n\t\t\t\t});\n\t\t\t\trequestId = response.headers.get('x-request-id') || '';\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tif (controller?.signal?.aborted) {\n\t\t\t\t\tthrow new Error('OpenAI request timed out.');\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tif (timeoutId) {\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst responseText = await response.text();\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`OpenAI request failed (${response.status}): ${responseText}`);\n\t\t\t}\n\n\t\t\tconst data = responseText ? JSON.parse(responseText) : {};\n\t\t\tconst message = data?.choices?.[0]?.message || {};\n\t\t\tconst content = this.extractContent(message);\n\t\t\tif (!content) {\n\t\t\t\tconst refusal = message?.refusal ? ` Refusal: ${message.refusal}` : '';\n\t\t\t\tthrow new Error(`OpenAI returned no completion content.${refusal}`);\n\t\t\t}\n\n\t\t\tconst usage = this.extractUsage(data?.usage);\n\t\t\treturn {\n\t\t\t\tcontent,\n\t\t\t\tusage,\n\t\t\t\tmodel: data?.model || model,\n\t\t\t\trequestId: data?.id || requestId,\n\t\t\t\tresponseText\n\t\t\t};\n\t\t};\n\n\t\tconst runWithRetry = async (model: string): Promise<OpenAIChatResult & { responseText: string }> => {\n\t\t\tlet attempt = 0;\n\t\t\tlet lastError: unknown = null;\n\t\t\twhile (attempt <= maxRetries) {\n\t\t\t\ttry {\n\t\t\t\t\treturn await runRequest(model);\n\t\t\t\t}\n\t\t\t\tcatch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tif (attempt >= maxRetries || !this.isRetryableError(error)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst delay = retryDelayMs * Math.pow(2, attempt);\n\t\t\t\t\tawait this.sleep(delay);\n\t\t\t\t\tattempt += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t};\n\n\t\ttry {\n\t\t\tconst result = await runWithRetry(primaryModel);\n\t\t\treturn {\n\t\t\t\tcontent: result.content,\n\t\t\t\tusage: result.usage,\n\t\t\t\tmodel: result.model,\n\t\t\t\trequestId: result.requestId\n\t\t\t};\n\t\t}\n\t\tcatch (error) {\n\t\t\tif (!fallbackModel || fallbackModel === primaryModel) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst result = await runWithRetry(fallbackModel);\n\t\t\treturn {\n\t\t\t\tcontent: result.content,\n\t\t\t\tusage: result.usage,\n\t\t\t\tmodel: result.model,\n\t\t\t\trequestId: result.requestId\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate extractContent(message: any): string {\n\t\tif (!message) {\n\t\t\treturn '';\n\t\t}\n\t\tconst content = message.content;\n\t\tif (typeof content === 'string') {\n\t\t\treturn content.trim();\n\t\t}\n\t\tif (Array.isArray(content)) {\n\t\t\treturn content\n\t\t\t\t.map((part) => {\n\t\t\t\t\tif (!part) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof part === 'string') {\n\t\t\t\t\t\treturn part;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof part?.text === 'string') {\n\t\t\t\t\t\treturn part.text;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof part?.content === 'string') {\n\t\t\t\t\t\treturn part.content;\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.trim();\n\t\t}\n\t\treturn '';\n\t}\n\n\tprivate extractUsage(usage: any): OpenAIUsageSummary | undefined {\n\t\tif (!usage) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst inputTokens = this.normalizeTokenValue(usage.prompt_tokens ?? usage.input_tokens);\n\t\tconst outputTokens = this.normalizeTokenValue(usage.completion_tokens ?? usage.output_tokens);\n\t\tconst totalTokens = this.normalizeTokenValue(usage.total_tokens ?? (inputTokens + outputTokens));\n\t\tif (!totalTokens && !inputTokens && !outputTokens) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tinputTokens,\n\t\t\toutputTokens,\n\t\t\ttotalTokens\n\t\t};\n\t}\n\n\tprivate normalizeTokenValue(value: any): number {\n\t\tconst parsed = Number(value);\n\t\tif (!Number.isFinite(parsed) || parsed < 0) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn round(parsed);\n\t}\n\n\tprivate normalizeTokenCount(value?: number): number {\n\t\tif (!Number.isFinite(value)) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst rounded = round(value || 0);\n\t\treturn rounded < 0 ? 0 : rounded;\n\t}\n\n\tprivate normalizeRetryCount(value?: number): number {\n\t\tif (!Number.isFinite(value)) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn Math.max(0, round(value || 0));\n\t}\n\n\tprivate normalizeRetryDelay(value?: number): number {\n\t\tif (!Number.isFinite(value)) {\n\t\t\treturn 750;\n\t\t}\n\t\treturn Math.max(250, round(value || 0));\n\t}\n\n\tprivate isRetryableError(error: any): boolean {\n\t\tconst message = error instanceof Error ? error.message.toLowerCase() : String(error || '').toLowerCase();\n\t\treturn message.includes('timeout') || message.includes('429') || message.includes('rate limit');\n\t}\n\n\tprivate async sleep(ms: number): Promise<void> {\n\t\tif (!ms) {\n\t\t\treturn;\n\t\t}\n\t\tawait sleepTimeout(ms);\n\t}\n}\n"]}
|