freeturtle 0.1.17 → 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,14 +9,8 @@ export interface GoogleOAuthCredentials {
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function createGoogleOAuth2Client(creds: GoogleOAuthCredentials): OAuth2Client;
|
|
11
11
|
/**
|
|
12
|
-
* Run the
|
|
13
|
-
*
|
|
14
|
-
* Matches OpenClaw's approach:
|
|
15
|
-
* 1. Starts a local HTTP server on 127.0.0.1
|
|
16
|
-
* 2. Opens the consent URL in the user's browser
|
|
17
|
-
* 3. Waits for the redirect callback with the auth code
|
|
18
|
-
* 4. Exchanges the code for tokens
|
|
19
|
-
* 5. Returns the refresh_token
|
|
12
|
+
* Run the OAuth2 consent flow.
|
|
13
|
+
* Automatically picks the right flow based on the environment.
|
|
20
14
|
*/
|
|
21
15
|
export declare function runGoogleOAuthFlow(clientId: string, clientSecret: string, opts?: {
|
|
22
16
|
port?: number;
|
package/dist/src/oauth/google.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { OAuth2Client } from "google-auth-library";
|
|
2
2
|
import http from "node:http";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
3
4
|
import { execFile } from "node:child_process";
|
|
4
5
|
/**
|
|
5
6
|
* Create an authenticated OAuth2Client with auto-refresh.
|
|
@@ -9,6 +10,16 @@ export function createGoogleOAuth2Client(creds) {
|
|
|
9
10
|
client.setCredentials({ refresh_token: creds.refreshToken });
|
|
10
11
|
return client;
|
|
11
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
|
+
}
|
|
12
23
|
/**
|
|
13
24
|
* Open a URL in the user's default browser.
|
|
14
25
|
*/
|
|
@@ -19,17 +30,53 @@ function openBrowser(url) {
|
|
|
19
30
|
});
|
|
20
31
|
}
|
|
21
32
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* Matches OpenClaw's approach:
|
|
25
|
-
* 1. Starts a local HTTP server on 127.0.0.1
|
|
26
|
-
* 2. Opens the consent URL in the user's browser
|
|
27
|
-
* 3. Waits for the redirect callback with the auth code
|
|
28
|
-
* 4. Exchanges the code for tokens
|
|
29
|
-
* 5. Returns the refresh_token
|
|
33
|
+
* Exchange an auth code for a refresh token.
|
|
30
34
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
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) => {
|
|
61
|
+
rl.question("Paste the callback URL here: ", (answer) => {
|
|
62
|
+
rl.close();
|
|
63
|
+
resolve(answer.trim());
|
|
64
|
+
});
|
|
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);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Local flow: start localhost server, open browser, wait for callback.
|
|
78
|
+
*/
|
|
79
|
+
async function runLocalFlow(clientId, clientSecret, port) {
|
|
33
80
|
return new Promise((resolve, reject) => {
|
|
34
81
|
const server = http.createServer();
|
|
35
82
|
const timeout = setTimeout(() => {
|
|
@@ -107,4 +154,14 @@ export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
|
107
154
|
});
|
|
108
155
|
});
|
|
109
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
|
+
}
|
|
110
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,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
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/oauth/google.ts"],"names":[],"mappings":"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"}
|