@glbgpt/cli 0.1.0-test.1 → 0.1.0-test.2
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/dist/src/auth/loginFlow.d.ts +38 -3
- package/dist/src/auth/loginFlow.js +52 -8
- package/dist/src/auth/loginFlow.js.map +1 -1
- package/dist/src/commands/loginCommand.d.ts +5 -0
- package/dist/src/commands/loginCommand.js +56 -32
- package/dist/src/commands/loginCommand.js.map +1 -1
- package/dist/src/index.js +0 -0
- package/dist/src/tui/run.js +19 -7
- package/dist/src/tui/run.js.map +1 -1
- package/package.json +5 -5
|
@@ -11,16 +11,51 @@ export interface BrowserLoginDeps {
|
|
|
11
11
|
lang: string;
|
|
12
12
|
authClient: AuthApi;
|
|
13
13
|
credentialStore: CredentialStore;
|
|
14
|
-
/**
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Present the sign-in options. `loopbackUrl` completes automatically when the browser is on
|
|
16
|
+
* THIS machine; `codeUrl` shows a one-time code to paste (for a remote/SSH box whose browser
|
|
17
|
+
* lives elsewhere). Injected for testing / --no-browser.
|
|
18
|
+
*/
|
|
19
|
+
openUrl: (urls: {
|
|
20
|
+
loopbackUrl: string;
|
|
21
|
+
codeUrl: string;
|
|
22
|
+
}) => void | Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Concurrent paste fallback (Claude Code's model): resolve with the one-time code the user
|
|
25
|
+
* pasted (already validated against `state` — see {@link parsePastedCode}), or null if they
|
|
26
|
+
* gave up / no paste input is available. Aborted when the loopback wins. `state` is the value
|
|
27
|
+
* to bind against; the implementation validates and returns only the code part. When omitted,
|
|
28
|
+
* only the loopback path is used.
|
|
29
|
+
*/
|
|
30
|
+
readPastedCode?: (opts: {
|
|
31
|
+
state: string;
|
|
32
|
+
signal: AbortSignal;
|
|
33
|
+
}) => Promise<string | null>;
|
|
16
34
|
genState?: () => string;
|
|
17
35
|
timeoutMs?: number;
|
|
18
36
|
}
|
|
37
|
+
/** Raised when a pasted code fails its `#state` binding check. */
|
|
38
|
+
export declare class PastedCodeError extends Error {
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validate and parse a pasted `code#state` value (Claude Code's format). The web page appends
|
|
42
|
+
* the login attempt's `state` to the one-time code, so the CLI can confirm the pasted code
|
|
43
|
+
* belongs to THIS login — without it, an attacker could trick you into pasting their code and
|
|
44
|
+
* log you into their account (login session fixation). Returns the code part; throws on a
|
|
45
|
+
* missing or mismatched state (constant-time compare).
|
|
46
|
+
*/
|
|
47
|
+
export declare function parsePastedCode(pasted: string, expectedState: string): string;
|
|
19
48
|
export interface LoginResult {
|
|
20
49
|
email?: string;
|
|
21
50
|
authUrl: string;
|
|
51
|
+
/** How the code arrived — for a friendly confirmation message. */
|
|
52
|
+
via: 'browser' | 'code';
|
|
22
53
|
}
|
|
23
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Main login flow: a loopback listener AND a paste fallback race each other, so it works
|
|
56
|
+
* whether the browser is on this machine (loopback wins) or on another one (you paste the
|
|
57
|
+
* code). Returns once credentials are stored.
|
|
58
|
+
*/
|
|
24
59
|
export declare function browserLogin(deps: BrowserLoginDeps): Promise<LoginResult>;
|
|
25
60
|
export interface CodeLoginDeps {
|
|
26
61
|
authClient: AuthApi;
|
|
@@ -1,26 +1,70 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import { LoopbackServer } from './loopbackServer.js';
|
|
3
|
-
/**
|
|
3
|
+
/** Raised when a pasted code fails its `#state` binding check. */
|
|
4
|
+
export class PastedCodeError extends Error {
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Validate and parse a pasted `code#state` value (Claude Code's format). The web page appends
|
|
8
|
+
* the login attempt's `state` to the one-time code, so the CLI can confirm the pasted code
|
|
9
|
+
* belongs to THIS login — without it, an attacker could trick you into pasting their code and
|
|
10
|
+
* log you into their account (login session fixation). Returns the code part; throws on a
|
|
11
|
+
* missing or mismatched state (constant-time compare).
|
|
12
|
+
*/
|
|
13
|
+
export function parsePastedCode(pasted, expectedState) {
|
|
14
|
+
const trimmed = pasted.trim();
|
|
15
|
+
const hash = trimmed.indexOf('#');
|
|
16
|
+
if (hash < 0) {
|
|
17
|
+
throw new PastedCodeError('Invalid code — copy the full code (it should include the "#…" part).');
|
|
18
|
+
}
|
|
19
|
+
const code = trimmed.slice(0, hash);
|
|
20
|
+
const state = trimmed.slice(hash + 1);
|
|
21
|
+
const a = Buffer.from(state);
|
|
22
|
+
const b = Buffer.from(expectedState);
|
|
23
|
+
const ok = a.length === b.length && crypto.timingSafeEqual(a, b);
|
|
24
|
+
if (!code || !ok) {
|
|
25
|
+
throw new PastedCodeError("Invalid code — it doesn't match this sign-in attempt. Start over with `glbgpt login`.");
|
|
26
|
+
}
|
|
27
|
+
return code;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Main login flow: a loopback listener AND a paste fallback race each other, so it works
|
|
31
|
+
* whether the browser is on this machine (loopback wins) or on another one (you paste the
|
|
32
|
+
* code). Returns once credentials are stored.
|
|
33
|
+
*/
|
|
4
34
|
export async function browserLogin(deps) {
|
|
5
35
|
const state = (deps.genState ?? defaultState)();
|
|
6
36
|
const server = new LoopbackServer(state, deps.timeoutMs);
|
|
7
37
|
const { redirectUri } = await server.listen();
|
|
8
|
-
const
|
|
9
|
-
|
|
38
|
+
const base = `${trimSlash(deps.webBaseUrl)}/${deps.lang}/cli-auth`;
|
|
39
|
+
const loopbackUrl = `${base}?redirect_uri=${encodeURIComponent(redirectUri)}&state=${encodeURIComponent(state)}`;
|
|
40
|
+
// The code page echoes this state back appended to the one-time code so the paste path can
|
|
41
|
+
// bind it to this login attempt (see parsePastedCode).
|
|
42
|
+
const codeUrl = `${base}?mode=code&state=${encodeURIComponent(state)}`;
|
|
43
|
+
const abort = new AbortController();
|
|
10
44
|
try {
|
|
11
|
-
await deps.openUrl(
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
45
|
+
await deps.openUrl({ loopbackUrl, codeUrl });
|
|
46
|
+
const loopback = server.waitForCode().then((code) => ({ code, via: 'browser' }));
|
|
47
|
+
// The paste path only wins when a valid (state-bound) code is pasted; otherwise it idles
|
|
48
|
+
// until the loopback resolves and aborts it (a null/aborted paste must not settle the race).
|
|
49
|
+
const paste = deps.readPastedCode
|
|
50
|
+
? deps.readPastedCode({ state, signal: abort.signal }).then((code) => code && code.trim()
|
|
51
|
+
? { code: code.trim(), via: 'code' }
|
|
52
|
+
: new Promise(() => { }))
|
|
53
|
+
: new Promise(() => { });
|
|
54
|
+
const winner = await Promise.race([loopback, paste]);
|
|
55
|
+
abort.abort(); // stop the paste reader if the loopback won
|
|
56
|
+
const info = await finishLogin(deps.authClient, deps.credentialStore, winner.code);
|
|
57
|
+
return { email: info.email, authUrl: loopbackUrl, via: winner.via };
|
|
15
58
|
}
|
|
16
59
|
finally {
|
|
60
|
+
abort.abort();
|
|
17
61
|
server.close();
|
|
18
62
|
}
|
|
19
63
|
}
|
|
20
64
|
/** Fallback login: exchange a code the user pasted from the web page. */
|
|
21
65
|
export async function codeLogin(deps, code) {
|
|
22
66
|
const info = await finishLogin(deps.authClient, deps.credentialStore, code.trim());
|
|
23
|
-
return { email: info.email, authUrl: '' };
|
|
67
|
+
return { email: info.email, authUrl: '', via: 'code' };
|
|
24
68
|
}
|
|
25
69
|
async function finishLogin(authClient, store, code) {
|
|
26
70
|
const token = await authClient.exchange(code);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loginFlow.js","sourceRoot":"","sources":["../../../src/auth/loginFlow.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"loginFlow.js","sourceRoot":"","sources":["../../../src/auth/loginFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
* `glbgpt login` — real dependency wiring for the login commands. Keeps orchestration logic
|
|
3
3
|
* in auth/loginFlow (unit-tested); this module handles I/O (browser, prompts, printing).
|
|
4
4
|
* All user-facing output is English.
|
|
5
|
+
*
|
|
6
|
+
* One flow for every case: a loopback listener and a paste-a-code fallback race each other.
|
|
7
|
+
* Local → the browser redirect completes automatically; remote/SSH or `--code`/`--no-browser`
|
|
8
|
+
* → you paste the one-time code from the web page. The pasted code carries a `#state` suffix
|
|
9
|
+
* bound to this attempt (see parsePastedCode) so a code from another session is rejected.
|
|
5
10
|
*/
|
|
6
11
|
export declare function runLogin(opts: {
|
|
7
12
|
noBrowser: boolean;
|
|
@@ -2,13 +2,18 @@ import readline from 'node:readline/promises';
|
|
|
2
2
|
import { stdin, stdout } from 'node:process';
|
|
3
3
|
import { AuthClient } from '../auth/authClient.js';
|
|
4
4
|
import { CredentialStore } from '../auth/credentialStore.js';
|
|
5
|
-
import { browserLogin,
|
|
5
|
+
import { browserLogin, parsePastedCode } from '../auth/loginFlow.js';
|
|
6
6
|
import { openBrowser } from '../util/openBrowser.js';
|
|
7
7
|
import { apiBaseUrl, webBaseUrl, lang } from '../config/env.js';
|
|
8
8
|
/**
|
|
9
9
|
* `glbgpt login` — real dependency wiring for the login commands. Keeps orchestration logic
|
|
10
10
|
* in auth/loginFlow (unit-tested); this module handles I/O (browser, prompts, printing).
|
|
11
11
|
* All user-facing output is English.
|
|
12
|
+
*
|
|
13
|
+
* One flow for every case: a loopback listener and a paste-a-code fallback race each other.
|
|
14
|
+
* Local → the browser redirect completes automatically; remote/SSH or `--code`/`--no-browser`
|
|
15
|
+
* → you paste the one-time code from the web page. The pasted code carries a `#state` suffix
|
|
16
|
+
* bound to this attempt (see parsePastedCode) so a code from another session is rejected.
|
|
12
17
|
*/
|
|
13
18
|
export async function runLogin(opts) {
|
|
14
19
|
const authClient = new AuthClient({ baseUrl: apiBaseUrl() });
|
|
@@ -18,38 +23,34 @@ export async function runLogin(opts) {
|
|
|
18
23
|
if (process.platform === 'win32') {
|
|
19
24
|
console.error(`Note: credentials are stored at ${credentialStore.location()} without file-permission protection on Windows.`);
|
|
20
25
|
}
|
|
26
|
+
// A remote/SSH session's browser lives on another machine, so the loopback redirect can't
|
|
27
|
+
// reach us — lead with the paste-a-code path (and never try to open a local browser). The
|
|
28
|
+
// same applies when the user asked for --code or --no-browser.
|
|
29
|
+
const remote = !!(process.env.SSH_CONNECTION || process.env.SSH_TTY);
|
|
30
|
+
const useBrowser = !opts.noBrowser && !opts.useCode && !remote;
|
|
21
31
|
try {
|
|
22
|
-
if (opts.useCode) {
|
|
23
|
-
const url = `${webBaseUrl().replace(/\/+$/, '')}/${lang()}/cli-auth?mode=code`;
|
|
24
|
-
console.error(`1. Open this page and authorize, then copy the code shown:\n ${url}`);
|
|
25
|
-
// Same residual-phishing warning as the browser path: a pasted code is a bearer secret.
|
|
26
|
-
console.error(' Only authorize if you started this login yourself. If someone gave you a code, do not paste it.');
|
|
27
|
-
const code = await prompt('2. Paste the code here: ');
|
|
28
|
-
if (!code.trim()) {
|
|
29
|
-
console.error('No code entered.');
|
|
30
|
-
process.exitCode = 1;
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const result = await codeLogin({ authClient, credentialStore }, code);
|
|
34
|
-
console.error(`Logged in${result.email ? ` as ${result.email}` : ''}.`);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
32
|
const result = await browserLogin({
|
|
38
33
|
webBaseUrl: webBaseUrl(),
|
|
39
34
|
lang: lang(),
|
|
40
35
|
authClient,
|
|
41
36
|
credentialStore,
|
|
42
|
-
openUrl: (
|
|
43
|
-
if (
|
|
44
|
-
console.error(`
|
|
45
|
-
|
|
37
|
+
openUrl: ({ loopbackUrl, codeUrl }) => {
|
|
38
|
+
if (useBrowser) {
|
|
39
|
+
console.error(`Opening your browser to authorize…\n ${loopbackUrl}`);
|
|
40
|
+
openBrowser(loopbackUrl);
|
|
41
|
+
console.error('\nOn a remote machine, or the browser opened elsewhere? Authorize here instead');
|
|
42
|
+
console.error(`and paste the code shown:\n ${codeUrl}`);
|
|
46
43
|
}
|
|
47
44
|
else {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
if (remote)
|
|
46
|
+
console.error('Remote session detected — authorize in a browser on your own computer:');
|
|
47
|
+
else
|
|
48
|
+
console.error('Open this URL in a browser to authorize, then paste the code shown:');
|
|
49
|
+
console.error(` ${codeUrl}`);
|
|
51
50
|
}
|
|
51
|
+
console.error('Only authorize if you started this login yourself. If someone gave you a code, do not paste it.');
|
|
52
52
|
},
|
|
53
|
+
readPastedCode: makePasteReader(),
|
|
53
54
|
});
|
|
54
55
|
console.error(`Logged in${result.email ? ` as ${result.email}` : ''}.`);
|
|
55
56
|
}
|
|
@@ -58,6 +59,38 @@ export async function runLogin(opts) {
|
|
|
58
59
|
process.exitCode = 1;
|
|
59
60
|
}
|
|
60
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* A paste reader for the login race: prompts for the `code#state` string, validates it against
|
|
64
|
+
* this attempt's state (re-prompting on a malformed paste, Claude Code-style), and returns the
|
|
65
|
+
* bare code. Resolves null when the loopback wins (the signal aborts the prompt).
|
|
66
|
+
*/
|
|
67
|
+
function makePasteReader() {
|
|
68
|
+
return async ({ state, signal }) => {
|
|
69
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
70
|
+
try {
|
|
71
|
+
for (;;) {
|
|
72
|
+
let line;
|
|
73
|
+
try {
|
|
74
|
+
line = await rl.question('Paste code (or wait for the browser): ', { signal });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null; // aborted because the loopback completed first, or the stream closed
|
|
78
|
+
}
|
|
79
|
+
if (!line.trim())
|
|
80
|
+
continue; // stray Enter — keep waiting
|
|
81
|
+
try {
|
|
82
|
+
return parsePastedCode(line, state);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
console.error(err instanceof Error ? err.message : String(err)); // re-prompt
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
rl.close();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
61
94
|
export async function runLogout() {
|
|
62
95
|
const removed = await new CredentialStore().clear();
|
|
63
96
|
console.error(removed ? 'Signed out.' : 'You are not signed in.');
|
|
@@ -84,13 +117,4 @@ export async function runWhoami() {
|
|
|
84
117
|
process.exitCode = 1;
|
|
85
118
|
}
|
|
86
119
|
}
|
|
87
|
-
async function prompt(question) {
|
|
88
|
-
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
89
|
-
try {
|
|
90
|
-
return await rl.question(question);
|
|
91
|
-
}
|
|
92
|
-
finally {
|
|
93
|
-
rl.close();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
120
|
//# sourceMappingURL=loginCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loginCommand.js","sourceRoot":"","sources":["../../../src/commands/loginCommand.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"loginCommand.js","sourceRoot":"","sources":["../../../src/commands/loginCommand.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
File without changes
|
package/dist/src/tui/run.js
CHANGED
|
@@ -33,11 +33,20 @@ import path from 'node:path';
|
|
|
33
33
|
* override. GLBGPT_BASE_URL points at test vs prod.
|
|
34
34
|
*/
|
|
35
35
|
export async function runTui(options = {}) {
|
|
36
|
-
|
|
36
|
+
let backend = options.backend ?? (await buildHttpBackend());
|
|
37
37
|
if (!backend) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
// Not signed in — run the login flow inline, then continue into chat (the Codex / Claude
|
|
39
|
+
// Code model: the bare command handles login-if-needed; `glbgpt login` stays a discrete,
|
|
40
|
+
// scriptable command). Only the interactive entry does this; `exec` errors out instead.
|
|
41
|
+
console.error("Welcome to GlobalGPT — let's sign you in first.\n");
|
|
42
|
+
const { runLogin } = await import('../commands/loginCommand.js');
|
|
43
|
+
await runLogin({ noBrowser: false, useCode: false });
|
|
44
|
+
backend = await buildHttpBackend();
|
|
45
|
+
if (!backend) {
|
|
46
|
+
// runLogin already printed why (cancelled / failed) and set the exit code.
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.error(''); // breathing room before the TUI takes over the screen
|
|
41
50
|
}
|
|
42
51
|
const token = await resolveToken();
|
|
43
52
|
// Server-driven model catalog: cached copy applies now, refresh continues in the background.
|
|
@@ -101,10 +110,13 @@ export async function runTui(options = {}) {
|
|
|
101
110
|
lang: lang(),
|
|
102
111
|
authClient: new AuthClient({ baseUrl: apiBaseUrl() }),
|
|
103
112
|
credentialStore: cs,
|
|
104
|
-
|
|
105
|
-
|
|
113
|
+
// No concurrent paste inside the TUI (Ink owns stdin) — the loopback path only. A remote
|
|
114
|
+
// TUI user should exit and run `glbgpt login --code`; we surface that URL too.
|
|
115
|
+
openUrl: ({ loopbackUrl, codeUrl }) => {
|
|
116
|
+
controller.note(`Open this URL to authorize (only if you started this login yourself):\n ${loopbackUrl}\n` +
|
|
117
|
+
`On a remote machine? Exit and run \`glbgpt login --code\`, or authorize at:\n ${codeUrl}`);
|
|
106
118
|
if (mode === 'browser')
|
|
107
|
-
openBrowser(
|
|
119
|
+
openBrowser(loopbackUrl);
|
|
108
120
|
},
|
|
109
121
|
});
|
|
110
122
|
const creds = await cs.load();
|
package/dist/src/tui/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/tui/run.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAgB7B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAyB,EAAE;IACtD,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/tui/run.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@glbgpt/cli",
|
|
3
|
-
"version": "0.1.0-test.
|
|
4
|
-
"description": "GlobalGPT
|
|
3
|
+
"version": "0.1.0-test.2",
|
|
4
|
+
"description": "GlobalGPT in your terminal — chat, image and video generation, and an exec entry point for scripts and agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"glbgpt": "dist/src/index.js",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"tag": "test"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
|
-
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/src/index.js",
|
|
23
23
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
24
24
|
"test": "vitest run",
|
|
25
25
|
"test:watch": "vitest",
|
|
26
|
-
"prepublishOnly": "npm run test && tsc -p tsconfig.build.json",
|
|
27
|
-
"prepack": "tsc -p tsconfig.build.json"
|
|
26
|
+
"prepublishOnly": "npm run test && tsc -p tsconfig.build.json && chmod +x dist/src/index.js",
|
|
27
|
+
"prepack": "tsc -p tsconfig.build.json && chmod +x dist/src/index.js"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@modelcontextprotocol/sdk": "^1.29.0",
|