freeturtle 0.1.13 → 0.1.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 +78 -58
- package/dist/bin/freeturtle.js +10 -2
- package/dist/bin/freeturtle.js.map +1 -1
- package/dist/src/cli/connect-gmail.d.ts +6 -0
- package/dist/src/cli/connect-gmail.js +128 -0
- package/dist/src/cli/connect-gmail.js.map +1 -0
- package/dist/src/cli/connection-tests.d.ts +4 -0
- package/dist/src/cli/connection-tests.js +10 -0
- package/dist/src/cli/connection-tests.js.map +1 -1
- package/dist/src/cli/init.js +86 -30
- package/dist/src/cli/init.js.map +1 -1
- package/dist/src/cli/webhooks.js +38 -26
- package/dist/src/cli/webhooks.js.map +1 -1
- package/dist/src/modules/gmail/client.d.ts +62 -0
- package/dist/src/modules/gmail/client.js +144 -0
- package/dist/src/modules/gmail/client.js.map +1 -0
- package/dist/src/modules/gmail/index.d.ts +9 -0
- package/dist/src/modules/gmail/index.js +45 -0
- package/dist/src/modules/gmail/index.js.map +1 -0
- package/dist/src/modules/gmail/tools.d.ts +2 -0
- package/dist/src/modules/gmail/tools.js +70 -0
- package/dist/src/modules/gmail/tools.js.map +1 -0
- package/dist/src/modules/loader.js +2 -0
- package/dist/src/modules/loader.js.map +1 -1
- package/dist/src/oauth/google.d.ts +23 -0
- package/dist/src/oauth/google.js +110 -0
- package/dist/src/oauth/google.js.map +1 -0
- package/package.json +3 -1
|
@@ -3,11 +3,13 @@ import { DatabaseModule } from "./database/index.js";
|
|
|
3
3
|
import { GitHubModule } from "./github/index.js";
|
|
4
4
|
import { OnchainModule } from "./onchain/index.js";
|
|
5
5
|
import { XmtpModule } from "./xmtp/index.js";
|
|
6
|
+
import { GmailModule } from "./gmail/index.js";
|
|
6
7
|
import { WorkspaceModule } from "./workspace/index.js";
|
|
7
8
|
const MODULE_MAP = {
|
|
8
9
|
farcaster: FarcasterModule,
|
|
9
10
|
database: DatabaseModule,
|
|
10
11
|
github: GitHubModule,
|
|
12
|
+
gmail: GmailModule,
|
|
11
13
|
onchain: OnchainModule,
|
|
12
14
|
xmtp: XmtpModule,
|
|
13
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/modules/loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,GAA+C;IAC7D,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAwB,EACxB,GAA2B,EAC3B,MAAe,EACf,MAAqB,EACrB,GAAY;IAEZ,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,qFAAqF;IACrF,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,MAAM,EAAE,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,SAAS;QAEpC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,IAAI,CAAC,mBAAmB,IAAI,aAAa,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,UAAU,CAClB,YAAkD,EAClD,GAAG,EACH,EAAE,MAAM,EAAE,CACX,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,MAAM,EAAE,KAAK,CAAC,WAAW,IAAI,2BAA2B,GAAG,aAAa,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/modules/loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,GAA+C;IAC7D,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAwB,EACxB,GAA2B,EAC3B,MAAe,EACf,MAAqB,EACrB,GAAY;IAEZ,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,qFAAqF;IACrF,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,MAAM,EAAE,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,SAAS;QAEpC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,IAAI,CAAC,mBAAmB,IAAI,aAAa,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,UAAU,CAClB,YAAkD,EAClD,GAAG,EACH,EAAE,MAAM,EAAE,CACX,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,MAAM,EAAE,KAAK,CAAC,WAAW,IAAI,2BAA2B,GAAG,aAAa,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OAuth2Client } from "google-auth-library";
|
|
2
|
+
export interface GoogleOAuthCredentials {
|
|
3
|
+
clientId: string;
|
|
4
|
+
clientSecret: string;
|
|
5
|
+
refreshToken: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Create an authenticated OAuth2Client with auto-refresh.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createGoogleOAuth2Client(creds: GoogleOAuthCredentials): OAuth2Client;
|
|
11
|
+
/**
|
|
12
|
+
* Run the browser-based OAuth2 consent flow.
|
|
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
|
|
20
|
+
*/
|
|
21
|
+
export declare function runGoogleOAuthFlow(clientId: string, clientSecret: string, opts?: {
|
|
22
|
+
port?: number;
|
|
23
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { OAuth2Client } from "google-auth-library";
|
|
2
|
+
import http from "node:http";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
/**
|
|
5
|
+
* Create an authenticated OAuth2Client with auto-refresh.
|
|
6
|
+
*/
|
|
7
|
+
export function createGoogleOAuth2Client(creds) {
|
|
8
|
+
const client = new OAuth2Client(creds.clientId, creds.clientSecret);
|
|
9
|
+
client.setCredentials({ refresh_token: creds.refreshToken });
|
|
10
|
+
return client;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Open a URL in the user's default browser.
|
|
14
|
+
*/
|
|
15
|
+
function openBrowser(url) {
|
|
16
|
+
const cmd = process.platform === "darwin" ? "open" : "xdg-open";
|
|
17
|
+
execFile(cmd, [url], () => {
|
|
18
|
+
// If browser open fails, the URL is already printed to console
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run the browser-based OAuth2 consent flow.
|
|
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
|
|
30
|
+
*/
|
|
31
|
+
export async function runGoogleOAuthFlow(clientId, clientSecret, opts) {
|
|
32
|
+
const port = opts?.port ?? 0; // 0 = OS picks a free port
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const server = http.createServer();
|
|
35
|
+
const timeout = setTimeout(() => {
|
|
36
|
+
server.close();
|
|
37
|
+
reject(new Error("OAuth flow timed out after 5 minutes"));
|
|
38
|
+
}, 5 * 60 * 1000);
|
|
39
|
+
server.listen(port, "127.0.0.1", () => {
|
|
40
|
+
const addr = server.address();
|
|
41
|
+
if (!addr || typeof addr === "string") {
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
server.close();
|
|
44
|
+
reject(new Error("Failed to start local OAuth server"));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const redirectUri = `http://127.0.0.1:${addr.port}/callback`;
|
|
48
|
+
const oauth2Client = new OAuth2Client(clientId, clientSecret, redirectUri);
|
|
49
|
+
const authUrl = oauth2Client.generateAuthUrl({
|
|
50
|
+
access_type: "offline",
|
|
51
|
+
scope: ["https://mail.google.com/"],
|
|
52
|
+
prompt: "consent",
|
|
53
|
+
});
|
|
54
|
+
console.log(`\nOpen this URL in your browser to authorize:\n\n ${authUrl}\n`);
|
|
55
|
+
openBrowser(authUrl);
|
|
56
|
+
server.on("request", async (req, res) => {
|
|
57
|
+
if (!req.url?.startsWith("/callback")) {
|
|
58
|
+
res.writeHead(404);
|
|
59
|
+
res.end("Not found");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const url = new URL(req.url, `http://127.0.0.1:${addr.port}`);
|
|
63
|
+
const code = url.searchParams.get("code");
|
|
64
|
+
const error = url.searchParams.get("error");
|
|
65
|
+
if (error) {
|
|
66
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
67
|
+
res.end("<h1>Authorization denied</h1><p>You can close this tab.</p>");
|
|
68
|
+
clearTimeout(timeout);
|
|
69
|
+
server.close();
|
|
70
|
+
reject(new Error(`OAuth authorization denied: ${error}`));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!code) {
|
|
74
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
75
|
+
res.end("<h1>Missing authorization code</h1>");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
80
|
+
if (!tokens.refresh_token) {
|
|
81
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
82
|
+
res.end("<h1>Error</h1><p>No refresh token received. Try revoking access at " +
|
|
83
|
+
'<a href="https://myaccount.google.com/permissions">Google Account Permissions</a> and retry.</p>');
|
|
84
|
+
clearTimeout(timeout);
|
|
85
|
+
server.close();
|
|
86
|
+
reject(new Error("No refresh_token received. Revoke app access at myaccount.google.com/permissions and retry."));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
90
|
+
res.end("<h1>Authorization successful!</h1><p>You can close this tab and return to the terminal.</p>");
|
|
91
|
+
clearTimeout(timeout);
|
|
92
|
+
server.close();
|
|
93
|
+
resolve(tokens.refresh_token);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
res.writeHead(500, { "Content-Type": "text/html" });
|
|
97
|
+
res.end("<h1>Token exchange failed</h1><p>Check the terminal for details.</p>");
|
|
98
|
+
clearTimeout(timeout);
|
|
99
|
+
server.close();
|
|
100
|
+
reject(err);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
server.on("error", (err) => {
|
|
105
|
+
clearTimeout(timeout);
|
|
106
|
+
reject(err);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/oauth/google.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "freeturtle",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "An open-source framework for deploying autonomous AI CEOs that run onchain businesses.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/bin/freeturtle.js",
|
|
@@ -43,10 +43,12 @@
|
|
|
43
43
|
"@anthropic-ai/sdk": "^0.78.0",
|
|
44
44
|
"@clack/prompts": "^1.1.0",
|
|
45
45
|
"@farcaster/hub-nodejs": "^0.15.10",
|
|
46
|
+
"@googleapis/gmail": "^16.1.1",
|
|
46
47
|
"@octokit/rest": "^22.0.1",
|
|
47
48
|
"commander": "^14.0.3",
|
|
48
49
|
"croner": "^10.0.1",
|
|
49
50
|
"dotenv": "^17.3.1",
|
|
51
|
+
"google-auth-library": "^10.6.1",
|
|
50
52
|
"grammy": "^1.41.1",
|
|
51
53
|
"openai": "^6.25.0",
|
|
52
54
|
"pg": "^8.19.0",
|