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.
- package/README.md +2 -2
- package/package.json +1 -1
- package/packages/client/dist/assets/{agentExampleHighlight-De1SlBXH.js → agentExampleHighlight-B2IJxYzN.js} +1 -1
- package/packages/client/dist/assets/{commandTokenHighlight-COQi5YnH.js → commandTokenHighlight-BdGXkDR5.js} +1 -1
- package/packages/client/dist/assets/{index-D8XvfvVS.js → index-BFWGN51V.js} +1 -1
- package/packages/client/dist/assets/index-BX7y_Qt3.css +32 -0
- package/packages/client/dist/assets/{index-CQgqPGOG.js → index-lmx-m-iP.js} +552 -478
- package/packages/client/dist/assets/{snippetTokenHighlight-jMAHlrFd.js → snippetTokenHighlight-B9bH9Npx.js} +1 -1
- package/packages/client/dist/index.html +2 -2
- package/packages/client/dist/sw.js +1 -1
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +25 -1
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/config/index.d.ts +10 -0
- package/packages/server/dist/config/index.d.ts.map +1 -1
- package/packages/server/dist/config/index.js +10 -0
- package/packages/server/dist/config/index.js.map +1 -1
- package/packages/server/dist/controllers/accountController.d.ts +19 -0
- package/packages/server/dist/controllers/accountController.d.ts.map +1 -0
- package/packages/server/dist/controllers/accountController.js +92 -0
- package/packages/server/dist/controllers/accountController.js.map +1 -0
- package/packages/server/dist/controllers/projectController.d.ts +1 -1
- package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
- package/packages/server/dist/controllers/projectController.js +19 -5
- package/packages/server/dist/controllers/projectController.js.map +1 -1
- package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
- package/packages/server/dist/controllers/serverController.js +8 -1
- package/packages/server/dist/controllers/serverController.js.map +1 -1
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +83 -6
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/index.js +8 -0
- package/packages/server/dist/index.js.map +1 -1
- package/packages/server/dist/middleware/session.d.ts.map +1 -1
- package/packages/server/dist/middleware/session.js +7 -5
- package/packages/server/dist/middleware/session.js.map +1 -1
- package/packages/server/dist/routes/accounts.d.ts +13 -0
- package/packages/server/dist/routes/accounts.d.ts.map +1 -0
- package/packages/server/dist/routes/accounts.js +18 -0
- package/packages/server/dist/routes/accounts.js.map +1 -0
- package/packages/server/dist/routes/config.d.ts +3 -0
- package/packages/server/dist/routes/config.d.ts.map +1 -0
- package/packages/server/dist/routes/config.js +59 -0
- package/packages/server/dist/routes/config.js.map +1 -0
- package/packages/server/dist/routes/preferences.d.ts.map +1 -1
- package/packages/server/dist/routes/preferences.js +22 -4
- package/packages/server/dist/routes/preferences.js.map +1 -1
- package/packages/server/dist/services/accountInfoService.js +6 -6
- package/packages/server/dist/services/accountInfoService.js.map +1 -1
- package/packages/server/dist/services/accountStorageService.d.ts +119 -0
- package/packages/server/dist/services/accountStorageService.d.ts.map +1 -0
- package/packages/server/dist/services/accountStorageService.js +285 -0
- package/packages/server/dist/services/accountStorageService.js.map +1 -0
- package/packages/server/dist/services/chatService.d.ts.map +1 -1
- package/packages/server/dist/services/chatService.js +4 -8
- package/packages/server/dist/services/chatService.js.map +1 -1
- package/packages/server/dist/services/claudeLoginService.d.ts +124 -0
- package/packages/server/dist/services/claudeLoginService.d.ts.map +1 -0
- package/packages/server/dist/services/claudeLoginService.js +417 -0
- package/packages/server/dist/services/claudeLoginService.js.map +1 -0
- package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -1
- package/packages/server/dist/services/cliChatEngine.js +85 -33
- package/packages/server/dist/services/cliChatEngine.js.map +1 -1
- package/packages/server/dist/services/cliGridCards.d.ts +30 -10
- package/packages/server/dist/services/cliGridCards.d.ts.map +1 -1
- package/packages/server/dist/services/cliGridCards.js +80 -34
- package/packages/server/dist/services/cliGridCards.js.map +1 -1
- package/packages/server/dist/services/cliModalDetect.d.ts +15 -7
- package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -1
- package/packages/server/dist/services/cliModalDetect.js +16 -12
- package/packages/server/dist/services/cliModalDetect.js.map +1 -1
- package/packages/server/dist/services/cliScreenModel.d.ts +3 -2
- package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -1
- package/packages/server/dist/services/cliScreenModel.js +2 -0
- package/packages/server/dist/services/cliScreenModel.js.map +1 -1
- package/packages/server/dist/services/cliService.d.ts.map +1 -1
- package/packages/server/dist/services/cliService.js +2 -7
- package/packages/server/dist/services/cliService.js.map +1 -1
- package/packages/server/dist/services/cliSessionPool.d.ts +13 -1
- package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -1
- package/packages/server/dist/services/cliSessionPool.js +14 -4
- package/packages/server/dist/services/cliSessionPool.js.map +1 -1
- package/packages/server/dist/services/preferencesService.d.ts +1 -0
- package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
- package/packages/server/dist/services/preferencesService.js +25 -2
- package/packages/server/dist/services/preferencesService.js.map +1 -1
- package/packages/server/dist/services/queueService.d.ts +1 -0
- package/packages/server/dist/services/queueService.d.ts.map +1 -1
- package/packages/server/dist/services/queueService.js +3 -0
- package/packages/server/dist/services/queueService.js.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.d.ts +7 -0
- package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.js +10 -0
- package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
- package/packages/server/dist/services/workspaceContext.d.ts +29 -3
- package/packages/server/dist/services/workspaceContext.d.ts.map +1 -1
- package/packages/server/dist/services/workspaceContext.js +100 -8
- package/packages/server/dist/services/workspaceContext.js.map +1 -1
- package/packages/server/dist/snippets/promote-to-story +86 -9
- package/packages/server/dist/utils/cliDebugLog.d.ts +6 -5
- package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -1
- package/packages/server/dist/utils/cliDebugLog.js +11 -8
- package/packages/server/dist/utils/cliDebugLog.js.map +1 -1
- package/packages/server/dist/utils/logger.d.ts +7 -0
- package/packages/server/dist/utils/logger.d.ts.map +1 -1
- package/packages/server/dist/utils/logger.js +13 -1
- package/packages/server/dist/utils/logger.js.map +1 -1
- package/packages/server/resources/manual/01-getting-started.md +11 -5
- package/packages/server/resources/manual/03-sessions.md +1 -0
- package/packages/server/resources/manual/04-slash-commands-favorites.md +1 -0
- package/packages/server/resources/manual/13-settings.md +34 -10
- package/packages/server/resources/manual/16-troubleshooting.md +4 -7
- package/packages/shared/dist/index.d.ts +2 -1
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +2 -0
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/accounts.d.ts +104 -0
- package/packages/shared/dist/types/accounts.d.ts.map +1 -0
- package/packages/shared/dist/types/accounts.js +14 -0
- package/packages/shared/dist/types/accounts.js.map +1 -0
- package/packages/shared/dist/types/preferences.d.ts +39 -0
- package/packages/shared/dist/types/preferences.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.js.map +1 -1
- package/packages/shared/dist/types/sdk.d.ts +3 -1
- package/packages/shared/dist/types/sdk.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.js.map +1 -1
- package/packages/shared/dist/types/websocket.d.ts +23 -1
- package/packages/shared/dist/types/websocket.d.ts.map +1 -1
- package/packages/client/dist/assets/index-BsHMOF5r.css +0 -32
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAoB,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACtG,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EAEZ,cAAc,EACd,eAAe,EAWhB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cliChatEngine.d.ts","sourceRoot":"","sources":["../../src/services/cliChatEngine.ts"],"names":[],"mappings":"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"}
|