indusagi-coding-agent 0.1.14 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/dist/cli/args.d.ts +1 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +19 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/login-handler.d.ts +20 -0
  7. package/dist/cli/login-handler.d.ts.map +1 -0
  8. package/dist/cli/login-handler.js +413 -0
  9. package/dist/cli/login-handler.js.map +1 -0
  10. package/dist/core/auth-storage.d.ts +56 -19
  11. package/dist/core/auth-storage.d.ts.map +1 -1
  12. package/dist/core/auth-storage.js +207 -53
  13. package/dist/core/auth-storage.js.map +1 -1
  14. package/dist/core/model-registry.d.ts +17 -2
  15. package/dist/core/model-registry.d.ts.map +1 -1
  16. package/dist/core/model-registry.js +20 -4
  17. package/dist/core/model-registry.js.map +1 -1
  18. package/dist/core/model-resolver.js +2 -2
  19. package/dist/core/model-resolver.js.map +1 -1
  20. package/dist/core/sdk.d.ts.map +1 -1
  21. package/dist/core/sdk.js +10 -1
  22. package/dist/core/sdk.js.map +1 -1
  23. package/dist/core/task-session-manager.d.ts.map +1 -1
  24. package/dist/core/task-session-manager.js +7 -1
  25. package/dist/core/task-session-manager.js.map +1 -1
  26. package/dist/main.d.ts.map +1 -1
  27. package/dist/main.js +9 -1
  28. package/dist/main.js.map +1 -1
  29. package/dist/modes/interactive/components/oauth-selector.d.ts +28 -0
  30. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  31. package/dist/modes/interactive/components/oauth-selector.js +161 -27
  32. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  33. package/dist/modes/interactive/interactive-mode.d.ts +20 -0
  34. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  35. package/dist/modes/interactive/interactive-mode.js +265 -1
  36. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  37. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-handler.js","sourceRoot":"","sources":["../../src/cli/login-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAS3C,SAAS,iBAAiB,CAAC,IAAc;IACxC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;QACpB,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAc;IACtD,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE9C,qBAAqB;IACrB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,gBAAgB;IAChB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,6BAA6B;IAC7B,MAAM,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,WAAwB;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAErC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC,CAAC;QAC3G,OAAO;IACR,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAExG,KAAK,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,QAAQ,EAAE,CAAC;YAClD,MAAM,SAAS,GAAG,SAAS,KAAK,cAAc,CAAC;YAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,IAAI,SAAS,CAAC;YAEjD,IAAI,MAAM,GAAG,GAAG,CAAC;YACjB,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC;gBACjD,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,IAAI,GAAG,aAAa,KAAK,IAAI,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACf,CAAC;AACF,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,WAAwB;IAC5D,sBAAsB;IACtB,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,OAAgB;KACtB,CAAC,CAAC,CAAC;IAEJ,oBAAoB;IACpB,MAAM,eAAe,GAAG;QACvB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAkB,EAAE;QACpE,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5F,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAkB,EAAE;QACzE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC1D,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAkB,EAAE;QACnE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAkB,EAAE;QACtD,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC9D,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC3D,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAkB,EAAE;QAClE,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAkB,EAAE;QAChF,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC3D,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5D,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5D,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAkB,EAAE;QACvE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAkB,EAAE;KAClE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAEzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC3C,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC/C,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClC,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,cAAc,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;IAC1G,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;IAE5F,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;IAC1I,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAClI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;IAChI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;IAC9H,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;AACtI,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,WAAwB,EAAE,QAAgB,EAAE,SAAkB;IAC5F,qCAAqC;IACrC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAElE,wCAAwC;IACxC,MAAM,eAAe,GAAG,SAAS,IAAI,SAAS,CAAC;IAC/C,MAAM,gBAAgB,GAAG,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3D,2FAA2F;IAC3F,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,QAAQ,iBAAiB,gBAAgB,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAC;QACnH,KAAK,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,gBAAgB,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,IAAI,SAAS,CAAC;YACjD,MAAM,SAAS,GAAG,SAAS,KAAK,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAChC,4BAA4B,EAC5B,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAC3C,CAAC;QAEF,IAAI,MAAM,KAAK,sBAAsB,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAClC,iBAAiB,EACjB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,CAClE,CAAC;YACF,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC;YAC3G,IAAI,eAAe,EAAE,CAAC;gBACrB,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,QAAQ,IAAI,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,OAAO;QACR,CAAC;QAED,kDAAkD;QAClD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,mDAAmD,CAAC,CAAC;QACvF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,+BAA+B;QAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5G,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,OAAO,wBAAwB,QAAQ,IAAI,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpG,qBAAqB;IACrB,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;QAEpF,IAAI,CAAC;YACJ,MAAM,WAAW,CAAC,KAAK,CAAC,QAAe,EAAE;gBACxC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC/C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;oBAC3C,CAAC;gBACF,CAAC;gBACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC1B,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACpC,CAAC;gBACD,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;oBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,CAAC;aACD,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;YAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,SAAS,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,QAAQ,cAAc,SAAS,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC;QAChH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,OAAO;IACR,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEtC,oBAAoB;IACpB,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,CAAC,IAAI,CAClB,YAAY,YAAY,CAAC,IAAI,iBAAiB,YAAY,CAAC,OAAO,EAAE,EACpE,YAAY,CAAC,IAAI,CACjB,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,MAAM,YAAY,CACrC,gBAAgB,YAAY,CAAC,MAAM,sBAAsB,EACzD,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAC9B,CAAC;QACF,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;YAC3B,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE;gBAC1C,IAAI,EAAE,SAAS;gBACf,GAAG,EAAE,MAAM;gBACX,SAAS,EAAE,eAAe;gBAC1B,WAAW,EAAE,SAAS,IAAI,SAAS;aACnC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,SAAS,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,YAAY,CAAC,MAAM,mBAAmB,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,QAAQ,cAAc,SAAS,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC;YAC/G,OAAO;QACR,CAAC;IACF,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,YAAY,CAAC,IAAI,UAAU,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE;QAC1C,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,eAAe;QAC1B,WAAW,EAAE,SAAS,IAAI,SAAS;KACnC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,SAAS,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,QAAQ,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,QAAQ,cAAc,SAAS,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,WAAwB,EACxB,QAAgB,EAChB,SAAkB,EAClB,GAAa;IAEb,IAAI,GAAG,EAAE,CAAC;QACT,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,QAAQ,IAAI,CAAC,CAAC,CAAC;QAChF,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,QAAQ,IAAI,CAAC,CAAC,CAAC;QACxE,OAAO;IACR,CAAC;IAED,+BAA+B;IAC/B,IAAI,SAAS,EAAE,CAAC;QACf,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;QAC5E,OAAO;IACR,CAAC;IAED,sCAAsC;IACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAClC,2BAA2B,EAC3B,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAC/E,CAAC;QAEF,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;YACjC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,QAAQ,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACP,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC;YACnG,IAAI,eAAe,EAAE,CAAC;gBACrB,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC5E,CAAC;QACF,CAAC;QACD,OAAO;IACR,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAC,WAAW,IAAI,aAAa,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;AACnI,CAAC;AAQD,SAAS,eAAe,CAAC,QAAgB;IACxC,MAAM,SAAS,GAAiC;QAC/C,IAAI,EAAE;YACL,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,0BAA0B;SACnC;QACD,aAAa,EAAE;YACd,IAAI,EAAE,qCAAqC;YAC3C,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,8BAA8B;SACvC;QACD,QAAQ,EAAE;YACT,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,0BAA0B;SACnC;QACD,SAAS,EAAE;YACV,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,gCAAgC;SACzC;QACD,MAAM,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,sCAAsC;SAC/C;QACD,MAAM,EAAE;YACP,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,wCAAwC;SACjD;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,+BAA+B;SACxC;QACD,QAAQ,EAAE;YACT,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,4BAA4B;SACrC;QACD,GAAG,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,kBAAkB;SAC3B;QACD,UAAU,EAAE;YACX,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,4BAA4B;SACrC;QACD,mBAAmB,EAAE;YACpB,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,oCAAoC;SAC7C;QACD,GAAG,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,mBAAmB;SAC5B;QACD,OAAO,EAAE;YACR,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,6BAA6B;SACtC;QACD,OAAO,EAAE;YACR,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,2BAA2B;SACpC;QACD,YAAY,EAAE;YACb,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,2BAA2B;SACpC;QACD,QAAQ,EAAE;YACT,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,sBAAsB;SAC/B;KACD,CAAC;IAEF,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,QAAQ,GAAG;IAChB,IAAI,CAAC,OAAe,EAAE,KAAa;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;CACD,CAAC;AAEF,SAAS,YAAY,CAAC,QAAgB,EAAE,OAAiB;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,eAAe,CAAC;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;YACzE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,eAAe,CAAC;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;YACvD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -2,37 +2,58 @@
2
2
  * Credential storage for API keys and OAuth tokens.
3
3
  * Handles loading, saving, and refreshing credentials from auth.json.
4
4
  *
5
+ * MULTI-ACCOUNT SUPPORT: Each provider can have multiple named accounts.
6
+ *
5
7
  * Uses file locking to prevent race conditions when multiple indusagi instances
6
8
  * try to refresh tokens simultaneously.
7
9
  */
8
- import { type OAuthCredentials, type OAuthLoginCallbacks, type OAuthProviderId } from "indusagi/ai";
10
+ import { type OAuthCredentials, type OAuthLoginCallbacks, type OAuthProviderId, type OAuthProviderInterface } from "indusagi/ai";
9
11
  export type ApiKeyCredential = {
10
12
  type: "api_key";
11
13
  key: string;
14
+ accountId?: string;
15
+ accountName?: string;
12
16
  };
13
17
  export type OAuthCredential = {
14
18
  type: "oauth";
19
+ accountId?: string;
20
+ accountName?: string;
15
21
  } & OAuthCredentials;
16
22
  export type AuthCredential = ApiKeyCredential | OAuthCredential;
17
- export type AuthStorageData = Record<string, AuthCredential>;
23
+ export type AuthStorageData = Record<string, Record<string, AuthCredential>>;
24
+ export type LegacyAuthStorageData = Record<string, AuthCredential>;
18
25
  /**
19
26
  * Credential storage backed by a JSON file.
27
+ * Supports multiple accounts per provider.
20
28
  */
21
29
  export declare class AuthStorage {
22
30
  private authPath;
23
31
  private data;
24
32
  private runtimeOverrides;
25
33
  private fallbackResolver?;
34
+ private defaultAccounts;
26
35
  constructor(authPath?: string);
36
+ /**
37
+ * Migrate from legacy single-account format to multi-account format
38
+ */
39
+ private migrateLegacyData;
27
40
  /**
28
41
  * Set a runtime API key override (not persisted to disk).
29
42
  * Used for CLI --api-key flag.
30
43
  */
31
- setRuntimeApiKey(provider: string, apiKey: string): void;
44
+ setRuntimeApiKey(provider: string, apiKey: string, accountId?: string): void;
32
45
  /**
33
46
  * Remove a runtime API key override.
34
47
  */
35
- removeRuntimeApiKey(provider: string): void;
48
+ removeRuntimeApiKey(provider: string, accountId?: string): void;
49
+ /**
50
+ * Set default account for a provider
51
+ */
52
+ setDefaultAccount(provider: string, accountId: string): void;
53
+ /**
54
+ * Get default account for a provider
55
+ */
56
+ getDefaultAccount(provider: string): string | undefined;
36
57
  /**
37
58
  * Set a fallback resolver for API keys not found in auth.json or env vars.
38
59
  * Used for custom provider keys from models.json.
@@ -42,22 +63,33 @@ export declare class AuthStorage {
42
63
  * Reload credentials from disk.
43
64
  */
44
65
  reload(): void;
66
+ /**
67
+ * Check if data is in legacy format (single account per provider)
68
+ */
69
+ private isLegacyFormat;
45
70
  /**
46
71
  * Save credentials to disk.
47
72
  */
48
73
  private save;
49
74
  /**
50
- * Get credential for a provider.
75
+ * Get credential for a provider and account.
76
+ */
77
+ get(provider: string, accountId?: string): AuthCredential | undefined;
78
+ /**
79
+ * Get all accounts for a provider.
51
80
  */
52
- get(provider: string): AuthCredential | undefined;
81
+ getAccounts(provider: string): Array<{
82
+ accountId: string;
83
+ credential: AuthCredential;
84
+ }>;
53
85
  /**
54
- * Set credential for a provider.
86
+ * Set credential for a provider and account.
55
87
  */
56
- set(provider: string, credential: AuthCredential): void;
88
+ set(provider: string, accountId: string, credential: AuthCredential): void;
57
89
  /**
58
- * Remove credential for a provider.
90
+ * Remove credential for a provider and account.
59
91
  */
60
- remove(provider: string): void;
92
+ remove(provider: string, accountId?: string): void;
61
93
  /**
62
94
  * List all providers with credentials.
63
95
  */
@@ -65,12 +97,12 @@ export declare class AuthStorage {
65
97
  /**
66
98
  * Check if credentials exist for a provider in auth.json.
67
99
  */
68
- has(provider: string): boolean;
100
+ has(provider: string, accountId?: string): boolean;
69
101
  /**
70
102
  * Check if any form of auth is configured for a provider.
71
103
  * Unlike getApiKey(), this doesn't refresh OAuth tokens.
72
104
  */
73
- hasAuth(provider: string): boolean;
105
+ hasAuth(provider: string, accountId?: string): boolean;
74
106
  /**
75
107
  * Get all credentials (for passing to getOAuthApiKey).
76
108
  */
@@ -78,19 +110,17 @@ export declare class AuthStorage {
78
110
  /**
79
111
  * Login to an OAuth provider.
80
112
  */
81
- login(providerId: OAuthProviderId, callbacks: OAuthLoginCallbacks): Promise<void>;
113
+ login(providerId: OAuthProviderId, callbacks: OAuthLoginCallbacks, accountId?: string, accountName?: string): Promise<void>;
82
114
  /**
83
115
  * Logout from a provider.
84
116
  */
85
- logout(provider: string): void;
117
+ logout(provider: string, accountId?: string): void;
86
118
  /**
87
119
  * Refresh OAuth token with file locking to prevent race conditions.
88
- * Multiple indusagi instances may try to refresh simultaneously when tokens expire.
89
- * This ensures only one instance refreshes while others wait and use the result.
90
120
  */
91
121
  private refreshOAuthTokenWithLock;
92
122
  /**
93
- * Get API key for a provider.
123
+ * Get API key for a provider and account.
94
124
  * Priority:
95
125
  * 1. Runtime override (CLI --api-key)
96
126
  * 2. API key from auth.json
@@ -98,10 +128,17 @@ export declare class AuthStorage {
98
128
  * 4. Environment variable
99
129
  * 5. Fallback resolver (models.json custom providers)
100
130
  */
101
- getApiKey(providerId: string): Promise<string | undefined>;
131
+ getApiKey(providerId: string, accountId?: string): Promise<string | undefined>;
102
132
  /**
103
133
  * Get all registered OAuth providers
104
134
  */
105
- getOAuthProviders(): import("indusagi/ai").OAuthProviderInterface[];
135
+ getOAuthProviders(): OAuthProviderInterface[];
136
+ /**
137
+ * Get account info for display
138
+ */
139
+ getAccountInfo(provider: string, accountId: string): {
140
+ name: string;
141
+ type: string;
142
+ } | undefined;
106
143
  }
107
144
  //# sourceMappingURL=auth-storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-storage.d.ts","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAKN,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,MAAM,aAAa,CAAC;AAMrB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,OAAO,CAAC;CACd,GAAG,gBAAgB,CAAC;AAErB,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE7D;;GAEG;AACH,qBAAa,WAAW;IAKX,OAAO,CAAC,QAAQ;IAJ5B,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,gBAAgB,CAAC,CAA2C;gBAEhD,QAAQ,GAAE,MAAyC;IAIvE;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxD;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3C;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI;IAI7E;;OAEG;IACH,MAAM,IAAI,IAAI;IAYd;;OAEG;IACH,OAAO,CAAC,IAAI;IASZ;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIjD;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI;IAKvD;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK9B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQlC;;OAEG;IACH,MAAM,IAAI,eAAe;IAIzB;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvF;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI9B;;;;OAIG;YACW,yBAAyB;IA8EvC;;;;;;;;OAQG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA0DhE;;OAEG;IACH,iBAAiB;CAGjB"}
1
+ {"version":3,"file":"auth-storage.d.ts","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAKN,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,MAAM,aAAa,CAAC;AAMrB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,gBAAgB,CAAC;AAErB,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAGhE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAG7E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAEnE;;;GAGG;AACH,qBAAa,WAAW;IAMX,OAAO,CAAC,QAAQ;IAL5B,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,gBAAgB,CAA+C;IACvE,OAAO,CAAC,gBAAgB,CAAC,CAA2C;IACpE,OAAO,CAAC,eAAe,CAAkC;gBAErC,QAAQ,GAAE,MAAyC;IAIvE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,IAAI;IAOvF;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI5D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASvD;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI;IAI7E;;OAEG;IACH,MAAM,IAAI,IAAI;IAyBd;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,IAAI;IAgBZ;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,cAAc,GAAG,SAAS;IAIhF;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,cAAc,CAAA;KAAE,CAAC;IAUvF;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI;IAmB1E;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBlD;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAOlD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAwBtD;;OAEG;IACH,MAAM,IAAI,eAAe;IAIzB;;OAEG;IACG,KAAK,CACV,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,mBAAmB,EAC9B,SAAS,GAAE,MAAkB,EAC7B,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAkBhB;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlD;;OAEG;YACW,yBAAyB;IAiFvC;;;;;;;;OAQG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAuDpF;;OAEG;IACH,iBAAiB,IAAI,sBAAsB,EAAE;IAI7C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAS/F"}
@@ -2,6 +2,8 @@
2
2
  * Credential storage for API keys and OAuth tokens.
3
3
  * Handles loading, saving, and refreshing credentials from auth.json.
4
4
  *
5
+ * MULTI-ACCOUNT SUPPORT: Each provider can have multiple named accounts.
6
+ *
5
7
  * Uses file locking to prevent race conditions when multiple indusagi instances
6
8
  * try to refresh tokens simultaneously.
7
9
  */
@@ -12,26 +14,73 @@ import lockfile from "proper-lockfile";
12
14
  import { getAgentDir } from "../config.js";
13
15
  /**
14
16
  * Credential storage backed by a JSON file.
17
+ * Supports multiple accounts per provider.
15
18
  */
16
19
  export class AuthStorage {
17
20
  constructor(authPath = join(getAgentDir(), "auth.json")) {
18
21
  this.authPath = authPath;
19
22
  this.data = {};
20
- this.runtimeOverrides = new Map();
23
+ this.runtimeOverrides = new Map(); // provider -> accountId -> apiKey
24
+ this.defaultAccounts = new Map(); // provider -> default accountId
21
25
  this.reload();
22
26
  }
27
+ /**
28
+ * Migrate from legacy single-account format to multi-account format
29
+ */
30
+ migrateLegacyData(legacyData) {
31
+ const migrated = {};
32
+ for (const [provider, credential] of Object.entries(legacyData)) {
33
+ // Create default account for legacy credential
34
+ const accountId = "default";
35
+ const accountName = "Default";
36
+ if (!migrated[provider]) {
37
+ migrated[provider] = {};
38
+ }
39
+ migrated[provider][accountId] = {
40
+ ...credential,
41
+ accountId,
42
+ accountName,
43
+ };
44
+ }
45
+ return migrated;
46
+ }
23
47
  /**
24
48
  * Set a runtime API key override (not persisted to disk).
25
49
  * Used for CLI --api-key flag.
26
50
  */
27
- setRuntimeApiKey(provider, apiKey) {
28
- this.runtimeOverrides.set(provider, apiKey);
51
+ setRuntimeApiKey(provider, apiKey, accountId = "default") {
52
+ if (!this.runtimeOverrides.has(provider)) {
53
+ this.runtimeOverrides.set(provider, new Map());
54
+ }
55
+ this.runtimeOverrides.get(provider).set(accountId, apiKey);
29
56
  }
30
57
  /**
31
58
  * Remove a runtime API key override.
32
59
  */
33
- removeRuntimeApiKey(provider) {
34
- this.runtimeOverrides.delete(provider);
60
+ removeRuntimeApiKey(provider, accountId) {
61
+ if (accountId) {
62
+ this.runtimeOverrides.get(provider)?.delete(accountId);
63
+ }
64
+ else {
65
+ this.runtimeOverrides.delete(provider);
66
+ }
67
+ }
68
+ /**
69
+ * Set default account for a provider
70
+ */
71
+ setDefaultAccount(provider, accountId) {
72
+ this.defaultAccounts.set(provider, accountId);
73
+ }
74
+ /**
75
+ * Get default account for a provider
76
+ */
77
+ getDefaultAccount(provider) {
78
+ // Check env var first
79
+ const envDefault = process.env[`INDUSAGI_DEFAULT_ACCOUNT_${provider.replace(/-/g, '_').toUpperCase()}`];
80
+ if (envDefault)
81
+ return envDefault;
82
+ // Then check saved default
83
+ return this.defaultAccounts.get(provider);
35
84
  }
36
85
  /**
37
86
  * Set a fallback resolver for API keys not found in auth.json or env vars.
@@ -49,12 +98,40 @@ export class AuthStorage {
49
98
  return;
50
99
  }
51
100
  try {
52
- this.data = JSON.parse(readFileSync(this.authPath, "utf-8"));
101
+ const raw = JSON.parse(readFileSync(this.authPath, "utf-8"));
102
+ // Detect legacy format and migrate
103
+ if (this.isLegacyFormat(raw)) {
104
+ this.data = this.migrateLegacyData(raw);
105
+ this.save(); // Save in new format
106
+ }
107
+ else {
108
+ this.data = raw;
109
+ }
110
+ // Load default accounts
111
+ if (raw._defaults) {
112
+ this.defaultAccounts = new Map(Object.entries(raw._defaults));
113
+ }
53
114
  }
54
115
  catch {
55
116
  this.data = {};
56
117
  }
57
118
  }
119
+ /**
120
+ * Check if data is in legacy format (single account per provider)
121
+ */
122
+ isLegacyFormat(data) {
123
+ if (!data || typeof data !== "object")
124
+ return false;
125
+ for (const [key, value] of Object.entries(data)) {
126
+ if (key.startsWith("_"))
127
+ continue; // Skip metadata
128
+ // If value has 'type' field directly, it's legacy format
129
+ if (value && typeof value === "object" && value.type) {
130
+ return true;
131
+ }
132
+ }
133
+ return false;
134
+ }
58
135
  /**
59
136
  * Save credentials to disk.
60
137
  */
@@ -63,27 +140,71 @@ export class AuthStorage {
63
140
  if (!existsSync(dir)) {
64
141
  mkdirSync(dir, { recursive: true, mode: 0o700 });
65
142
  }
66
- writeFileSync(this.authPath, JSON.stringify(this.data, null, 2), "utf-8");
143
+ // Include defaults in saved data
144
+ const dataToSave = {
145
+ ...this.data,
146
+ _defaults: Object.fromEntries(this.defaultAccounts),
147
+ };
148
+ writeFileSync(this.authPath, JSON.stringify(dataToSave, null, 2), "utf-8");
67
149
  chmodSync(this.authPath, 0o600);
68
150
  }
69
151
  /**
70
- * Get credential for a provider.
152
+ * Get credential for a provider and account.
153
+ */
154
+ get(provider, accountId = "default") {
155
+ return this.data[provider]?.[accountId];
156
+ }
157
+ /**
158
+ * Get all accounts for a provider.
71
159
  */
72
- get(provider) {
73
- return this.data[provider] ?? undefined;
160
+ getAccounts(provider) {
161
+ const providerData = this.data[provider];
162
+ if (!providerData)
163
+ return [];
164
+ return Object.entries(providerData).map(([accountId, credential]) => ({
165
+ accountId,
166
+ credential,
167
+ }));
74
168
  }
75
169
  /**
76
- * Set credential for a provider.
170
+ * Set credential for a provider and account.
77
171
  */
78
- set(provider, credential) {
79
- this.data[provider] = credential;
172
+ set(provider, accountId, credential) {
173
+ if (!this.data[provider]) {
174
+ this.data[provider] = {};
175
+ }
176
+ this.data[provider][accountId] = {
177
+ ...credential,
178
+ accountId,
179
+ accountName: credential.accountName || accountId,
180
+ };
181
+ // If this is the first account, set it as default
182
+ if (Object.keys(this.data[provider]).length === 1) {
183
+ this.setDefaultAccount(provider, accountId);
184
+ }
80
185
  this.save();
81
186
  }
82
187
  /**
83
- * Remove credential for a provider.
188
+ * Remove credential for a provider and account.
84
189
  */
85
- remove(provider) {
86
- delete this.data[provider];
190
+ remove(provider, accountId) {
191
+ if (accountId) {
192
+ delete this.data[provider]?.[accountId];
193
+ // If we removed the default, pick a new one
194
+ if (this.getDefaultAccount(provider) === accountId) {
195
+ const remaining = this.getAccounts(provider);
196
+ if (remaining.length > 0) {
197
+ this.setDefaultAccount(provider, remaining[0].accountId);
198
+ }
199
+ else {
200
+ this.defaultAccounts.delete(provider);
201
+ }
202
+ }
203
+ }
204
+ else {
205
+ delete this.data[provider];
206
+ this.defaultAccounts.delete(provider);
207
+ }
87
208
  this.save();
88
209
  }
89
210
  /**
@@ -95,20 +216,39 @@ export class AuthStorage {
95
216
  /**
96
217
  * Check if credentials exist for a provider in auth.json.
97
218
  */
98
- has(provider) {
99
- return provider in this.data;
219
+ has(provider, accountId) {
220
+ if (accountId) {
221
+ return accountId in (this.data[provider] || {});
222
+ }
223
+ return provider in this.data && Object.keys(this.data[provider]).length > 0;
100
224
  }
101
225
  /**
102
226
  * Check if any form of auth is configured for a provider.
103
227
  * Unlike getApiKey(), this doesn't refresh OAuth tokens.
104
228
  */
105
- hasAuth(provider) {
106
- if (this.runtimeOverrides.has(provider))
107
- return true;
108
- if (this.data[provider])
109
- return true;
229
+ hasAuth(provider, accountId) {
230
+ // Check runtime override
231
+ if (accountId) {
232
+ if (this.runtimeOverrides.get(provider)?.has(accountId))
233
+ return true;
234
+ }
235
+ else {
236
+ if (this.runtimeOverrides.get(provider)?.size)
237
+ return true;
238
+ }
239
+ // Check saved credentials
240
+ if (accountId) {
241
+ if (this.has(provider, accountId))
242
+ return true;
243
+ }
244
+ else {
245
+ if (this.has(provider))
246
+ return true;
247
+ }
248
+ // Check env var
110
249
  if (getEnvApiKey(provider))
111
250
  return true;
251
+ // Check fallback
112
252
  if (this.fallbackResolver?.(provider))
113
253
  return true;
114
254
  return false;
@@ -122,26 +262,30 @@ export class AuthStorage {
122
262
  /**
123
263
  * Login to an OAuth provider.
124
264
  */
125
- async login(providerId, callbacks) {
265
+ async login(providerId, callbacks, accountId = "default", accountName) {
126
266
  const provider = getOAuthProvider(providerId);
127
267
  if (!provider) {
128
268
  throw new Error(`Unknown OAuth provider: ${providerId}`);
129
269
  }
130
270
  const credentials = await provider.login(callbacks);
131
- this.set(providerId, { type: "oauth", ...credentials });
271
+ const oauthCred = {
272
+ type: "oauth",
273
+ accountId,
274
+ accountName: accountName || accountId,
275
+ ...credentials,
276
+ };
277
+ this.set(providerId, accountId, oauthCred);
132
278
  }
133
279
  /**
134
280
  * Logout from a provider.
135
281
  */
136
- logout(provider) {
137
- this.remove(provider);
282
+ logout(provider, accountId) {
283
+ this.remove(provider, accountId);
138
284
  }
139
285
  /**
140
286
  * Refresh OAuth token with file locking to prevent race conditions.
141
- * Multiple indusagi instances may try to refresh simultaneously when tokens expire.
142
- * This ensures only one instance refreshes while others wait and use the result.
143
287
  */
144
- async refreshOAuthTokenWithLock(providerId) {
288
+ async refreshOAuthTokenWithLock(providerId, accountId) {
145
289
  const provider = getOAuthProvider(providerId);
146
290
  if (!provider) {
147
291
  return null;
@@ -158,7 +302,6 @@ export class AuthStorage {
158
302
  let release;
159
303
  try {
160
304
  // Acquire exclusive lock with retry and timeout
161
- // Use generous retry window to handle slow token endpoints
162
305
  release = await lockfile.lock(this.authPath, {
163
306
  retries: {
164
307
  retries: 10,
@@ -167,16 +310,15 @@ export class AuthStorage {
167
310
  maxTimeout: 10000,
168
311
  randomize: true,
169
312
  },
170
- stale: 30000, // Consider lock stale after 30 seconds
313
+ stale: 30000,
171
314
  });
172
- // Re-read file after acquiring lock - another instance may have refreshed
315
+ // Re-read file after acquiring lock
173
316
  this.reload();
174
- const cred = this.data[providerId];
317
+ const cred = this.data[providerId]?.[accountId];
175
318
  if (cred?.type !== "oauth") {
176
319
  return null;
177
320
  }
178
321
  // Check if token is still expired after re-reading
179
- // (another instance may have already refreshed it)
180
322
  if (Date.now() < cred.expires) {
181
323
  // Token is now valid - another instance refreshed it
182
324
  const apiKey = provider.getApiKey(cred);
@@ -184,33 +326,37 @@ export class AuthStorage {
184
326
  }
185
327
  // Token still expired, we need to refresh
186
328
  const oauthCreds = {};
187
- for (const [key, value] of Object.entries(this.data)) {
329
+ for (const [key, value] of Object.entries(this.data[providerId] || {})) {
188
330
  if (value.type === "oauth") {
189
331
  oauthCreds[key] = value;
190
332
  }
191
333
  }
192
334
  const result = await getOAuthApiKey(providerId, oauthCreds);
193
335
  if (result) {
194
- this.data[providerId] = { type: "oauth", ...result.newCredentials };
336
+ this.data[providerId][accountId] = {
337
+ type: "oauth",
338
+ accountId,
339
+ accountName: cred.accountName,
340
+ ...result.newCredentials,
341
+ };
195
342
  this.save();
196
343
  return result;
197
344
  }
198
345
  return null;
199
346
  }
200
347
  finally {
201
- // Always release the lock
202
348
  if (release) {
203
349
  try {
204
350
  await release();
205
351
  }
206
352
  catch {
207
- // Ignore unlock errors (lock may have been compromised)
353
+ // Ignore unlock errors
208
354
  }
209
355
  }
210
356
  }
211
357
  }
212
358
  /**
213
- * Get API key for a provider.
359
+ * Get API key for a provider and account.
214
360
  * Priority:
215
361
  * 1. Runtime override (CLI --api-key)
216
362
  * 2. API key from auth.json
@@ -218,47 +364,43 @@ export class AuthStorage {
218
364
  * 4. Environment variable
219
365
  * 5. Fallback resolver (models.json custom providers)
220
366
  */
221
- async getApiKey(providerId) {
367
+ async getApiKey(providerId, accountId) {
368
+ // Use default account if not specified
369
+ const targetAccount = accountId || this.getDefaultAccount(providerId) || "default";
222
370
  // Runtime override takes highest priority
223
- const runtimeKey = this.runtimeOverrides.get(providerId);
371
+ const runtimeKey = this.runtimeOverrides.get(providerId)?.get(targetAccount);
224
372
  if (runtimeKey) {
225
373
  return runtimeKey;
226
374
  }
227
- const cred = this.data[providerId];
375
+ const cred = this.data[providerId]?.[targetAccount];
228
376
  if (cred?.type === "api_key") {
229
377
  return cred.key;
230
378
  }
231
379
  if (cred?.type === "oauth") {
232
380
  const provider = getOAuthProvider(providerId);
233
381
  if (!provider) {
234
- // Unknown OAuth provider, can't get API key
235
382
  return undefined;
236
383
  }
237
384
  // Check if token needs refresh
238
385
  const needsRefresh = Date.now() >= cred.expires;
239
386
  if (needsRefresh) {
240
- // Use locked refresh to prevent race conditions
241
387
  try {
242
- const result = await this.refreshOAuthTokenWithLock(providerId);
388
+ const result = await this.refreshOAuthTokenWithLock(providerId, targetAccount);
243
389
  if (result) {
244
390
  return result.apiKey;
245
391
  }
246
392
  }
247
393
  catch {
248
- // Refresh failed - re-read file to check if another instance succeeded
394
+ // Refresh failed - re-read file
249
395
  this.reload();
250
- const updatedCred = this.data[providerId];
396
+ const updatedCred = this.data[providerId]?.[targetAccount];
251
397
  if (updatedCred?.type === "oauth" && Date.now() < updatedCred.expires) {
252
- // Another instance refreshed successfully, use those credentials
253
398
  return provider.getApiKey(updatedCred);
254
399
  }
255
- // Refresh truly failed - return undefined so model discovery skips this provider
256
- // User can /login to re-authenticate (credentials preserved for retry)
257
400
  return undefined;
258
401
  }
259
402
  }
260
403
  else {
261
- // Token not expired, use current access token
262
404
  return provider.getApiKey(cred);
263
405
  }
264
406
  }
@@ -266,7 +408,7 @@ export class AuthStorage {
266
408
  const envKey = getEnvApiKey(providerId);
267
409
  if (envKey)
268
410
  return envKey;
269
- // Fall back to custom resolver (e.g., models.json custom providers)
411
+ // Fall back to custom resolver
270
412
  return this.fallbackResolver?.(providerId) ?? undefined;
271
413
  }
272
414
  /**
@@ -275,5 +417,17 @@ export class AuthStorage {
275
417
  getOAuthProviders() {
276
418
  return getOAuthProviders();
277
419
  }
420
+ /**
421
+ * Get account info for display
422
+ */
423
+ getAccountInfo(provider, accountId) {
424
+ const cred = this.get(provider, accountId);
425
+ if (!cred)
426
+ return undefined;
427
+ return {
428
+ name: cred.accountName || accountId,
429
+ type: cred.type,
430
+ };
431
+ }
278
432
  }
279
433
  //# sourceMappingURL=auth-storage.js.map