hammoc 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +2 -2
  2. package/package.json +1 -1
  3. package/packages/client/dist/assets/{agentExampleHighlight-De1SlBXH.js → agentExampleHighlight-B2IJxYzN.js} +1 -1
  4. package/packages/client/dist/assets/{commandTokenHighlight-COQi5YnH.js → commandTokenHighlight-BdGXkDR5.js} +1 -1
  5. package/packages/client/dist/assets/{index-D8XvfvVS.js → index-BFWGN51V.js} +1 -1
  6. package/packages/client/dist/assets/index-BX7y_Qt3.css +32 -0
  7. package/packages/client/dist/assets/{index-CQgqPGOG.js → index-lmx-m-iP.js} +552 -478
  8. package/packages/client/dist/assets/{snippetTokenHighlight-jMAHlrFd.js → snippetTokenHighlight-B9bH9Npx.js} +1 -1
  9. package/packages/client/dist/index.html +2 -2
  10. package/packages/client/dist/sw.js +1 -1
  11. package/packages/server/dist/app.d.ts.map +1 -1
  12. package/packages/server/dist/app.js +25 -1
  13. package/packages/server/dist/app.js.map +1 -1
  14. package/packages/server/dist/config/index.d.ts +10 -0
  15. package/packages/server/dist/config/index.d.ts.map +1 -1
  16. package/packages/server/dist/config/index.js +10 -0
  17. package/packages/server/dist/config/index.js.map +1 -1
  18. package/packages/server/dist/controllers/accountController.d.ts +19 -0
  19. package/packages/server/dist/controllers/accountController.d.ts.map +1 -0
  20. package/packages/server/dist/controllers/accountController.js +92 -0
  21. package/packages/server/dist/controllers/accountController.js.map +1 -0
  22. package/packages/server/dist/controllers/projectController.d.ts +1 -1
  23. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  24. package/packages/server/dist/controllers/projectController.js +19 -5
  25. package/packages/server/dist/controllers/projectController.js.map +1 -1
  26. package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
  27. package/packages/server/dist/controllers/serverController.js +8 -1
  28. package/packages/server/dist/controllers/serverController.js.map +1 -1
  29. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  30. package/packages/server/dist/handlers/websocket.js +83 -6
  31. package/packages/server/dist/handlers/websocket.js.map +1 -1
  32. package/packages/server/dist/index.js +8 -0
  33. package/packages/server/dist/index.js.map +1 -1
  34. package/packages/server/dist/middleware/session.d.ts.map +1 -1
  35. package/packages/server/dist/middleware/session.js +7 -5
  36. package/packages/server/dist/middleware/session.js.map +1 -1
  37. package/packages/server/dist/routes/accounts.d.ts +13 -0
  38. package/packages/server/dist/routes/accounts.d.ts.map +1 -0
  39. package/packages/server/dist/routes/accounts.js +18 -0
  40. package/packages/server/dist/routes/accounts.js.map +1 -0
  41. package/packages/server/dist/routes/config.d.ts +3 -0
  42. package/packages/server/dist/routes/config.d.ts.map +1 -0
  43. package/packages/server/dist/routes/config.js +59 -0
  44. package/packages/server/dist/routes/config.js.map +1 -0
  45. package/packages/server/dist/routes/preferences.d.ts.map +1 -1
  46. package/packages/server/dist/routes/preferences.js +22 -4
  47. package/packages/server/dist/routes/preferences.js.map +1 -1
  48. package/packages/server/dist/services/accountInfoService.js +6 -6
  49. package/packages/server/dist/services/accountInfoService.js.map +1 -1
  50. package/packages/server/dist/services/accountStorageService.d.ts +119 -0
  51. package/packages/server/dist/services/accountStorageService.d.ts.map +1 -0
  52. package/packages/server/dist/services/accountStorageService.js +285 -0
  53. package/packages/server/dist/services/accountStorageService.js.map +1 -0
  54. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  55. package/packages/server/dist/services/chatService.js +4 -8
  56. package/packages/server/dist/services/chatService.js.map +1 -1
  57. package/packages/server/dist/services/claudeLoginService.d.ts +124 -0
  58. package/packages/server/dist/services/claudeLoginService.d.ts.map +1 -0
  59. package/packages/server/dist/services/claudeLoginService.js +417 -0
  60. package/packages/server/dist/services/claudeLoginService.js.map +1 -0
  61. package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -1
  62. package/packages/server/dist/services/cliChatEngine.js +85 -33
  63. package/packages/server/dist/services/cliChatEngine.js.map +1 -1
  64. package/packages/server/dist/services/cliGridCards.d.ts +30 -10
  65. package/packages/server/dist/services/cliGridCards.d.ts.map +1 -1
  66. package/packages/server/dist/services/cliGridCards.js +80 -34
  67. package/packages/server/dist/services/cliGridCards.js.map +1 -1
  68. package/packages/server/dist/services/cliModalDetect.d.ts +15 -7
  69. package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -1
  70. package/packages/server/dist/services/cliModalDetect.js +16 -12
  71. package/packages/server/dist/services/cliModalDetect.js.map +1 -1
  72. package/packages/server/dist/services/cliScreenModel.d.ts +3 -2
  73. package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -1
  74. package/packages/server/dist/services/cliScreenModel.js +2 -0
  75. package/packages/server/dist/services/cliScreenModel.js.map +1 -1
  76. package/packages/server/dist/services/cliService.d.ts.map +1 -1
  77. package/packages/server/dist/services/cliService.js +2 -7
  78. package/packages/server/dist/services/cliService.js.map +1 -1
  79. package/packages/server/dist/services/cliSessionPool.d.ts +13 -1
  80. package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -1
  81. package/packages/server/dist/services/cliSessionPool.js +14 -4
  82. package/packages/server/dist/services/cliSessionPool.js.map +1 -1
  83. package/packages/server/dist/services/preferencesService.d.ts +1 -0
  84. package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
  85. package/packages/server/dist/services/preferencesService.js +25 -2
  86. package/packages/server/dist/services/preferencesService.js.map +1 -1
  87. package/packages/server/dist/services/queueService.d.ts +1 -0
  88. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  89. package/packages/server/dist/services/queueService.js +3 -0
  90. package/packages/server/dist/services/queueService.js.map +1 -1
  91. package/packages/server/dist/services/rateLimitProbeService.d.ts +7 -0
  92. package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
  93. package/packages/server/dist/services/rateLimitProbeService.js +10 -0
  94. package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
  95. package/packages/server/dist/services/workspaceContext.d.ts +29 -3
  96. package/packages/server/dist/services/workspaceContext.d.ts.map +1 -1
  97. package/packages/server/dist/services/workspaceContext.js +100 -8
  98. package/packages/server/dist/services/workspaceContext.js.map +1 -1
  99. package/packages/server/dist/snippets/promote-to-story +86 -9
  100. package/packages/server/dist/utils/cliDebugLog.d.ts +6 -5
  101. package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -1
  102. package/packages/server/dist/utils/cliDebugLog.js +11 -8
  103. package/packages/server/dist/utils/cliDebugLog.js.map +1 -1
  104. package/packages/server/dist/utils/logger.d.ts +7 -0
  105. package/packages/server/dist/utils/logger.d.ts.map +1 -1
  106. package/packages/server/dist/utils/logger.js +13 -1
  107. package/packages/server/dist/utils/logger.js.map +1 -1
  108. package/packages/server/resources/manual/01-getting-started.md +11 -5
  109. package/packages/server/resources/manual/03-sessions.md +1 -0
  110. package/packages/server/resources/manual/04-slash-commands-favorites.md +1 -0
  111. package/packages/server/resources/manual/13-settings.md +34 -10
  112. package/packages/server/resources/manual/16-troubleshooting.md +4 -7
  113. package/packages/shared/dist/index.d.ts +2 -1
  114. package/packages/shared/dist/index.d.ts.map +1 -1
  115. package/packages/shared/dist/index.js +2 -0
  116. package/packages/shared/dist/index.js.map +1 -1
  117. package/packages/shared/dist/types/accounts.d.ts +104 -0
  118. package/packages/shared/dist/types/accounts.d.ts.map +1 -0
  119. package/packages/shared/dist/types/accounts.js +14 -0
  120. package/packages/shared/dist/types/accounts.js.map +1 -0
  121. package/packages/shared/dist/types/preferences.d.ts +39 -0
  122. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  123. package/packages/shared/dist/types/preferences.js.map +1 -1
  124. package/packages/shared/dist/types/sdk.d.ts +3 -1
  125. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  126. package/packages/shared/dist/types/sdk.js.map +1 -1
  127. package/packages/shared/dist/types/websocket.d.ts +23 -1
  128. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  129. package/packages/client/dist/assets/index-BsHMOF5r.css +0 -32
  130. package/packages/server/dist/snippets/promote-issue +0 -9
@@ -0,0 +1,417 @@
1
+ /**
2
+ * Claude Login Service (Story BS-7)
3
+ *
4
+ * Orchestrates the interactive `claude` `/login` OAuth flow from inside Hammoc so a user —
5
+ * including on mobile, with no host terminal — can authenticate without leaving the UI.
6
+ *
7
+ * It reuses the SAME PTY lifecycle the CLI chat engine uses (`cliSessionPool.spawnClaude`)
8
+ * and the SAME headless screen model (`cliScreenModel`) for prompt detection, but it is a
9
+ * SEPARATE, disposable login session: it is spawned in `os.tmpdir()` (not a project), it
10
+ * never injects a chat prompt, and it is torn down the moment login completes or times out.
11
+ * Isolation by construction — the chat session count (websocket `activeStreams`) and the web
12
+ * terminal pool (`ptyService`) are never touched.
13
+ *
14
+ * Browser auto-open is suppressed via `extraEnv: { BROWSER: 'none' }` (Story BS-7 added the
15
+ * `extraEnv` merge to `cliSessionPool.buildEnv`), so the CLI prints the OAuth URL on screen
16
+ * instead of shelling out to a desktop browser the mobile/remote client doesn't have.
17
+ *
18
+ * ── Detection sources (empirically verified against the bundled binary, claude v2.1.181, via
19
+ * a non-destructive node-pty probe — code never submitted, so auth state was untouched) ──
20
+ * - Trust prompt / login-method menu / "Paste code" prompt: read from the SETTLED screen grid
21
+ * (the box-chrome modal text the existing CLI detectors also read).
22
+ * - OAuth URL: read from the RAW PTY stream, de-wrapped — NOT the grid. The URL is ~450 chars
23
+ * and the live grid CORRUPTS it: claude hard-wraps the URL into ~118-char lines and the
24
+ * concurrent "✶ Opening browser…" spinner repaints overwrite the box edges (verified: the
25
+ * grid showed `tps://…` with the leading `ht` clipped and ~2 chars lost per row boundary).
26
+ * The raw stream carries the URL once, intact, so we extract + de-wrap from there.
27
+ *
28
+ * Version-fragile by nature (a future TUI revision can reword the prompts / restyle the menu);
29
+ * the four detection patterns are exported named constants so the tests assert against the same
30
+ * source the runtime uses, and a failure degrades to the manual "run /login in a terminal" path
31
+ * (the onboarding fallback the story's rollback note describes).
32
+ */
33
+ import os from 'os';
34
+ import path from 'path';
35
+ import { watch, existsSync, readFileSync, unlinkSync } from 'fs';
36
+ import { cliSessionPool } from './cliSessionPool.js';
37
+ import { createCliScreenModel, CLI_SCREEN_COLS, CLI_SCREEN_ROWS } from './cliScreenModel.js';
38
+ import { accountInfoService } from './accountInfoService.js';
39
+ import { rateLimitProbeService } from './rateLimitProbeService.js';
40
+ import { createLogger } from '../utils/logger.js';
41
+ const log = createLogger('claudeLoginService');
42
+ /** `~/.claude/.credentials.json` — the OAuth credentials file the CLI writes on success and that
43
+ * `rateLimitProbeService` reads. Auth completion is detected by this file gaining a token. */
44
+ const CREDENTIALS_PATH = path.join(os.homedir(), '.claude', '.credentials.json');
45
+ const CREDENTIALS_DIR = path.dirname(CREDENTIALS_PATH);
46
+ // ── Detection patterns (verified against claude v2.1.181 — see file header) ──
47
+ /** Trust prompt shown for an untrusted cwd. Defensive: a fresh `os.tmpdir()` spawn did NOT show
48
+ * it in the probe (Temp was already trusted), but other environments may, so it is auto-accepted
49
+ * when present before `/login` is injected. */
50
+ export const LOGIN_TRUST_PROMPT_RE = /Is this a project you created or one you trust\?/i;
51
+ /** The login-method selection menu anchor ("Select login method:" above the 3 numbered options). */
52
+ export const LOGIN_METHOD_PROMPT_RE = /Select login method:/i;
53
+ /** The OAuth authorize URL start anchor (the full URL is de-wrapped from the raw stream). */
54
+ export const OAUTH_URL_RE = /https:\/\/claude\.com\/cai\/oauth\/authorize\?/;
55
+ /** The code-entry prompt the CLI shows once the OAuth URL is displayed. */
56
+ export const LOGIN_CODE_PROMPT_RE = /Paste code here if prompted/i;
57
+ /** The idle input-box prompt glyph — boot readiness marker (shared with the CLI engine). */
58
+ const LOGIN_INPUT_MARKER = '❯';
59
+ /** A selection-menu footer ("Esc to cancel") — the AND-gate partner so a half-drawn menu can't
60
+ * match (same conservative spirit as the CLI permission/question detectors). */
61
+ const LOGIN_ESC_CANCEL_RE = /Esc\b[^\n]{0,16}\bcancel\b/i;
62
+ const ESC = '\x1b';
63
+ /** Strip ANSI CSI/OSC sequences and control bytes from a raw PTY chunk so the URL reads cleanly. */
64
+ function stripAnsi(s) {
65
+ return s
66
+ .replace(new RegExp(ESC + '\\[[0-9;?]*[A-Za-z]', 'g'), '')
67
+ .replace(new RegExp(ESC + '\\][^\\x07]*\\x07', 'g'), '')
68
+ .replace(new RegExp(ESC + '[=>]', 'g'), '')
69
+ // eslint-disable-next-line no-control-regex -- intentionally stripping raw PTY control bytes
70
+ .replace(/[\x00-\x09\x0b-\x1f]/g, '');
71
+ }
72
+ /** True when the settled grid shows the untrusted-cwd trust prompt. */
73
+ export function detectTrustPrompt(gridText) {
74
+ return LOGIN_TRUST_PROMPT_RE.test(gridText);
75
+ }
76
+ /** True when the settled grid shows the login-method selection menu (anchor + cancel footer). */
77
+ export function detectLoginMethodPrompt(gridText) {
78
+ return LOGIN_METHOD_PROMPT_RE.test(gridText) && LOGIN_ESC_CANCEL_RE.test(gridText);
79
+ }
80
+ /** True when the settled grid shows the "Paste code here" prompt (anchor + cancel footer). */
81
+ export function detectCodePrompt(gridText) {
82
+ return LOGIN_CODE_PROMPT_RE.test(gridText) && LOGIN_ESC_CANCEL_RE.test(gridText);
83
+ }
84
+ /**
85
+ * Extract the full OAuth authorize URL from the RAW (ANSI-stripped) PTY stream, de-wrapping
86
+ * claude's hard line breaks. claude prints the long URL split onto ~118-char lines with NO
87
+ * indent; each break is a real `\n` whose next char is a URL char (so we skip it), and the URL
88
+ * ends at the first real whitespace or a blank/indented line (next char is `\n`/space). Returns
89
+ * the first occurrence (the clean initial paint) or null when no URL is on screen yet.
90
+ */
91
+ export function extractOAuthUrl(rawText) {
92
+ const flat = stripAnsi(rawText).replace(/\r/g, '');
93
+ const start = flat.search(OAUTH_URL_RE);
94
+ if (start < 0)
95
+ return null;
96
+ let url = '';
97
+ for (let j = start; j < flat.length; j++) {
98
+ const c = flat[j];
99
+ if (c === '\n') {
100
+ const next = flat[j + 1];
101
+ // Hard-wrap continuation: the next line starts with another URL char → skip the break.
102
+ if (next && next !== '\n' && next !== ' ' && next !== '\t')
103
+ continue;
104
+ break; // blank / indented line → the URL ended on the previous char
105
+ }
106
+ if (c === ' ' || c === '\t')
107
+ break;
108
+ url += c;
109
+ }
110
+ return url.length > 0 ? url : null;
111
+ }
112
+ /** Read the OAuth access token from the credentials file, or null if absent/unreadable. */
113
+ function readCredentialsToken() {
114
+ try {
115
+ if (!existsSync(CREDENTIALS_PATH))
116
+ return null;
117
+ const data = JSON.parse(readFileSync(CREDENTIALS_PATH, 'utf-8'));
118
+ const token = data?.claudeAiOauth?.accessToken;
119
+ return typeof token === 'string' && token.length > 0 ? token : null;
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ /**
126
+ * Delete the OAuth credentials file (logout). Returns true when the file is gone afterward
127
+ * (deleted now or already absent). Best-effort — a delete failure is reported as false so the
128
+ * caller surfaces an error rather than a false "logged out".
129
+ */
130
+ export function deleteCredentials() {
131
+ try {
132
+ if (existsSync(CREDENTIALS_PATH))
133
+ unlinkSync(CREDENTIALS_PATH);
134
+ return !existsSync(CREDENTIALS_PATH);
135
+ }
136
+ catch (err) {
137
+ log.warn(`logout: failed to delete credentials: ${err instanceof Error ? err.message : String(err)}`);
138
+ return false;
139
+ }
140
+ }
141
+ const BOOT_SETTLE_MS = 400;
142
+ const SUBMIT_GAP_MS = 1000; // bracketed-paste-safe gap before the Enter that submits typed text
143
+ const KEY_GAP_MS = 350; // discrete keypress spacing (digit then Enter)
144
+ const CREDENTIALS_POLL_MS = 500;
145
+ const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;
146
+ /**
147
+ * One disposable interactive login session. Created per `auth:start`, driven by the client's
148
+ * `auth:select-method` / `auth:submit-code`, and disposed on completion / timeout / disconnect.
149
+ */
150
+ export class ClaudeLoginSession {
151
+ cb;
152
+ screen = createCliScreenModel();
153
+ handle = null;
154
+ pty = null;
155
+ phase = 'idle';
156
+ rawAccum = '';
157
+ bootBuffer = '';
158
+ injectedLogin = false;
159
+ trustAccepted = false;
160
+ methodPrompted = false;
161
+ urlEmitted = false;
162
+ codePrompted = false;
163
+ settled = false;
164
+ bootSettleTimer = null;
165
+ timeoutTimer = null;
166
+ credPollTimer = null;
167
+ credWatcher = null;
168
+ timeoutMs;
169
+ constructor(cb, timeoutMs = DEFAULT_TIMEOUT_MS) {
170
+ this.cb = cb;
171
+ this.timeoutMs = timeoutMs;
172
+ }
173
+ /** Spawn the disposable login PTY and begin the boot → /login sequence. */
174
+ start(binaryPathOverride) {
175
+ if (this.phase !== 'idle')
176
+ return;
177
+ this.phase = 'booting';
178
+ try {
179
+ const spawned = cliSessionPool.spawnClaude({
180
+ cwd: os.tmpdir(),
181
+ args: [],
182
+ cols: CLI_SCREEN_COLS,
183
+ rows: CLI_SCREEN_ROWS,
184
+ extraEnv: { BROWSER: 'none' },
185
+ binaryPathOverride,
186
+ });
187
+ this.handle = spawned.handle;
188
+ this.pty = spawned.pty;
189
+ }
190
+ catch (err) {
191
+ this.fail(`Failed to start login session: ${err instanceof Error ? err.message : String(err)}`);
192
+ return;
193
+ }
194
+ cliSessionPool.registerDisposer(this.handle, () => this.teardown());
195
+ this.pty.onData((data) => this.onData(data));
196
+ this.pty.onExit(({ exitCode }) => {
197
+ // The interactive REPL should not exit before login completes. An early exit means a
198
+ // spawn/auth failure — but if we're already completing/done, this is our own kill.
199
+ if (this.phase === 'completing' || this.phase === 'done' || this.settled)
200
+ return;
201
+ this.fail(`claude CLI exited (code ${exitCode}) before login completed`);
202
+ });
203
+ this.timeoutTimer = setTimeout(() => this.fail('Login timed out'), this.timeoutMs);
204
+ }
205
+ /** Inject the chosen login method (1/2/3) into the menu (digit + Enter). */
206
+ selectMethod(method) {
207
+ if (this.phase !== 'method-select' || !this.pty)
208
+ return;
209
+ this.phase = 'awaiting-url';
210
+ try {
211
+ this.pty.write(String(method));
212
+ setTimeout(() => {
213
+ if (this.settled || !this.pty)
214
+ return;
215
+ this.pty.write('\r');
216
+ }, KEY_GAP_MS);
217
+ }
218
+ catch (err) {
219
+ this.fail(`Failed to select login method: ${err instanceof Error ? err.message : String(err)}`);
220
+ }
221
+ }
222
+ /** Write the user-supplied auth code to the PTY and begin watching for credentials. */
223
+ submitCode(code) {
224
+ if (this.phase !== 'code-input' || !this.pty)
225
+ return;
226
+ // eslint-disable-next-line no-control-regex -- strip CR/LF/ESC so the code can't premature-submit or inject keys
227
+ const clean = code.replace(/[\r\n\x1b\x00-\x1f]/g, '').trim();
228
+ if (!clean) {
229
+ this.cb.onError('Empty auth code');
230
+ return;
231
+ }
232
+ this.phase = 'completing';
233
+ try {
234
+ this.pty.write(clean);
235
+ setTimeout(() => {
236
+ if (this.settled || !this.pty)
237
+ return;
238
+ this.pty.write('\r');
239
+ this.watchCredentials();
240
+ }, SUBMIT_GAP_MS);
241
+ }
242
+ catch (err) {
243
+ this.fail(`Failed to submit auth code: ${err instanceof Error ? err.message : String(err)}`);
244
+ }
245
+ }
246
+ /** Tear down the login PTY + screen model + timers/watchers. Idempotent. */
247
+ dispose() {
248
+ // Mark settled BEFORE killing the PTY. dispose() is always an INTENTIONAL teardown — the
249
+ // session was replaced by a new `auth:start` (the user re-picked a method / went back), or
250
+ // its socket went away, or it already completed/failed. Killing the PTY fires `onExit`, and
251
+ // without this flag that handler would mistake the intentional kill for a crash and emit a
252
+ // spurious `claude CLI exited (code 129)` failure into the (now unrelated) UI. Setting
253
+ // `settled` first makes onExit a no-op. Harmless when complete()/fail() already set it.
254
+ this.settled = true;
255
+ if (this.handle) {
256
+ cliSessionPool.dispose(this.handle); // runs teardown() via the registered disposer
257
+ }
258
+ else {
259
+ this.teardown();
260
+ }
261
+ }
262
+ // ── internals ──
263
+ onData(data) {
264
+ if (this.settled)
265
+ return;
266
+ this.screen.write(data);
267
+ this.rawAccum += data;
268
+ // Bound memory on a pathological run; the URL block is far smaller than this window.
269
+ if (this.rawAccum.length > 512 * 1024)
270
+ this.rawAccum = this.rawAccum.slice(-256 * 1024);
271
+ if (!this.injectedLogin) {
272
+ this.bootBuffer += data;
273
+ if (this.bootBuffer.includes(LOGIN_INPUT_MARKER) || detectTrustPrompt(this.bootBuffer)) {
274
+ if (this.bootSettleTimer)
275
+ clearTimeout(this.bootSettleTimer);
276
+ this.bootSettleTimer = setTimeout(() => this.afterBootSettle(), BOOT_SETTLE_MS);
277
+ }
278
+ return;
279
+ }
280
+ void this.screen.flush().then(() => this.consumeGrid());
281
+ }
282
+ afterBootSettle() {
283
+ if (this.injectedLogin || this.settled || !this.pty)
284
+ return;
285
+ void this.screen.flush().then(() => {
286
+ if (this.injectedLogin || this.settled || !this.pty)
287
+ return;
288
+ const text = this.screen.readScreenText();
289
+ // Auto-accept the trust prompt (if present) and re-wait for the input box (AC2).
290
+ if (!this.trustAccepted && detectTrustPrompt(text)) {
291
+ this.trustAccepted = true;
292
+ try {
293
+ this.pty.write('\r');
294
+ }
295
+ catch {
296
+ /* PTY may be gone */
297
+ }
298
+ return; // the next box-marker frame re-arms the settle timer
299
+ }
300
+ // Input box ready → inject `/login` (typed, Enter as a separate bracketed-paste-safe write).
301
+ this.injectedLogin = true;
302
+ this.phase = 'method-select';
303
+ this.bootBuffer = '';
304
+ try {
305
+ this.pty.write('/login');
306
+ setTimeout(() => {
307
+ if (this.settled || !this.pty)
308
+ return;
309
+ this.pty.write('\r');
310
+ }, SUBMIT_GAP_MS);
311
+ }
312
+ catch (err) {
313
+ this.fail(`Failed to inject /login: ${err instanceof Error ? err.message : String(err)}`);
314
+ }
315
+ });
316
+ }
317
+ consumeGrid() {
318
+ if (this.settled)
319
+ return;
320
+ const text = this.screen.readScreenText();
321
+ // Login-method menu → signal the client to present the 3 options (once).
322
+ if (!this.methodPrompted && this.phase === 'method-select' && detectLoginMethodPrompt(text)) {
323
+ this.methodPrompted = true;
324
+ this.cb.onMethodPrompt();
325
+ return;
326
+ }
327
+ // OAuth URL — extracted from the RAW stream (the grid corrupts the long URL). Emit once.
328
+ if (!this.urlEmitted && (this.phase === 'awaiting-url' || this.phase === 'code-input')) {
329
+ const url = extractOAuthUrl(this.rawAccum);
330
+ if (url) {
331
+ this.urlEmitted = true;
332
+ this.cb.onUrl(url);
333
+ }
334
+ }
335
+ // "Paste code here" prompt → signal the client to show the code input (once).
336
+ if (!this.codePrompted && (this.phase === 'awaiting-url' || this.phase === 'code-input') && detectCodePrompt(text)) {
337
+ this.codePrompted = true;
338
+ this.phase = 'code-input';
339
+ this.cb.onCodePrompt();
340
+ }
341
+ }
342
+ /**
343
+ * Watch the credentials file for a token (fs.watch as the low-latency trigger + a poll loop as
344
+ * the deterministic fallback — the file may not exist yet, and fs.watch reliability varies by
345
+ * platform). On a token appearing, refresh account info and complete.
346
+ */
347
+ watchCredentials() {
348
+ if (this.settled)
349
+ return;
350
+ const check = () => {
351
+ if (this.settled)
352
+ return;
353
+ if (readCredentialsToken())
354
+ this.complete();
355
+ };
356
+ try {
357
+ this.credWatcher = watch(CREDENTIALS_DIR, () => check());
358
+ }
359
+ catch {
360
+ // Directory may not exist yet — the poll loop covers it.
361
+ }
362
+ this.credPollTimer = setInterval(check, CREDENTIALS_POLL_MS);
363
+ check();
364
+ }
365
+ complete() {
366
+ if (this.settled)
367
+ return;
368
+ this.settled = true;
369
+ this.phase = 'done';
370
+ // Invalidate the rate-limit probe's cached (logged-out) token so it re-reads the new file.
371
+ rateLimitProbeService.invalidateTokenCache();
372
+ accountInfoService
373
+ .refresh()
374
+ .then((account) => this.cb.onComplete(account))
375
+ .catch(() => this.cb.onComplete(null))
376
+ .finally(() => this.dispose());
377
+ }
378
+ fail(message) {
379
+ if (this.settled)
380
+ return;
381
+ this.settled = true;
382
+ this.phase = 'error';
383
+ log.warn(`login failed: ${message}`);
384
+ this.cb.onError(message);
385
+ this.dispose();
386
+ }
387
+ teardown() {
388
+ this.handle = null;
389
+ this.pty = null;
390
+ if (this.bootSettleTimer) {
391
+ clearTimeout(this.bootSettleTimer);
392
+ this.bootSettleTimer = null;
393
+ }
394
+ if (this.timeoutTimer) {
395
+ clearTimeout(this.timeoutTimer);
396
+ this.timeoutTimer = null;
397
+ }
398
+ if (this.credPollTimer) {
399
+ clearInterval(this.credPollTimer);
400
+ this.credPollTimer = null;
401
+ }
402
+ try {
403
+ this.credWatcher?.close();
404
+ }
405
+ catch {
406
+ /* ignore */
407
+ }
408
+ this.credWatcher = null;
409
+ try {
410
+ this.screen.dispose();
411
+ }
412
+ catch {
413
+ /* ignore */
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=claudeLoginService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeLoginService.js","sourceRoot":"","sources":["../../src/services/claudeLoginService.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cliChatEngine.d.ts","sourceRoot":"","sources":["../../src/services/cliChatEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cliChatEngine.d.ts","sourceRoot":"","sources":["../../src/services/cliChatEngine.ts"],"names":[],"mappings":"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"}