freeturtle 0.1.38 → 0.1.40

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.
Files changed (67) hide show
  1. package/README.md +7 -2
  2. package/dist/bin/freeturtle.js +25 -2
  3. package/dist/bin/freeturtle.js.map +1 -1
  4. package/dist/src/cli/connect-database.js +10 -0
  5. package/dist/src/cli/connect-database.js.map +1 -1
  6. package/dist/src/cli/connect-farcaster.js +10 -0
  7. package/dist/src/cli/connect-farcaster.js.map +1 -1
  8. package/dist/src/cli/connect-github.js +11 -0
  9. package/dist/src/cli/connect-github.js.map +1 -1
  10. package/dist/src/cli/connect-gmail.js +10 -0
  11. package/dist/src/cli/connect-gmail.js.map +1 -1
  12. package/dist/src/cli/connect-onchain.js +10 -0
  13. package/dist/src/cli/connect-onchain.js.map +1 -1
  14. package/dist/src/cli/connect-telegram.js +8 -0
  15. package/dist/src/cli/connect-telegram.js.map +1 -1
  16. package/dist/src/cli/connect-web-search.js +8 -0
  17. package/dist/src/cli/connect-web-search.js.map +1 -1
  18. package/dist/src/cli/daemon-utils.d.ts +6 -0
  19. package/dist/src/cli/daemon-utils.js +21 -5
  20. package/dist/src/cli/daemon-utils.js.map +1 -1
  21. package/dist/src/cli/init.js +210 -85
  22. package/dist/src/cli/init.js.map +1 -1
  23. package/dist/src/cli/intake.d.ts +8 -5
  24. package/dist/src/cli/intake.js +178 -20
  25. package/dist/src/cli/intake.js.map +1 -1
  26. package/dist/src/config.js +8 -0
  27. package/dist/src/config.js.map +1 -1
  28. package/dist/src/config.test.js +29 -0
  29. package/dist/src/config.test.js.map +1 -1
  30. package/dist/src/daemon.d.ts +9 -0
  31. package/dist/src/daemon.js +119 -0
  32. package/dist/src/daemon.js.map +1 -1
  33. package/dist/src/memory.d.ts +11 -0
  34. package/dist/src/memory.js +161 -2
  35. package/dist/src/memory.js.map +1 -1
  36. package/dist/src/memory.test.d.ts +1 -0
  37. package/dist/src/memory.test.js +109 -0
  38. package/dist/src/memory.test.js.map +1 -0
  39. package/dist/src/modules/farcaster/client.d.ts +3 -0
  40. package/dist/src/modules/farcaster/client.js +45 -0
  41. package/dist/src/modules/farcaster/client.js.map +1 -1
  42. package/dist/src/modules/farcaster/index.js +62 -0
  43. package/dist/src/modules/farcaster/index.js.map +1 -1
  44. package/dist/src/modules/farcaster/tools.js +60 -0
  45. package/dist/src/modules/farcaster/tools.js.map +1 -1
  46. package/dist/src/modules/github/client.d.ts +6 -0
  47. package/dist/src/modules/github/client.js +13 -0
  48. package/dist/src/modules/github/client.js.map +1 -1
  49. package/dist/src/modules/github/index.js +4 -0
  50. package/dist/src/modules/github/index.js.map +1 -1
  51. package/dist/src/modules/github/tools.js +22 -0
  52. package/dist/src/modules/github/tools.js.map +1 -1
  53. package/dist/src/modules/workspace/index.d.ts +5 -0
  54. package/dist/src/modules/workspace/index.js +59 -0
  55. package/dist/src/modules/workspace/index.js.map +1 -1
  56. package/dist/src/modules/workspace/tools.js +50 -0
  57. package/dist/src/modules/workspace/tools.js.map +1 -1
  58. package/dist/src/policy.d.ts +12 -7
  59. package/dist/src/policy.js +19 -13
  60. package/dist/src/policy.js.map +1 -1
  61. package/dist/src/policy.test.js +71 -1
  62. package/dist/src/policy.test.js.map +1 -1
  63. package/dist/src/runner.js +19 -2
  64. package/dist/src/runner.js.map +1 -1
  65. package/dist/src/scheduler.js +13 -2
  66. package/dist/src/scheduler.js.map +1 -1
  67. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { readFile, writeFile, mkdir } from "node:fs/promises";
2
- import { join, dirname } from "node:path";
1
+ import { readFile, writeFile, mkdir, readdir, stat } from "node:fs/promises";
2
+ import { join, dirname, relative } from "node:path";
3
3
  function memoryPath(dir, filename) {
4
4
  return join(dir, "workspace", "memory", filename);
5
5
  }
@@ -33,4 +33,163 @@ export async function appendToJsonArray(dir, filename, entry) {
33
33
  arr.push(entry);
34
34
  await writeMemoryFile(dir, filename, JSON.stringify(arr, null, 2));
35
35
  }
36
+ // --- Daily Memory ---
37
+ function todayDateStr() {
38
+ return new Date().toISOString().slice(0, 10);
39
+ }
40
+ function dailyMemoryPath(dir, dateStr) {
41
+ return memoryPath(dir, `${dateStr}.md`);
42
+ }
43
+ export async function appendDailyMemory(dir, content) {
44
+ const dateStr = todayDateStr();
45
+ const filePath = dailyMemoryPath(dir, dateStr);
46
+ await mkdir(dirname(filePath), { recursive: true });
47
+ const timestamp = new Date().toISOString().slice(11, 19);
48
+ const entry = `\n### ${timestamp}\n${content}\n`;
49
+ let existing = "";
50
+ try {
51
+ existing = await readFile(filePath, "utf-8");
52
+ }
53
+ catch (err) {
54
+ if (!(err instanceof Error && "code" in err && err.code === "ENOENT")) {
55
+ throw err;
56
+ }
57
+ // File doesn't exist yet — start with header
58
+ existing = `# Daily Memory — ${dateStr}\n`;
59
+ }
60
+ await writeFile(filePath, existing + entry, "utf-8");
61
+ }
62
+ export async function loadRecentDailyMemory(dir, days = 2) {
63
+ const parts = [];
64
+ const now = new Date();
65
+ for (let i = 0; i < days; i++) {
66
+ const d = new Date(now);
67
+ d.setDate(d.getDate() - i);
68
+ const dateStr = d.toISOString().slice(0, 10);
69
+ const filePath = dailyMemoryPath(dir, dateStr);
70
+ try {
71
+ const content = await readFile(filePath, "utf-8");
72
+ parts.push(content);
73
+ }
74
+ catch {
75
+ // file doesn't exist, skip
76
+ }
77
+ }
78
+ return parts.join("\n---\n");
79
+ }
80
+ async function collectFiles(baseDir, paths) {
81
+ const fileSet = new Set();
82
+ for (const p of paths) {
83
+ const full = join(baseDir, p);
84
+ try {
85
+ const s = await stat(full);
86
+ if (s.isDirectory()) {
87
+ await collectFilesRecursive(full, fileSet);
88
+ }
89
+ else if (s.isFile()) {
90
+ fileSet.add(full);
91
+ }
92
+ }
93
+ catch {
94
+ // doesn't exist, skip
95
+ }
96
+ }
97
+ return [...fileSet];
98
+ }
99
+ async function collectFilesRecursive(dir, files) {
100
+ const entries = await readdir(dir, { withFileTypes: true });
101
+ for (const entry of entries) {
102
+ const full = join(dir, entry.name);
103
+ if (entry.isDirectory()) {
104
+ await collectFilesRecursive(full, files);
105
+ }
106
+ else if (entry.isFile() && (entry.name.endsWith(".md") || entry.name.endsWith(".json"))) {
107
+ files.add(full);
108
+ }
109
+ }
110
+ }
111
+ function scoreChunk(lines, queryTerms) {
112
+ const text = lines.join(" ").toLowerCase();
113
+ let score = 0;
114
+ for (const term of queryTerms) {
115
+ // Count occurrences
116
+ let idx = 0;
117
+ while (true) {
118
+ idx = text.indexOf(term, idx);
119
+ if (idx === -1)
120
+ break;
121
+ score += 1;
122
+ idx += term.length;
123
+ }
124
+ }
125
+ return score;
126
+ }
127
+ export async function searchMemory(dir, query, options) {
128
+ const maxResults = options?.maxResults ?? 10;
129
+ const queryTerms = query.toLowerCase().split(/\s+/).filter(Boolean);
130
+ if (queryTerms.length === 0)
131
+ return [];
132
+ const searchPaths = [
133
+ "workspace/memory",
134
+ "workspace/MEMORY.md",
135
+ "workspace/reflections",
136
+ "strategy",
137
+ ];
138
+ const files = await collectFiles(dir, searchPaths);
139
+ const results = [];
140
+ for (const filePath of files) {
141
+ try {
142
+ const content = await readFile(filePath, "utf-8");
143
+ const relPath = relative(dir, filePath);
144
+ if (filePath.endsWith(".json")) {
145
+ // Search stringified JSON entries
146
+ try {
147
+ const parsed = JSON.parse(content);
148
+ const entries = Array.isArray(parsed) ? parsed : [parsed];
149
+ for (let i = 0; i < entries.length; i++) {
150
+ const text = JSON.stringify(entries[i]);
151
+ const score = scoreChunk([text], queryTerms);
152
+ if (score > 0) {
153
+ results.push({
154
+ file: relPath,
155
+ snippet: text.slice(0, 500),
156
+ line: i + 1,
157
+ score,
158
+ });
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ // invalid JSON, search as text
164
+ const lines = content.split("\n");
165
+ searchLines(lines, queryTerms, relPath, results);
166
+ }
167
+ }
168
+ else {
169
+ const lines = content.split("\n");
170
+ searchLines(lines, queryTerms, relPath, results);
171
+ }
172
+ }
173
+ catch {
174
+ // can't read file, skip
175
+ }
176
+ }
177
+ results.sort((a, b) => b.score - a.score);
178
+ return results.slice(0, maxResults);
179
+ }
180
+ function searchLines(lines, queryTerms, relPath, results) {
181
+ const chunkSize = 20;
182
+ for (let i = 0; i < lines.length; i += chunkSize) {
183
+ const chunk = lines.slice(i, i + chunkSize);
184
+ const score = scoreChunk(chunk, queryTerms);
185
+ if (score > 0) {
186
+ results.push({
187
+ file: relPath,
188
+ snippet: chunk.join("\n").slice(0, 500),
189
+ line: i + 1,
190
+ score,
191
+ });
192
+ }
193
+ }
194
+ }
36
195
  //# sourceMappingURL=memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,SAAS,UAAU,CAAC,GAAW,EAAE,QAAgB;IAC/C,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB;IAChE,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9F,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe;IAClF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB,EAAE,KAAc;IACnF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,GAAc,CAAC;IACnB,IAAI,CAAC;QACH,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,GAAG,GAAG,EAAE,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,109 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtemp, rm, readFile, mkdir, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { appendDailyMemory, loadRecentDailyMemory, searchMemory, } from "./memory.js";
6
+ describe("memory", () => {
7
+ let dir;
8
+ beforeEach(async () => {
9
+ dir = await mkdtemp(join(tmpdir(), "ft-memory-test-"));
10
+ await mkdir(join(dir, "workspace", "memory"), { recursive: true });
11
+ });
12
+ afterEach(async () => {
13
+ await rm(dir, { recursive: true, force: true });
14
+ });
15
+ describe("appendDailyMemory", () => {
16
+ it("creates dated file and appends timestamped entry", async () => {
17
+ await appendDailyMemory(dir, "First observation");
18
+ const dateStr = new Date().toISOString().slice(0, 10);
19
+ const content = await readFile(join(dir, "workspace", "memory", `${dateStr}.md`), "utf-8");
20
+ expect(content).toContain(`# Daily Memory — ${dateStr}`);
21
+ expect(content).toContain("First observation");
22
+ expect(content).toMatch(/### \d{2}:\d{2}:\d{2}/);
23
+ });
24
+ it("appends to existing file without overwriting", async () => {
25
+ await appendDailyMemory(dir, "Entry one");
26
+ await appendDailyMemory(dir, "Entry two");
27
+ const dateStr = new Date().toISOString().slice(0, 10);
28
+ const content = await readFile(join(dir, "workspace", "memory", `${dateStr}.md`), "utf-8");
29
+ expect(content).toContain("Entry one");
30
+ expect(content).toContain("Entry two");
31
+ });
32
+ });
33
+ describe("loadRecentDailyMemory", () => {
34
+ it("loads today + yesterday", async () => {
35
+ const today = new Date().toISOString().slice(0, 10);
36
+ const yesterday = new Date(Date.now() - 86400000)
37
+ .toISOString()
38
+ .slice(0, 10);
39
+ await writeFile(join(dir, "workspace", "memory", `${today}.md`), "# Today\nToday's notes", "utf-8");
40
+ await writeFile(join(dir, "workspace", "memory", `${yesterday}.md`), "# Yesterday\nYesterday's notes", "utf-8");
41
+ const result = await loadRecentDailyMemory(dir, 2);
42
+ expect(result).toContain("Today's notes");
43
+ expect(result).toContain("Yesterday's notes");
44
+ });
45
+ it("returns empty string when no files exist", async () => {
46
+ const result = await loadRecentDailyMemory(dir, 2);
47
+ expect(result).toBe("");
48
+ });
49
+ });
50
+ describe("searchMemory", () => {
51
+ it("finds text in markdown files", async () => {
52
+ await writeFile(join(dir, "workspace", "memory", "2025-01-01.md"), "# Notes\nDecided to use PostgreSQL for the database layer.", "utf-8");
53
+ const results = await searchMemory(dir, "PostgreSQL");
54
+ expect(results.length).toBeGreaterThan(0);
55
+ expect(results[0].snippet).toContain("PostgreSQL");
56
+ });
57
+ it("finds text in JSON session notes", async () => {
58
+ await mkdir(join(dir, "workspace", "memory", "session-notes"), {
59
+ recursive: true,
60
+ });
61
+ await writeFile(join(dir, "workspace", "memory", "session-notes", "2025-01-01-post.json"), JSON.stringify([
62
+ { task: "post", response: "Posted about blockchain governance" },
63
+ ]), "utf-8");
64
+ const results = await searchMemory(dir, "blockchain governance");
65
+ expect(results.length).toBeGreaterThan(0);
66
+ expect(results[0].snippet).toContain("blockchain");
67
+ });
68
+ it("returns results sorted by relevance", async () => {
69
+ await writeFile(join(dir, "workspace", "memory", "a.md"), "token token token token", "utf-8");
70
+ await writeFile(join(dir, "workspace", "memory", "b.md"), "token", "utf-8");
71
+ const results = await searchMemory(dir, "token");
72
+ expect(results.length).toBe(2);
73
+ expect(results[0].score).toBeGreaterThanOrEqual(results[1].score);
74
+ });
75
+ it("returns empty array for no matches", async () => {
76
+ await writeFile(join(dir, "workspace", "memory", "test.md"), "Nothing relevant here", "utf-8");
77
+ const results = await searchMemory(dir, "xyznonexistent");
78
+ expect(results).toEqual([]);
79
+ });
80
+ it("respects max_results limit", async () => {
81
+ for (let i = 0; i < 5; i++) {
82
+ await writeFile(join(dir, "workspace", "memory", `file${i}.md`), `match keyword here in file ${i}`, "utf-8");
83
+ }
84
+ const results = await searchMemory(dir, "keyword", { maxResults: 2 });
85
+ expect(results.length).toBe(2);
86
+ });
87
+ it("searches MEMORY.md", async () => {
88
+ await writeFile(join(dir, "workspace", "MEMORY.md"), "# Long-Term Memory\n\nPrefer concise responses. Founder likes brevity.", "utf-8");
89
+ const results = await searchMemory(dir, "brevity");
90
+ expect(results.length).toBeGreaterThan(0);
91
+ expect(results[0].file).toContain("MEMORY.md");
92
+ });
93
+ it("searches reflections directory", async () => {
94
+ await mkdir(join(dir, "workspace", "reflections"), { recursive: true });
95
+ await writeFile(join(dir, "workspace", "reflections", "2025-01-01.md"), "Reflection: engagement improved after shorter posts.", "utf-8");
96
+ const results = await searchMemory(dir, "engagement");
97
+ expect(results.length).toBeGreaterThan(0);
98
+ expect(results[0].file).toContain("reflections");
99
+ });
100
+ it("searches strategy directory", async () => {
101
+ await mkdir(join(dir, "strategy"), { recursive: true });
102
+ await writeFile(join(dir, "strategy", "2025-01-01.md"), "Strategy: focus on developer community growth.", "utf-8");
103
+ const results = await searchMemory(dir, "developer community");
104
+ expect(results.length).toBeGreaterThan(0);
105
+ expect(results[0].file).toContain("strategy");
106
+ });
107
+ });
108
+ });
109
+ //# sourceMappingURL=memory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.test.js","sourceRoot":"","sources":["../../src/memory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,GAAW,CAAC;IAEhB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;YAElD,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,KAAK,CAAC,EACjD,OAAO,CACR,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC1C,MAAM,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAE1C,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,KAAK,CAAC,EACjD,OAAO,CACR,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;iBAC9C,WAAW,EAAE;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhB,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,KAAK,CAAC,EAC/C,wBAAwB,EACxB,OAAO,CACR,CAAC;YACF,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,SAAS,KAAK,CAAC,EACnD,gCAAgC,EAChC,OAAO,CACR,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,EACjD,4DAA4D,EAC5D,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE;gBAC7D,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,SAAS,CACb,IAAI,CACF,GAAG,EACH,WAAW,EACX,QAAQ,EACR,eAAe,EACf,sBAAsB,CACvB,EACD,IAAI,CAAC,SAAS,CAAC;gBACb,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oCAAoC,EAAE;aACjE,CAAC,EACF,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YACjE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,EACxC,yBAAyB,EACzB,OAAO,CACR,CAAC;YACF,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,EACxC,OAAO,EACP,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,EAC3C,uBAAuB,EACvB,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAC/C,8BAA8B,CAAC,EAAE,EACjC,OAAO,CACR,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EACnC,wEAAwE,EACxE,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,CAAC,EACtD,sDAAsD,EACtD,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,eAAe,CAAC,EACtC,gDAAgD,EAChD,OAAO,CACR,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -37,6 +37,9 @@ export declare class NeynarClient {
37
37
  getCasts(channelId: string, limit?: number): Promise<Cast[]>;
38
38
  getMentions(fid: number, limit?: number): Promise<Cast[]>;
39
39
  replyCast(parentHash: string, text: string): Promise<CastResponse>;
40
+ fetchCast(identifier: string): Promise<Record<string, unknown>>;
41
+ searchCasts(query: string, limit?: number): Promise<Record<string, unknown>[]>;
42
+ lookupUser(fid: number): Promise<Record<string, unknown>>;
40
43
  deleteCast(targetHash: string): Promise<{
41
44
  success: boolean;
42
45
  }>;
@@ -65,6 +65,51 @@ export class NeynarClient {
65
65
  async replyCast(parentHash, text) {
66
66
  return this.postCast(text, { parent: parentHash });
67
67
  }
68
+ async fetchCast(identifier) {
69
+ const type = identifier.startsWith("http") ? "url" : "hash";
70
+ const params = new URLSearchParams({
71
+ identifier,
72
+ type,
73
+ });
74
+ const res = await fetch(`${BASE_URL}/cast?${params}`, {
75
+ headers: { "x-api-key": this.apiKey },
76
+ });
77
+ if (!res.ok) {
78
+ const err = await res.text();
79
+ throw new Error(`Neynar fetchCast failed (${res.status}): ${err}`);
80
+ }
81
+ const data = (await res.json());
82
+ return data.cast;
83
+ }
84
+ async searchCasts(query, limit = 20) {
85
+ const params = new URLSearchParams({
86
+ q: query,
87
+ limit: String(Math.min(limit, 100)),
88
+ });
89
+ const res = await fetch(`${BASE_URL}/cast/search?${params}`, {
90
+ headers: { "x-api-key": this.apiKey },
91
+ });
92
+ if (!res.ok) {
93
+ const err = await res.text();
94
+ throw new Error(`Neynar searchCasts failed (${res.status}): ${err}`);
95
+ }
96
+ const data = (await res.json());
97
+ return data.result?.casts ?? [];
98
+ }
99
+ async lookupUser(fid) {
100
+ const res = await fetch(`${BASE_URL}/user/bulk?fids=${fid}`, {
101
+ headers: { "x-api-key": this.apiKey },
102
+ });
103
+ if (!res.ok) {
104
+ const err = await res.text();
105
+ throw new Error(`Neynar lookupUser failed (${res.status}): ${err}`);
106
+ }
107
+ const data = (await res.json());
108
+ const user = data.users?.[0];
109
+ if (!user)
110
+ throw new Error(`User with FID ${fid} not found`);
111
+ return user;
112
+ }
68
113
  async deleteCast(targetHash) {
69
114
  const res = await fetch(`${BASE_URL}/cast`, {
70
115
  method: "DELETE",
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/modules/farcaster/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/modules/farcaster/client.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,68 @@ export class FarcasterModule {
63
63
  const result = await withRetry(() => this.client.deleteCast(input.target_hash));
64
64
  return JSON.stringify(result);
65
65
  }
66
+ case "fetch_cast": {
67
+ const cast = await withRetry(() => this.client.fetchCast(input.identifier));
68
+ // Return a clean summary + key fields
69
+ const c = cast;
70
+ const summary = {
71
+ hash: c.hash,
72
+ author: c.author?.username ?? "unknown",
73
+ author_fid: c.author?.fid,
74
+ text: c.text,
75
+ timestamp: c.timestamp,
76
+ channel: c.channel?.name ?? null,
77
+ likes: c.reactions?.likes_count ?? 0,
78
+ recasts: c.reactions?.recasts_count ?? 0,
79
+ replies: c.replies?.count ?? 0,
80
+ embeds: c.embeds ?? [],
81
+ };
82
+ return JSON.stringify(summary, null, 2);
83
+ }
84
+ case "search_casts": {
85
+ const casts = await withRetry(() => this.client.searchCasts(input.query, input.limit ?? 20));
86
+ const results = casts.map((c) => ({
87
+ hash: c.hash,
88
+ author: c.author?.username ?? "unknown",
89
+ author_fid: c.author?.fid,
90
+ text: c.text?.slice(0, 300),
91
+ timestamp: c.timestamp,
92
+ likes: c.reactions?.likes_count ?? 0,
93
+ recasts: c.reactions?.recasts_count ?? 0,
94
+ replies: c.replies?.count ?? 0,
95
+ }));
96
+ return JSON.stringify(results, null, 2);
97
+ }
98
+ case "check_cast_engagement": {
99
+ const cast = await withRetry(() => this.client.fetchCast(input.hash));
100
+ const c = cast;
101
+ const likes = c.reactions?.likes_count ?? 0;
102
+ const recasts = c.reactions?.recasts_count ?? 0;
103
+ const replies = c.replies?.count ?? 0;
104
+ const score = likes * 3 + recasts * 5 + replies * 2;
105
+ return JSON.stringify({
106
+ hash: c.hash,
107
+ text: c.text?.slice(0, 200),
108
+ likes,
109
+ recasts,
110
+ replies,
111
+ score,
112
+ timestamp: c.timestamp,
113
+ }, null, 2);
114
+ }
115
+ case "check_user": {
116
+ const user = await withRetry(() => this.client.lookupUser(input.fid));
117
+ const u = user;
118
+ return JSON.stringify({
119
+ fid: u.fid,
120
+ username: u.username,
121
+ display_name: u.display_name,
122
+ score: u.score,
123
+ is_spam: (u.score ?? 0) < 0.5,
124
+ follower_count: u.follower_count,
125
+ following_count: u.following_count,
126
+ }, null, 2);
127
+ }
66
128
  default:
67
129
  throw new Error(`Unknown farcaster tool: ${name}`);
68
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/farcaster/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/farcaster/index.ts"],"names":[],"mappings":"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"}
@@ -86,5 +86,65 @@ export const farcasterTools = [
86
86
  required: ["target_hash"],
87
87
  },
88
88
  },
89
+ {
90
+ name: "fetch_cast",
91
+ description: "Fetch a single cast by hash or Farcaster URL. Returns author, text, reactions, replies, embeds, and timestamp.",
92
+ input_schema: {
93
+ type: "object",
94
+ properties: {
95
+ identifier: {
96
+ type: "string",
97
+ description: "Cast hash (0x...) or Farcaster URL",
98
+ },
99
+ },
100
+ required: ["identifier"],
101
+ },
102
+ },
103
+ {
104
+ name: "search_casts",
105
+ description: "Search Farcaster casts by query text. Use this to find mentions, conversations, or specific topics.",
106
+ input_schema: {
107
+ type: "object",
108
+ properties: {
109
+ query: {
110
+ type: "string",
111
+ description: "Search query (e.g. username, topic, URL)",
112
+ },
113
+ limit: {
114
+ type: "number",
115
+ description: "Number of results (default 20, max 100)",
116
+ },
117
+ },
118
+ required: ["query"],
119
+ },
120
+ },
121
+ {
122
+ name: "check_cast_engagement",
123
+ description: "Check engagement stats (likes, recasts, replies) for a specific cast. Useful for tracking how a post is performing.",
124
+ input_schema: {
125
+ type: "object",
126
+ properties: {
127
+ hash: {
128
+ type: "string",
129
+ description: "The cast hash to check engagement for",
130
+ },
131
+ },
132
+ required: ["hash"],
133
+ },
134
+ },
135
+ {
136
+ name: "check_user",
137
+ description: "Look up a Farcaster user by FID. Returns username, display name, follower count, and spam score.",
138
+ input_schema: {
139
+ type: "object",
140
+ properties: {
141
+ fid: {
142
+ type: "number",
143
+ description: "The Farcaster FID of the user to look up",
144
+ },
145
+ },
146
+ required: ["fid"],
147
+ },
148
+ },
89
149
  ];
90
150
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/modules/farcaster/tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,kGAAkG;QACpG,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+CAA+C;iBAC7D;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,wCAAwC;iBACtD;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,sHAAsH;QACxH,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;iBAC1D;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iDAAiD;iBAC/D;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,CAAC;SACzB;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,yEAAyE;QAC3E,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,oDAAoD;QACtD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;SAClC;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,wFAAwF;QAC1F,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/modules/farcaster/tools.ts"],"names":[],"mappings":"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"}
@@ -11,11 +11,17 @@ export interface CommitResult {
11
11
  sha: string;
12
12
  html_url: string;
13
13
  }
14
+ export interface RepoResult {
15
+ full_name: string;
16
+ html_url: string;
17
+ private: boolean;
18
+ }
14
19
  export declare class GitHubClient {
15
20
  private octokit;
16
21
  constructor(token: string);
17
22
  private parseRepo;
18
23
  createIssue(repo: string, title: string, body: string): Promise<Issue>;
19
24
  listIssues(repo: string, state?: "open" | "closed" | "all"): Promise<Issue[]>;
25
+ createRepo(name: string, description?: string, isPrivate?: boolean): Promise<RepoResult>;
20
26
  commitFile(repo: string, path: string, content: string, message: string, branch?: string): Promise<CommitResult>;
21
27
  }
@@ -44,6 +44,19 @@ export class GitHubClient {
44
44
  user: d.user?.login ?? "unknown",
45
45
  }));
46
46
  }
47
+ async createRepo(name, description, isPrivate) {
48
+ const { data } = await this.octokit.repos.createForAuthenticatedUser({
49
+ name,
50
+ description,
51
+ private: isPrivate ?? false,
52
+ auto_init: true,
53
+ });
54
+ return {
55
+ full_name: data.full_name,
56
+ html_url: data.html_url,
57
+ private: data.private,
58
+ };
59
+ }
47
60
  async commitFile(repo, path, content, message, branch) {
48
61
  const { owner, repo: name } = this.parseRepo(repo);
49
62
  // Check if file exists to get its SHA
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/modules/github/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/modules/github/client.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,10 @@ export class GitHubModule {
23
23
  assertGithubRepoAllowed(this.policy, input.repo);
24
24
  }
25
25
  switch (name) {
26
+ case "create_repo": {
27
+ const result = await withRetry(() => this.client.createRepo(input.name, input.description, input.private));
28
+ return JSON.stringify(result);
29
+ }
26
30
  case "create_issue": {
27
31
  const issue = await withRetry(() => this.client.createIssue(input.repo, input.title, input.body));
28
32
  return JSON.stringify(issue);