freeturtle 0.1.33 → 0.1.35
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 +2 -27
- package/dist/bin/freeturtle.js +11 -3
- package/dist/bin/freeturtle.js.map +1 -1
- package/dist/src/approval-flow.test.d.ts +1 -0
- package/dist/src/approval-flow.test.js +259 -0
- package/dist/src/approval-flow.test.js.map +1 -0
- package/dist/src/cli/config-utils.d.ts +5 -0
- package/dist/src/cli/config-utils.js +45 -0
- package/dist/src/cli/config-utils.js.map +1 -0
- package/dist/src/cli/connect-web-search.d.ts +3 -0
- package/dist/src/cli/connect-web-search.js +40 -0
- package/dist/src/cli/connect-web-search.js.map +1 -0
- package/dist/src/cli/connection-tests.d.ts +4 -0
- package/dist/src/cli/connection-tests.js +15 -0
- package/dist/src/cli/connection-tests.js.map +1 -1
- package/dist/src/cli/init.js +36 -1
- package/dist/src/cli/init.js.map +1 -1
- package/dist/src/modules/database/client.d.ts +7 -1
- package/dist/src/modules/database/client.js +162 -22
- package/dist/src/modules/database/client.js.map +1 -1
- package/dist/src/modules/database/index.d.ts +11 -1
- package/dist/src/modules/database/index.js +69 -4
- package/dist/src/modules/database/index.js.map +1 -1
- package/dist/src/modules/loader.js +2 -0
- package/dist/src/modules/loader.js.map +1 -1
- package/dist/src/modules/web-search/index.d.ts +25 -0
- package/dist/src/modules/web-search/index.js +279 -0
- package/dist/src/modules/web-search/index.js.map +1 -0
- package/dist/src/policy.js +0 -2
- package/dist/src/policy.js.map +1 -1
- package/dist/src/policy.test.js +2 -2
- package/dist/src/policy.test.js.map +1 -1
- package/dist/src/redaction.js +1 -0
- package/dist/src/redaction.js.map +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runner.js.map +1 -1
- package/dist/src/security/external-content.d.ts +44 -0
- package/dist/src/security/external-content.js +124 -0
- package/dist/src/security/external-content.js.map +1 -0
- package/dist/src/webhooks/server.js +10 -3
- package/dist/src/webhooks/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -391,7 +391,7 @@ All external API calls (Neynar, GitHub, Postgres, BaseScan, RPC) are wrapped wit
|
|
|
391
391
|
|
|
392
392
|
FreeTurtle is designed to be safe to run locally:
|
|
393
393
|
|
|
394
|
-
- **
|
|
394
|
+
- **Shell execution with env security** — commands run directly, but dangerous environment variables (PATH, HOME, LD_*, DYLD_*, NODE_OPTIONS) are blocked
|
|
395
395
|
- **Sandboxed workspace** — file access is restricted to `~/.freeturtle/`, path traversal is blocked
|
|
396
396
|
- **Protected self-modification** — changes to soul.md, config.md, and .env require founder approval
|
|
397
397
|
- **Closed tool set** — only the tools defined by enabled modules are available
|
|
@@ -438,34 +438,9 @@ Your `.env` file contains API keys and tokens. FreeTurtle automatically sets it
|
|
|
438
438
|
|
|
439
439
|
Your cloud provider (Oracle, Railway, Fly.io, DigitalOcean, etc.) has full access to the underlying infrastructure — they can technically read any file on your VM. This is true of all cloud computing and is covered by their terms of service. For most use cases this is fine. If this is unacceptable for your threat model, run FreeTurtle on hardware you physically control (e.g. a Raspberry Pi or a spare laptop).
|
|
440
440
|
|
|
441
|
-
## The Two-Turtle Vision (v0.2)
|
|
442
|
-
|
|
443
|
-
The current v0.1 is a single-process CEO. v0.2 will split it into two:
|
|
444
|
-
|
|
445
|
-
- **Inner Turtle** — has all the tools, writes to an outbox, never posts directly
|
|
446
|
-
- **Outer Turtle** — reads the outbox, reviews actions, executes approved ones
|
|
447
|
-
|
|
448
|
-
This creates **security by architecture, not by instruction**. The inner turtle can reason freely without risk because it literally cannot post or commit — only propose. The outer turtle is a simple approval layer.
|
|
449
|
-
|
|
450
|
-
This pattern, proven by tortOS, means you can give your CEO powerful tools without worrying about rogue actions.
|
|
451
|
-
|
|
452
|
-
## tortOS — Proof of Concept
|
|
453
|
-
|
|
454
|
-
FreeTurtle generalizes the patterns proven by [tortOS](https://tortoise.xyz), which runs the Tortoise music platform on Farcaster/Base:
|
|
455
|
-
|
|
456
|
-
- Autonomous posting and community engagement
|
|
457
|
-
- Weekly strategy briefs
|
|
458
|
-
- Database queries for platform analytics
|
|
459
|
-
- GitHub issue management
|
|
460
|
-
- All controlled by a soul config and readable memory files
|
|
461
|
-
|
|
462
|
-
tortOS has been running autonomously for months. FreeTurtle packages those patterns into a framework anyone can use.
|
|
463
|
-
|
|
464
441
|
## Roadmap
|
|
465
442
|
|
|
466
|
-
- **v0.
|
|
467
|
-
- **v0.2** — Two-turtle architecture (inner/outer split, outbox, approval queue)
|
|
468
|
-
- **v0.3** — XMTP integration (public-facing DMs)
|
|
443
|
+
- **v0.2** — XMTP integration (public-facing DMs)
|
|
469
444
|
- **Future** — Hosted dashboard, multi-CEO management
|
|
470
445
|
|
|
471
446
|
## License
|
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.34");
|
|
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.34");
|
|
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
|
});
|
|
@@ -156,7 +156,7 @@ program
|
|
|
156
156
|
});
|
|
157
157
|
const connect = program
|
|
158
158
|
.command("connect")
|
|
159
|
-
.description("Connect external services (gmail, telegram, github, farcaster, database, onchain)");
|
|
159
|
+
.description("Connect external services (gmail, telegram, github, farcaster, database, onchain, web-search)");
|
|
160
160
|
connect
|
|
161
161
|
.command("gmail")
|
|
162
162
|
.description("Connect Gmail for reading and sending emails")
|
|
@@ -205,6 +205,14 @@ connect
|
|
|
205
205
|
const { connectOnchain } = await import("../src/cli/connect-onchain.js");
|
|
206
206
|
await connectOnchain(opts.dir);
|
|
207
207
|
});
|
|
208
|
+
connect
|
|
209
|
+
.command("web-search")
|
|
210
|
+
.description("Connect Brave Search API for web research")
|
|
211
|
+
.option("--dir <path>", "Workspace directory", DEFAULT_DIR)
|
|
212
|
+
.action(async (opts) => {
|
|
213
|
+
const { connectWebSearch } = await import("../src/cli/connect-web-search.js");
|
|
214
|
+
await connectWebSearch(opts.dir);
|
|
215
|
+
});
|
|
208
216
|
program
|
|
209
217
|
.command("skills")
|
|
210
218
|
.description("List installed Agent Skills (OpenClaw / ClawHub compatible)")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"freeturtle.js","sourceRoot":"","sources":["../../bin/freeturtle.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"freeturtle.js","sourceRoot":"","sources":["../../bin/freeturtle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { TaskRunner } from "./runner.js";
|
|
3
|
+
import { MockLLMClient } from "../test/helpers/mock-llm.js";
|
|
4
|
+
import { createTempWorkspace } from "../test/helpers/temp-workspace.js";
|
|
5
|
+
import { getDefaultPolicy } from "./policy.js";
|
|
6
|
+
import { createLogger } from "./logger.js";
|
|
7
|
+
// Module with a tool that REQUIRES approval (delete_cast)
|
|
8
|
+
class FakeFarcasterModule {
|
|
9
|
+
name = "farcaster";
|
|
10
|
+
description = "Fake farcaster for testing";
|
|
11
|
+
executed = [];
|
|
12
|
+
async initialize() { }
|
|
13
|
+
getTools() {
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
name: "delete_cast",
|
|
17
|
+
description: "Delete a Farcaster cast",
|
|
18
|
+
input_schema: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: { hash: { type: "string" } },
|
|
21
|
+
required: ["hash"],
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
async executeTool(name, input) {
|
|
27
|
+
this.executed.push({ name, input });
|
|
28
|
+
return `Deleted cast ${input.hash}`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Module with run_command (does NOT require approval anymore)
|
|
32
|
+
class FakeShellModule {
|
|
33
|
+
name = "shell";
|
|
34
|
+
description = "Fake shell for testing";
|
|
35
|
+
executed = [];
|
|
36
|
+
async initialize() { }
|
|
37
|
+
getTools() {
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
name: "run_command",
|
|
41
|
+
description: "Run a shell command",
|
|
42
|
+
input_schema: {
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: { command: { type: "string" } },
|
|
45
|
+
required: ["command"],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
async executeTool(name, input) {
|
|
51
|
+
this.executed.push({ name, input });
|
|
52
|
+
return `Command output: executed "${input.command}"`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// A module whose tool does NOT require approval
|
|
56
|
+
class FakeWorkspaceModule {
|
|
57
|
+
name = "workspace";
|
|
58
|
+
description = "Fake workspace for testing";
|
|
59
|
+
executed = [];
|
|
60
|
+
async initialize() { }
|
|
61
|
+
getTools() {
|
|
62
|
+
return [
|
|
63
|
+
{
|
|
64
|
+
name: "read_file",
|
|
65
|
+
description: "Read a file",
|
|
66
|
+
input_schema: {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: { path: { type: "string" } },
|
|
69
|
+
required: ["path"],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
async executeTool(name, input) {
|
|
75
|
+
this.executed.push({ name, input });
|
|
76
|
+
return `File contents of ${input.path}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let workspace;
|
|
80
|
+
let logger;
|
|
81
|
+
beforeEach(async () => {
|
|
82
|
+
workspace = await createTempWorkspace();
|
|
83
|
+
logger = createLogger("test");
|
|
84
|
+
});
|
|
85
|
+
afterEach(async () => {
|
|
86
|
+
await workspace.cleanup();
|
|
87
|
+
});
|
|
88
|
+
describe("Non-blocking approval flow (integration)", () => {
|
|
89
|
+
it("delete_cast requires approval and returns immediately without executing", async () => {
|
|
90
|
+
const llm = new MockLLMClient();
|
|
91
|
+
const farcaster = new FakeFarcasterModule();
|
|
92
|
+
const policy = getDefaultPolicy();
|
|
93
|
+
llm.addToolCall("delete_cast", { hash: "0xabc123" }, "Done.");
|
|
94
|
+
const approvalMessages = [];
|
|
95
|
+
const runner = new TaskRunner(workspace.dir, llm, [farcaster], logger, {
|
|
96
|
+
policy,
|
|
97
|
+
onApprovalNeeded: (msg) => approvalMessages.push(msg),
|
|
98
|
+
onFollowup: () => { },
|
|
99
|
+
});
|
|
100
|
+
await runner.runMessage("delete that cast", "test-channel");
|
|
101
|
+
// CRITICAL: The tool must NOT have been executed — it's behind approval
|
|
102
|
+
expect(farcaster.executed).toHaveLength(0);
|
|
103
|
+
// An approval notification must have been sent to the founder
|
|
104
|
+
expect(approvalMessages).toHaveLength(1);
|
|
105
|
+
expect(approvalMessages[0]).toContain("delete_cast");
|
|
106
|
+
expect(approvalMessages[0]).toMatch(/yes|approve/i);
|
|
107
|
+
// There must be exactly one pending approval request on disk
|
|
108
|
+
const approvalMgr = runner.getApprovalManager();
|
|
109
|
+
const pending = await approvalMgr.list("pending");
|
|
110
|
+
expect(pending).toHaveLength(1);
|
|
111
|
+
expect(pending[0].toolName).toBe("delete_cast");
|
|
112
|
+
expect(pending[0].status).toBe("pending");
|
|
113
|
+
});
|
|
114
|
+
it("after approval is granted, the tool executes and followup is sent", async () => {
|
|
115
|
+
const llm = new MockLLMClient();
|
|
116
|
+
const farcaster = new FakeFarcasterModule();
|
|
117
|
+
const policy = getDefaultPolicy();
|
|
118
|
+
llm.addToolCall("delete_cast", { hash: "0xabc123" }, "Done.");
|
|
119
|
+
const followups = [];
|
|
120
|
+
const runner = new TaskRunner(workspace.dir, llm, [farcaster], logger, {
|
|
121
|
+
policy,
|
|
122
|
+
onApprovalNeeded: () => { },
|
|
123
|
+
onFollowup: (msg) => followups.push(msg),
|
|
124
|
+
});
|
|
125
|
+
// Run the message — returns immediately without executing
|
|
126
|
+
await runner.runMessage("delete that cast", "test-channel");
|
|
127
|
+
expect(farcaster.executed).toHaveLength(0);
|
|
128
|
+
// Now approve the pending request
|
|
129
|
+
const approvalMgr = runner.getApprovalManager();
|
|
130
|
+
const pending = await approvalMgr.list("pending");
|
|
131
|
+
expect(pending).toHaveLength(1);
|
|
132
|
+
await approvalMgr.approve(pending[0].id, "founder");
|
|
133
|
+
// Wait for the fire-and-forget to pick up the approval
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
135
|
+
// CRITICAL: The tool must now have been executed exactly once
|
|
136
|
+
expect(farcaster.executed).toHaveLength(1);
|
|
137
|
+
expect(farcaster.executed[0].name).toBe("delete_cast");
|
|
138
|
+
expect(farcaster.executed[0].input.hash).toBe("0xabc123");
|
|
139
|
+
// CRITICAL: A followup message must have been sent with the tool's output
|
|
140
|
+
expect(followups).toHaveLength(1);
|
|
141
|
+
expect(followups[0]).toContain("Deleted cast");
|
|
142
|
+
});
|
|
143
|
+
it("rejected approval sends rejection followup and does NOT execute", async () => {
|
|
144
|
+
const llm = new MockLLMClient();
|
|
145
|
+
const farcaster = new FakeFarcasterModule();
|
|
146
|
+
const policy = getDefaultPolicy();
|
|
147
|
+
llm.addToolCall("delete_cast", { hash: "0xabc123" }, "Done.");
|
|
148
|
+
const followups = [];
|
|
149
|
+
const runner = new TaskRunner(workspace.dir, llm, [farcaster], logger, {
|
|
150
|
+
policy,
|
|
151
|
+
onApprovalNeeded: () => { },
|
|
152
|
+
onFollowup: (msg) => followups.push(msg),
|
|
153
|
+
});
|
|
154
|
+
await runner.runMessage("delete that cast", "test-channel");
|
|
155
|
+
expect(farcaster.executed).toHaveLength(0);
|
|
156
|
+
const approvalMgr = runner.getApprovalManager();
|
|
157
|
+
const pending = await approvalMgr.list("pending");
|
|
158
|
+
expect(pending).toHaveLength(1);
|
|
159
|
+
await approvalMgr.reject(pending[0].id, "Absolutely not");
|
|
160
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
161
|
+
// CRITICAL: Tool must NOT have executed after rejection
|
|
162
|
+
expect(farcaster.executed).toHaveLength(0);
|
|
163
|
+
// CRITICAL: Followup must mention rejection
|
|
164
|
+
expect(followups).toHaveLength(1);
|
|
165
|
+
expect(followups[0].toLowerCase()).toContain("rejected");
|
|
166
|
+
// The approval record on disk must reflect rejection
|
|
167
|
+
const all = await approvalMgr.list();
|
|
168
|
+
expect(all[0].status).toBe("rejected");
|
|
169
|
+
});
|
|
170
|
+
it("run_command executes immediately without approval", async () => {
|
|
171
|
+
const llm = new MockLLMClient();
|
|
172
|
+
const shell = new FakeShellModule();
|
|
173
|
+
const policy = getDefaultPolicy();
|
|
174
|
+
llm.addToolCall("run_command", { command: "npm install vercel" }, "Done.");
|
|
175
|
+
const approvalMessages = [];
|
|
176
|
+
const runner = new TaskRunner(workspace.dir, llm, [shell], logger, {
|
|
177
|
+
policy,
|
|
178
|
+
onApprovalNeeded: (msg) => approvalMessages.push(msg),
|
|
179
|
+
onFollowup: () => { },
|
|
180
|
+
});
|
|
181
|
+
await runner.runMessage("install vercel", "test-channel");
|
|
182
|
+
// CRITICAL: run_command must execute immediately — no approval
|
|
183
|
+
expect(shell.executed).toHaveLength(1);
|
|
184
|
+
expect(shell.executed[0].name).toBe("run_command");
|
|
185
|
+
expect(shell.executed[0].input.command).toBe("npm install vercel");
|
|
186
|
+
// No approval notifications should have been sent
|
|
187
|
+
expect(approvalMessages).toHaveLength(0);
|
|
188
|
+
// No pending approvals on disk
|
|
189
|
+
const approvalMgr = runner.getApprovalManager();
|
|
190
|
+
const pending = await approvalMgr.list("pending");
|
|
191
|
+
expect(pending).toHaveLength(0);
|
|
192
|
+
});
|
|
193
|
+
it("non-approval tools execute immediately and their result reaches the LLM", async () => {
|
|
194
|
+
const llm = new MockLLMClient();
|
|
195
|
+
const ws = new FakeWorkspaceModule();
|
|
196
|
+
const policy = getDefaultPolicy();
|
|
197
|
+
llm.addToolCall("read_file", { path: "soul.md" }, "Done.");
|
|
198
|
+
const runner = new TaskRunner(workspace.dir, llm, [ws], logger, {
|
|
199
|
+
policy,
|
|
200
|
+
});
|
|
201
|
+
await runner.runMessage("read soul.md", "test-channel");
|
|
202
|
+
// CRITICAL: Tool must have executed immediately (no approval needed)
|
|
203
|
+
expect(ws.executed).toHaveLength(1);
|
|
204
|
+
expect(ws.executed[0].name).toBe("read_file");
|
|
205
|
+
expect(ws.executed[0].input.path).toBe("soul.md");
|
|
206
|
+
// No approval requests should exist
|
|
207
|
+
const approvalMgr = runner.getApprovalManager();
|
|
208
|
+
const pending = await approvalMgr.list("pending");
|
|
209
|
+
expect(pending).toHaveLength(0);
|
|
210
|
+
});
|
|
211
|
+
it("approval-pending tool does not block subsequent messages", async () => {
|
|
212
|
+
const llm = new MockLLMClient();
|
|
213
|
+
const farcaster = new FakeFarcasterModule();
|
|
214
|
+
const ws = new FakeWorkspaceModule();
|
|
215
|
+
const policy = getDefaultPolicy();
|
|
216
|
+
// First message triggers approval (delete_cast)
|
|
217
|
+
llm.addToolCall("delete_cast", { hash: "0xabc" }, "Done.");
|
|
218
|
+
// Second message uses a non-approval tool
|
|
219
|
+
llm.addToolCall("read_file", { path: "config.md" }, "Done.");
|
|
220
|
+
const runner = new TaskRunner(workspace.dir, llm, [farcaster, ws], logger, { policy, onApprovalNeeded: () => { }, onFollowup: () => { } });
|
|
221
|
+
// Record timing — both must complete quickly (not wait for approval)
|
|
222
|
+
const start = Date.now();
|
|
223
|
+
await runner.runMessage("delete that cast", "test-channel");
|
|
224
|
+
await runner.runMessage("read config", "test-channel");
|
|
225
|
+
const elapsed = Date.now() - start;
|
|
226
|
+
// CRITICAL: Both messages must complete in under 5 seconds
|
|
227
|
+
expect(elapsed).toBeLessThan(5000);
|
|
228
|
+
// CRITICAL: read_file must have executed, delete_cast must NOT have
|
|
229
|
+
expect(ws.executed).toHaveLength(1);
|
|
230
|
+
expect(ws.executed[0].name).toBe("read_file");
|
|
231
|
+
expect(farcaster.executed).toHaveLength(0);
|
|
232
|
+
// Exactly one pending approval should exist (for delete_cast)
|
|
233
|
+
const approvalMgr = runner.getApprovalManager();
|
|
234
|
+
const pending = await approvalMgr.list("pending");
|
|
235
|
+
expect(pending).toHaveLength(1);
|
|
236
|
+
expect(pending[0].toolName).toBe("delete_cast");
|
|
237
|
+
});
|
|
238
|
+
it("approval followup contains actual tool output, not a generic message", async () => {
|
|
239
|
+
const llm = new MockLLMClient();
|
|
240
|
+
const farcaster = new FakeFarcasterModule();
|
|
241
|
+
const policy = getDefaultPolicy();
|
|
242
|
+
llm.addToolCall("delete_cast", { hash: "0xdeadbeef" }, "Done.");
|
|
243
|
+
const followups = [];
|
|
244
|
+
const runner = new TaskRunner(workspace.dir, llm, [farcaster], logger, {
|
|
245
|
+
policy,
|
|
246
|
+
onApprovalNeeded: () => { },
|
|
247
|
+
onFollowup: (msg) => followups.push(msg),
|
|
248
|
+
});
|
|
249
|
+
await runner.runMessage("delete cast", "test-channel");
|
|
250
|
+
const approvalMgr = runner.getApprovalManager();
|
|
251
|
+
const pending = await approvalMgr.list("pending");
|
|
252
|
+
await approvalMgr.approve(pending[0].id, "founder");
|
|
253
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
254
|
+
// CRITICAL: The followup must contain the actual output from executeTool
|
|
255
|
+
expect(followups).toHaveLength(1);
|
|
256
|
+
expect(followups[0]).toContain("0xdeadbeef");
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
//# sourceMappingURL=approval-flow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-flow.test.js","sourceRoot":"","sources":["../../src/approval-flow.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,0DAA0D;AAC1D,MAAM,mBAAmB;IACvB,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,4BAA4B,CAAC;IAC3C,QAAQ,GAA4D,EAAE,CAAC;IAEvE,KAAK,CAAC,UAAU,KAAI,CAAC;IAErB,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,yBAAyB;gBACtC,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,KAA8B;QAE9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpC,OAAO,gBAAgB,KAAK,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;CACF;AAED,8DAA8D;AAC9D,MAAM,eAAe;IACnB,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,wBAAwB,CAAC;IACvC,QAAQ,GAA4D,EAAE,CAAC;IAEvE,KAAK,CAAC,UAAU,KAAI,CAAC;IAErB,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,qBAAqB;gBAClC,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBAC3C,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACtB;aACF;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,KAA8B;QAE9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpC,OAAO,6BAA6B,KAAK,CAAC,OAAO,GAAG,CAAC;IACvD,CAAC;CACF;AAED,gDAAgD;AAChD,MAAM,mBAAmB;IACvB,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,4BAA4B,CAAC;IAC3C,QAAQ,GAA4D,EAAE,CAAC;IAEvE,KAAK,CAAC,UAAU,KAAI,CAAC;IAErB,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,aAAa;gBAC1B,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,KAA8B;QAE9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpC,OAAO,oBAAoB,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;CACF;AAED,IAAI,SAAwD,CAAC;AAC7D,IAAI,MAAuC,CAAC;AAE5C,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACxC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,GAAG,CAAC,WAAW,CACb,aAAa,EACb,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,OAAO,CACR,CAAC;QAEF,MAAM,gBAAgB,GAAa,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAU,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE;YAC5E,MAAM;YACN,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YACrD,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAE5D,wEAAwE;QACxE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3C,8DAA8D;QAC9D,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEpD,6DAA6D;QAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,GAAG,CAAC,WAAW,CACb,aAAa,EACb,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,OAAO,CACR,CAAC;QAEF,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAU,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE;YAC5E,MAAM;YACN,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;SACzC,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3C,kCAAkC;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEhC,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEpD,uDAAuD;QACvD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,8DAA8D;QAC9D,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE1D,0EAA0E;QAC1E,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,GAAG,CAAC,WAAW,CACb,aAAa,EACb,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,OAAO,CACR,CAAC;QAEF,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAU,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE;YAC5E,MAAM;YACN,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEhC,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAE1D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,wDAAwD;QACxD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3C,4CAA4C;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAEzD,qDAAqD;QACrD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,GAAG,CAAC,WAAW,CACb,aAAa,EACb,EAAE,OAAO,EAAE,oBAAoB,EAAE,EACjC,OAAO,CACR,CAAC;QAEF,MAAM,gBAAgB,GAAa,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAU,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE;YACxE,MAAM;YACN,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YACrD,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAE1D,+DAA+D;QAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEnE,kDAAkD;QAClD,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEzC,+BAA+B;QAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,GAAG,CAAC,WAAW,CACb,WAAW,EACX,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,OAAO,CACR,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAU,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE;YACrE,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAExD,qEAAqE;QACrE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElD,oCAAoC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,gDAAgD;QAChD,GAAG,CAAC,WAAW,CACb,aAAa,EACb,EAAE,IAAI,EAAE,OAAO,EAAE,EACjB,OAAO,CACR,CAAC;QACF,0CAA0C;QAC1C,GAAG,CAAC,WAAW,CACb,WAAW,EACX,EAAE,IAAI,EAAE,WAAW,EAAE,EACrB,OAAO,CACR,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,SAAS,CAAC,GAAG,EACb,GAAU,EACV,CAAC,SAAS,EAAE,EAAE,CAAC,EACf,MAAM,EACN,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAC7D,CAAC;QAEF,qEAAqE;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEnC,2DAA2D;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnC,oEAAoE;QACpE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE3C,8DAA8D;QAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,GAAG,CAAC,WAAW,CACb,aAAa,EACb,EAAE,IAAI,EAAE,YAAY,EAAE,EACtB,OAAO,CACR,CAAC;QAEF,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAU,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE;YAC5E,MAAM;YACN,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC1B,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEpD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,yEAAyE;QACzE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Enable a module in config.md. If the module section exists, sets enabled to true.
|
|
5
|
+
* If it doesn't exist, appends it under ## Modules.
|
|
6
|
+
*/
|
|
7
|
+
export async function enableModule(dir, moduleName) {
|
|
8
|
+
const configPath = join(dir, "config.md");
|
|
9
|
+
let content;
|
|
10
|
+
try {
|
|
11
|
+
content = await readFile(configPath, "utf-8");
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return; // no config.md — nothing to update
|
|
15
|
+
}
|
|
16
|
+
// Check if the module section already exists
|
|
17
|
+
const sectionRegex = new RegExp(`^### ${moduleName}\\s*\\n- enabled:\\s*(true|false)`, "m");
|
|
18
|
+
const match = content.match(sectionRegex);
|
|
19
|
+
if (match) {
|
|
20
|
+
// Update existing section
|
|
21
|
+
content = content.replace(sectionRegex, `### ${moduleName}\n- enabled: true`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Find the ## Modules section and append
|
|
25
|
+
const modulesIdx = content.indexOf("## Modules");
|
|
26
|
+
if (modulesIdx === -1) {
|
|
27
|
+
// No Modules section — append one
|
|
28
|
+
content += `\n## Modules\n\n### ${moduleName}\n- enabled: true\n`;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Find the next ## section after Modules to insert before it
|
|
32
|
+
const afterModules = content.indexOf("\n## ", modulesIdx + 10);
|
|
33
|
+
const insertion = `\n### ${moduleName}\n- enabled: true\n`;
|
|
34
|
+
if (afterModules === -1) {
|
|
35
|
+
// Modules is the last section
|
|
36
|
+
content += insertion;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
content = content.slice(0, afterModules) + insertion + content.slice(afterModules);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
await writeFile(configPath, content, "utf-8");
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=config-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-utils.js","sourceRoot":"","sources":["../../../src/cli/config-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,UAAkB;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,mCAAmC;IAC7C,CAAC;IAED,6CAA6C;IAC7C,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,QAAQ,UAAU,mCAAmC,EAAE,GAAG,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE1C,IAAI,KAAK,EAAE,CAAC;QACV,0BAA0B;QAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,UAAU,mBAAmB,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,kCAAkC;YAClC,OAAO,IAAI,uBAAuB,UAAU,qBAAqB,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,6DAA6D;YAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,SAAS,UAAU,qBAAqB,CAAC;YAC3D,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxB,8BAA8B;gBAC9B,OAAO,IAAI,SAAS,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { testBraveSearch } from "./connection-tests.js";
|
|
3
|
+
import { upsertEnv } from "./env-utils.js";
|
|
4
|
+
import { enableModule } from "./config-utils.js";
|
|
5
|
+
export async function connectWebSearch(dir) {
|
|
6
|
+
p.intro("Connect Web Search (Brave)");
|
|
7
|
+
p.note([
|
|
8
|
+
"Get a free API key at:",
|
|
9
|
+
" brave.com/search/api",
|
|
10
|
+
"",
|
|
11
|
+
"The free plan includes 2,000 queries/month.",
|
|
12
|
+
"Your CEO will use this for web research.",
|
|
13
|
+
].join("\n"), "Brave Search Setup");
|
|
14
|
+
const apiKey = await p.text({
|
|
15
|
+
message: "Brave Search API key:",
|
|
16
|
+
validate: (v) => (!v || v.length < 10 ? "Invalid API key" : undefined),
|
|
17
|
+
});
|
|
18
|
+
if (p.isCancel(apiKey)) {
|
|
19
|
+
p.cancel("Cancelled.");
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const s = p.spinner();
|
|
23
|
+
s.start("Testing connection...");
|
|
24
|
+
try {
|
|
25
|
+
await testBraveSearch(apiKey);
|
|
26
|
+
s.stop("Connected!");
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
s.stop("Connection failed.");
|
|
30
|
+
p.log.error(err instanceof Error ? err.message : String(err));
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
await upsertEnv(dir, { BRAVE_API_KEY: apiKey });
|
|
34
|
+
await enableModule(dir, "web-search");
|
|
35
|
+
p.log.success("Credentials saved to .env");
|
|
36
|
+
p.log.info("Module enabled in config.md");
|
|
37
|
+
p.outro("Web search connected! Your CEO can now search the web.");
|
|
38
|
+
return { apiKey };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=connect-web-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-web-search.js","sourceRoot":"","sources":["../../../src/cli/connect-web-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAEtC,CAAC,CAAC,IAAI,CACJ;QACE,wBAAwB;QACxB,wBAAwB;QACxB,EAAE;QACF,6CAA6C;QAC7C,0CAA0C;KAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,oBAAoB,CACrB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;KACvE,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAEhE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,MAAM,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEtC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC1C,CAAC,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAElE,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -14,6 +14,10 @@ export declare function testDatabase(url: string): Promise<void>;
|
|
|
14
14
|
* Test Gmail OAuth credentials by calling the profile endpoint.
|
|
15
15
|
*/
|
|
16
16
|
export declare function testGmail(clientId: string, clientSecret: string, refreshToken: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Test a Brave Search API key by running a simple query.
|
|
19
|
+
*/
|
|
20
|
+
export declare function testBraveSearch(apiKey: string): Promise<void>;
|
|
17
21
|
/**
|
|
18
22
|
* Test an EVM RPC URL by calling eth_blockNumber.
|
|
19
23
|
*/
|
|
@@ -50,6 +50,21 @@ export async function testGmail(clientId, clientSecret, refreshToken) {
|
|
|
50
50
|
const client = new GmailClient(auth);
|
|
51
51
|
await client.getProfile();
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Test a Brave Search API key by running a simple query.
|
|
55
|
+
*/
|
|
56
|
+
export async function testBraveSearch(apiKey) {
|
|
57
|
+
const res = await fetch("https://api.search.brave.com/res/v1/web/search?q=test&count=1", {
|
|
58
|
+
headers: {
|
|
59
|
+
Accept: "application/json",
|
|
60
|
+
"X-Subscription-Token": apiKey,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
const body = await res.text();
|
|
65
|
+
throw new Error(`Brave Search API error (${res.status}): ${body}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
53
68
|
/**
|
|
54
69
|
* Test an EVM RPC URL by calling eth_blockNumber.
|
|
55
70
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-tests.js","sourceRoot":"","sources":["../../../src/cli/connection-tests.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connection-tests.js","sourceRoot":"","sources":["../../../src/cli/connection-tests.ts"],"names":[],"mappings":"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"}
|