@evalops/maestro 0.10.46 → 0.10.48
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/README.md +4 -0
- package/dist/agent/providers/openai-codex-session.js +1 -1
- package/dist/agent/providers/openai-codex-session.js.map +1 -1
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/protocol-modes-api.js +1 -1
- package/dist/app-server/protocol-modes-api.js.map +1 -1
- package/dist/app-server/sandbox-check-api.d.ts +21 -0
- package/dist/app-server/{sandbox-proof-api.d.ts.map → sandbox-check-api.d.ts.map} +1 -1
- package/dist/app-server/{sandbox-proof-api.js → sandbox-check-api.js} +18 -18
- package/dist/app-server/{sandbox-proof-api.js.map → sandbox-check-api.js.map} +1 -1
- package/dist/app-server/session-api.d.ts +5 -5
- package/dist/app-server/session-api.js +18 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/codex.js +30 -3
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli/commands/update.d.ts +12 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +148 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +4 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli-tui/auth-state.d.ts +7 -0
- package/dist/cli-tui/auth-state.d.ts.map +1 -0
- package/dist/cli-tui/auth-state.js +46 -0
- package/dist/cli-tui/auth-state.js.map +1 -0
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +8 -3
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/command-suite-handlers.d.ts +2 -5
- package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +6 -5
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/ui-commands.d.ts +1 -1
- package/dist/cli-tui/commands/subcommands/ui-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/ui-commands.js.map +1 -1
- package/dist/cli-tui/footer.d.ts.map +1 -1
- package/dist/cli-tui/footer.js +1 -1
- package/dist/cli-tui/footer.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +24 -11
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +1 -0
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +25 -2
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +2 -5
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -1
- package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts +1 -1
- package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/ui-state-controller.js +5 -11
- package/dist/cli-tui/tui-renderer/ui-state-controller.js.map +1 -1
- package/dist/cli-tui/tui-renderer.d.ts +0 -4
- package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer.js +4 -29
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli-tui/ui-state.js +1 -1
- package/dist/cli-tui/ui-state.js.map +1 -1
- package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
- package/dist/cli-tui/utils/footer-utils.d.ts.map +1 -1
- package/dist/cli-tui/utils/footer-utils.js.map +1 -1
- package/dist/cli.js +4800 -3779
- package/dist/cli.js.map +1 -1
- package/dist/codex/app-server-client.d.ts +16 -2
- package/dist/codex/app-server-client.d.ts.map +1 -1
- package/dist/codex/app-server-client.js +67 -7
- package/dist/codex/app-server-client.js.map +1 -1
- package/dist/codex/auth.d.ts +4 -0
- package/dist/codex/auth.d.ts.map +1 -0
- package/dist/codex/auth.js +103 -0
- package/dist/codex/auth.js.map +1 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/evalops/agent-bootstrap.js +2 -2
- package/dist/evalops/agent-bootstrap.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -1
- package/dist/main.js.map +1 -1
- package/dist/models/config-loader.d.ts +12 -12
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +19 -19
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +12 -13
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/scenario.d.ts +2 -0
- package/dist/node_modules/@evalops/contracts/dist/scenario.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/scenario.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/index.d.ts +1 -0
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +42 -2
- package/dist/oauth/index.js.map +1 -1
- package/dist/platform/operating-plane-client.d.ts +3 -3
- package/dist/platform/operating-plane-client.d.ts.map +1 -1
- package/dist/platform/operating-plane-client.js.map +1 -1
- package/dist/platform/operating-plane-summary.js +3 -6
- package/dist/platform/operating-plane-summary.js.map +1 -1
- package/dist/server/agent-trajectory-scenarios.d.ts.map +1 -1
- package/dist/server/agent-trajectory-scenarios.js +29 -6
- package/dist/server/agent-trajectory-scenarios.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +44 -10
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.d.ts +2 -0
- package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.js +2 -0
- package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
- package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
- package/dist/server/handlers/platform-a2a-push.js +113 -2
- package/dist/server/handlers/platform-a2a-push.js.map +1 -1
- package/dist/server/handlers/ui.d.ts.map +1 -1
- package/dist/server/handlers/ui.js +5 -5
- package/dist/server/handlers/ui.js.map +1 -1
- package/dist/server/headless-in-process-host.d.ts.map +1 -1
- package/dist/server/headless-in-process-host.js +1 -1
- package/dist/server/headless-in-process-host.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +9 -2
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +54 -15
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/stores/ui-store.d.ts.map +1 -1
- package/dist/server/stores/ui-store.js +8 -1
- package/dist/server/stores/ui-store.js.map +1 -1
- package/dist/tools/background/task-runtime.js +1 -1
- package/dist/tools/background/task-runtime.js.map +1 -1
- package/dist/tools/background/task-types.d.ts +1 -1
- package/dist/update/check.d.ts +2 -0
- package/dist/update/check.d.ts.map +1 -1
- package/dist/update/check.js +100 -41
- package/dist/update/check.js.map +1 -1
- package/dist/update/startup-refresh.d.ts +56 -0
- package/dist/update/startup-refresh.d.ts.map +1 -0
- package/dist/update/startup-refresh.js +321 -0
- package/dist/update/startup-refresh.js.map +1 -0
- package/dist/version.json +2 -2
- package/package.json +297 -296
- package/dist/app-server/sandbox-proof-api.d.ts +0 -21
package/dist/cli-tui/footer.js
CHANGED
|
@@ -6,7 +6,7 @@ import { GitBranchTracker, buildBrandLine, buildHorizontalRule, buildPathAndStat
|
|
|
6
6
|
* Footer component that shows pwd, token stats, and context usage
|
|
7
7
|
*/
|
|
8
8
|
export class FooterComponent {
|
|
9
|
-
constructor(state, mode = "
|
|
9
|
+
constructor(state, mode = "rich", gitBranchTracker = new GitBranchTracker()) {
|
|
10
10
|
this.activeStage = null;
|
|
11
11
|
this.hints = [];
|
|
12
12
|
this.runtimeBadges = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/cli-tui/footer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACN,gBAAgB,EAEhB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAElB,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,GACV,MAAM,yBAAyB,CAAC;AAoBjC;;GAEG;AACH,MAAM,OAAO,eAAe;IAa3B,YACC,KAAiB,EACjB,OAAmB,UAAU,EAC7B,gBAAgB,GAAG,IAAI,gBAAgB,EAAE;QAdlC,gBAAW,GAAkB,IAAI,CAAC;QAClC,UAAK,GAAiB,EAAE,CAAC;QACzB,kBAAa,GAAa,EAAE,CAAC;QAE7B,gBAAW,GAAuB,IAAI,CAAC;QACvC,eAAU,GAAqB,EAAE,CAAC;QAClC,gBAAW,GAAG,CAAC,CAAC;QAChB,qBAAgB,GAAG,CAAC,CAAC;QAErB,kBAAa,GAA8B,SAAS,CAAC;QAO5D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC1C,CAAC;IAED,WAAW,CAAC,KAAiB;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,gBAAgB,CAAC,MAAgB;QAChC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,KAAoB;QAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,IAAmB;QAC1B,qDAAqD;QACrD,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,CAAC;IACF,CAAC;IAED,QAAQ,CAAC,KAAmB;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,IAAgB;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,UAAU;QACT,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,QAAQ,CACP,OAAe,EACf,IAA4C,EAC5C,UAAmB;QAEnB,MAAM,KAAK,GAAmB;YAC7B,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE;YACtB,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC;SAChE,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1C,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IAEO,oBAAoB,CAC3B,IAA4C,EAC5C,QAAiB;QAEjB,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC9C,QAAQ,IAAI,EAAE,CAAC;YACd,KAAK,QAAQ;gBACZ,OAAO,IAAI,CAAC;YACb,KAAK,MAAM;gBACV,OAAO,IAAI,CAAC;YACb,KAAK,SAAS;gBACb,OAAO,IAAI,CAAC;YACb;gBACC,OAAO,IAAI,CAAC;QACd,CAAC;IACF,CAAC;IAED,UAAU;QACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,KAAK,GAAG,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,mBAAmB;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC9B,CAAC;IAED,eAAe;QACd,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,WAAW;QACV,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,cAAc;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEO,YAAY,CAAC,KAAqB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACpC,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACP,CAAC;QACF,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAEO,YAAY;QACnB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,IAAyB;QAC9C,QAAQ,IAAI,EAAE,CAAC;YACd,KAAK,QAAQ;gBACZ,OAAO,CAAC,CAAC;YACV,KAAK,MAAM;gBACV,OAAO,CAAC,CAAC;YACV,KAAK,SAAS;gBACb,OAAO,CAAC,CAAC;YACV;gBACC,OAAO,CAAC,CAAC;QACX,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,cAA2B;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;QAC9D,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;YAC9D,cAAc,EAAE,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACN,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,IAAgB;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,iCAAiC;QACjC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;QAC/D,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAE1C,0BAA0B;QAC1B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC9D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,0CAA0C;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,qBAAqB,CAC1C,OAAO,CAAC,GAAG,EAAE,EACb,KAAK,EACL,KAAK,EACL,MAAM,EACN,IAAI,CAAC,WAAW,CAChB,CAAC;QAEF,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QAErD,0CAA0C;QAC1C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YAC3C,IAAI,cAAsB,CAAC;YAC3B,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,QAAQ,IAAI,EAAE,CAAC;gBACd,KAAK,MAAM;oBACV,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAClC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM;gBACP,KAAK,MAAM;oBACV,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACnC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC9C,MAAM;gBACP,KAAK,SAAS;oBACb,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACnC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC9C,MAAM;gBACP,KAAK,QAAQ;oBACZ,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACjC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC5C,MAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,GAAG,MAAM,GAAG,cAAc,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACP,4BAA4B;YAC5B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,UAAU,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,IAAY,EAAE,KAAa;QAClD,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;IAC/B,CAAC;IAEO,gBAAgB,CAAC,KAAkB,EAAE,KAAa;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAC1B,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAClD,CAAC;QACF,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,CAAC;CACD","sourcesContent":["import { visibleWidth } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport type { AgentState } from \"../agent/types.js\";\nimport { theme } from \"../theme/theme.js\";\nimport {\n\tGitBranchTracker,\n\tbuildBadgeAndPathLine,\n\tbuildBrandLine,\n\tbuildHorizontalRule,\n\tbuildPathAndStatsLine,\n\tbuildSoloStatsLine,\n\tbuildStatsLine,\n\tcalculateFooterStats,\n\tformatPathWithBranch,\n\tmergeHints,\n} from \"./utils/footer-utils.js\";\nimport type {\n\tFooterHint,\n\tFooterMode,\n\tFooterStats,\n} from \"./utils/footer-utils.js\";\n\n// Re-export FooterHint for external use\nexport type { FooterHint, HintType } from \"./utils/footer-utils.js\";\n\ninterface FooterToast {\n\tmessage: string;\n\ttone: \"info\" | \"warn\" | \"success\" | \"danger\";\n\texpiry: number;\n}\n\ninterface ToastQueueItem extends FooterToast {\n\tid: number;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage\n */\nexport class FooterComponent {\n\tprivate state: AgentState;\n\tprivate activeStage: string | null = null;\n\tprivate hints: FooterHint[] = [];\n\tprivate runtimeBadges: string[] = [];\n\tprivate mode: FooterMode;\n\tprivate activeToast: FooterToast | null = null;\n\tprivate toastQueue: ToastQueueItem[] = [];\n\tprivate nextToastId = 1;\n\tprivate unseenAlertCount = 0;\n\tprivate gitBranchTracker: GitBranchTracker;\n\tprivate currentBranch: string | null | undefined = undefined;\n\n\tconstructor(\n\t\tstate: AgentState,\n\t\tmode: FooterMode = \"ensemble\",\n\t\tgitBranchTracker = new GitBranchTracker(),\n\t) {\n\t\tthis.state = state;\n\t\tthis.mode = mode;\n\t\tthis.gitBranchTracker = gitBranchTracker;\n\t}\n\n\tupdateState(state: AgentState): void {\n\t\tthis.state = state;\n\t}\n\n\tsetRuntimeBadges(badges: string[]): void {\n\t\tthis.runtimeBadges = badges;\n\t}\n\n\tsetStage(stage: string | null): void {\n\t\tthis.activeStage = stage;\n\t}\n\n\tsetHint(hint: string | null): void {\n\t\t// Legacy method - convert single hint to hints array\n\t\tif (hint) {\n\t\t\tthis.hints = [{ type: \"custom\", message: hint, priority: 150 }];\n\t\t} else {\n\t\t\tthis.hints = [];\n\t\t}\n\t}\n\n\tsetHints(hints: FooterHint[]): void {\n\t\tthis.hints = hints;\n\t}\n\n\taddHint(hint: FooterHint): void {\n\t\tthis.hints.push(hint);\n\t}\n\n\tclearHints(): void {\n\t\tthis.hints = [];\n\t}\n\n\tsetToast(\n\t\tmessage: string,\n\t\ttone: \"info\" | \"warn\" | \"success\" | \"danger\",\n\t\tdurationMs?: number,\n\t): void {\n\t\tconst toast: ToastQueueItem = {\n\t\t\tid: this.nextToastId++,\n\t\t\tmessage,\n\t\t\ttone,\n\t\t\texpiry: Date.now() + this.resolveToastDuration(tone, durationMs),\n\t\t};\n\t\tthis.enqueueToast(toast);\n\t\tthis.dequeueToast();\n\t\tif (tone === \"danger\" || tone === \"warn\") {\n\t\t\tthis.unseenAlertCount += 1;\n\t\t}\n\t}\n\n\tprivate resolveToastDuration(\n\t\ttone: \"info\" | \"warn\" | \"success\" | \"danger\",\n\t\toverride?: number,\n\t): number {\n\t\tif (override && override > 0) return override;\n\t\tswitch (tone) {\n\t\t\tcase \"danger\":\n\t\t\t\treturn 8000;\n\t\t\tcase \"warn\":\n\t\t\t\treturn 6000;\n\t\t\tcase \"success\":\n\t\t\t\treturn 4500;\n\t\t\tdefault:\n\t\t\t\treturn 4000;\n\t\t}\n\t}\n\n\tclearToast(): void {\n\t\tthis.activeToast = null;\n\t\tthis.toastQueue = [];\n\t\tthis.unseenAlertCount = 0;\n\t}\n\n\tgetToastHistory(limit = 5): FooterToast[] {\n\t\tconst active = this.activeToast ? [this.activeToast] : [];\n\t\treturn [...active, ...this.toastQueue].slice(0, limit);\n\t}\n\n\tgetUnseenAlertCount(): number {\n\t\treturn this.unseenAlertCount;\n\t}\n\n\tclearAlertCount(): void {\n\t\tthis.unseenAlertCount = 0;\n\t}\n\n\tclearAlerts(): void {\n\t\tthis.clearToast();\n\t\tthis.unseenAlertCount = 0;\n\t}\n\n\tgetActiveToast(): FooterToast | null {\n\t\treturn this.activeToast;\n\t}\n\n\tprivate enqueueToast(toast: ToastQueueItem): void {\n\t\tconst priority = this.toastPriority(toast.tone);\n\t\tlet inserted = false;\n\t\tfor (let i = 0; i < this.toastQueue.length; i++) {\n\t\t\tif (priority > this.toastPriority(this.toastQueue[i]!.tone)) {\n\t\t\t\tthis.toastQueue.splice(i, 0, toast);\n\t\t\t\tinserted = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!inserted) {\n\t\t\tthis.toastQueue.push(toast);\n\t\t}\n\t}\n\n\tprivate dequeueToast(): void {\n\t\tif (this.activeToast) return;\n\t\tconst next = this.toastQueue.shift();\n\t\tif (next) {\n\t\t\tthis.activeToast = next;\n\t\t}\n\t}\n\n\tprivate toastPriority(tone: FooterToast[\"tone\"]): number {\n\t\tswitch (tone) {\n\t\t\tcase \"danger\":\n\t\t\t\treturn 4;\n\t\t\tcase \"warn\":\n\t\t\t\treturn 3;\n\t\t\tcase \"success\":\n\t\t\t\treturn 2;\n\t\t\tdefault:\n\t\t\t\treturn 1;\n\t\t}\n\t}\n\n\t/**\n\t * Begin watching for git branch changes and invoke a callback when the\n\t * branch changes so the UI can re-render.\n\t */\n\tstartBranchTracking(onBranchChange?: () => void): void {\n\t\tthis.currentBranch = this.gitBranchTracker.getCurrentBranch();\n\t\tthis.gitBranchTracker.watchBranch(() => {\n\t\t\tthis.gitBranchTracker.invalidate();\n\t\t\tthis.currentBranch = this.gitBranchTracker.getCurrentBranch();\n\t\t\tonBranchChange?.();\n\t\t});\n\t}\n\n\tdispose(): void {\n\t\tthis.gitBranchTracker.dispose();\n\t}\n\n\tsetMode(mode: FooterMode): void {\n\t\tthis.mode = mode;\n\t}\n\n\tgetMode(): FooterMode {\n\t\treturn this.mode;\n\t}\n\n\trender(width: number): string[] {\n\t\t// Refresh branch cache if needed\n\t\tif (this.currentBranch === undefined) {\n\t\t\tthis.currentBranch = this.gitBranchTracker.getCurrentBranch();\n\t\t}\n\t\tconst branch = this.currentBranch ?? null;\n\n\t\t// Check for expired toast\n\t\tif (this.activeToast && Date.now() > this.activeToast.expiry) {\n\t\t\tthis.activeToast = null;\n\t\t}\n\n\t\tconst stats = calculateFooterStats(this.state);\n\t\tif (this.mode === \"solo\") {\n\t\t\treturn this.renderSoloFooter(stats, width);\n\t\t}\n\n\t\t// New footer layout with horizontal rules\n\t\tconst rule = buildHorizontalRule(width);\n\t\tconst brandLine = buildBrandLine(width, this.state);\n\t\tconst pathStatsLine = buildPathAndStatsLine(\n\t\t\tprocess.cwd(),\n\t\t\tstats,\n\t\t\twidth,\n\t\t\tbranch,\n\t\t\tthis.activeStage,\n\t\t);\n\n\t\tconst lines = [rule, brandLine, rule, pathStatsLine];\n\n\t\t// Render Toast if active, otherwise Hints\n\t\tif (this.activeToast) {\n\t\t\tconst { message, tone } = this.activeToast;\n\t\t\tlet coloredMessage: string;\n\t\t\tlet prefix = \"\";\n\n\t\t\tswitch (tone) {\n\t\t\t\tcase \"info\":\n\t\t\t\t\tprefix = theme.fg(\"accent\", \"ℹ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"text\", message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"warn\":\n\t\t\t\t\tprefix = theme.fg(\"warning\", \"⚠ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"warning\", message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"success\":\n\t\t\t\t\tprefix = theme.fg(\"success\", \"✔ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"success\", message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"danger\":\n\t\t\t\t\tprefix = theme.fg(\"error\", \"✖ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"error\", message);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst fullMessage = `${prefix}${coloredMessage}`;\n\t\t\tlines.push(this.truncateToWidth(fullMessage, width));\n\t\t} else {\n\t\t\t// Use new multi-hint system\n\t\t\tconst mergedHint = mergeHints(stats, this.hints, width);\n\t\t\tif (mergedHint) {\n\t\t\t\tconst truncated = this.truncateToWidth(mergedHint, width);\n\t\t\t\tlines.push(chalk.hex(\"#94a3b8\")(truncated));\n\t\t\t}\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\tprivate truncateToWidth(text: string, width: number): string {\n\t\tif (width <= 0) return \"\";\n\t\tif (visibleWidth(text) <= width) return text;\n\t\tif (width === 1) return text.slice(0, 1);\n\t\tlet result = text;\n\t\twhile (visibleWidth(result) > width - 1 && result.length > 0) {\n\t\t\tresult = result.slice(0, -1);\n\t\t}\n\t\treturn `${result.trimEnd()}…`;\n\t}\n\n\tprivate renderSoloFooter(stats: FooterStats, width: number): string[] {\n\t\tconst branch = this.currentBranch ?? null;\n\t\tconst pathLine = chalk.gray(\n\t\t\tformatPathWithBranch(process.cwd(), width, branch),\n\t\t);\n\t\tconst statsLine = buildSoloStatsLine(stats, width, this.state);\n\t\treturn [pathLine, chalk.gray(statsLine)];\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/cli-tui/footer.ts"],"names":[],"mappings":"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","sourcesContent":["import { visibleWidth } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport type { AgentState } from \"../agent/types.js\";\nimport { theme } from \"../theme/theme.js\";\nimport {\n\tGitBranchTracker,\n\tbuildBadgeAndPathLine,\n\tbuildBrandLine,\n\tbuildHorizontalRule,\n\tbuildPathAndStatsLine,\n\tbuildSoloStatsLine,\n\tbuildStatsLine,\n\tcalculateFooterStats,\n\tformatPathWithBranch,\n\tmergeHints,\n} from \"./utils/footer-utils.js\";\nimport type {\n\tFooterHint,\n\tFooterMode,\n\tFooterStats,\n} from \"./utils/footer-utils.js\";\n\n// Re-export FooterHint for external use\nexport type { FooterHint, HintType } from \"./utils/footer-utils.js\";\n\ninterface FooterToast {\n\tmessage: string;\n\ttone: \"info\" | \"warn\" | \"success\" | \"danger\";\n\texpiry: number;\n}\n\ninterface ToastQueueItem extends FooterToast {\n\tid: number;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage\n */\nexport class FooterComponent {\n\tprivate state: AgentState;\n\tprivate activeStage: string | null = null;\n\tprivate hints: FooterHint[] = [];\n\tprivate runtimeBadges: string[] = [];\n\tprivate mode: FooterMode;\n\tprivate activeToast: FooterToast | null = null;\n\tprivate toastQueue: ToastQueueItem[] = [];\n\tprivate nextToastId = 1;\n\tprivate unseenAlertCount = 0;\n\tprivate gitBranchTracker: GitBranchTracker;\n\tprivate currentBranch: string | null | undefined = undefined;\n\n\tconstructor(\n\t\tstate: AgentState,\n\t\tmode: FooterMode = \"rich\",\n\t\tgitBranchTracker = new GitBranchTracker(),\n\t) {\n\t\tthis.state = state;\n\t\tthis.mode = mode;\n\t\tthis.gitBranchTracker = gitBranchTracker;\n\t}\n\n\tupdateState(state: AgentState): void {\n\t\tthis.state = state;\n\t}\n\n\tsetRuntimeBadges(badges: string[]): void {\n\t\tthis.runtimeBadges = badges;\n\t}\n\n\tsetStage(stage: string | null): void {\n\t\tthis.activeStage = stage;\n\t}\n\n\tsetHint(hint: string | null): void {\n\t\t// Legacy method - convert single hint to hints array\n\t\tif (hint) {\n\t\t\tthis.hints = [{ type: \"custom\", message: hint, priority: 150 }];\n\t\t} else {\n\t\t\tthis.hints = [];\n\t\t}\n\t}\n\n\tsetHints(hints: FooterHint[]): void {\n\t\tthis.hints = hints;\n\t}\n\n\taddHint(hint: FooterHint): void {\n\t\tthis.hints.push(hint);\n\t}\n\n\tclearHints(): void {\n\t\tthis.hints = [];\n\t}\n\n\tsetToast(\n\t\tmessage: string,\n\t\ttone: \"info\" | \"warn\" | \"success\" | \"danger\",\n\t\tdurationMs?: number,\n\t): void {\n\t\tconst toast: ToastQueueItem = {\n\t\t\tid: this.nextToastId++,\n\t\t\tmessage,\n\t\t\ttone,\n\t\t\texpiry: Date.now() + this.resolveToastDuration(tone, durationMs),\n\t\t};\n\t\tthis.enqueueToast(toast);\n\t\tthis.dequeueToast();\n\t\tif (tone === \"danger\" || tone === \"warn\") {\n\t\t\tthis.unseenAlertCount += 1;\n\t\t}\n\t}\n\n\tprivate resolveToastDuration(\n\t\ttone: \"info\" | \"warn\" | \"success\" | \"danger\",\n\t\toverride?: number,\n\t): number {\n\t\tif (override && override > 0) return override;\n\t\tswitch (tone) {\n\t\t\tcase \"danger\":\n\t\t\t\treturn 8000;\n\t\t\tcase \"warn\":\n\t\t\t\treturn 6000;\n\t\t\tcase \"success\":\n\t\t\t\treturn 4500;\n\t\t\tdefault:\n\t\t\t\treturn 4000;\n\t\t}\n\t}\n\n\tclearToast(): void {\n\t\tthis.activeToast = null;\n\t\tthis.toastQueue = [];\n\t\tthis.unseenAlertCount = 0;\n\t}\n\n\tgetToastHistory(limit = 5): FooterToast[] {\n\t\tconst active = this.activeToast ? [this.activeToast] : [];\n\t\treturn [...active, ...this.toastQueue].slice(0, limit);\n\t}\n\n\tgetUnseenAlertCount(): number {\n\t\treturn this.unseenAlertCount;\n\t}\n\n\tclearAlertCount(): void {\n\t\tthis.unseenAlertCount = 0;\n\t}\n\n\tclearAlerts(): void {\n\t\tthis.clearToast();\n\t\tthis.unseenAlertCount = 0;\n\t}\n\n\tgetActiveToast(): FooterToast | null {\n\t\treturn this.activeToast;\n\t}\n\n\tprivate enqueueToast(toast: ToastQueueItem): void {\n\t\tconst priority = this.toastPriority(toast.tone);\n\t\tlet inserted = false;\n\t\tfor (let i = 0; i < this.toastQueue.length; i++) {\n\t\t\tif (priority > this.toastPriority(this.toastQueue[i]!.tone)) {\n\t\t\t\tthis.toastQueue.splice(i, 0, toast);\n\t\t\t\tinserted = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!inserted) {\n\t\t\tthis.toastQueue.push(toast);\n\t\t}\n\t}\n\n\tprivate dequeueToast(): void {\n\t\tif (this.activeToast) return;\n\t\tconst next = this.toastQueue.shift();\n\t\tif (next) {\n\t\t\tthis.activeToast = next;\n\t\t}\n\t}\n\n\tprivate toastPriority(tone: FooterToast[\"tone\"]): number {\n\t\tswitch (tone) {\n\t\t\tcase \"danger\":\n\t\t\t\treturn 4;\n\t\t\tcase \"warn\":\n\t\t\t\treturn 3;\n\t\t\tcase \"success\":\n\t\t\t\treturn 2;\n\t\t\tdefault:\n\t\t\t\treturn 1;\n\t\t}\n\t}\n\n\t/**\n\t * Begin watching for git branch changes and invoke a callback when the\n\t * branch changes so the UI can re-render.\n\t */\n\tstartBranchTracking(onBranchChange?: () => void): void {\n\t\tthis.currentBranch = this.gitBranchTracker.getCurrentBranch();\n\t\tthis.gitBranchTracker.watchBranch(() => {\n\t\t\tthis.gitBranchTracker.invalidate();\n\t\t\tthis.currentBranch = this.gitBranchTracker.getCurrentBranch();\n\t\t\tonBranchChange?.();\n\t\t});\n\t}\n\n\tdispose(): void {\n\t\tthis.gitBranchTracker.dispose();\n\t}\n\n\tsetMode(mode: FooterMode): void {\n\t\tthis.mode = mode;\n\t}\n\n\tgetMode(): FooterMode {\n\t\treturn this.mode;\n\t}\n\n\trender(width: number): string[] {\n\t\t// Refresh branch cache if needed\n\t\tif (this.currentBranch === undefined) {\n\t\t\tthis.currentBranch = this.gitBranchTracker.getCurrentBranch();\n\t\t}\n\t\tconst branch = this.currentBranch ?? null;\n\n\t\t// Check for expired toast\n\t\tif (this.activeToast && Date.now() > this.activeToast.expiry) {\n\t\t\tthis.activeToast = null;\n\t\t}\n\n\t\tconst stats = calculateFooterStats(this.state);\n\t\tif (this.mode === \"solo\") {\n\t\t\treturn this.renderSoloFooter(stats, width);\n\t\t}\n\n\t\t// New footer layout with horizontal rules\n\t\tconst rule = buildHorizontalRule(width);\n\t\tconst brandLine = buildBrandLine(width, this.state);\n\t\tconst pathStatsLine = buildPathAndStatsLine(\n\t\t\tprocess.cwd(),\n\t\t\tstats,\n\t\t\twidth,\n\t\t\tbranch,\n\t\t\tthis.activeStage,\n\t\t);\n\n\t\tconst lines = [rule, brandLine, rule, pathStatsLine];\n\n\t\t// Render Toast if active, otherwise Hints\n\t\tif (this.activeToast) {\n\t\t\tconst { message, tone } = this.activeToast;\n\t\t\tlet coloredMessage: string;\n\t\t\tlet prefix = \"\";\n\n\t\t\tswitch (tone) {\n\t\t\t\tcase \"info\":\n\t\t\t\t\tprefix = theme.fg(\"accent\", \"ℹ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"text\", message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"warn\":\n\t\t\t\t\tprefix = theme.fg(\"warning\", \"⚠ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"warning\", message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"success\":\n\t\t\t\t\tprefix = theme.fg(\"success\", \"✔ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"success\", message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"danger\":\n\t\t\t\t\tprefix = theme.fg(\"error\", \"✖ \");\n\t\t\t\t\tcoloredMessage = theme.fg(\"error\", message);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst fullMessage = `${prefix}${coloredMessage}`;\n\t\t\tlines.push(this.truncateToWidth(fullMessage, width));\n\t\t} else {\n\t\t\t// Use new multi-hint system\n\t\t\tconst mergedHint = mergeHints(stats, this.hints, width);\n\t\t\tif (mergedHint) {\n\t\t\t\tconst truncated = this.truncateToWidth(mergedHint, width);\n\t\t\t\tlines.push(chalk.hex(\"#94a3b8\")(truncated));\n\t\t\t}\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\tprivate truncateToWidth(text: string, width: number): string {\n\t\tif (width <= 0) return \"\";\n\t\tif (visibleWidth(text) <= width) return text;\n\t\tif (width === 1) return text.slice(0, 1);\n\t\tlet result = text;\n\t\twhile (visibleWidth(result) > width - 1 && result.length > 0) {\n\t\t\tresult = result.slice(0, -1);\n\t\t}\n\t\treturn `${result.trimEnd()}…`;\n\t}\n\n\tprivate renderSoloFooter(stats: FooterStats, width: number): string[] {\n\t\tconst branch = this.currentBranch ?? null;\n\t\tconst pathLine = chalk.gray(\n\t\t\tformatPathWithBranch(process.cwd(), width, branch),\n\t\t);\n\t\tconst statsLine = buildSoloStatsLine(stats, width, this.state);\n\t\treturn [pathLine, chalk.gray(statsLine)];\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow-controller.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/oauth/oauth-flow-controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,GAAG,EAAQ,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAgBhE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,aAAa,EAAE,SAAS,CAAC;IACzB,EAAE,EAAE,GAAG,CAAC;IACR,aAAa,IAAI,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAC1C,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,kBAAkB,CAAC;IAClC,eAAe,EAAE,oBAAoB,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;IACvD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAC,CAAoB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAoB;gBAEhC,OAAO,EAAE,0BAA0B;IAO/C;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACG,kBAAkB,CACvB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-flow-controller.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/oauth/oauth-flow-controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,GAAG,EAAQ,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAgBhE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,aAAa,EAAE,SAAS,CAAC;IACzB,EAAE,EAAE,GAAG,CAAC;IACR,aAAa,IAAI,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAC1C,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,kBAAkB,CAAC;IAClC,eAAe,EAAE,oBAAoB,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;IACvD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAC,CAAoB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAoB;gBAEhC,OAAO,EAAE,0BAA0B;IAO/C;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACG,kBAAkB,CACvB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IA6GhB;;OAEG;IACG,mBAAmB,CACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC;IAqEhB;;OAEG;IACG,gCAAgC,CACrC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC;YAyEF,iBAAiB;YA8NjB,kBAAkB;CAuBhC"}
|
|
@@ -46,15 +46,21 @@ export class OAuthFlowController {
|
|
|
46
46
|
// Parse argument as a provider. Anthropic-specific mode arguments were
|
|
47
47
|
// retired with Anthropic OAuth login support.
|
|
48
48
|
let requestedProvider;
|
|
49
|
+
let requestedMode;
|
|
49
50
|
if (args) {
|
|
50
51
|
if (args.includes(":")) {
|
|
51
52
|
const parts = args.split(":").map((s) => s.trim());
|
|
52
53
|
requestedProvider = parts[0];
|
|
53
54
|
const mode = parts[1];
|
|
54
55
|
if (mode) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
if (requestedProvider === "openai-codex" && mode === "responses") {
|
|
57
|
+
requestedMode = mode;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.isOAuthFlowActive = false;
|
|
61
|
+
showError("Provider login modes are no longer supported, except /login openai-codex:responses for legacy Codex Responses credentials.");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
58
64
|
}
|
|
59
65
|
}
|
|
60
66
|
else {
|
|
@@ -74,7 +80,7 @@ export class OAuthFlowController {
|
|
|
74
80
|
}
|
|
75
81
|
const defaultProvider = providers.find((provider) => provider.id === "openai-codex");
|
|
76
82
|
if (!requestedProvider && defaultProvider) {
|
|
77
|
-
await this.performOAuthLogin(defaultProvider.id,
|
|
83
|
+
await this.performOAuthLogin(defaultProvider.id, requestedMode, showError);
|
|
78
84
|
return;
|
|
79
85
|
}
|
|
80
86
|
// If only one provider or specific provider requested, use it directly
|
|
@@ -88,7 +94,7 @@ export class OAuthFlowController {
|
|
|
88
94
|
showError(`Unknown provider: ${requestedProvider}`);
|
|
89
95
|
return;
|
|
90
96
|
}
|
|
91
|
-
await this.performOAuthLogin(provider.id,
|
|
97
|
+
await this.performOAuthLogin(provider.id, requestedMode, showError);
|
|
92
98
|
return;
|
|
93
99
|
}
|
|
94
100
|
// Multiple providers - show selector
|
|
@@ -123,9 +129,9 @@ export class OAuthFlowController {
|
|
|
123
129
|
const args = argumentText.trim().toLowerCase();
|
|
124
130
|
const requestedProvider = args || null;
|
|
125
131
|
// Import OAuth system
|
|
126
|
-
const {
|
|
132
|
+
const { listOAuthLogoutProvidersWithCodexAppServer } = await import("../../oauth/index.js");
|
|
127
133
|
// Get logged-in providers
|
|
128
|
-
const loggedInProviders =
|
|
134
|
+
const loggedInProviders = await listOAuthLogoutProvidersWithCodexAppServer();
|
|
129
135
|
if (loggedInProviders.length === 0) {
|
|
130
136
|
this.isOAuthFlowActive = false;
|
|
131
137
|
showInfo("No OAuth providers logged in. Use /login first.");
|
|
@@ -150,6 +156,7 @@ export class OAuthFlowController {
|
|
|
150
156
|
modalManager: this.modalManager,
|
|
151
157
|
ui: this.renderContext.ui,
|
|
152
158
|
mode: "logout",
|
|
159
|
+
providers: loggedInProviders,
|
|
153
160
|
onProviderSelected: async (providerId) => {
|
|
154
161
|
try {
|
|
155
162
|
await this.performOAuthLogout(providerId, showError);
|
|
@@ -235,7 +242,7 @@ export class OAuthFlowController {
|
|
|
235
242
|
requestRender();
|
|
236
243
|
try {
|
|
237
244
|
await login(providerId, {
|
|
238
|
-
mode
|
|
245
|
+
mode,
|
|
239
246
|
onStatus: (status) => {
|
|
240
247
|
chatContainer.addChild(new Spacer(1));
|
|
241
248
|
chatContainer.addChild(new Text(status, 1, 0));
|
|
@@ -343,8 +350,11 @@ export class OAuthFlowController {
|
|
|
343
350
|
},
|
|
344
351
|
});
|
|
345
352
|
this.notificationView.showToast(`Successfully authenticated with ${providerId}!`, "success");
|
|
353
|
+
const completionMessage = providerId === "openai-codex" && mode !== "responses"
|
|
354
|
+
? "Authentication complete. Codex app-server sign-in is ready."
|
|
355
|
+
: `Authentication complete. ${providerId} OAuth credentials saved.`;
|
|
346
356
|
chatContainer.addChild(new Spacer(1));
|
|
347
|
-
chatContainer.addChild(new Text(
|
|
357
|
+
chatContainer.addChild(new Text(completionMessage, 1, 0));
|
|
348
358
|
requestRender();
|
|
349
359
|
}
|
|
350
360
|
catch (error) {
|
|
@@ -373,9 +383,12 @@ export class OAuthFlowController {
|
|
|
373
383
|
try {
|
|
374
384
|
const { logout } = await import("../../oauth/index.js");
|
|
375
385
|
await logout(providerId);
|
|
376
|
-
|
|
386
|
+
const message = providerId === "openai-codex"
|
|
387
|
+
? "Signed out from openai-codex"
|
|
388
|
+
: `${providerId} OAuth credentials removed`;
|
|
389
|
+
this.notificationView.showToast(message, "success");
|
|
377
390
|
chatContainer.addChild(new Spacer(1));
|
|
378
|
-
chatContainer.addChild(new Text(
|
|
391
|
+
chatContainer.addChild(new Text(message, 1, 0));
|
|
379
392
|
requestRender();
|
|
380
393
|
}
|
|
381
394
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow-controller.js","sourceRoot":"","sources":["../../../src/cli-tui/oauth/oauth-flow-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { Spacer, type TUI, Text } from \"@evalops/tui\";\nimport type { Container } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport { theme } from \"../../theme/theme.js\";\nimport type { ModalManager } from \"../modal-manager.js\";\nimport type { NotificationView } from \"../notification-view.js\";\nimport { OAuthSelectorView } from \"../selectors/oauth-selector-view.js\";\nimport { formatLink } from \"../utils/links.js\";\n\nconst OSC52_PREFIX = \"\\u001b]52;c;\";\nconst OSC52_SUFFIX = \"\\u0007\";\n\nfunction copyToOsc52(value: string): boolean {\n\tif (!process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\tconst base64 = Buffer.from(value).toString(\"base64\");\n\tprocess.stdout.write(`${OSC52_PREFIX}${base64}${OSC52_SUFFIX}`);\n\treturn true;\n}\n\n/**\n * Callback interface for editor interactions during OAuth flow.\n */\nexport interface OAuthEditorCallbacks {\n\tclearEditor(): void;\n\tgetText(): string;\n\tsetText(text: string): void;\n\tonSubmit: ((text: string) => void) | undefined;\n}\n\n/**\n * Context for rendering OAuth UI elements.\n */\nexport interface OAuthRenderContext {\n\tchatContainer: Container;\n\tui: TUI;\n\trequestRender(): void;\n}\n\n/**\n * Options for the OAuth flow controller.\n */\nexport interface OAuthFlowControllerOptions {\n\tmodalManager: ModalManager;\n\tnotificationView: NotificationView;\n\trenderContext: OAuthRenderContext;\n\teditorCallbacks: OAuthEditorCallbacks;\n}\n\n/**\n * Controller for handling OAuth login and logout flows.\n *\n * Extracts OAuth flow logic from TuiRenderer to provide a cohesive unit\n * for authentication operations.\n */\nexport class OAuthFlowController {\n\tprivate readonly modalManager: ModalManager;\n\tprivate readonly notificationView: NotificationView;\n\tprivate readonly renderContext: OAuthRenderContext;\n\tprivate readonly editorCallbacks: OAuthEditorCallbacks;\n\tprivate isOAuthFlowActive = false;\n\tprivate oauthLoginView?: OAuthSelectorView;\n\tprivate oauthLogoutView?: OAuthSelectorView;\n\n\tconstructor(options: OAuthFlowControllerOptions) {\n\t\tthis.modalManager = options.modalManager;\n\t\tthis.notificationView = options.notificationView;\n\t\tthis.renderContext = options.renderContext;\n\t\tthis.editorCallbacks = options.editorCallbacks;\n\t}\n\n\t/**\n\t * Check if an OAuth flow is currently active.\n\t */\n\tisActive(): boolean {\n\t\treturn this.isOAuthFlowActive;\n\t}\n\n\t/**\n\t * Handle the /login command.\n\t */\n\tasync handleLoginCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\n\t\t// Parse argument as a provider. Anthropic-specific mode arguments were\n\t\t// retired with Anthropic OAuth login support.\n\t\tlet requestedProvider: string | undefined;\n\n\t\tif (args) {\n\t\t\tif (args.includes(\":\")) {\n\t\t\t\tconst parts = args.split(\":\").map((s) => s.trim());\n\t\t\t\trequestedProvider = parts[0];\n\t\t\t\tconst mode = parts[1];\n\t\t\t\tif (mode) {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t\tshowError(\n\t\t\t\t\t\t\"Provider login modes are no longer supported. Use /login openai-codex for Codex auth or /login openai for OpenAI Platform auth.\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequestedProvider = args;\n\t\t\t}\n\t\t}\n\n\t\t// Import OAuth system\n\t\tconst { getOAuthProviders, migrateOAuthCredentials } = await import(\n\t\t\t\"../../oauth/index.js\"\n\t\t);\n\n\t\t// Migrate old credentials if needed\n\t\tawait migrateOAuthCredentials();\n\n\t\t// Get available providers\n\t\tconst providers = getOAuthProviders().filter((p) => p.available);\n\n\t\tif (providers.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowError(\"No OAuth providers available\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst defaultProvider = providers.find(\n\t\t\t(provider) => provider.id === \"openai-codex\",\n\t\t);\n\t\tif (!requestedProvider && defaultProvider) {\n\t\t\tawait this.performOAuthLogin(defaultProvider.id, undefined, showError);\n\t\t\treturn;\n\t\t}\n\n\t\t// If only one provider or specific provider requested, use it directly\n\t\tif (providers.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? (providers.find((p) => p.id === requestedProvider) ??\n\t\t\t\t\tproviders.find((p) => p.id.includes(requestedProvider)))\n\t\t\t\t: providers[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Unknown provider: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogin(provider.id, undefined, showError);\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLoginView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"login\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogin(\n\t\t\t\t\t\tproviderId as SupportedOAuthProvider,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tshowError,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Login cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLoginView.show();\n\t}\n\n\t/**\n\t * Handle the /logout command.\n\t */\n\tasync handleLogoutCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\t\tconst requestedProvider = args || null;\n\n\t\t// Import OAuth system\n\t\tconst { listOAuthLogoutProviders } = await import(\"../../oauth/index.js\");\n\n\t\t// Get logged-in providers\n\t\tconst loggedInProviders = listOAuthLogoutProviders();\n\n\t\tif (loggedInProviders.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowInfo(\"No OAuth providers logged in. Use /login first.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// If specific provider requested or only one logged in, use it directly\n\t\tif (loggedInProviders.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? loggedInProviders.find(\n\t\t\t\t\t\t(p) => p === requestedProvider || p.includes(requestedProvider),\n\t\t\t\t\t)\n\t\t\t\t: loggedInProviders[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Not logged in to: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogout(provider, showError);\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLogoutView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"logout\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogout(providerId, showError);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Logout cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLogoutView.show();\n\t}\n\n\t/**\n\t * Handle the /auth source-of-truth command.\n\t */\n\tasync handleSourceOfTruthPolicyCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst args = argumentText.trim().split(/\\s+/).filter(Boolean);\n\t\tconst usage =\n\t\t\t\"Usage: /auth source-of-truth <provider> <area> [fallbackConnectionId]\\n\" +\n\t\t\t\" /auth source-of-truth clear <provider>\\n\" +\n\t\t\t\"Areas: analytics, billing, crm, hris, support\";\n\t\tif (\n\t\t\targs.length === 0 ||\n\t\t\t[\"help\", \"?\", \"-h\", \"--help\"].includes(args[0]?.toLowerCase() ?? \"\")\n\t\t) {\n\t\t\tshowInfo(usage);\n\t\t\treturn;\n\t\t}\n\n\t\tconst subcommand = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tif ([\"clear\", \"unset\", \"remove\"].includes(subcommand ?? \"\")) {\n\t\t\t\tconst provider = args[1];\n\t\t\t\tif (!provider || args.length > 2) {\n\t\t\t\t\tshowError(usage);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { clearOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t\t);\n\t\t\t\tconst cleared = clearOAuthProviderSourceOfTruthPolicy(provider);\n\t\t\t\tshowInfo(\n\t\t\t\t\tcleared\n\t\t\t\t\t\t? `Source-of-truth policy metadata cleared for ${provider}.`\n\t\t\t\t\t\t: `No source-of-truth policy metadata was set for ${provider}.`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst provider = args[0];\n\t\t\tconst area = args[1];\n\t\t\tconst fallbackConnectionId = args[2];\n\t\t\tif (!provider || !area || args.length > 3) {\n\t\t\t\tshowError(usage);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { configureOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t);\n\t\t\tconst configured = await configureOAuthProviderSourceOfTruthPolicy(\n\t\t\t\tprovider,\n\t\t\t\t{ area, fallbackConnectionId },\n\t\t\t);\n\t\t\tconst details = [\n\t\t\t\t`Source-of-truth policy configured for ${configured.provider}.`,\n\t\t\t\t`Area: ${configured.area}`,\n\t\t\t\t...(configured.fallbackConnectionId\n\t\t\t\t\t? [`Fallback connection: ${configured.fallbackConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.connectorConnectionId\n\t\t\t\t\t? [`Connector connection: ${configured.connectorConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.primaryConnectionId\n\t\t\t\t\t? [`Platform primary connection: ${configured.primaryConnectionId}`]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"Platform policy will sync when the connector service is configured and reachable.\",\n\t\t\t\t\t\t]),\n\t\t\t\t...(configured.workspaceId\n\t\t\t\t\t? [`Workspace: ${configured.workspaceId}`]\n\t\t\t\t\t: []),\n\t\t\t];\n\t\t\tshowInfo(details.join(\"\\n\"));\n\t\t} catch (error) {\n\t\t\tshowError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\n\tprivate async performOAuthLogin(\n\t\tproviderId: SupportedOAuthProvider,\n\t\tmode: string | undefined,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { login } = await import(\"../../oauth/index.js\");\n\n\t\tconst { chatContainer, ui, requestRender } = this.renderContext;\n\t\tconst requiresPromptCode = providerId === \"openai-codex\";\n\n\t\tchatContainer.addChild(new Spacer(1));\n\t\tchatContainer.addChild(new Text(`Logging in to ${providerId}...`, 1, 0));\n\t\trequestRender();\n\n\t\ttry {\n\t\t\tawait login(providerId, {\n\t\t\t\tmode: mode as \"pro\" | \"console\" | undefined,\n\t\t\t\tonStatus: (status: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(status, 1, 0));\n\t\t\t\t\trequestRender();\n\t\t\t\t},\n\t\t\t\tonAuthUrl: (url: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Opening browser to:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"accent\", formatLink(url, \"Open login URL\")),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\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\tchatContainer.addChild(new Text(url, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(url)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tif (requiresPromptCode) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser. If asked, paste the redirect URL or authorization code below.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser, then return here.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\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\trequestRender();\n\n\t\t\t\t\t// Auto-open browser using execFile for security\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\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},\n\t\t\t\tonDeviceCode: (code: string, verificationUri: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Authenticate by visiting:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\t\t\tformatLink(verificationUri, \"Open verification URL\"),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\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\tchatContainer.addChild(new Text(verificationUri, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(verificationUri)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(`Enter code: ${code}`, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\tnew Text(\"Waiting for authorization...\", 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\trequestRender();\n\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\"\n\t\t\t\t\t\t\t? [\"/c\", \"start\", \"\", verificationUri]\n\t\t\t\t\t\t\t: [verificationUri];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\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},\n\t\t\t\tonPromptCode: async () => {\n\t\t\t\t\tconst originalOnSubmit = this.editorCallbacks.onSubmit;\n\t\t\t\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\t\t\t\tconst timeout = setTimeout(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow timed out after 5 minutes\"));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = (text) => {\n\t\t\t\t\t\t\tconst trimmedText = text.trim();\n\n\t\t\t\t\t\t\tif (trimmedText.toLowerCase() === \"cancel\") {\n\t\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow cancelled by user\"));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Basic authorization code validation. OpenAI Codex also accepts\n\t\t\t\t\t\t\t// a full redirect URL for the manual fallback path.\n\t\t\t\t\t\t\tconst looksLikeOAuthValue =\n\t\t\t\t\t\t\t\tproviderId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? trimmedText.length >= 10 &&\n\t\t\t\t\t\t\t\t\t\t(trimmedText.startsWith(\"http://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.startsWith(\"https://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.includes(\"code=\") ||\n\t\t\t\t\t\t\t\t\t\t\t/^[a-zA-Z0-9_#-]+$/.test(trimmedText))\n\t\t\t\t\t\t\t\t\t: false;\n\t\t\t\t\t\t\tif (!looksLikeOAuthValue) {\n\t\t\t\t\t\t\t\tthis.notificationView.showError(\n\t\t\t\t\t\t\t\t\t\"Invalid authorization code format. Please try again or type 'cancel'.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\tresolve(trimmedText);\n\t\t\t\t\t\t};\n\t\t\t\t\t}).finally(() => {\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = originalOnSubmit;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`Successfully authenticated with ${providerId}!`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`Authentication complete. ${providerId} OAuth credentials saved.`,\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Login failed\";\n\n\t\t\tlet errorDetail = message;\n\t\t\tif (message.includes(\"timeout\")) {\n\t\t\t\terrorDetail = \"OAuth flow timed out after 5 minutes. Please try again.\";\n\t\t\t} else if (message.includes(\"cancel\")) {\n\t\t\t\terrorDetail = \"OAuth flow cancelled by user.\";\n\t\t\t} else if (message.includes(\"Invalid\") || message.includes(\"failed\")) {\n\t\t\t\terrorDetail = `${message}. The authorization code may be expired or invalid.`;\n\t\t\t}\n\n\t\t\tshowError(errorDetail);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(new Text(`Login failed: ${errorDetail}`, 1, 0));\n\t\t\trequestRender();\n\t\t} finally {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t}\n\t}\n\n\tprivate async performOAuthLogout(\n\t\tproviderId: OAuthLogoutProvider,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { chatContainer, requestRender } = this.renderContext;\n\n\t\ttry {\n\t\t\tconst { logout } = await import(\"../../oauth/index.js\");\n\t\t\tawait logout(providerId);\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`${providerId} OAuth credentials removed`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`Logged out from ${providerId}. OAuth credentials removed.`,\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Logout failed\";\n\t\t\tshowError(message);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oauth-flow-controller.js","sourceRoot":"","sources":["../../../src/cli-tui/oauth/oauth-flow-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { Spacer, type TUI, Text } from \"@evalops/tui\";\nimport type { Container } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport { theme } from \"../../theme/theme.js\";\nimport type { ModalManager } from \"../modal-manager.js\";\nimport type { NotificationView } from \"../notification-view.js\";\nimport { OAuthSelectorView } from \"../selectors/oauth-selector-view.js\";\nimport { formatLink } from \"../utils/links.js\";\n\nconst OSC52_PREFIX = \"\\u001b]52;c;\";\nconst OSC52_SUFFIX = \"\\u0007\";\n\nfunction copyToOsc52(value: string): boolean {\n\tif (!process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\tconst base64 = Buffer.from(value).toString(\"base64\");\n\tprocess.stdout.write(`${OSC52_PREFIX}${base64}${OSC52_SUFFIX}`);\n\treturn true;\n}\n\n/**\n * Callback interface for editor interactions during OAuth flow.\n */\nexport interface OAuthEditorCallbacks {\n\tclearEditor(): void;\n\tgetText(): string;\n\tsetText(text: string): void;\n\tonSubmit: ((text: string) => void) | undefined;\n}\n\n/**\n * Context for rendering OAuth UI elements.\n */\nexport interface OAuthRenderContext {\n\tchatContainer: Container;\n\tui: TUI;\n\trequestRender(): void;\n}\n\n/**\n * Options for the OAuth flow controller.\n */\nexport interface OAuthFlowControllerOptions {\n\tmodalManager: ModalManager;\n\tnotificationView: NotificationView;\n\trenderContext: OAuthRenderContext;\n\teditorCallbacks: OAuthEditorCallbacks;\n}\n\n/**\n * Controller for handling OAuth login and logout flows.\n *\n * Extracts OAuth flow logic from TuiRenderer to provide a cohesive unit\n * for authentication operations.\n */\nexport class OAuthFlowController {\n\tprivate readonly modalManager: ModalManager;\n\tprivate readonly notificationView: NotificationView;\n\tprivate readonly renderContext: OAuthRenderContext;\n\tprivate readonly editorCallbacks: OAuthEditorCallbacks;\n\tprivate isOAuthFlowActive = false;\n\tprivate oauthLoginView?: OAuthSelectorView;\n\tprivate oauthLogoutView?: OAuthSelectorView;\n\n\tconstructor(options: OAuthFlowControllerOptions) {\n\t\tthis.modalManager = options.modalManager;\n\t\tthis.notificationView = options.notificationView;\n\t\tthis.renderContext = options.renderContext;\n\t\tthis.editorCallbacks = options.editorCallbacks;\n\t}\n\n\t/**\n\t * Check if an OAuth flow is currently active.\n\t */\n\tisActive(): boolean {\n\t\treturn this.isOAuthFlowActive;\n\t}\n\n\t/**\n\t * Handle the /login command.\n\t */\n\tasync handleLoginCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\n\t\t// Parse argument as a provider. Anthropic-specific mode arguments were\n\t\t// retired with Anthropic OAuth login support.\n\t\tlet requestedProvider: string | undefined;\n\t\tlet requestedMode: string | undefined;\n\n\t\tif (args) {\n\t\t\tif (args.includes(\":\")) {\n\t\t\t\tconst parts = args.split(\":\").map((s) => s.trim());\n\t\t\t\trequestedProvider = parts[0];\n\t\t\t\tconst mode = parts[1];\n\t\t\t\tif (mode) {\n\t\t\t\t\tif (requestedProvider === \"openai-codex\" && mode === \"responses\") {\n\t\t\t\t\t\trequestedMode = mode;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\t\"Provider login modes are no longer supported, except /login openai-codex:responses for legacy Codex Responses credentials.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequestedProvider = args;\n\t\t\t}\n\t\t}\n\n\t\t// Import OAuth system\n\t\tconst { getOAuthProviders, migrateOAuthCredentials } = await import(\n\t\t\t\"../../oauth/index.js\"\n\t\t);\n\n\t\t// Migrate old credentials if needed\n\t\tawait migrateOAuthCredentials();\n\n\t\t// Get available providers\n\t\tconst providers = getOAuthProviders().filter((p) => p.available);\n\n\t\tif (providers.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowError(\"No OAuth providers available\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst defaultProvider = providers.find(\n\t\t\t(provider) => provider.id === \"openai-codex\",\n\t\t);\n\t\tif (!requestedProvider && defaultProvider) {\n\t\t\tawait this.performOAuthLogin(\n\t\t\t\tdefaultProvider.id,\n\t\t\t\trequestedMode,\n\t\t\t\tshowError,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// If only one provider or specific provider requested, use it directly\n\t\tif (providers.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? (providers.find((p) => p.id === requestedProvider) ??\n\t\t\t\t\tproviders.find((p) => p.id.includes(requestedProvider)))\n\t\t\t\t: providers[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Unknown provider: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogin(provider.id, requestedMode, showError);\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLoginView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"login\",\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogin(\n\t\t\t\t\t\tproviderId as SupportedOAuthProvider,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tshowError,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Login cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLoginView.show();\n\t}\n\n\t/**\n\t * Handle the /logout command.\n\t */\n\tasync handleLogoutCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tif (this.isOAuthFlowActive) {\n\t\t\tshowError(\n\t\t\t\t\"An OAuth flow is already in progress. Please complete or cancel it first.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOAuthFlowActive = true;\n\n\t\tconst args = argumentText.trim().toLowerCase();\n\t\tconst requestedProvider = args || null;\n\n\t\t// Import OAuth system\n\t\tconst { listOAuthLogoutProvidersWithCodexAppServer } = await import(\n\t\t\t\"../../oauth/index.js\"\n\t\t);\n\n\t\t// Get logged-in providers\n\t\tconst loggedInProviders =\n\t\t\tawait listOAuthLogoutProvidersWithCodexAppServer();\n\n\t\tif (loggedInProviders.length === 0) {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\tshowInfo(\"No OAuth providers logged in. Use /login first.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// If specific provider requested or only one logged in, use it directly\n\t\tif (loggedInProviders.length === 1 || requestedProvider) {\n\t\t\tconst provider = requestedProvider\n\t\t\t\t? loggedInProviders.find(\n\t\t\t\t\t\t(p) => p === requestedProvider || p.includes(requestedProvider),\n\t\t\t\t\t)\n\t\t\t\t: loggedInProviders[0];\n\n\t\t\tif (!provider) {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tshowError(`Not logged in to: ${requestedProvider}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait this.performOAuthLogout(provider, showError);\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Multiple providers - show selector\n\t\tthis.oauthLogoutView = new OAuthSelectorView({\n\t\t\tmodalManager: this.modalManager,\n\t\t\tui: this.renderContext.ui,\n\t\t\tmode: \"logout\",\n\t\t\tproviders: loggedInProviders,\n\t\t\tonProviderSelected: async (providerId) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.performOAuthLogout(providerId, showError);\n\t\t\t\t} finally {\n\t\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel: () => {\n\t\t\t\tthis.isOAuthFlowActive = false;\n\t\t\t\tthis.notificationView.showInfo(\"Logout cancelled\");\n\t\t\t},\n\t\t});\n\n\t\tthis.oauthLogoutView.show();\n\t}\n\n\t/**\n\t * Handle the /auth source-of-truth command.\n\t */\n\tasync handleSourceOfTruthPolicyCommand(\n\t\targumentText: string,\n\t\tshowError: (msg: string) => void,\n\t\tshowInfo: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst args = argumentText.trim().split(/\\s+/).filter(Boolean);\n\t\tconst usage =\n\t\t\t\"Usage: /auth source-of-truth <provider> <area> [fallbackConnectionId]\\n\" +\n\t\t\t\" /auth source-of-truth clear <provider>\\n\" +\n\t\t\t\"Areas: analytics, billing, crm, hris, support\";\n\t\tif (\n\t\t\targs.length === 0 ||\n\t\t\t[\"help\", \"?\", \"-h\", \"--help\"].includes(args[0]?.toLowerCase() ?? \"\")\n\t\t) {\n\t\t\tshowInfo(usage);\n\t\t\treturn;\n\t\t}\n\n\t\tconst subcommand = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tif ([\"clear\", \"unset\", \"remove\"].includes(subcommand ?? \"\")) {\n\t\t\t\tconst provider = args[1];\n\t\t\t\tif (!provider || args.length > 2) {\n\t\t\t\t\tshowError(usage);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { clearOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t\t);\n\t\t\t\tconst cleared = clearOAuthProviderSourceOfTruthPolicy(provider);\n\t\t\t\tshowInfo(\n\t\t\t\t\tcleared\n\t\t\t\t\t\t? `Source-of-truth policy metadata cleared for ${provider}.`\n\t\t\t\t\t\t: `No source-of-truth policy metadata was set for ${provider}.`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst provider = args[0];\n\t\t\tconst area = args[1];\n\t\t\tconst fallbackConnectionId = args[2];\n\t\t\tif (!provider || !area || args.length > 3) {\n\t\t\t\tshowError(usage);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { configureOAuthProviderSourceOfTruthPolicy } = await import(\n\t\t\t\t\"../../oauth/connectors.js\"\n\t\t\t);\n\t\t\tconst configured = await configureOAuthProviderSourceOfTruthPolicy(\n\t\t\t\tprovider,\n\t\t\t\t{ area, fallbackConnectionId },\n\t\t\t);\n\t\t\tconst details = [\n\t\t\t\t`Source-of-truth policy configured for ${configured.provider}.`,\n\t\t\t\t`Area: ${configured.area}`,\n\t\t\t\t...(configured.fallbackConnectionId\n\t\t\t\t\t? [`Fallback connection: ${configured.fallbackConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.connectorConnectionId\n\t\t\t\t\t? [`Connector connection: ${configured.connectorConnectionId}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(configured.primaryConnectionId\n\t\t\t\t\t? [`Platform primary connection: ${configured.primaryConnectionId}`]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"Platform policy will sync when the connector service is configured and reachable.\",\n\t\t\t\t\t\t]),\n\t\t\t\t...(configured.workspaceId\n\t\t\t\t\t? [`Workspace: ${configured.workspaceId}`]\n\t\t\t\t\t: []),\n\t\t\t];\n\t\t\tshowInfo(details.join(\"\\n\"));\n\t\t} catch (error) {\n\t\t\tshowError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\n\tprivate async performOAuthLogin(\n\t\tproviderId: SupportedOAuthProvider,\n\t\tmode: string | undefined,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { login } = await import(\"../../oauth/index.js\");\n\n\t\tconst { chatContainer, ui, requestRender } = this.renderContext;\n\t\tconst requiresPromptCode = providerId === \"openai-codex\";\n\n\t\tchatContainer.addChild(new Spacer(1));\n\t\tchatContainer.addChild(new Text(`Logging in to ${providerId}...`, 1, 0));\n\t\trequestRender();\n\n\t\ttry {\n\t\t\tawait login(providerId, {\n\t\t\t\tmode,\n\t\t\t\tonStatus: (status: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(status, 1, 0));\n\t\t\t\t\trequestRender();\n\t\t\t\t},\n\t\t\t\tonAuthUrl: (url: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Opening browser to:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"accent\", formatLink(url, \"Open login URL\")),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\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\tchatContainer.addChild(new Text(url, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(url)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tif (requiresPromptCode) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser. If asked, paste the redirect URL or authorization code below.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\t\"Complete authentication in the browser, then return here.\",\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\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\trequestRender();\n\n\t\t\t\t\t// Auto-open browser using execFile for security\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\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},\n\t\t\t\tonDeviceCode: (code: string, verificationUri: string) => {\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(new Text(\"Authenticate by visiting:\", 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (process.stdout.isTTY) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\t\t\tformatLink(verificationUri, \"Open verification URL\"),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\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\tchatContainer.addChild(new Text(verificationUri, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tif (copyToOsc52(verificationUri)) {\n\t\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t\t\t\t\"(Clipboard copy requested via OSC-52; paste in browser if supported.)\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t\tchatContainer.addChild(new Text(`Enter code: ${code}`, 1, 0));\n\t\t\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\t\t\tchatContainer.addChild(\n\t\t\t\t\t\tnew Text(\"Waiting for authorization...\", 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\trequestRender();\n\n\t\t\t\t\tconst openCmd =\n\t\t\t\t\t\tprocess.platform === \"darwin\"\n\t\t\t\t\t\t\t? \"open\"\n\t\t\t\t\t\t\t: process.platform === \"win32\"\n\t\t\t\t\t\t\t\t? \"cmd\"\n\t\t\t\t\t\t\t\t: \"xdg-open\";\n\t\t\t\t\tconst args =\n\t\t\t\t\t\tprocess.platform === \"win32\"\n\t\t\t\t\t\t\t? [\"/c\", \"start\", \"\", verificationUri]\n\t\t\t\t\t\t\t: [verificationUri];\n\t\t\t\t\texecFile(openCmd, args, (error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tthis.notificationView.showInfo(\n\t\t\t\t\t\t\t\t\"Could not auto-open browser. Please copy the URL manually.\",\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},\n\t\t\t\tonPromptCode: async () => {\n\t\t\t\t\tconst originalOnSubmit = this.editorCallbacks.onSubmit;\n\t\t\t\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\t\t\t\tconst timeout = setTimeout(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow timed out after 5 minutes\"));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t5 * 60 * 1000,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = (text) => {\n\t\t\t\t\t\t\tconst trimmedText = text.trim();\n\n\t\t\t\t\t\t\tif (trimmedText.toLowerCase() === \"cancel\") {\n\t\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treject(new Error(\"OAuth flow cancelled by user\"));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Basic authorization code validation. OpenAI Codex also accepts\n\t\t\t\t\t\t\t// a full redirect URL for the manual fallback path.\n\t\t\t\t\t\t\tconst looksLikeOAuthValue =\n\t\t\t\t\t\t\t\tproviderId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? trimmedText.length >= 10 &&\n\t\t\t\t\t\t\t\t\t\t(trimmedText.startsWith(\"http://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.startsWith(\"https://\") ||\n\t\t\t\t\t\t\t\t\t\t\ttrimmedText.includes(\"code=\") ||\n\t\t\t\t\t\t\t\t\t\t\t/^[a-zA-Z0-9_#-]+$/.test(trimmedText))\n\t\t\t\t\t\t\t\t\t: false;\n\t\t\t\t\t\t\tif (!looksLikeOAuthValue) {\n\t\t\t\t\t\t\t\tthis.notificationView.showError(\n\t\t\t\t\t\t\t\t\t\"Invalid authorization code format. Please try again or type 'cancel'.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\tthis.editorCallbacks.clearEditor();\n\t\t\t\t\t\t\tresolve(trimmedText);\n\t\t\t\t\t\t};\n\t\t\t\t\t}).finally(() => {\n\t\t\t\t\t\tthis.editorCallbacks.onSubmit = originalOnSubmit;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.notificationView.showToast(\n\t\t\t\t`Successfully authenticated with ${providerId}!`,\n\t\t\t\t\"success\",\n\t\t\t);\n\t\t\tconst completionMessage =\n\t\t\t\tproviderId === \"openai-codex\" && mode !== \"responses\"\n\t\t\t\t\t? \"Authentication complete. Codex app-server sign-in is ready.\"\n\t\t\t\t\t: `Authentication complete. ${providerId} OAuth credentials saved.`;\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(new Text(completionMessage, 1, 0));\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Login failed\";\n\n\t\t\tlet errorDetail = message;\n\t\t\tif (message.includes(\"timeout\")) {\n\t\t\t\terrorDetail = \"OAuth flow timed out after 5 minutes. Please try again.\";\n\t\t\t} else if (message.includes(\"cancel\")) {\n\t\t\t\terrorDetail = \"OAuth flow cancelled by user.\";\n\t\t\t} else if (message.includes(\"Invalid\") || message.includes(\"failed\")) {\n\t\t\t\terrorDetail = `${message}. The authorization code may be expired or invalid.`;\n\t\t\t}\n\n\t\t\tshowError(errorDetail);\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(new Text(`Login failed: ${errorDetail}`, 1, 0));\n\t\t\trequestRender();\n\t\t} finally {\n\t\t\tthis.isOAuthFlowActive = false;\n\t\t}\n\t}\n\n\tprivate async performOAuthLogout(\n\t\tproviderId: OAuthLogoutProvider,\n\t\tshowError: (msg: string) => void,\n\t): Promise<void> {\n\t\tconst { chatContainer, requestRender } = this.renderContext;\n\n\t\ttry {\n\t\t\tconst { logout } = await import(\"../../oauth/index.js\");\n\t\t\tawait logout(providerId);\n\n\t\t\tconst message =\n\t\t\t\tproviderId === \"openai-codex\"\n\t\t\t\t\t? \"Signed out from openai-codex\"\n\t\t\t\t\t: `${providerId} OAuth credentials removed`;\n\t\t\tthis.notificationView.showToast(message, \"success\");\n\t\t\tchatContainer.addChild(new Spacer(1));\n\t\t\tchatContainer.addChild(new Text(message, 1, 0));\n\t\t\trequestRender();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Logout failed\";\n\t\t\tshowError(message);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -5,6 +5,7 @@ interface OAuthSelectorViewOptions {
|
|
|
5
5
|
modalManager: ModalManager;
|
|
6
6
|
ui: TUI;
|
|
7
7
|
mode: "login" | "logout";
|
|
8
|
+
providers?: OAuthLogoutProvider[];
|
|
8
9
|
onProviderSelected: (providerId: SupportedOAuthProvider | OAuthLogoutProvider) => Promise<void>;
|
|
9
10
|
onCancel: () => void;
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector-view.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EACX,mBAAmB,EACnB,sBAAsB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,UAAU,wBAAwB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,EAAE,EAAE,GAAG,CAAC;IACR,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,kBAAkB,EAAE,CACnB,UAAU,EAAE,sBAAsB,GAAG,mBAAmB,KACpD,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAGjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,OAAO,EAAE,wBAAwB;IAE9D,IAAI,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"oauth-selector-view.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EACX,mBAAmB,EACnB,sBAAsB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,UAAU,wBAAwB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,EAAE,EAAE,GAAG,CAAC;IACR,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,kBAAkB,EAAE,CACnB,UAAU,EAAE,sBAAsB,GAAG,mBAAmB,KACpD,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAGjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,OAAO,EAAE,wBAAwB;IAE9D,IAAI,IAAI,IAAI;IAqBZ,OAAO,CAAC,IAAI;CAOZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector-view.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-selector-view.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAa7D,MAAM,OAAO,iBAAiB;IAG7B,YAA6B,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;QAFtD,aAAQ,GAAkC,IAAI,CAAC;IAEU,CAAC;IAElE,IAAI;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,KAAK,EAAE,UAAU,EAAE,EAAE;YACpB,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC,EACD,GAAG,EAAE;YACJ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC,EACD,IAAI,CAAC,OAAO,CAAC,SAAS,CACtB,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,IAAI;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,CAAC;CACD","sourcesContent":["import type { TUI } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport type { ModalManager } from \"../modal-manager.js\";\nimport { OAuthSelectorComponent } from \"./oauth-selector.js\";\n\ninterface OAuthSelectorViewOptions {\n\tmodalManager: ModalManager;\n\tui: TUI;\n\tmode: \"login\" | \"logout\";\n\tproviders?: OAuthLogoutProvider[];\n\tonProviderSelected: (\n\t\tproviderId: SupportedOAuthProvider | OAuthLogoutProvider,\n\t) => Promise<void>;\n\tonCancel: () => void;\n}\n\nexport class OAuthSelectorView {\n\tprivate selector: OAuthSelectorComponent | null = null;\n\n\tconstructor(private readonly options: OAuthSelectorViewOptions) {}\n\n\tshow(): void {\n\t\tif (this.selector) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selector = new OAuthSelectorComponent(\n\t\t\tthis.options.mode,\n\t\t\tasync (providerId) => {\n\t\t\t\tawait this.options.onProviderSelected(providerId);\n\t\t\t\tthis.hide();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis.options.onCancel();\n\t\t\t\tthis.hide();\n\t\t\t},\n\t\t\tthis.options.providers,\n\t\t);\n\n\t\tthis.options.modalManager.push(this.selector);\n\t}\n\n\tprivate hide(): void {\n\t\tif (!this.selector) {\n\t\t\treturn;\n\t\t}\n\t\tthis.options.modalManager.pop();\n\t\tthis.selector = null;\n\t}\n}\n"]}
|
|
@@ -6,11 +6,12 @@ import type { OAuthLogoutProvider } from "../../oauth/index.js";
|
|
|
6
6
|
export declare class OAuthSelectorComponent extends Container {
|
|
7
7
|
private onSelectCallback;
|
|
8
8
|
private onCancelCallback;
|
|
9
|
+
private readonly providerIds?;
|
|
9
10
|
private listContainer;
|
|
10
11
|
private allProviders;
|
|
11
12
|
private selectedIndex;
|
|
12
13
|
private mode;
|
|
13
|
-
constructor(mode: "login" | "logout", onSelectCallback: (providerId: OAuthLogoutProvider) => void, onCancelCallback: () => void);
|
|
14
|
+
constructor(mode: "login" | "logout", onSelectCallback: (providerId: OAuthLogoutProvider) => void, onCancelCallback: () => void, providerIds?: OAuthLogoutProvider[] | undefined);
|
|
14
15
|
private loadProviders;
|
|
15
16
|
private updateList;
|
|
16
17
|
handleInput(keyData: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IAQnD,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IAQnD,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAT9B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,IAAI,CAAqB;gBAGhC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAChB,gBAAgB,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,EAC3D,gBAAgB,EAAE,MAAM,IAAI,EACnB,WAAW,CAAC,EAAE,mBAAmB,EAAE,YAAA;IA6BrD,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,UAAU;IAwClB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA8BlC"}
|
|
@@ -4,10 +4,11 @@ import { getOAuthLogoutProviders, getOAuthProviders, } from "../../oauth/index.j
|
|
|
4
4
|
* Component that renders an OAuth provider selector
|
|
5
5
|
*/
|
|
6
6
|
export class OAuthSelectorComponent extends Container {
|
|
7
|
-
constructor(mode, onSelectCallback, onCancelCallback) {
|
|
7
|
+
constructor(mode, onSelectCallback, onCancelCallback, providerIds) {
|
|
8
8
|
super();
|
|
9
9
|
this.onSelectCallback = onSelectCallback;
|
|
10
10
|
this.onCancelCallback = onCancelCallback;
|
|
11
|
+
this.providerIds = providerIds;
|
|
11
12
|
this.allProviders = [];
|
|
12
13
|
this.selectedIndex = 0;
|
|
13
14
|
this.mode = mode;
|
|
@@ -30,7 +31,9 @@ export class OAuthSelectorComponent extends Container {
|
|
|
30
31
|
loadProviders() {
|
|
31
32
|
// For logout mode, only show providers with credentials
|
|
32
33
|
if (this.mode === "logout") {
|
|
33
|
-
this.allProviders =
|
|
34
|
+
this.allProviders = this.providerIds
|
|
35
|
+
? this.providerIds.map((providerId) => resolveLogoutProviderInfo(providerId))
|
|
36
|
+
: getOAuthLogoutProviders();
|
|
34
37
|
}
|
|
35
38
|
else {
|
|
36
39
|
// For login mode, only show available providers
|
|
@@ -94,4 +97,24 @@ export class OAuthSelectorComponent extends Container {
|
|
|
94
97
|
}
|
|
95
98
|
}
|
|
96
99
|
}
|
|
100
|
+
function resolveLogoutProviderInfo(providerId) {
|
|
101
|
+
const provider = getOAuthProviders().find((candidate) => candidate.id === providerId);
|
|
102
|
+
if (provider) {
|
|
103
|
+
return provider;
|
|
104
|
+
}
|
|
105
|
+
if (providerId === "anthropic") {
|
|
106
|
+
return {
|
|
107
|
+
id: "anthropic",
|
|
108
|
+
name: "Anthropic OAuth",
|
|
109
|
+
description: "Legacy Anthropic OAuth credentials (logout only)",
|
|
110
|
+
available: true,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
id: providerId,
|
|
115
|
+
name: providerId,
|
|
116
|
+
description: "OAuth credentials",
|
|
117
|
+
available: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
97
120
|
//# sourceMappingURL=oauth-selector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAMvD,OAAO,EACN,uBAAuB,EACvB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAMpD,YACC,IAAwB,EAChB,gBAA2D,EAC3D,gBAA4B;
|
|
1
|
+
{"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../src/cli-tui/selectors/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, Spacer, Text } from \"@evalops/tui\";\nimport type {\n\tOAuthLogoutProvider,\n\tOAuthProviderInfo,\n\tSupportedOAuthProvider,\n} from \"../../oauth/index.js\";\nimport {\n\tgetOAuthLogoutProviders,\n\tgetOAuthProviders,\n} from \"../../oauth/index.js\";\n\n/**\n * Component that renders an OAuth provider selector\n */\nexport class OAuthSelectorComponent extends Container {\n\tprivate listContainer: Container;\n\tprivate allProviders: OAuthProviderInfo<OAuthLogoutProvider>[] = [];\n\tprivate selectedIndex = 0;\n\tprivate mode: \"login\" | \"logout\";\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tprivate onSelectCallback: (providerId: OAuthLogoutProvider) => void,\n\t\tprivate onCancelCallback: () => void,\n\t\tprivate readonly providerIds?: OAuthLogoutProvider[],\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\n\t\t// Load providers\n\t\tthis.loadProviders();\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title =\n\t\t\tmode === \"login\"\n\t\t\t\t? \"Select provider to login:\"\n\t\t\t\t: \"Select provider to logout:\";\n\t\tthis.addChild(new Text(title, 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Initial render\n\t\tthis.updateList();\n\t}\n\n\tprivate loadProviders(): void {\n\t\t// For logout mode, only show providers with credentials\n\t\tif (this.mode === \"logout\") {\n\t\t\tthis.allProviders = this.providerIds\n\t\t\t\t? this.providerIds.map((providerId) =>\n\t\t\t\t\t\tresolveLogoutProviderInfo(providerId),\n\t\t\t\t\t)\n\t\t\t\t: getOAuthLogoutProviders();\n\t\t} else {\n\t\t\t// For login mode, only show available providers\n\t\t\tthis.allProviders = getOAuthProviders().filter(\n\t\t\t\t(p): p is OAuthProviderInfo<SupportedOAuthProvider> => p.available,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.allProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.mode === \"login\"\n\t\t\t\t\t? \"No OAuth providers available\"\n\t\t\t\t\t: \"No OAuth providers logged in. Use /login first.\";\n\t\t\tthis.listContainer.addChild(new Text(` ${message}`, 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < this.allProviders.length; i++) {\n\t\t\tconst provider = this.allProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst isAvailable = provider.available;\n\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tline = `→ ${provider.name} - ${provider.description}`;\n\t\t\t} else {\n\t\t\t\tline = ` ${provider.name} - ${provider.description}`;\n\t\t\t}\n\n\t\t\tif (!isAvailable) {\n\t\t\t\tline = ` ${provider.name} - ${provider.description} (coming soon)`;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new Text(line, 0, 0));\n\t\t}\n\n\t\t// Add help text\n\t\tthis.listContainer.addChild(new Spacer(1));\n\t\tthis.listContainer.addChild(\n\t\t\tnew Text(\"Use ↑↓ to navigate, Enter to select, Esc to cancel\", 0, 0),\n\t\t);\n\t}\n\n\thandleInput(keyData: string): void {\n\t\t// Up arrow\n\t\tif (keyData === \"\\x1b[A\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (keyData === \"\\x1b[B\") {\n\t\t\tthis.selectedIndex = Math.min(\n\t\t\t\tthis.allProviders.length - 1,\n\t\t\t\tthis.selectedIndex + 1,\n\t\t\t);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (keyData === \"\\r\") {\n\t\t\tconst selectedProvider = this.allProviders[this.selectedIndex];\n\t\t\t// Guard against undefined provider (e.g., empty array)\n\t\t\tif (\n\t\t\t\tselectedProvider &&\n\t\t\t\t(selectedProvider.available || this.mode === \"logout\")\n\t\t\t) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape\n\t\telse if (keyData === \"\\x1b\") {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n\nfunction resolveLogoutProviderInfo(\n\tproviderId: OAuthLogoutProvider,\n): OAuthProviderInfo<OAuthLogoutProvider> {\n\tconst provider = getOAuthProviders().find(\n\t\t(candidate) => candidate.id === providerId,\n\t);\n\tif (provider) {\n\t\treturn provider;\n\t}\n\tif (providerId === \"anthropic\") {\n\t\treturn {\n\t\t\tid: \"anthropic\",\n\t\t\tname: \"Anthropic OAuth\",\n\t\t\tdescription: \"Legacy Anthropic OAuth credentials (logout only)\",\n\t\t\tavailable: true,\n\t\t};\n\t}\n\treturn {\n\t\tid: providerId,\n\t\tname: providerId,\n\t\tdescription: \"OAuth credentials\",\n\t\tavailable: true,\n\t};\n}\n"]}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* suites such as /ss, /diag, /cfg, and /tools.
|
|
4
4
|
*/
|
|
5
5
|
import { type CommandSuiteHandlers } from "../commands/command-suite-handlers.js";
|
|
6
|
+
import type { AuthState } from "../commands/subcommands/auth-commands.js";
|
|
6
7
|
import type { CommandExecutionContext, CommandHandlers } from "../commands/types.js";
|
|
7
8
|
type SuiteHandlerKey = "about" | "approvals" | "background" | "branch" | "changes" | "checkpoint" | "clean" | "clear" | "commands" | "compactTools" | "composer" | "config" | "context" | "cost" | "diagnostics" | "exportSession" | "footer" | "framework" | "guardian" | "importConfig" | "initAgents" | "login" | "logout" | "lsp" | "mcp" | "newChat" | "otel" | "planMode" | "preview" | "quota" | "queue" | "review" | "run" | "session" | "sessions" | "shareSession" | "stats" | "status" | "telemetry" | "theme" | "training" | "tree" | "tools" | "undoChanges" | "workflow" | "zen";
|
|
8
9
|
export type CommandSuiteBaseHandlers = Pick<CommandHandlers, SuiteHandlerKey>;
|
|
@@ -13,11 +14,7 @@ export interface CommandSuiteRuntimeDeps {
|
|
|
13
14
|
footerMode: string;
|
|
14
15
|
compactTools: boolean;
|
|
15
16
|
};
|
|
16
|
-
getAuthState: () =>
|
|
17
|
-
authenticated: boolean;
|
|
18
|
-
provider?: string;
|
|
19
|
-
mode?: string;
|
|
20
|
-
};
|
|
17
|
+
getAuthState: () => AuthState | Promise<AuthState>;
|
|
21
18
|
handleSessionRecoverCommand: (ctx: CommandExecutionContext) => void | Promise<void>;
|
|
22
19
|
handleSessionCleanupCommand: (ctx: CommandExecutionContext) => void | Promise<void>;
|
|
23
20
|
handleSourcesCommand: (ctx: CommandExecutionContext) => void | Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-suite-wiring.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/tui-renderer/command-suite-wiring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,KAAK,oBAAoB,EAGzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EACX,uBAAuB,EACvB,eAAe,EACf,MAAM,sBAAsB,CAAC;AAE9B,KAAK,eAAe,GACjB,OAAO,GACP,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,OAAO,GACP,OAAO,GACP,UAAU,GACV,cAAc,GACd,UAAU,GACV,QAAQ,GACR,SAAS,GACT,MAAM,GACN,aAAa,GACb,eAAe,GACf,QAAQ,GACR,WAAW,GACX,UAAU,GACV,cAAc,GACd,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,KAAK,GACL,KAAK,GACL,SAAS,GACT,MAAM,GACN,UAAU,GACV,SAAS,GACT,OAAO,GACP,OAAO,GACP,QAAQ,GACR,KAAK,GACL,SAAS,GACT,UAAU,GACV,cAAc,GACd,OAAO,GACP,QAAQ,GACR,WAAW,GACX,OAAO,GACP,UAAU,GACV,MAAM,GACN,OAAO,GACP,aAAa,GACb,UAAU,GACV,KAAK,CAAC;AAET,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACvC,UAAU,EAAE,MAAM;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,YAAY,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"command-suite-wiring.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/tui-renderer/command-suite-wiring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,KAAK,oBAAoB,EAGzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,KAAK,EACX,uBAAuB,EACvB,eAAe,EACf,MAAM,sBAAsB,CAAC;AAE9B,KAAK,eAAe,GACjB,OAAO,GACP,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,OAAO,GACP,OAAO,GACP,UAAU,GACV,cAAc,GACd,UAAU,GACV,QAAQ,GACR,SAAS,GACT,MAAM,GACN,aAAa,GACb,eAAe,GACf,QAAQ,GACR,WAAW,GACX,UAAU,GACV,cAAc,GACd,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,KAAK,GACL,KAAK,GACL,SAAS,GACT,MAAM,GACN,UAAU,GACV,SAAS,GACT,OAAO,GACP,OAAO,GACP,QAAQ,GACR,KAAK,GACL,SAAS,GACT,UAAU,GACV,cAAc,GACd,OAAO,GACP,QAAQ,GACR,WAAW,GACX,OAAO,GACP,UAAU,GACV,MAAM,GACN,OAAO,GACP,aAAa,GACb,UAAU,GACV,KAAK,CAAC;AAET,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACvC,UAAU,EAAE,MAAM;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,YAAY,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,2BAA2B,EAAE,CAC5B,GAAG,EAAE,uBAAuB,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,2BAA2B,EAAE,CAC5B,GAAG,EAAE,uBAAuB,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oBAAoB,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,iBAAiB,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,8BAA8B,EAAE,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,KAC3B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACtE,QAAQ,EAAE,wBAAwB,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACxC,IAAI,EAAE,sBAAsB,GAC1B,oBAAoB,CAiGtB"}
|