@vertaaux/cli 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/MIGRATION.md +239 -0
  3. package/README.md +62 -17
  4. package/dist/app/interactive-app.d.ts +103 -0
  5. package/dist/app/interactive-app.d.ts.map +1 -0
  6. package/dist/app/interactive-app.js +328 -0
  7. package/dist/app/layout/canvas.d.ts +23 -0
  8. package/dist/app/layout/canvas.d.ts.map +1 -0
  9. package/dist/app/layout/canvas.js +36 -0
  10. package/dist/app/layout/footer.d.ts +31 -0
  11. package/dist/app/layout/footer.d.ts.map +1 -0
  12. package/dist/app/layout/footer.js +41 -0
  13. package/dist/app/layout/header.d.ts +20 -0
  14. package/dist/app/layout/header.d.ts.map +1 -0
  15. package/dist/app/layout/header.js +27 -0
  16. package/dist/app/menu/categories.d.ts +20 -0
  17. package/dist/app/menu/categories.d.ts.map +1 -0
  18. package/dist/app/menu/categories.js +166 -0
  19. package/dist/app/menu/filter.d.ts +17 -0
  20. package/dist/app/menu/filter.d.ts.map +1 -0
  21. package/dist/app/menu/filter.js +33 -0
  22. package/dist/app/menu/menu-view.d.ts +35 -0
  23. package/dist/app/menu/menu-view.d.ts.map +1 -0
  24. package/dist/app/menu/menu-view.js +230 -0
  25. package/dist/app/menu/recent.d.ts +24 -0
  26. package/dist/app/menu/recent.d.ts.map +1 -0
  27. package/dist/app/menu/recent.js +49 -0
  28. package/dist/app/types.d.ts +43 -0
  29. package/dist/app/types.d.ts.map +1 -0
  30. package/dist/app/types.js +7 -0
  31. package/dist/app/views/command-runner.d.ts +36 -0
  32. package/dist/app/views/command-runner.d.ts.map +1 -0
  33. package/dist/app/views/command-runner.js +415 -0
  34. package/dist/app/views/help-overlay.d.ts +21 -0
  35. package/dist/app/views/help-overlay.d.ts.map +1 -0
  36. package/dist/app/views/help-overlay.js +46 -0
  37. package/dist/auth/ci-token.d.ts +8 -2
  38. package/dist/auth/ci-token.d.ts.map +1 -1
  39. package/dist/auth/ci-token.js +15 -30
  40. package/dist/auth/device-flow.d.ts +2 -1
  41. package/dist/auth/device-flow.d.ts.map +1 -1
  42. package/dist/auth/device-flow.js +13 -10
  43. package/dist/auth/token-store.d.ts.map +1 -1
  44. package/dist/auth/token-store.js +12 -2
  45. package/dist/baseline/diff.d.ts +2 -2
  46. package/dist/baseline/diff.d.ts.map +1 -1
  47. package/dist/baseline/diff.js +15 -34
  48. package/dist/commands/a11y.d.ts +11 -0
  49. package/dist/commands/a11y.d.ts.map +1 -0
  50. package/dist/commands/a11y.js +149 -0
  51. package/dist/commands/audit/artifacts.d.ts +27 -0
  52. package/dist/commands/audit/artifacts.d.ts.map +1 -0
  53. package/dist/commands/audit/artifacts.js +158 -0
  54. package/dist/commands/audit/ci-detection.d.ts +18 -0
  55. package/dist/commands/audit/ci-detection.d.ts.map +1 -0
  56. package/dist/commands/audit/ci-detection.js +71 -0
  57. package/dist/commands/audit/explain.d.ts +11 -0
  58. package/dist/commands/audit/explain.d.ts.map +1 -0
  59. package/dist/commands/audit/explain.js +45 -0
  60. package/dist/commands/audit/filters.d.ts +17 -0
  61. package/dist/commands/audit/filters.d.ts.map +1 -0
  62. package/dist/commands/audit/filters.js +40 -0
  63. package/dist/commands/audit/index.d.ts +18 -0
  64. package/dist/commands/audit/index.d.ts.map +1 -0
  65. package/dist/commands/audit/index.js +589 -0
  66. package/dist/commands/audit/output.d.ts +32 -0
  67. package/dist/commands/audit/output.d.ts.map +1 -0
  68. package/dist/commands/audit/output.js +129 -0
  69. package/dist/commands/audit/policy.d.ts +27 -0
  70. package/dist/commands/audit/policy.d.ts.map +1 -0
  71. package/dist/commands/audit/policy.js +147 -0
  72. package/dist/commands/audit/scoring.d.ts +23 -0
  73. package/dist/commands/audit/scoring.d.ts.map +1 -0
  74. package/dist/commands/audit/scoring.js +70 -0
  75. package/dist/commands/audit/types.d.ts +89 -0
  76. package/dist/commands/audit/types.d.ts.map +1 -0
  77. package/dist/commands/audit/types.js +8 -0
  78. package/dist/commands/audit.d.ts +2 -60
  79. package/dist/commands/audit.d.ts.map +1 -1
  80. package/dist/commands/audit.js +2 -1097
  81. package/dist/commands/baseline.d.ts +2 -0
  82. package/dist/commands/baseline.d.ts.map +1 -1
  83. package/dist/commands/baseline.js +221 -123
  84. package/dist/commands/comment.d.ts +22 -0
  85. package/dist/commands/comment.d.ts.map +1 -1
  86. package/dist/commands/comment.js +127 -62
  87. package/dist/commands/compare.d.ts +17 -0
  88. package/dist/commands/compare.d.ts.map +1 -1
  89. package/dist/commands/compare.js +288 -181
  90. package/dist/commands/diff.d.ts +7 -0
  91. package/dist/commands/diff.d.ts.map +1 -1
  92. package/dist/commands/diff.js +181 -143
  93. package/dist/commands/doc.d.ts +10 -0
  94. package/dist/commands/doc.d.ts.map +1 -1
  95. package/dist/commands/doc.js +135 -77
  96. package/dist/commands/doctor.d.ts +2 -0
  97. package/dist/commands/doctor.d.ts.map +1 -1
  98. package/dist/commands/doctor.js +166 -19
  99. package/dist/commands/download.d.ts +10 -0
  100. package/dist/commands/download.d.ts.map +1 -1
  101. package/dist/commands/download.js +169 -112
  102. package/dist/commands/explain.d.ts +5 -0
  103. package/dist/commands/explain.d.ts.map +1 -1
  104. package/dist/commands/explain.js +242 -156
  105. package/dist/commands/fix-all.d.ts +25 -0
  106. package/dist/commands/fix-all.d.ts.map +1 -0
  107. package/dist/commands/fix-all.js +206 -0
  108. package/dist/commands/fix-plan.d.ts +9 -0
  109. package/dist/commands/fix-plan.d.ts.map +1 -1
  110. package/dist/commands/fix-plan.js +154 -90
  111. package/dist/commands/fix.d.ts +17 -0
  112. package/dist/commands/fix.d.ts.map +1 -0
  113. package/dist/commands/fix.js +111 -0
  114. package/dist/commands/init.d.ts +11 -0
  115. package/dist/commands/init.d.ts.map +1 -1
  116. package/dist/commands/init.js +94 -42
  117. package/dist/commands/login.d.ts +18 -0
  118. package/dist/commands/login.d.ts.map +1 -1
  119. package/dist/commands/login.js +263 -92
  120. package/dist/commands/patch-review.d.ts +11 -0
  121. package/dist/commands/patch-review.d.ts.map +1 -1
  122. package/dist/commands/patch-review.js +160 -98
  123. package/dist/commands/policy.d.ts +31 -0
  124. package/dist/commands/policy.d.ts.map +1 -1
  125. package/dist/commands/policy.js +270 -125
  126. package/dist/commands/release-notes.d.ts +10 -0
  127. package/dist/commands/release-notes.d.ts.map +1 -1
  128. package/dist/commands/release-notes.js +128 -74
  129. package/dist/commands/scan.d.ts +13 -0
  130. package/dist/commands/scan.d.ts.map +1 -0
  131. package/dist/commands/scan.js +133 -0
  132. package/dist/commands/status.d.ts +9 -0
  133. package/dist/commands/status.d.ts.map +1 -0
  134. package/dist/commands/status.js +81 -0
  135. package/dist/commands/suggest.d.ts +10 -0
  136. package/dist/commands/suggest.d.ts.map +1 -1
  137. package/dist/commands/suggest.js +180 -83
  138. package/dist/commands/triage.d.ts +35 -0
  139. package/dist/commands/triage.d.ts.map +1 -1
  140. package/dist/commands/triage.js +207 -82
  141. package/dist/commands/upload.d.ts +9 -0
  142. package/dist/commands/upload.d.ts.map +1 -1
  143. package/dist/commands/upload.js +140 -101
  144. package/dist/commands/verify.d.ts +13 -0
  145. package/dist/commands/verify.d.ts.map +1 -0
  146. package/dist/commands/verify.js +118 -0
  147. package/dist/config/schema.d.ts +4 -0
  148. package/dist/config/schema.d.ts.map +1 -1
  149. package/dist/index.d.ts +3 -2
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +127 -991
  152. package/dist/interactive/fix-wizard.d.ts +3 -0
  153. package/dist/interactive/fix-wizard.d.ts.map +1 -1
  154. package/dist/interactive/fix-wizard.js +130 -112
  155. package/dist/interactive/init-wizard.d.ts +3 -1
  156. package/dist/interactive/init-wizard.d.ts.map +1 -1
  157. package/dist/interactive/init-wizard.js +207 -138
  158. package/dist/interactive/prompts.d.ts +7 -3
  159. package/dist/interactive/prompts.d.ts.map +1 -1
  160. package/dist/interactive/prompts.js +44 -23
  161. package/dist/output/envelope.d.ts +9 -0
  162. package/dist/output/envelope.d.ts.map +1 -1
  163. package/dist/output/envelope.js +37 -3
  164. package/dist/output/factory.d.ts +2 -1
  165. package/dist/output/factory.d.ts.map +1 -1
  166. package/dist/output/html.d.ts +2 -1
  167. package/dist/output/html.d.ts.map +1 -1
  168. package/dist/output/html.js +3 -2
  169. package/dist/output/human.d.ts +2 -1
  170. package/dist/output/human.d.ts.map +1 -1
  171. package/dist/output/human.js +3 -2
  172. package/dist/output/json.d.ts +2 -1
  173. package/dist/output/json.d.ts.map +1 -1
  174. package/dist/output/junit.d.ts +2 -1
  175. package/dist/output/junit.d.ts.map +1 -1
  176. package/dist/output/sarif.d.ts +2 -1
  177. package/dist/output/sarif.d.ts.map +1 -1
  178. package/dist/policy/schema.d.ts +137 -0
  179. package/dist/policy/schema.d.ts.map +1 -1
  180. package/dist/policy/schema.js +107 -0
  181. package/dist/prompts/command-catalog.js +9 -9
  182. package/dist/types.d.ts +74 -0
  183. package/dist/types.d.ts.map +1 -0
  184. package/dist/types.js +5 -0
  185. package/dist/ui/banner.d.ts +34 -0
  186. package/dist/ui/banner.d.ts.map +1 -1
  187. package/dist/ui/banner.js +97 -5
  188. package/dist/ui/diagnostics.d.ts +9 -4
  189. package/dist/ui/diagnostics.d.ts.map +1 -1
  190. package/dist/ui/diagnostics.js +32 -82
  191. package/dist/ui/strings.d.ts +373 -0
  192. package/dist/ui/strings.d.ts.map +1 -0
  193. package/dist/ui/strings.js +499 -0
  194. package/dist/ui/table.d.ts +0 -2
  195. package/dist/ui/table.d.ts.map +1 -1
  196. package/dist/ui/table.js +3 -4
  197. package/dist/utils/api-client.d.ts +46 -0
  198. package/dist/utils/api-client.d.ts.map +1 -0
  199. package/dist/utils/api-client.js +170 -0
  200. package/dist/utils/client.d.ts +29 -18
  201. package/dist/utils/client.d.ts.map +1 -1
  202. package/dist/utils/client.js +104 -12
  203. package/dist/utils/formatters.d.ts +38 -0
  204. package/dist/utils/formatters.d.ts.map +1 -0
  205. package/dist/utils/formatters.js +277 -0
  206. package/dist/utils/root-args.d.ts +12 -0
  207. package/dist/utils/root-args.d.ts.map +1 -0
  208. package/dist/utils/root-args.js +44 -0
  209. package/dist/utils/stdin.d.ts +7 -0
  210. package/dist/utils/stdin.d.ts.map +1 -1
  211. package/dist/utils/stdin.js +32 -2
  212. package/dist/utils/url-classify.d.ts.map +1 -1
  213. package/dist/utils/url-classify.js +24 -3
  214. package/node_modules/@vertaaux/tui/dist/index.cjs +1216 -27
  215. package/node_modules/@vertaaux/tui/dist/index.cjs.map +1 -1
  216. package/node_modules/@vertaaux/tui/dist/index.d.cts +361 -4
  217. package/node_modules/@vertaaux/tui/dist/index.d.ts +361 -4
  218. package/node_modules/@vertaaux/tui/dist/index.js +1189 -27
  219. package/node_modules/@vertaaux/tui/dist/index.js.map +1 -1
  220. package/node_modules/@vertaaux/tui/package.json +2 -3
  221. package/node_modules/chalk/license +9 -0
  222. package/node_modules/chalk/package.json +83 -0
  223. package/node_modules/chalk/readme.md +297 -0
  224. package/node_modules/chalk/source/index.d.ts +325 -0
  225. package/node_modules/chalk/source/index.js +225 -0
  226. package/node_modules/chalk/source/utilities.js +33 -0
  227. package/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  228. package/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  229. package/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  230. package/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
  231. package/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  232. package/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
  233. package/package.json +20 -5
  234. package/dist/commands/client.d.ts +0 -14
  235. package/dist/commands/client.d.ts.map +0 -1
  236. package/dist/commands/client.js +0 -362
  237. package/dist/commands/drift.d.ts +0 -15
  238. package/dist/commands/drift.d.ts.map +0 -1
  239. package/dist/commands/drift.js +0 -309
  240. package/dist/commands/protect.d.ts +0 -16
  241. package/dist/commands/protect.d.ts.map +0 -1
  242. package/dist/commands/protect.js +0 -323
  243. package/dist/commands/report.d.ts +0 -15
  244. package/dist/commands/report.d.ts.map +0 -1
  245. package/dist/commands/report.js +0 -214
  246. package/dist/policy/sync.d.ts +0 -67
  247. package/dist/policy/sync.d.ts.map +0 -1
  248. package/dist/policy/sync.js +0 -147
@@ -0,0 +1,415 @@
1
+ /**
2
+ * CommandRunnerView — Executes a CLI command within the InteractiveApp canvas.
3
+ *
4
+ * Lifecycle:
5
+ * 1. "collecting" — prompts for required args ON the alt screen using raw-mode
6
+ * keyboard input (same system as MenuView). No stdin mode transitions.
7
+ * 2. "running" — command runs INSIDE the app layout. A renderer override
8
+ * captures step states so this view can render them in the canvas.
9
+ * Header and footer stay visible throughout.
10
+ * 3. "done"/"error" — shows result summary in canvas, M returns to menu.
11
+ *
12
+ * Each command's handler is called directly (no program.parse()).
13
+ */
14
+ import fs from "fs";
15
+ import path from "path";
16
+ import { dim, bold, colorize, brand, renderError, setRendererOverride, setKeyboardOverrideActive, renderStepList, getTerminalWidth, getTerminalHeight, } from "@vertaaux/tui";
17
+ import { setOutputBuffer } from "../../output/envelope.js";
18
+ // Command handler imports
19
+ import { handleAudit } from "../../commands/audit/index.js";
20
+ import { handleScan } from "../../commands/scan.js";
21
+ import { handleA11y } from "../../commands/a11y.js";
22
+ import { handleStatus } from "../../commands/status.js";
23
+ import { handleDiff } from "../../commands/diff.js";
24
+ import { handleCompare } from "../../commands/compare.js";
25
+ import { handleTriage } from "../../commands/triage.js";
26
+ import { handleExplain } from "../../commands/explain.js";
27
+ import { handleSuggest } from "../../commands/suggest.js";
28
+ import { handleFix } from "../../commands/fix.js";
29
+ import { handleFixAll } from "../../commands/fix-all.js";
30
+ import { handleFixPlan } from "../../commands/fix-plan.js";
31
+ import { handlePatchReview } from "../../commands/patch-review.js";
32
+ import { handleDoc } from "../../commands/doc.js";
33
+ import { handleComment } from "../../commands/comment.js";
34
+ import { handleReleaseNotes } from "../../commands/release-notes.js";
35
+ import { handleInit } from "../../commands/init.js";
36
+ import { handleBaseline } from "../../commands/baseline.js";
37
+ import { handleUpload } from "../../commands/upload.js";
38
+ import { handleDownload } from "../../commands/download.js";
39
+ import { handleVerify } from "../../commands/verify.js";
40
+ import { handleLogin, handleLogout, handleWhoami } from "../../commands/login.js";
41
+ import { handleDoctor } from "../../commands/doctor.js";
42
+ import { handlePolicy } from "../../commands/policy.js";
43
+ function resolveJobOrFile(value) {
44
+ const trimmed = value.trim();
45
+ const resolved = path.resolve(process.cwd(), trimmed);
46
+ if (trimmed.toLowerCase().endsWith(".json") ||
47
+ trimmed.includes("/") ||
48
+ trimmed.includes("\\") ||
49
+ fs.existsSync(resolved)) {
50
+ return { file: trimmed };
51
+ }
52
+ return { job: trimmed };
53
+ }
54
+ /**
55
+ * Get the argument definitions for a command.
56
+ */
57
+ function getArgDefs(cmd) {
58
+ switch (cmd) {
59
+ case "audit":
60
+ case "scan":
61
+ case "a11y":
62
+ return [{ label: "Target URL", key: "url" }];
63
+ case "status":
64
+ return [{ label: "Job ID", key: "jobId" }];
65
+ case "diff":
66
+ case "triage":
67
+ case "explain":
68
+ case "fix-plan":
69
+ case "doc":
70
+ case "baseline":
71
+ return [{ label: "Audit job ID or JSON file", key: "auditSource" }];
72
+ case "compare":
73
+ return [
74
+ { label: "URL A", key: "urlA" },
75
+ { label: "URL B", key: "urlB" },
76
+ ];
77
+ case "fix":
78
+ return [{ label: "Job ID to fix", key: "jobId" }];
79
+ case "suggest":
80
+ return [{ label: "Describe the fix you need", key: "intent" }];
81
+ case "comment":
82
+ return [{ label: "Audit JSON file", key: "input" }];
83
+ case "fix-all":
84
+ return [
85
+ { label: "Job ID", key: "jobId" },
86
+ { label: "File path or content", key: "fileContent" },
87
+ ];
88
+ case "download":
89
+ return [{ label: "Job ID to download", key: "jobId" }];
90
+ default:
91
+ return [];
92
+ }
93
+ }
94
+ /**
95
+ * A renderer that captures state instead of writing to the terminal.
96
+ * The CommandRunnerView reads from it in render().
97
+ */
98
+ class CanvasRenderer {
99
+ stepStates = [];
100
+ result = null;
101
+ finished = false;
102
+ update(state) {
103
+ if (state.stepStates) {
104
+ this.stepStates = [...state.stepStates];
105
+ }
106
+ }
107
+ finish(result) {
108
+ this.result = result;
109
+ this.finished = true;
110
+ }
111
+ dispose() { }
112
+ suspend() { }
113
+ resume() { }
114
+ }
115
+ export class CommandRunnerView {
116
+ status;
117
+ statusText = "";
118
+ commandValue;
119
+ app;
120
+ onReturn;
121
+ // Arg collection state
122
+ argDefs;
123
+ collectedArgs = {};
124
+ currentArgIndex = 0;
125
+ inputBuffer = "";
126
+ // Resolve function for the arg collection promise
127
+ resolveArgCollection = null;
128
+ // Canvas renderer for capturing step states
129
+ canvasRenderer = new CanvasRenderer();
130
+ // Captured command output (from writeOutput during execution)
131
+ outputBuffer = [];
132
+ // Scroll position for viewing results
133
+ scrollOffset = 0;
134
+ constructor(commandValue, app, onReturn) {
135
+ this.commandValue = commandValue;
136
+ this.app = app;
137
+ this.onReturn = onReturn;
138
+ this.argDefs = getArgDefs(commandValue);
139
+ this.status = this.argDefs.length > 0 ? "collecting" : "running";
140
+ }
141
+ render() {
142
+ const lines = [];
143
+ switch (this.status) {
144
+ case "collecting": {
145
+ lines.push(bold(this.commandValue));
146
+ lines.push("");
147
+ for (let i = 0; i < this.currentArgIndex; i++) {
148
+ const def = this.argDefs[i];
149
+ lines.push(dim(` ${def.label}: `) + this.collectedArgs[def.key]);
150
+ }
151
+ const currentDef = this.argDefs[this.currentArgIndex];
152
+ if (currentDef) {
153
+ lines.push(colorize(` ${currentDef.label}: `, brand.lime) +
154
+ this.inputBuffer +
155
+ colorize("█", brand.lime));
156
+ }
157
+ lines.push("");
158
+ lines.push(dim("Type your input, then press Enter to confirm"));
159
+ lines.push(dim("Press Escape to cancel"));
160
+ break;
161
+ }
162
+ case "running": {
163
+ // Show step-list from the canvas renderer
164
+ if (this.canvasRenderer.stepStates.length > 0) {
165
+ const stepList = renderStepList(this.canvasRenderer.stepStates, this.app.getFrameIndex(), getTerminalWidth());
166
+ lines.push(stepList);
167
+ }
168
+ else {
169
+ lines.push(dim(`Running ${bold(this.commandValue)}...`));
170
+ }
171
+ break;
172
+ }
173
+ case "done":
174
+ case "error": {
175
+ const content = this.status === "error" && this.outputBuffer.length === 0
176
+ ? [renderError({ message: this.statusText || "Command failed", suggestion: "vertaa doctor" })]
177
+ : this.outputBuffer.length > 0
178
+ ? [...this.outputBuffer]
179
+ : [colorize("Command completed.", brand.lime)];
180
+ // Scrollable view: show a window of lines based on scrollOffset
181
+ // Reserve 2 lines for footer hint
182
+ const availableHeight = Math.max(3, getTerminalHeight() - 12);
183
+ const totalLines = content.length;
184
+ const maxScroll = Math.max(0, totalLines - availableHeight);
185
+ this.scrollOffset = Math.min(this.scrollOffset, maxScroll);
186
+ const visible = content.slice(this.scrollOffset, this.scrollOffset + availableHeight);
187
+ lines.push(...visible);
188
+ // Scroll indicator
189
+ if (totalLines > availableHeight) {
190
+ const pct = maxScroll > 0 ? Math.round((this.scrollOffset / maxScroll) * 100) : 100;
191
+ lines.push("");
192
+ lines.push(dim(`↑↓ scroll (${pct}%) | M menu | Q quit`));
193
+ }
194
+ else {
195
+ lines.push("");
196
+ lines.push(dim("M menu | Q quit"));
197
+ }
198
+ break;
199
+ }
200
+ }
201
+ return lines.join("\n");
202
+ }
203
+ handleKey(key, ctrl, _meta) {
204
+ if (this.status === "collecting") {
205
+ if (ctrl && key === "\x03")
206
+ return false;
207
+ if (key === "\x1b") {
208
+ this.onReturn();
209
+ return true;
210
+ }
211
+ if (key === "\r" || key === "\n") {
212
+ const currentDef = this.argDefs[this.currentArgIndex];
213
+ if (currentDef && this.inputBuffer.trim().length > 0) {
214
+ this.collectedArgs[currentDef.key] = this.inputBuffer.trim();
215
+ this.inputBuffer = "";
216
+ this.currentArgIndex++;
217
+ if (this.currentArgIndex >= this.argDefs.length) {
218
+ if (this.resolveArgCollection) {
219
+ this.resolveArgCollection();
220
+ }
221
+ }
222
+ }
223
+ return true;
224
+ }
225
+ if (key === "\x7f" || key === "\b") {
226
+ this.inputBuffer = this.inputBuffer.slice(0, -1);
227
+ return true;
228
+ }
229
+ if (key.length === 1 && key >= " ") {
230
+ this.inputBuffer += key;
231
+ return true;
232
+ }
233
+ return false;
234
+ }
235
+ // Done/error state — handle navigation and scroll keys
236
+ if (this.status === "done" || this.status === "error") {
237
+ if (key === "m" || key === "M" || key === "\r") {
238
+ this.onReturn();
239
+ return true;
240
+ }
241
+ if (key === "\x1b") {
242
+ // Escape — but not arrow key sequences
243
+ this.onReturn();
244
+ return true;
245
+ }
246
+ if (key === "q" || key === "Q") {
247
+ process.exit(0);
248
+ }
249
+ // Arrow up / k
250
+ if (key === "\x1b[A" || key === "k") {
251
+ this.scrollOffset = Math.max(0, this.scrollOffset - 1);
252
+ return true;
253
+ }
254
+ // Arrow down / j
255
+ if (key === "\x1b[B" || key === "j") {
256
+ this.scrollOffset++;
257
+ return true;
258
+ }
259
+ // Page up
260
+ if (key === "\x1b[5~") {
261
+ this.scrollOffset = Math.max(0, this.scrollOffset - 10);
262
+ return true;
263
+ }
264
+ // Page down
265
+ if (key === "\x1b[6~") {
266
+ this.scrollOffset += 10;
267
+ return true;
268
+ }
269
+ // Home
270
+ if (key === "\x1b[H" || key === "g") {
271
+ this.scrollOffset = 0;
272
+ return true;
273
+ }
274
+ // End
275
+ if (key === "\x1b[F" || key === "G") {
276
+ this.scrollOffset = Infinity; // clamped in render()
277
+ return true;
278
+ }
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+ async onMount() {
284
+ // If command needs args, wait for collection
285
+ if (this.argDefs.length > 0) {
286
+ await new Promise((resolve) => {
287
+ this.resolveArgCollection = resolve;
288
+ });
289
+ }
290
+ // Set overrides so command handlers use our canvas renderer,
291
+ // don't steal stdin, and buffer their output instead of writing to stdout.
292
+ this.status = "running";
293
+ setRendererOverride(this.canvasRenderer);
294
+ setKeyboardOverrideActive(true);
295
+ setOutputBuffer(this.outputBuffer);
296
+ try {
297
+ await this.executeCommand();
298
+ this.status = "done";
299
+ }
300
+ catch (err) {
301
+ this.status = "error";
302
+ this.statusText = err instanceof Error ? err.message : String(err);
303
+ }
304
+ // Restore all overrides
305
+ setOutputBuffer(null);
306
+ setRendererOverride(null);
307
+ setKeyboardOverrideActive(false);
308
+ }
309
+ // ── Private ──────────────────────────────────────────────────
310
+ async executeCommand() {
311
+ const cmd = this.commandValue;
312
+ const args = this.collectedArgs;
313
+ switch (cmd) {
314
+ case "audit":
315
+ await handleAudit(args.url, {}, {});
316
+ break;
317
+ case "scan":
318
+ await handleScan(args.url, {});
319
+ break;
320
+ case "a11y":
321
+ await handleA11y(args.url, {});
322
+ break;
323
+ case "status":
324
+ await handleStatus(args.jobId, {});
325
+ break;
326
+ case "fix":
327
+ await handleFix(args.jobId, {});
328
+ break;
329
+ case "download":
330
+ await handleDownload(args.jobId, {});
331
+ break;
332
+ case "suggest":
333
+ await handleSuggest({ intent: args.intent });
334
+ break;
335
+ case "fix-all":
336
+ await handleFixAll({
337
+ jobId: args.jobId,
338
+ fileContent: args.fileContent,
339
+ });
340
+ break;
341
+ case "diff":
342
+ await handleDiff(args.auditSource
343
+ ? (() => {
344
+ const source = resolveJobOrFile(args.auditSource);
345
+ return source.file
346
+ ? { fromFile: source.file }
347
+ : { jobIdArg: source.job };
348
+ })()
349
+ : {});
350
+ break;
351
+ case "compare":
352
+ await handleCompare({
353
+ urlA: args.urlA,
354
+ urlB: args.urlB,
355
+ wait: true,
356
+ });
357
+ break;
358
+ case "triage":
359
+ await handleTriage(resolveJobOrFile(args.auditSource));
360
+ break;
361
+ case "explain":
362
+ await handleExplain(resolveJobOrFile(args.auditSource));
363
+ break;
364
+ case "fix-plan":
365
+ await handleFixPlan(resolveJobOrFile(args.auditSource));
366
+ break;
367
+ case "patch-review":
368
+ await handlePatchReview({});
369
+ break;
370
+ case "doc":
371
+ await handleDoc(resolveJobOrFile(args.auditSource));
372
+ break;
373
+ case "comment":
374
+ await handleComment({ input: args.input });
375
+ break;
376
+ case "release-notes":
377
+ await handleReleaseNotes({});
378
+ break;
379
+ case "init":
380
+ await handleInit({});
381
+ break;
382
+ case "baseline":
383
+ await (() => {
384
+ const source = resolveJobOrFile(args.auditSource);
385
+ return source.file
386
+ ? handleBaseline(undefined, { fromFile: source.file })
387
+ : handleBaseline(source.job, {});
388
+ })();
389
+ break;
390
+ case "upload":
391
+ await handleUpload(undefined, {});
392
+ break;
393
+ case "verify":
394
+ await handleVerify({});
395
+ break;
396
+ case "login":
397
+ await handleLogin({});
398
+ break;
399
+ case "logout":
400
+ await handleLogout();
401
+ break;
402
+ case "whoami":
403
+ await handleWhoami({});
404
+ break;
405
+ case "doctor":
406
+ await handleDoctor({});
407
+ break;
408
+ case "policy":
409
+ await handlePolicy("show", {});
410
+ break;
411
+ default:
412
+ throw new Error(`Unknown command: ${cmd}`);
413
+ }
414
+ }
415
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * HelpOverlayView — Keyboard shortcuts overlay implementing CommandView.
3
+ *
4
+ * Renders a box with context-specific keyboard shortcuts. Pressing H or Esc
5
+ * dismisses the overlay via the onDismiss callback.
6
+ */
7
+ import type { CommandView } from "../types.js";
8
+ /**
9
+ * HelpOverlayView implements CommandView for the keyboard shortcuts overlay.
10
+ *
11
+ * @param onDismiss - Callback invoked when user dismisses the overlay (H or Esc)
12
+ */
13
+ export declare class HelpOverlayView implements CommandView {
14
+ private readonly onDismiss;
15
+ constructor(onDismiss: () => void);
16
+ /** Render the help overlay as a box */
17
+ render(): string;
18
+ /** Handle Esc to dismiss the overlay (F1 toggle handled at app level) */
19
+ handleKey(key: string, _ctrl: boolean, _meta: boolean): boolean;
20
+ }
21
+ //# sourceMappingURL=help-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-overlay.d.ts","sourceRoot":"","sources":["../../../src/app/views/help-overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY/C;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;gBAE3B,SAAS,EAAE,MAAM,IAAI;IAIjC,uCAAuC;IACvC,MAAM,IAAI,MAAM;IAehB,yEAAyE;IACzE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;CAQhE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * HelpOverlayView — Keyboard shortcuts overlay implementing CommandView.
3
+ *
4
+ * Renders a box with context-specific keyboard shortcuts. Pressing H or Esc
5
+ * dismisses the overlay via the onDismiss callback.
6
+ */
7
+ import { box, bold, dim } from "@vertaaux/tui";
8
+ /** Default shortcuts shown in any context */
9
+ const DEFAULT_SHORTCUTS = [
10
+ ["↑ / ↓", "Navigate menu items"],
11
+ ["Enter", "Select / confirm"],
12
+ ["/", "Start search (or type any character)"],
13
+ ["Esc", "Clear search / go back"],
14
+ ["F1", "Toggle this help overlay"],
15
+ ["Ctrl+C", "Exit vertaa"],
16
+ ];
17
+ /**
18
+ * HelpOverlayView implements CommandView for the keyboard shortcuts overlay.
19
+ *
20
+ * @param onDismiss - Callback invoked when user dismisses the overlay (H or Esc)
21
+ */
22
+ export class HelpOverlayView {
23
+ onDismiss;
24
+ constructor(onDismiss) {
25
+ this.onDismiss = onDismiss;
26
+ }
27
+ /** Render the help overlay as a box */
28
+ render() {
29
+ const rows = DEFAULT_SHORTCUTS.map(([key, description]) => ` ${bold(key.padEnd(12))} ${dim(description)}`);
30
+ const content = [
31
+ bold("Keyboard Shortcuts"),
32
+ dim("─".repeat(36)),
33
+ ...rows,
34
+ ].join("\n");
35
+ return box(content, { padding: 1 });
36
+ }
37
+ /** Handle Esc to dismiss the overlay (F1 toggle handled at app level) */
38
+ handleKey(key, _ctrl, _meta) {
39
+ if (key === "\x1b") {
40
+ this.onDismiss();
41
+ return true;
42
+ }
43
+ // Consume all other keys while overlay is visible
44
+ return true;
45
+ }
46
+ }
@@ -38,16 +38,22 @@ interface TokenValidationResponse {
38
38
  /**
39
39
  * Validate a CI token against the API.
40
40
  *
41
+ * Uses apiRequest() from client.ts with the token as explicit API key,
42
+ * so that auth header construction stays centralized in client.ts.
43
+ *
41
44
  * @param token - Token to validate
42
- * @param apiBase - API base URL (optional)
45
+ * @param apiBase - API base URL (optional, resolved via resolveApiBase)
43
46
  * @returns true if token is valid
44
47
  */
45
48
  export declare function validateCIToken(token: string, apiBase?: string): Promise<boolean>;
46
49
  /**
47
50
  * Get token info from the API.
48
51
  *
52
+ * Uses apiRequest() from client.ts with the token as explicit API key,
53
+ * so that auth header construction stays centralized in client.ts.
54
+ *
49
55
  * @param token - Token to check
50
- * @param apiBase - API base URL (optional)
56
+ * @param apiBase - API base URL (optional, resolved via resolveApiBase)
51
57
  * @returns Token info or null if invalid/error
52
58
  */
53
59
  export declare function getTokenInfo(token: string, apiBase?: string): Promise<TokenValidationResponse | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"ci-token.d.ts","sourceRoot":"","sources":["../../src/auth/ci-token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAQ1C;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,6BAA6B;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAkBzC"}
1
+ {"version":3,"file":"ci-token.d.ts","sourceRoot":"","sources":["../../src/auth/ci-token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAQ1C;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,6BAA6B;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAYzC"}
@@ -4,6 +4,7 @@
4
4
  * CI tokens are long-lived API keys used in CI/CD pipelines.
5
5
  * They can be passed via environment variables or --token flag.
6
6
  */
7
+ import { apiRequest, resolveApiBase } from "../utils/client.js";
7
8
  /**
8
9
  * Environment variable names for CI tokens.
9
10
  * Checked in order of preference.
@@ -25,30 +26,20 @@ export function getCIToken() {
25
26
  }
26
27
  return null;
27
28
  }
28
- /**
29
- * Default API base URL.
30
- */
31
- const DEFAULT_API_BASE = "https://vertaaux.ai/v1";
32
29
  /**
33
30
  * Validate a CI token against the API.
34
31
  *
32
+ * Uses apiRequest() from client.ts with the token as explicit API key,
33
+ * so that auth header construction stays centralized in client.ts.
34
+ *
35
35
  * @param token - Token to validate
36
- * @param apiBase - API base URL (optional)
36
+ * @param apiBase - API base URL (optional, resolved via resolveApiBase)
37
37
  * @returns true if token is valid
38
38
  */
39
- export async function validateCIToken(token, apiBase = DEFAULT_API_BASE) {
39
+ export async function validateCIToken(token, apiBase) {
40
40
  try {
41
- const response = await fetch(`${apiBase}/auth/validate`, {
42
- method: "GET",
43
- headers: {
44
- "X-API-Key": token,
45
- "Content-Type": "application/json",
46
- },
47
- });
48
- if (!response.ok) {
49
- return false;
50
- }
51
- const data = (await response.json());
41
+ const base = resolveApiBase(apiBase);
42
+ const data = await apiRequest(base, "/auth/validate", { method: "GET" }, token);
52
43
  return data.valid === true;
53
44
  }
54
45
  catch {
@@ -59,23 +50,17 @@ export async function validateCIToken(token, apiBase = DEFAULT_API_BASE) {
59
50
  /**
60
51
  * Get token info from the API.
61
52
  *
53
+ * Uses apiRequest() from client.ts with the token as explicit API key,
54
+ * so that auth header construction stays centralized in client.ts.
55
+ *
62
56
  * @param token - Token to check
63
- * @param apiBase - API base URL (optional)
57
+ * @param apiBase - API base URL (optional, resolved via resolveApiBase)
64
58
  * @returns Token info or null if invalid/error
65
59
  */
66
- export async function getTokenInfo(token, apiBase = DEFAULT_API_BASE) {
60
+ export async function getTokenInfo(token, apiBase) {
67
61
  try {
68
- const response = await fetch(`${apiBase}/auth/validate`, {
69
- method: "GET",
70
- headers: {
71
- "X-API-Key": token,
72
- "Content-Type": "application/json",
73
- },
74
- });
75
- if (!response.ok) {
76
- return null;
77
- }
78
- return response.json();
62
+ const base = resolveApiBase(apiBase);
63
+ return await apiRequest(base, "/auth/validate", { method: "GET" }, token);
79
64
  }
80
65
  catch {
81
66
  return null;
@@ -59,8 +59,9 @@ export interface DeviceFlowResult {
59
59
  *
60
60
  * @param clientId - OAuth client ID for the CLI
61
61
  * @param authBase - Base URL for auth endpoints (default: https://vertaaux.ai)
62
+ * @param onMessage - Optional callback for displaying messages (defaults to writeOutput)
62
63
  * @returns Device flow result with tokens
63
64
  * @throws Error if authorization fails or times out
64
65
  */
65
- export declare function startDeviceFlow(clientId: string, authBase?: string): Promise<DeviceFlowResult>;
66
+ export declare function startDeviceFlow(clientId: string, authBase?: string, onMessage?: (msg: string) => void): Promise<DeviceFlowResult>;
66
67
  //# sourceMappingURL=device-flow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAmCD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAA0B,GACnC,OAAO,CAAC,gBAAgB,CAAC,CA6B3B"}
1
+ {"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAmCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAA0B,EACpC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA+B3B"}
@@ -7,6 +7,7 @@
7
7
  * @see https://datatracker.ietf.org/doc/html/rfc8628
8
8
  */
9
9
  import { createSpinner, succeedSpinner } from "../ui/spinner.js";
10
+ import { writeOutput } from "../output/envelope.js";
10
11
  /**
11
12
  * Format remaining time as MM:SS.
12
13
  */
@@ -33,24 +34,26 @@ const DEFAULT_TIMEOUT_SECONDS = 300;
33
34
  *
34
35
  * @param clientId - OAuth client ID for the CLI
35
36
  * @param authBase - Base URL for auth endpoints (default: https://vertaaux.ai)
37
+ * @param onMessage - Optional callback for displaying messages (defaults to writeOutput)
36
38
  * @returns Device flow result with tokens
37
39
  * @throws Error if authorization fails or times out
38
40
  */
39
- export async function startDeviceFlow(clientId, authBase = DEFAULT_AUTH_BASE) {
41
+ export async function startDeviceFlow(clientId, authBase = DEFAULT_AUTH_BASE, onMessage) {
42
+ const emit = onMessage ?? ((msg) => writeOutput(msg));
40
43
  // Step 1: Request device code
41
44
  const deviceCodeResponse = await requestDeviceCode(clientId, authBase);
42
45
  // Step 2: Display instructions
43
- console.log("\n");
44
- console.log(" To authenticate, visit:");
45
- console.log(` ${deviceCodeResponse.verification_uri}`);
46
- console.log("\n");
47
- console.log(` Enter code: ${deviceCodeResponse.user_code}`);
48
- console.log("\n");
46
+ emit("\n\n");
47
+ emit(" To authenticate, visit:\n");
48
+ emit(` ${deviceCodeResponse.verification_uri}\n`);
49
+ emit("\n");
50
+ emit(` Enter code: ${deviceCodeResponse.user_code}\n`);
51
+ emit("\n");
49
52
  if (deviceCodeResponse.verification_uri_complete) {
50
- console.log(` Or open: ${deviceCodeResponse.verification_uri_complete}`);
51
- console.log("\n");
53
+ emit(` Or open: ${deviceCodeResponse.verification_uri_complete}\n`);
54
+ emit("\n");
52
55
  }
53
- console.log(" Press Ctrl+C to cancel.\n");
56
+ emit(" Press Ctrl+C to cancel.\n\n");
54
57
  // Step 3: Poll for token with countdown
55
58
  const tokens = await pollForToken(clientId, deviceCodeResponse.device_code, deviceCodeResponse.interval, deviceCodeResponse.expires_in, authBase);
56
59
  return tokens;
@@ -1 +1 @@
1
- {"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../src/auth/token-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAa3D;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAUxD"}
1
+ {"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../src/auth/token-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAkB3D;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAUxD"}