memoire-ai 0.6.13 → 0.6.15
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 +17 -6
- package/dist/ascii-success.js +10 -10
- package/dist/ascii-success.js.map +1 -1
- package/dist/auth.d.ts +12 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +288 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.js +21 -326
- package/dist/cli.js.map +1 -1
- package/dist/configure.d.ts +0 -45
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +60 -401
- package/dist/configure.js.map +1 -1
- package/dist/hooks.d.ts +2 -13
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +131 -451
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/dist/local-config.d.ts +5 -2
- package/dist/local-config.d.ts.map +1 -1
- package/dist/local-config.js +1 -1
- package/dist/local-config.js.map +1 -1
- package/dist/manual.js +12 -12
- package/dist/manual.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +2 -22
- package/dist/mcp.js.map +1 -1
- package/dist/profiler/codebase-analyzer.d.ts +34 -0
- package/dist/profiler/codebase-analyzer.d.ts.map +1 -0
- package/dist/profiler/codebase-analyzer.js +622 -0
- package/dist/profiler/codebase-analyzer.js.map +1 -0
- package/dist/profiler/convention-detector.d.ts +11 -0
- package/dist/profiler/convention-detector.d.ts.map +1 -0
- package/dist/profiler/convention-detector.js +408 -0
- package/dist/profiler/convention-detector.js.map +1 -0
- package/dist/profiler/git-scanner.d.ts +8 -0
- package/dist/profiler/git-scanner.d.ts.map +1 -0
- package/dist/profiler/git-scanner.js +246 -0
- package/dist/profiler/git-scanner.js.map +1 -0
- package/dist/profiler/index.d.ts +50 -0
- package/dist/profiler/index.d.ts.map +1 -0
- package/dist/profiler/index.js +374 -0
- package/dist/profiler/index.js.map +1 -0
- package/dist/profiler/mcp-installer.d.ts +34 -0
- package/dist/profiler/mcp-installer.d.ts.map +1 -0
- package/dist/profiler/mcp-installer.js +249 -0
- package/dist/profiler/mcp-installer.js.map +1 -0
- package/dist/profiler/skill-engine.d.ts +43 -0
- package/dist/profiler/skill-engine.d.ts.map +1 -0
- package/dist/profiler/skill-engine.js +295 -0
- package/dist/profiler/skill-engine.js.map +1 -0
- package/dist/profiler/watcher.d.ts +44 -0
- package/dist/profiler/watcher.d.ts.map +1 -0
- package/dist/profiler/watcher.js +122 -0
- package/dist/profiler/watcher.js.map +1 -0
- package/dist/uninstall.js +1 -1
- package/dist/uninstall.js.map +1 -1
- package/package.json +11 -17
- package/skills/use-memoire/SKILL.md +50 -89
package/README.md
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
# Memoire CLI
|
|
2
2
|
|
|
3
|
-
Memoire installs
|
|
3
|
+
Memoire installs local research tools and last-session context for Cursor, Claude Code, Codex, and Amp.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Setup
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx memoire
|
|
8
|
+
npx memoire-ai setup --client cursor
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Commands
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
npx memoire
|
|
15
|
-
|
|
14
|
+
npx memoire-ai setup --client cursor
|
|
15
|
+
memoire pause
|
|
16
|
+
memoire unpause
|
|
17
|
+
memoire uninstall
|
|
18
|
+
memoire mcp
|
|
16
19
|
```
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
## What you get
|
|
22
|
+
|
|
23
|
+
- `memoire_code_search` for GitHub code search
|
|
24
|
+
- `arxiv_search` for paper lookup
|
|
25
|
+
- `fetch_url` for reading docs and raw files
|
|
26
|
+
- `index_docs`, `search_docs`, `list_docs`, and `remove_docs` for local docs indexing
|
|
27
|
+
- `get_session_context` for the last session summary
|
|
28
|
+
|
|
29
|
+
Memoire stores its local state in `~/.memoire/` and does not require a cloud service or API key for the default setup.
|
package/dist/ascii-success.js
CHANGED
|
@@ -107,9 +107,9 @@ export async function playSuccessAnimation(client) {
|
|
|
107
107
|
write('\n');
|
|
108
108
|
// Phase 5: Closing message
|
|
109
109
|
const closing = [
|
|
110
|
-
'Your agents now
|
|
111
|
-
'
|
|
112
|
-
'
|
|
110
|
+
'Your agents now reuse the last session context.',
|
|
111
|
+
'Research tools and local docs are ready whenever you need them.',
|
|
112
|
+
'Memoire stays local by default.',
|
|
113
113
|
];
|
|
114
114
|
for (const line of closing) {
|
|
115
115
|
write(`${C.brand} ${line}${C.reset}\n`);
|
|
@@ -119,21 +119,21 @@ export async function playSuccessAnimation(client) {
|
|
|
119
119
|
}
|
|
120
120
|
function printStaticSuccess(client) {
|
|
121
121
|
console.log(`\n ◆ Memoire is active for ${client}`);
|
|
122
|
-
console.log('
|
|
122
|
+
console.log(' Local research tools and session context are ready.\n');
|
|
123
123
|
}
|
|
124
124
|
function getTips(client) {
|
|
125
125
|
const base = [
|
|
126
126
|
'Quick start:',
|
|
127
127
|
'',
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
' Resume work → use `get_session_context()` in your agent',
|
|
129
|
+
' Research code → use `memoire_code_search(query: "...")`',
|
|
130
|
+
' Search docs → use `index_docs(...)` then `search_docs(...)`',
|
|
131
131
|
'',
|
|
132
132
|
'Commands:',
|
|
133
133
|
'',
|
|
134
|
-
' memoire
|
|
135
|
-
' memoire
|
|
136
|
-
' memoire
|
|
134
|
+
' memoire pause Pause hooks',
|
|
135
|
+
' memoire unpause Resume hooks',
|
|
136
|
+
' memoire uninstall Remove Memoire from this project',
|
|
137
137
|
];
|
|
138
138
|
if (client === 'cursor') {
|
|
139
139
|
base.push('', 'Context is auto-injected via .cursor/rules/ on every prompt.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ascii-success.js","sourceRoot":"","sources":["../src/ascii-success.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ascii-success.js","sourceRoot":"","sources":["../src/ascii-success.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memoire auth <provider>
|
|
3
|
+
*
|
|
4
|
+
* Reads locally-stored CLI credentials (Claude Code or Codex) and syncs them
|
|
5
|
+
* to the Memoire dashboard via the auth bridge API.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx memoire-ai auth claude --session=<id>
|
|
9
|
+
* npx memoire-ai auth codex --session=<id>
|
|
10
|
+
*/
|
|
11
|
+
export declare function runAuthCommand(provider: string | undefined, sessionId: string | undefined): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+PH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,IAAI,CAAC,CA6Ff"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memoire auth <provider>
|
|
3
|
+
*
|
|
4
|
+
* Reads locally-stored CLI credentials (Claude Code or Codex) and syncs them
|
|
5
|
+
* to the Memoire dashboard via the auth bridge API.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx memoire-ai auth claude --session=<id>
|
|
9
|
+
* npx memoire-ai auth codex --session=<id>
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { execFileSync } from 'node:child_process';
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Credential readers (ported from memi/src/agents/cli-credentials.ts)
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
const CLAUDE_CREDENTIALS_PATH = '.claude/.credentials.json';
|
|
20
|
+
const CLAUDE_KEYCHAIN_SERVICE = 'Claude Code-credentials';
|
|
21
|
+
const CODEX_AUTH_FILENAME = 'auth.json';
|
|
22
|
+
function readClaudeCredentials() {
|
|
23
|
+
// Try macOS Keychain first (using execFileSync to prevent shell injection)
|
|
24
|
+
if (process.platform === 'darwin') {
|
|
25
|
+
try {
|
|
26
|
+
const result = execFileSync('security', ['find-generic-password', '-s', CLAUDE_KEYCHAIN_SERVICE, '-w'], { encoding: 'utf8', timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
27
|
+
const data = JSON.parse(result.trim());
|
|
28
|
+
const oauth = data?.claudeAiOauth;
|
|
29
|
+
if (oauth?.accessToken) {
|
|
30
|
+
return {
|
|
31
|
+
provider: 'anthropic',
|
|
32
|
+
access_token: oauth.accessToken,
|
|
33
|
+
refresh_token: oauth.refreshToken || undefined,
|
|
34
|
+
expires_at: oauth.expiresAt
|
|
35
|
+
? new Date(oauth.expiresAt).toISOString()
|
|
36
|
+
: undefined,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Keychain not available or no entry — fall through to file
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Try credentials file
|
|
45
|
+
const credPath = join(homedir(), CLAUDE_CREDENTIALS_PATH);
|
|
46
|
+
if (!existsSync(credPath))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const raw = JSON.parse(readFileSync(credPath, 'utf-8'));
|
|
50
|
+
const oauth = raw?.claudeAiOauth;
|
|
51
|
+
if (!oauth?.accessToken)
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
provider: 'anthropic',
|
|
55
|
+
access_token: oauth.accessToken,
|
|
56
|
+
refresh_token: oauth.refreshToken || undefined,
|
|
57
|
+
expires_at: oauth.expiresAt
|
|
58
|
+
? new Date(oauth.expiresAt).toISOString()
|
|
59
|
+
: undefined,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function resolveCodexHome() {
|
|
67
|
+
const configured = process.env.CODEX_HOME;
|
|
68
|
+
return configured ?? join(homedir(), '.codex');
|
|
69
|
+
}
|
|
70
|
+
function readCodexCredentials() {
|
|
71
|
+
// Try macOS Keychain first
|
|
72
|
+
if (process.platform === 'darwin') {
|
|
73
|
+
try {
|
|
74
|
+
const codexHome = resolveCodexHome();
|
|
75
|
+
const hash = createHash('sha256').update(codexHome).digest('hex');
|
|
76
|
+
const account = `cli|${hash.slice(0, 16)}`;
|
|
77
|
+
const result = execFileSync('security', ['find-generic-password', '-s', 'Codex Auth', '-a', account, '-w'], { encoding: 'utf8', timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
78
|
+
const data = JSON.parse(result.trim());
|
|
79
|
+
const tokens = data?.tokens;
|
|
80
|
+
if (tokens?.access_token) {
|
|
81
|
+
const expiresMs = decodeJwtExpiry(tokens.access_token);
|
|
82
|
+
return {
|
|
83
|
+
provider: 'openai',
|
|
84
|
+
access_token: tokens.access_token,
|
|
85
|
+
refresh_token: tokens.refresh_token || undefined,
|
|
86
|
+
expires_at: expiresMs ? new Date(expiresMs).toISOString() : undefined,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Keychain not available — fall through to file
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Try auth.json file
|
|
95
|
+
const authPath = join(resolveCodexHome(), CODEX_AUTH_FILENAME);
|
|
96
|
+
if (!existsSync(authPath))
|
|
97
|
+
return null;
|
|
98
|
+
try {
|
|
99
|
+
const raw = JSON.parse(readFileSync(authPath, 'utf-8'));
|
|
100
|
+
const tokens = raw?.tokens;
|
|
101
|
+
if (!tokens?.access_token)
|
|
102
|
+
return null;
|
|
103
|
+
const expiresMs = decodeJwtExpiry(tokens.access_token);
|
|
104
|
+
return {
|
|
105
|
+
provider: 'openai',
|
|
106
|
+
access_token: tokens.access_token,
|
|
107
|
+
refresh_token: tokens.refresh_token || undefined,
|
|
108
|
+
expires_at: expiresMs ? new Date(expiresMs).toISOString() : undefined,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Decode JWT expiry (exp claim) without a library. */
|
|
116
|
+
function decodeJwtExpiry(token) {
|
|
117
|
+
const parts = token.split('.');
|
|
118
|
+
if (parts.length < 2)
|
|
119
|
+
return null;
|
|
120
|
+
try {
|
|
121
|
+
const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
|
|
122
|
+
return typeof payload.exp === 'number' ? payload.exp * 1000 : null;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// OpenAI Device Code Flow (runs from user's terminal — no CORS/Cloudflare)
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
const OPENAI_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
|
|
132
|
+
async function doCodexDeviceCodeFlow() {
|
|
133
|
+
console.log(' No local Codex credentials found.');
|
|
134
|
+
console.log(' Starting ChatGPT sign-in...\n');
|
|
135
|
+
const res = await fetch('https://auth0.openai.com/oauth/device/code', {
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
138
|
+
body: new URLSearchParams({
|
|
139
|
+
client_id: OPENAI_CLIENT_ID,
|
|
140
|
+
scope: 'openid profile email offline_access',
|
|
141
|
+
}),
|
|
142
|
+
});
|
|
143
|
+
if (!res.ok) {
|
|
144
|
+
const text = await res.text().catch(() => '');
|
|
145
|
+
throw new Error(`OpenAI device code request failed (${res.status}): ${text.slice(0, 200)}`);
|
|
146
|
+
}
|
|
147
|
+
const data = (await res.json());
|
|
148
|
+
if (!data.device_code) {
|
|
149
|
+
throw new Error('No device code returned from OpenAI');
|
|
150
|
+
}
|
|
151
|
+
const verificationUri = data.verification_uri_complete || data.verification_uri;
|
|
152
|
+
console.log(` Your code: ${data.user_code}`);
|
|
153
|
+
console.log(` Open this URL: ${verificationUri}\n`);
|
|
154
|
+
// Try to open browser automatically
|
|
155
|
+
try {
|
|
156
|
+
const openCmd = process.platform === 'darwin' ? 'open'
|
|
157
|
+
: process.platform === 'win32' ? 'start'
|
|
158
|
+
: 'xdg-open';
|
|
159
|
+
execFileSync(openCmd, [verificationUri], {
|
|
160
|
+
stdio: 'ignore',
|
|
161
|
+
timeout: 5000,
|
|
162
|
+
});
|
|
163
|
+
console.log(' Browser opened. Enter the code above, then authorize.');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
console.log(' Open the URL above in your browser and enter the code.');
|
|
167
|
+
}
|
|
168
|
+
console.log(' Waiting for authorization...\n');
|
|
169
|
+
const interval = (data.interval || 5) * 1000;
|
|
170
|
+
const deadline = Date.now() + data.expires_in * 1000;
|
|
171
|
+
while (Date.now() < deadline) {
|
|
172
|
+
await new Promise((r) => setTimeout(r, interval));
|
|
173
|
+
const tokenRes = await fetch('https://auth0.openai.com/oauth/token', {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
176
|
+
body: new URLSearchParams({
|
|
177
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
178
|
+
device_code: data.device_code,
|
|
179
|
+
client_id: OPENAI_CLIENT_ID,
|
|
180
|
+
}),
|
|
181
|
+
});
|
|
182
|
+
const tokenData = (await tokenRes.json());
|
|
183
|
+
if (tokenData.error === 'authorization_pending' || tokenData.error === 'slow_down') {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (!tokenRes.ok || !tokenData.access_token) {
|
|
187
|
+
throw new Error(tokenData.error_description || tokenData.error || 'Token exchange failed');
|
|
188
|
+
}
|
|
189
|
+
const expiresMs = tokenData.expires_in
|
|
190
|
+
? Date.now() + tokenData.expires_in * 1000
|
|
191
|
+
: null;
|
|
192
|
+
return {
|
|
193
|
+
provider: 'openai',
|
|
194
|
+
access_token: tokenData.access_token,
|
|
195
|
+
refresh_token: tokenData.refresh_token || undefined,
|
|
196
|
+
expires_at: expiresMs ? new Date(expiresMs).toISOString() : undefined,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
throw new Error('Device code expired. Please try again.');
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Main auth command
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
const DASHBOARD_URL = process.env.MEMOIRE_DASHBOARD_URL || 'https://trymemoire.com';
|
|
205
|
+
export async function runAuthCommand(provider, sessionId) {
|
|
206
|
+
if (!provider || !['claude', 'codex', 'anthropic', 'openai'].includes(provider)) {
|
|
207
|
+
console.error(`
|
|
208
|
+
Usage: memoire auth <provider> --session=<id>
|
|
209
|
+
|
|
210
|
+
Providers:
|
|
211
|
+
claude Sync Claude Code credentials (from ~/.claude/)
|
|
212
|
+
codex Sync Codex credentials or sign in with ChatGPT
|
|
213
|
+
|
|
214
|
+
The --session flag links this to your dashboard. Get the full command
|
|
215
|
+
from trymemoire.com/settings/coding-agents.
|
|
216
|
+
`);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
if (!sessionId) {
|
|
220
|
+
console.error(' Error: --session flag is required.');
|
|
221
|
+
console.error(' Copy the full command from your Memoire dashboard.\n');
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
// Normalize provider name
|
|
225
|
+
const isAnthropic = provider === 'claude' || provider === 'anthropic';
|
|
226
|
+
const providerLabel = isAnthropic ? 'Claude Code' : 'Codex';
|
|
227
|
+
const apiProvider = isAnthropic ? 'anthropic' : 'openai';
|
|
228
|
+
console.log(`\n Reading ${providerLabel} credentials...`);
|
|
229
|
+
// Read local credentials
|
|
230
|
+
let cred = isAnthropic ? readClaudeCredentials() : readCodexCredentials();
|
|
231
|
+
if (!cred && isAnthropic) {
|
|
232
|
+
console.error('\n No Claude Code credentials found.');
|
|
233
|
+
console.error(' Run "claude" in your terminal to authenticate first.');
|
|
234
|
+
console.error(' Credentials are stored in ~/.claude/.credentials.json\n');
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
// For Codex: if no local creds, run the device code flow from this terminal
|
|
238
|
+
if (!cred && !isAnthropic) {
|
|
239
|
+
cred = await doCodexDeviceCodeFlow();
|
|
240
|
+
}
|
|
241
|
+
if (!cred) {
|
|
242
|
+
console.error(`\n No ${providerLabel} credentials found.\n`);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
console.log(` Found ${providerLabel} credentials.`);
|
|
246
|
+
// Check if token is expired
|
|
247
|
+
if (cred.expires_at) {
|
|
248
|
+
const expiresAt = new Date(cred.expires_at).getTime();
|
|
249
|
+
if (Date.now() > expiresAt) {
|
|
250
|
+
console.error(`\n Warning: ${providerLabel} token is expired.`);
|
|
251
|
+
console.error(` Re-authenticate by running "${isAnthropic ? 'claude' : 'codex'}" first.\n`);
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Send to bridge API
|
|
256
|
+
console.log(' Syncing to Memoire dashboard...');
|
|
257
|
+
try {
|
|
258
|
+
const res = await fetch(`${DASHBOARD_URL}/api/auth/bridge`, {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: { 'Content-Type': 'application/json' },
|
|
261
|
+
body: JSON.stringify({
|
|
262
|
+
session_id: sessionId,
|
|
263
|
+
provider: apiProvider,
|
|
264
|
+
access_token: cred.access_token,
|
|
265
|
+
refresh_token: cred.refresh_token,
|
|
266
|
+
expires_at: cred.expires_at,
|
|
267
|
+
}),
|
|
268
|
+
});
|
|
269
|
+
if (!res.ok) {
|
|
270
|
+
const body = await res.json().catch(() => ({ error: 'Unknown error' }));
|
|
271
|
+
if (res.status === 404) {
|
|
272
|
+
console.error('\n Session expired or invalid. Generate a new command from the dashboard.\n');
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.error(`\n Error: ${body.error || `HTTP ${res.status}`}\n`);
|
|
276
|
+
}
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
console.log(`\n ${providerLabel} connected successfully!`);
|
|
280
|
+
console.log(' You can close this terminal and return to the dashboard.\n');
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
console.error(`\n Network error: ${e instanceof Error ? e.message : String(e)}`);
|
|
284
|
+
console.error(' Check your internet connection and try again.\n');
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|