freeturtle 0.1.18 → 0.1.19
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/bin/freeturtle.js
CHANGED
|
@@ -15,14 +15,14 @@ const program = new Command();
|
|
|
15
15
|
program
|
|
16
16
|
.name("freeturtle")
|
|
17
17
|
.description("An open-source framework for deploying autonomous AI CEOs that run onchain businesses.")
|
|
18
|
-
.version("0.1.
|
|
18
|
+
.version("0.1.19");
|
|
19
19
|
program
|
|
20
20
|
.command("hello")
|
|
21
21
|
.description("Verify the CLI is working")
|
|
22
22
|
.action(() => {
|
|
23
23
|
console.log(" \x1b[38;2;94;255;164m _____ ____\x1b[0m");
|
|
24
24
|
console.log(" \x1b[38;2;94;255;164m/ \\ | o |\x1b[0m");
|
|
25
|
-
console.log(" \x1b[38;2;94;255;164m| |/ ___\\|\x1b[0m FreeTurtle v0.1.
|
|
25
|
+
console.log(" \x1b[38;2;94;255;164m| |/ ___\\|\x1b[0m FreeTurtle v0.1.19");
|
|
26
26
|
console.log(" \x1b[38;2;94;255;164m|_________/\x1b[0m");
|
|
27
27
|
console.log(" \x1b[38;2;94;255;164m|_|_| |_|_|\x1b[0m");
|
|
28
28
|
});
|
|
@@ -9,11 +9,8 @@ export interface GoogleOAuthCredentials {
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function createGoogleOAuth2Client(creds: GoogleOAuthCredentials): OAuth2Client;
|
|
11
11
|
/**
|
|
12
|
-
* Run the
|
|
13
|
-
*
|
|
14
|
-
* Works both locally and on remote servers:
|
|
15
|
-
* - Locally: starts a localhost HTTP server, opens browser, waits for callback
|
|
16
|
-
* - Remote: prints the auth URL, user approves in browser, pastes the callback URL back
|
|
12
|
+
* Run the OAuth2 consent flow.
|
|
13
|
+
* Automatically picks the right flow based on the environment.
|
|
17
14
|
*/
|
|
18
15
|
export declare function runGoogleOAuthFlow(clientId: string, clientSecret: string, opts?: {
|
|
19
16
|
port?: number;
|
package/dist/src/oauth/google.js
CHANGED
|
@@ -10,6 +10,16 @@ export function createGoogleOAuth2Client(creds) {
|
|
|
10
10
|
client.setCredentials({ refresh_token: creds.refreshToken });
|
|
11
11
|
return client;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Detect if we're running on a headless/remote server (no display).
|
|
15
|
+
*/
|
|
16
|
+
function isHeadless() {
|
|
17
|
+
if (process.platform === "darwin")
|
|
18
|
+
return false;
|
|
19
|
+
if (process.platform === "win32")
|
|
20
|
+
return false;
|
|
21
|
+
return !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY;
|
|
22
|
+
}
|
|
13
23
|
/**
|
|
14
24
|
* Open a URL in the user's default browser.
|
|
15
25
|
*/
|
|
@@ -20,26 +30,53 @@ function openBrowser(url) {
|
|
|
20
30
|
});
|
|
21
31
|
}
|
|
22
32
|
/**
|
|
23
|
-
*
|
|
33
|
+
* Exchange an auth code for a refresh token.
|
|
24
34
|
*/
|
|
25
|
-
function
|
|
26
|
-
return
|
|
27
|
-
const
|
|
35
|
+
async function exchangeCode(oauth2Client) {
|
|
36
|
+
return async (code) => {
|
|
37
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
38
|
+
if (!tokens.refresh_token) {
|
|
39
|
+
throw new Error("No refresh_token received. Revoke app access at myaccount.google.com/permissions and retry.");
|
|
40
|
+
}
|
|
41
|
+
return tokens.refresh_token;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Remote/headless flow: print URL, user pastes callback URL back.
|
|
46
|
+
*/
|
|
47
|
+
async function runRemoteFlow(clientId, clientSecret) {
|
|
48
|
+
// Use a fixed port so the redirect URI is predictable
|
|
49
|
+
const redirectUri = "http://127.0.0.1:39043/callback";
|
|
50
|
+
const oauth2Client = new OAuth2Client(clientId, clientSecret, redirectUri);
|
|
51
|
+
const authUrl = oauth2Client.generateAuthUrl({
|
|
52
|
+
access_type: "offline",
|
|
53
|
+
scope: ["https://mail.google.com/"],
|
|
54
|
+
prompt: "consent",
|
|
55
|
+
});
|
|
56
|
+
console.log(`\nOpen this URL in your browser to authorize:\n\n ${authUrl}\n`);
|
|
57
|
+
console.log("After approving, your browser will redirect to a localhost URL that won't load.");
|
|
58
|
+
console.log("That's expected. Copy the FULL URL from your browser's address bar and paste it below.\n");
|
|
59
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
60
|
+
const pastedUrl = await new Promise((resolve) => {
|
|
28
61
|
rl.question("Paste the callback URL here: ", (answer) => {
|
|
29
62
|
rl.close();
|
|
30
63
|
resolve(answer.trim());
|
|
31
64
|
});
|
|
32
65
|
});
|
|
66
|
+
const url = new URL(pastedUrl);
|
|
67
|
+
const error = url.searchParams.get("error");
|
|
68
|
+
if (error)
|
|
69
|
+
throw new Error(`OAuth authorization denied: ${error}`);
|
|
70
|
+
const code = url.searchParams.get("code");
|
|
71
|
+
if (!code)
|
|
72
|
+
throw new Error("No authorization code found in the pasted URL.");
|
|
73
|
+
const exchange = await exchangeCode(oauth2Client);
|
|
74
|
+
return exchange(code);
|
|
33
75
|
}
|
|
34
76
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* Works both locally and on remote servers:
|
|
38
|
-
* - Locally: starts a localhost HTTP server, opens browser, waits for callback
|
|
39
|
-
* - Remote: prints the auth URL, user approves in browser, pastes the callback URL back
|
|
77
|
+
* Local flow: start localhost server, open browser, wait for callback.
|
|
40
78
|
*/
|
|
41
|
-
|
|
42
|
-
const port = opts?.port ?? 0; // 0 = OS picks a free port
|
|
79
|
+
async function runLocalFlow(clientId, clientSecret, port) {
|
|
43
80
|
return new Promise((resolve, reject) => {
|
|
44
81
|
const server = http.createServer();
|
|
45
82
|
const timeout = setTimeout(() => {
|
|
@@ -62,36 +99,7 @@ export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
|
62
99
|
prompt: "consent",
|
|
63
100
|
});
|
|
64
101
|
console.log(`\nOpen this URL in your browser to authorize:\n\n ${authUrl}\n`);
|
|
65
|
-
console.log("After approving, you'll be redirected to a localhost URL.");
|
|
66
|
-
console.log("If the redirect works automatically, great! Otherwise,");
|
|
67
|
-
console.log("copy the FULL URL from your browser's address bar and paste it below.\n");
|
|
68
102
|
openBrowser(authUrl);
|
|
69
|
-
// Race: either the localhost server receives the callback,
|
|
70
|
-
// or the user pastes the URL manually (for remote servers).
|
|
71
|
-
let settled = false;
|
|
72
|
-
const handleCode = async (code) => {
|
|
73
|
-
if (settled)
|
|
74
|
-
return;
|
|
75
|
-
settled = true;
|
|
76
|
-
try {
|
|
77
|
-
const { tokens } = await oauth2Client.getToken(code);
|
|
78
|
-
if (!tokens.refresh_token) {
|
|
79
|
-
clearTimeout(timeout);
|
|
80
|
-
server.close();
|
|
81
|
-
reject(new Error("No refresh_token received. Revoke app access at myaccount.google.com/permissions and retry."));
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
clearTimeout(timeout);
|
|
85
|
-
server.close();
|
|
86
|
-
resolve(tokens.refresh_token);
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
clearTimeout(timeout);
|
|
90
|
-
server.close();
|
|
91
|
-
reject(err);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
// Path 1: localhost callback server
|
|
95
103
|
server.on("request", async (req, res) => {
|
|
96
104
|
if (!req.url?.startsWith("/callback")) {
|
|
97
105
|
res.writeHead(404);
|
|
@@ -104,7 +112,6 @@ export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
|
104
112
|
if (error) {
|
|
105
113
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
106
114
|
res.end("<h1>Authorization denied</h1><p>You can close this tab.</p>");
|
|
107
|
-
settled = true;
|
|
108
115
|
clearTimeout(timeout);
|
|
109
116
|
server.close();
|
|
110
117
|
reject(new Error(`OAuth authorization denied: ${error}`));
|
|
@@ -115,44 +122,30 @@ export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
|
115
122
|
res.end("<h1>Missing authorization code</h1>");
|
|
116
123
|
return;
|
|
117
124
|
}
|
|
118
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
119
|
-
res.end("<h1>Authorization successful!</h1><p>You can close this tab and return to the terminal.</p>");
|
|
120
|
-
await handleCode(code);
|
|
121
|
-
});
|
|
122
|
-
// Path 2: user pastes the URL manually (remote server flow)
|
|
123
|
-
waitForPastedUrl().then(async (pastedUrl) => {
|
|
124
|
-
if (settled)
|
|
125
|
-
return;
|
|
126
125
|
try {
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
clearTimeout(timeout);
|
|
133
|
-
server.close();
|
|
134
|
-
reject(new Error(`OAuth authorization denied: ${error}`));
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
if (!code) {
|
|
138
|
-
settled = true;
|
|
126
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
127
|
+
if (!tokens.refresh_token) {
|
|
128
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
129
|
+
res.end("<h1>Error</h1><p>No refresh token received. Try revoking access at " +
|
|
130
|
+
'<a href="https://myaccount.google.com/permissions">Google Account Permissions</a> and retry.</p>');
|
|
139
131
|
clearTimeout(timeout);
|
|
140
132
|
server.close();
|
|
141
|
-
reject(new Error("No
|
|
133
|
+
reject(new Error("No refresh_token received. Revoke app access at myaccount.google.com/permissions and retry."));
|
|
142
134
|
return;
|
|
143
135
|
}
|
|
144
|
-
|
|
136
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
137
|
+
res.end("<h1>Authorization successful!</h1><p>You can close this tab and return to the terminal.</p>");
|
|
138
|
+
clearTimeout(timeout);
|
|
139
|
+
server.close();
|
|
140
|
+
resolve(tokens.refresh_token);
|
|
145
141
|
}
|
|
146
|
-
catch {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
res.writeHead(500, { "Content-Type": "text/html" });
|
|
144
|
+
res.end("<h1>Token exchange failed</h1><p>Check the terminal for details.</p>");
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
server.close();
|
|
147
|
+
reject(err);
|
|
153
148
|
}
|
|
154
|
-
}).catch(() => {
|
|
155
|
-
// stdin closed or readline error — ignore, server path may still work
|
|
156
149
|
});
|
|
157
150
|
});
|
|
158
151
|
server.on("error", (err) => {
|
|
@@ -161,4 +154,14 @@ export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
|
161
154
|
});
|
|
162
155
|
});
|
|
163
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Run the OAuth2 consent flow.
|
|
159
|
+
* Automatically picks the right flow based on the environment.
|
|
160
|
+
*/
|
|
161
|
+
export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
162
|
+
if (isHeadless()) {
|
|
163
|
+
return runRemoteFlow(clientId, clientSecret);
|
|
164
|
+
}
|
|
165
|
+
return runLocalFlow(clientId, clientSecret, opts?.port ?? 0);
|
|
166
|
+
}
|
|
164
167
|
//# sourceMappingURL=google.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/oauth/google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQ9C;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAA6B;IACpE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;QACxB,+DAA+D;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/oauth/google.ts"],"names":[],"mappings":"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"}
|