freeturtle 0.1.0 → 0.1.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.
@@ -0,0 +1,242 @@
1
+ import * as p from "@clack/prompts";
2
+ import { readFile, writeFile, chmod, mkdir } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { createWebhook, deleteWebhook, listWebhooks, channelToUrl, } from "../webhooks/neynar.js";
5
+ export async function runWebhooksSetup(dir) {
6
+ p.intro("Webhook Setup");
7
+ // Load existing .env
8
+ const envPath = join(dir, ".env");
9
+ const existingEnv = {};
10
+ try {
11
+ const content = await readFile(envPath, "utf-8");
12
+ for (const line of content.split("\n")) {
13
+ const match = line.match(/^([A-Z_]+)=(.+)$/);
14
+ if (match)
15
+ existingEnv[match[1]] = match[2];
16
+ }
17
+ }
18
+ catch {
19
+ // No .env
20
+ }
21
+ const apiKey = existingEnv.NEYNAR_API_KEY;
22
+ const fid = existingEnv.FARCASTER_FID;
23
+ if (!apiKey || !fid) {
24
+ p.log.error("Farcaster must be connected first. Run: freeturtle connect farcaster");
25
+ return;
26
+ }
27
+ // Check for existing webhooks
28
+ const s = p.spinner();
29
+ s.start("Checking existing webhooks");
30
+ let existing;
31
+ try {
32
+ existing = await listWebhooks(apiKey);
33
+ }
34
+ catch (err) {
35
+ s.stop("Failed");
36
+ p.log.error(`Could not list webhooks: ${err instanceof Error ? err.message : "Unknown error"}`);
37
+ return;
38
+ }
39
+ s.stop(`Found ${existing.length} existing webhook(s)`);
40
+ if (existing.length > 0) {
41
+ p.log.info("Current webhooks:");
42
+ for (const wh of existing) {
43
+ p.log.message(` ${wh.title || wh.webhook_id} → ${wh.url} (${wh.active ? "active" : "inactive"})`);
44
+ }
45
+ const action = await p.select({
46
+ message: "What would you like to do?",
47
+ options: [
48
+ { value: "new", label: "Create a new webhook" },
49
+ { value: "delete", label: "Delete an existing webhook" },
50
+ { value: "cancel", label: "Cancel" },
51
+ ],
52
+ });
53
+ if (p.isCancel(action) || action === "cancel") {
54
+ p.cancel("Cancelled.");
55
+ return;
56
+ }
57
+ if (action === "delete") {
58
+ const whId = await p.select({
59
+ message: "Which webhook to delete?",
60
+ options: existing.map((wh) => ({
61
+ value: wh.webhook_id,
62
+ label: `${wh.title || wh.webhook_id} → ${wh.url}`,
63
+ })),
64
+ });
65
+ if (p.isCancel(whId)) {
66
+ p.cancel("Cancelled.");
67
+ return;
68
+ }
69
+ s.start("Deleting webhook");
70
+ try {
71
+ await deleteWebhook(apiKey, whId);
72
+ s.stop("Webhook deleted");
73
+ }
74
+ catch (err) {
75
+ s.stop("Failed");
76
+ p.log.error(`Could not delete webhook: ${err instanceof Error ? err.message : "Unknown error"}`);
77
+ }
78
+ return;
79
+ }
80
+ }
81
+ // Create a new webhook
82
+ p.note([
83
+ "FreeTurtle's daemon runs a webhook server that listens for",
84
+ "Farcaster events. You choose what to listen for, provide",
85
+ "your server's public URL, and Neynar sends events there.",
86
+ "",
87
+ "The webhook server runs on a port you choose (default: 3456).",
88
+ "Make sure the port is open in your firewall.",
89
+ ].join("\n"), "How it works");
90
+ // What to listen for
91
+ const ownFid = parseInt(fid, 10);
92
+ const listeners = await p.multiselect({
93
+ message: "What should your CEO listen for?",
94
+ options: [
95
+ { value: "mentions", label: "Mentions", hint: "someone @'s your CEO" },
96
+ { value: "replies", label: "Replies", hint: "someone replies to your CEO's casts" },
97
+ { value: "users", label: "Specific users", hint: "watch casts from certain accounts" },
98
+ { value: "channels", label: "Channels", hint: "watch new casts in Farcaster channels" },
99
+ ],
100
+ initialValues: ["mentions"],
101
+ required: true,
102
+ });
103
+ if (p.isCancel(listeners)) {
104
+ p.cancel("Cancelled.");
105
+ return;
106
+ }
107
+ const subscription = {};
108
+ let watchFidsStr = "";
109
+ if (listeners.includes("mentions")) {
110
+ subscription.mentionedFids = [ownFid];
111
+ }
112
+ if (listeners.includes("replies")) {
113
+ subscription.parentAuthorFids = [ownFid];
114
+ }
115
+ if (listeners.includes("users")) {
116
+ const fidsInput = await p.text({
117
+ message: "FIDs to watch (comma-separated)",
118
+ placeholder: "e.g. 3, 12345, 99999",
119
+ validate: (v) => {
120
+ if (!v?.trim())
121
+ return "Required";
122
+ const fids = v.split(",").map((f) => f.trim());
123
+ if (fids.some((f) => isNaN(parseInt(f, 10))))
124
+ return "All values must be numbers";
125
+ return undefined;
126
+ },
127
+ });
128
+ if (p.isCancel(fidsInput)) {
129
+ p.cancel("Cancelled.");
130
+ return;
131
+ }
132
+ const watchFids = fidsInput.split(",").map((f) => parseInt(f.trim(), 10));
133
+ subscription.authorFids = watchFids;
134
+ watchFidsStr = watchFids.join(",");
135
+ }
136
+ if (listeners.includes("channels")) {
137
+ const channelsInput = await p.text({
138
+ message: "Channel names to watch (comma-separated, without /)",
139
+ placeholder: "e.g. farcaster, base, music",
140
+ validate: (v) => (v?.trim() ? undefined : "Required"),
141
+ });
142
+ if (p.isCancel(channelsInput)) {
143
+ p.cancel("Cancelled.");
144
+ return;
145
+ }
146
+ subscription.channelUrls = channelsInput
147
+ .split(",")
148
+ .map((c) => channelToUrl(c.trim()));
149
+ }
150
+ const port = await p.text({
151
+ message: "Webhook server port",
152
+ placeholder: "3456",
153
+ defaultValue: "3456",
154
+ validate: (v) => {
155
+ const n = parseInt(v || "3456", 10);
156
+ if (isNaN(n) || n < 1 || n > 65535)
157
+ return "Invalid port number";
158
+ return undefined;
159
+ },
160
+ });
161
+ if (p.isCancel(port)) {
162
+ p.cancel("Cancelled.");
163
+ return;
164
+ }
165
+ const url = await p.text({
166
+ message: "Your server's public webhook URL",
167
+ placeholder: `http://<YOUR_SERVER_IP>:${port}/webhook`,
168
+ validate: (v) => {
169
+ if (!v?.trim())
170
+ return "Required";
171
+ if (!v.includes("/webhook"))
172
+ return "URL should end with /webhook";
173
+ return undefined;
174
+ },
175
+ });
176
+ if (p.isCancel(url)) {
177
+ p.cancel("Cancelled.");
178
+ return;
179
+ }
180
+ const webhookSecret = await p.text({
181
+ message: "Webhook secret (optional, for signature verification)",
182
+ placeholder: "Leave blank to skip",
183
+ });
184
+ if (p.isCancel(webhookSecret)) {
185
+ p.cancel("Cancelled.");
186
+ return;
187
+ }
188
+ // Register with Neynar
189
+ s.start("Registering webhook with Neynar");
190
+ try {
191
+ await createWebhook(apiKey, `FreeTurtle (FID ${fid})`, url, subscription);
192
+ s.stop("Webhook registered");
193
+ }
194
+ catch (err) {
195
+ s.stop("Failed");
196
+ p.log.error(`Could not register webhook: ${err instanceof Error ? err.message : "Unknown error"}`);
197
+ return;
198
+ }
199
+ // Save to .env
200
+ const envVars = {
201
+ WEBHOOK_PORT: port,
202
+ WEBHOOK_ENABLED: "true",
203
+ };
204
+ if (webhookSecret?.trim()) {
205
+ envVars.NEYNAR_WEBHOOK_SECRET = webhookSecret.trim();
206
+ }
207
+ if (watchFidsStr) {
208
+ envVars.WEBHOOK_WATCH_FIDS = watchFidsStr;
209
+ }
210
+ let envContent = "";
211
+ try {
212
+ envContent = await readFile(envPath, "utf-8");
213
+ }
214
+ catch {
215
+ // No existing .env
216
+ }
217
+ for (const [key, value] of Object.entries(envVars)) {
218
+ const regex = new RegExp(`^${key}=.*$`, "m");
219
+ if (regex.test(envContent)) {
220
+ envContent = envContent.replace(regex, `${key}=${value}`);
221
+ }
222
+ else {
223
+ envContent += `${envContent.endsWith("\n") || envContent === "" ? "" : "\n"}${key}=${value}\n`;
224
+ }
225
+ }
226
+ await mkdir(dirname(envPath), { recursive: true });
227
+ await writeFile(envPath, envContent, "utf-8");
228
+ await chmod(envPath, 0o600);
229
+ p.log.success("Settings saved to .env");
230
+ p.note([
231
+ "Make sure port " + port + " is open:",
232
+ "",
233
+ " Oracle Cloud: Networking > VCN > Subnet > Security List > Add Ingress Rule",
234
+ " OS firewall: sudo iptables -I INPUT -p tcp --dport " + port + " -j ACCEPT",
235
+ "",
236
+ "Then restart FreeTurtle:",
237
+ "",
238
+ " freeturtle start",
239
+ ].join("\n"), "Next steps");
240
+ p.outro("Webhook setup complete!");
241
+ }
242
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/cli/webhooks.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export declare class FreeTurtleDaemon {
10
10
  private channels;
11
11
  private runner?;
12
12
  private ipcServer?;
13
+ private webhookServer?;
13
14
  constructor(dir: string, options?: DaemonOptions);
14
15
  start(): Promise<void>;
15
16
  stop(): Promise<void>;
@@ -10,6 +10,7 @@ import { Scheduler } from "./scheduler.js";
10
10
  import { Heartbeat } from "./heartbeat.js";
11
11
  import { TerminalChannel } from "./channels/terminal.js";
12
12
  import { TelegramChannel } from "./channels/telegram.js";
13
+ import { WebhookServer } from "./webhooks/server.js";
13
14
  import { createLogger } from "./logger.js";
14
15
  export class FreeTurtleDaemon {
15
16
  dir;
@@ -20,6 +21,7 @@ export class FreeTurtleDaemon {
20
21
  channels = [];
21
22
  runner;
22
23
  ipcServer;
24
+ webhookServer;
23
25
  constructor(dir, options = {}) {
24
26
  this.dir = dir;
25
27
  this.options = options;
@@ -60,7 +62,7 @@ export class FreeTurtleDaemon {
60
62
  });
61
63
  this.logger.info(`LLM: ${provider} / ${config.llm.model}`);
62
64
  // Load modules (pass policy for allowlist enforcement)
63
- const modules = await loadModules(config, env, this.logger, config.policy);
65
+ const modules = await loadModules(config, env, this.logger, config.policy, this.dir);
64
66
  this.logger.info(`Modules: ${modules.map((m) => m.name).join(", ") || "none"}`);
65
67
  // Create runner with policy and approval notifications
66
68
  this.runner = new TaskRunner(this.dir, llm, modules, this.logger, {
@@ -112,6 +114,26 @@ export class FreeTurtleDaemon {
112
114
  this.logger.warn("Telegram enabled but TELEGRAM_BOT_TOKEN or TELEGRAM_OWNER_ID missing");
113
115
  }
114
116
  }
117
+ // Start webhook server if enabled
118
+ if (env.WEBHOOK_ENABLED === "true" && env.NEYNAR_API_KEY && env.FARCASTER_FID) {
119
+ const webhookPort = parseInt(env.WEBHOOK_PORT || "3456", 10);
120
+ const watchedFids = env.WEBHOOK_WATCH_FIDS
121
+ ? env.WEBHOOK_WATCH_FIDS.split(",").map((f) => parseInt(f.trim(), 10))
122
+ : undefined;
123
+ this.webhookServer = new WebhookServer({
124
+ port: webhookPort,
125
+ ownFid: parseInt(env.FARCASTER_FID, 10),
126
+ neynarApiKey: env.NEYNAR_API_KEY,
127
+ webhookSecret: env.NEYNAR_WEBHOOK_SECRET,
128
+ watchedFids,
129
+ logger: this.logger,
130
+ onEvent: async (prompt) => {
131
+ return this.runner.runMessage(prompt, "webhook");
132
+ },
133
+ });
134
+ await this.webhookServer.start();
135
+ this.logger.info(`Webhook server started on port ${webhookPort}`);
136
+ }
115
137
  // Write PID file
116
138
  const pidPath = join(this.dir, "daemon.pid");
117
139
  await writeFile(pidPath, String(process.pid), "utf-8");
@@ -132,6 +154,9 @@ export class FreeTurtleDaemon {
132
154
  const moduleNames = modules.map((m) => m.name).join(", ") || "none";
133
155
  const channelNames = this.channels.map((c) => c.name).join(", ") || "none";
134
156
  const cronCount = Object.keys(config.cron).length;
157
+ const webhookStatus = this.webhookServer
158
+ ? `port ${env.WEBHOOK_PORT || "3456"}`
159
+ : "off";
135
160
  console.log(`
136
161
  \x1b[38;2;94;255;164m _____ ____\x1b[0m
137
162
  \x1b[38;2;94;255;164m / \\ | o |\x1b[0m
@@ -144,6 +169,7 @@ export class FreeTurtleDaemon {
144
169
  Modules ${moduleNames}
145
170
  Cron tasks ${cronCount}
146
171
  Channels ${channelNames}
172
+ Webhooks ${webhookStatus}
147
173
 
148
174
  \x1b[2mfreeturtle send "message" — talk to your CEO\x1b[0m
149
175
  \x1b[2mfreeturtle start --chat — interactive mode\x1b[0m
@@ -157,6 +183,8 @@ export class FreeTurtleDaemon {
157
183
  for (const ch of this.channels) {
158
184
  await ch.stop();
159
185
  }
186
+ if (this.webhookServer)
187
+ await this.webhookServer.stop();
160
188
  this.ipcServer?.close();
161
189
  // Remove PID file
162
190
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,4 @@ import type { FreeTurtleConfig } from "../config.js";
2
2
  import type { PolicyConfig } from "../policy.js";
3
3
  import type { FreeTurtleModule } from "./types.js";
4
4
  import type { Logger } from "../logger.js";
5
- export declare function loadModules(config: FreeTurtleConfig, env: Record<string, string>, logger?: Logger, policy?: PolicyConfig): Promise<FreeTurtleModule[]>;
5
+ export declare function loadModules(config: FreeTurtleConfig, env: Record<string, string>, logger?: Logger, policy?: PolicyConfig, dir?: string): Promise<FreeTurtleModule[]>;
@@ -3,6 +3,7 @@ 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 { WorkspaceModule } from "./workspace/index.js";
6
7
  const MODULE_MAP = {
7
8
  farcaster: FarcasterModule,
8
9
  database: DatabaseModule,
@@ -10,8 +11,20 @@ const MODULE_MAP = {
10
11
  onchain: OnchainModule,
11
12
  xmtp: XmtpModule,
12
13
  };
13
- export async function loadModules(config, env, logger, policy) {
14
+ export async function loadModules(config, env, logger, policy, dir) {
14
15
  const modules = [];
16
+ // Workspace module is always loaded — gives the CEO file access to its own workspace
17
+ if (dir) {
18
+ try {
19
+ const workspace = new WorkspaceModule();
20
+ await workspace.initialize({ _workspaceDir: dir }, env, { policy });
21
+ modules.push(workspace);
22
+ }
23
+ catch (err) {
24
+ const msg = err instanceof Error ? err.message : "Unknown error";
25
+ logger?.error(`Workspace module failed to initialize: ${msg}`);
26
+ }
27
+ }
15
28
  for (const [name, moduleConfig] of Object.entries(config.modules)) {
16
29
  if (!moduleConfig.enabled)
17
30
  continue;
@@ -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;AAE7C,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;IAErB,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,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,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"}
@@ -0,0 +1,20 @@
1
+ import type { FreeTurtleModule, ToolDefinition } from "../types.js";
2
+ import type { PolicyConfig } from "../../policy.js";
3
+ export declare class WorkspaceModule implements FreeTurtleModule {
4
+ name: string;
5
+ description: string;
6
+ private dir;
7
+ initialize(config: Record<string, unknown>, _env: Record<string, string>, _options?: {
8
+ policy?: PolicyConfig;
9
+ }): Promise<void>;
10
+ getTools(): ToolDefinition[];
11
+ executeTool(name: string, input: Record<string, unknown>): Promise<string>;
12
+ /** Resolve a relative path, ensuring it stays within the workspace */
13
+ private safePath;
14
+ private readFile;
15
+ private writeFile;
16
+ private editFile;
17
+ private listFiles;
18
+ }
19
+ /** Check if a workspace file path is protected (requires approval) */
20
+ export declare function isProtectedWorkspacePath(path: string): boolean;
@@ -0,0 +1,115 @@
1
+ import { readFile, writeFile, readdir, mkdir, stat } from "node:fs/promises";
2
+ import { join, dirname, normalize, resolve } from "node:path";
3
+ import { workspaceTools } from "./tools.js";
4
+ /** Files that require founder approval to modify */
5
+ const PROTECTED_FILES = ["soul.md", "config.md", ".env"];
6
+ export class WorkspaceModule {
7
+ name = "workspace";
8
+ description = "Read and write files in your own workspace — modify your soul, config, memory, and notes.";
9
+ dir;
10
+ async initialize(config, _env, _options) {
11
+ this.dir = config._workspaceDir;
12
+ if (!this.dir) {
13
+ throw new Error("Workspace module requires _workspaceDir");
14
+ }
15
+ }
16
+ getTools() {
17
+ return workspaceTools;
18
+ }
19
+ async executeTool(name, input) {
20
+ switch (name) {
21
+ case "read_file":
22
+ return this.readFile(input.path);
23
+ case "write_file":
24
+ return this.writeFile(input.path, input.content);
25
+ case "edit_file":
26
+ return this.editFile(input.path, input.old_text, input.new_text);
27
+ case "list_files":
28
+ return this.listFiles(input.path || ".");
29
+ default:
30
+ throw new Error(`Unknown workspace tool: ${name}`);
31
+ }
32
+ }
33
+ /** Resolve a relative path, ensuring it stays within the workspace */
34
+ safePath(relativePath) {
35
+ const normalized = normalize(relativePath);
36
+ if (normalized.startsWith("..") || normalized.startsWith("/")) {
37
+ throw new Error(`Path "${relativePath}" is not allowed — must be relative to workspace`);
38
+ }
39
+ const full = resolve(this.dir, normalized);
40
+ if (!full.startsWith(this.dir)) {
41
+ throw new Error(`Path "${relativePath}" escapes the workspace`);
42
+ }
43
+ return full;
44
+ }
45
+ async readFile(path) {
46
+ const full = this.safePath(path);
47
+ try {
48
+ const content = await readFile(full, "utf-8");
49
+ return content;
50
+ }
51
+ catch (err) {
52
+ if (err instanceof Error && "code" in err && err.code === "ENOENT") {
53
+ return `Error: File not found: ${path}`;
54
+ }
55
+ throw err;
56
+ }
57
+ }
58
+ async writeFile(path, content) {
59
+ const full = this.safePath(path);
60
+ await mkdir(dirname(full), { recursive: true });
61
+ await writeFile(full, content, "utf-8");
62
+ return `Written: ${path} (${content.length} chars)`;
63
+ }
64
+ async editFile(path, oldText, newText) {
65
+ const full = this.safePath(path);
66
+ let content;
67
+ try {
68
+ content = await readFile(full, "utf-8");
69
+ }
70
+ catch (err) {
71
+ if (err instanceof Error && "code" in err && err.code === "ENOENT") {
72
+ return `Error: File not found: ${path}`;
73
+ }
74
+ throw err;
75
+ }
76
+ if (!content.includes(oldText)) {
77
+ return `Error: Could not find the text to replace in ${path}`;
78
+ }
79
+ const updated = content.replace(oldText, newText);
80
+ await writeFile(full, updated, "utf-8");
81
+ return `Edited: ${path}`;
82
+ }
83
+ async listFiles(path) {
84
+ const full = this.safePath(path);
85
+ try {
86
+ const entries = await readdir(full);
87
+ const results = [];
88
+ for (const entry of entries) {
89
+ // Skip hidden files except .env
90
+ if (entry.startsWith(".") && entry !== ".env")
91
+ continue;
92
+ try {
93
+ const info = await stat(join(full, entry));
94
+ results.push(info.isDirectory() ? `${entry}/` : entry);
95
+ }
96
+ catch {
97
+ results.push(entry);
98
+ }
99
+ }
100
+ return results.length > 0 ? results.join("\n") : "(empty directory)";
101
+ }
102
+ catch (err) {
103
+ if (err instanceof Error && "code" in err && err.code === "ENOENT") {
104
+ return `Error: Directory not found: ${path}`;
105
+ }
106
+ throw err;
107
+ }
108
+ }
109
+ }
110
+ /** Check if a workspace file path is protected (requires approval) */
111
+ export function isProtectedWorkspacePath(path) {
112
+ const normalized = normalize(path);
113
+ return PROTECTED_FILES.some((f) => normalized === f || normalized.endsWith(`/${f}`));
114
+ }
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/workspace/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const workspaceTools: ToolDefinition[];