@avasis-ai/synthcode 1.0.0

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +292 -0
  3. package/dist/chunk-53ZOIXM4.js +624 -0
  4. package/dist/chunk-53ZOIXM4.js.map +1 -0
  5. package/dist/chunk-BWXHO6UJ.js +115 -0
  6. package/dist/chunk-BWXHO6UJ.js.map +1 -0
  7. package/dist/chunk-CARUMOML.js +123 -0
  8. package/dist/chunk-CARUMOML.js.map +1 -0
  9. package/dist/chunk-DGUM43GV.js +11 -0
  10. package/dist/chunk-DGUM43GV.js.map +1 -0
  11. package/dist/chunk-F34HO4RA.js +487 -0
  12. package/dist/chunk-F34HO4RA.js.map +1 -0
  13. package/dist/chunk-FK7S2S7V.js +132 -0
  14. package/dist/chunk-FK7S2S7V.js.map +1 -0
  15. package/dist/chunk-MQ7XP6VT.js +174 -0
  16. package/dist/chunk-MQ7XP6VT.js.map +1 -0
  17. package/dist/chunk-TLPOO6C3.js +176 -0
  18. package/dist/chunk-TLPOO6C3.js.map +1 -0
  19. package/dist/chunk-W6OLZ2OI.js +56 -0
  20. package/dist/chunk-W6OLZ2OI.js.map +1 -0
  21. package/dist/cli/index.cjs +151 -0
  22. package/dist/cli/index.cjs.map +1 -0
  23. package/dist/cli/index.d.cts +1 -0
  24. package/dist/cli/index.d.ts +1 -0
  25. package/dist/cli/index.js +8 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/run.cjs +128 -0
  28. package/dist/cli/run.cjs.map +1 -0
  29. package/dist/cli/run.d.cts +1 -0
  30. package/dist/cli/run.d.ts +1 -0
  31. package/dist/cli/run.js +126 -0
  32. package/dist/cli/run.js.map +1 -0
  33. package/dist/index-D-K6sx8s.d.cts +8 -0
  34. package/dist/index-D-K6sx8s.d.ts +8 -0
  35. package/dist/index.cjs +2909 -0
  36. package/dist/index.cjs.map +1 -0
  37. package/dist/index.d.cts +274 -0
  38. package/dist/index.d.ts +274 -0
  39. package/dist/index.js +1048 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/llm/index.cjs +531 -0
  42. package/dist/llm/index.cjs.map +1 -0
  43. package/dist/llm/index.d.cts +70 -0
  44. package/dist/llm/index.d.ts +70 -0
  45. package/dist/llm/index.js +24 -0
  46. package/dist/llm/index.js.map +1 -0
  47. package/dist/mcp/index.cjs +323 -0
  48. package/dist/mcp/index.cjs.map +1 -0
  49. package/dist/mcp/index.d.cts +39 -0
  50. package/dist/mcp/index.d.ts +39 -0
  51. package/dist/mcp/index.js +11 -0
  52. package/dist/mcp/index.js.map +1 -0
  53. package/dist/memory/index.cjs +146 -0
  54. package/dist/memory/index.cjs.map +1 -0
  55. package/dist/memory/index.d.cts +51 -0
  56. package/dist/memory/index.d.ts +51 -0
  57. package/dist/memory/index.js +10 -0
  58. package/dist/memory/index.js.map +1 -0
  59. package/dist/tools/fuzzy-edit.cjs +200 -0
  60. package/dist/tools/fuzzy-edit.cjs.map +1 -0
  61. package/dist/tools/fuzzy-edit.d.cts +9 -0
  62. package/dist/tools/fuzzy-edit.d.ts +9 -0
  63. package/dist/tools/fuzzy-edit.js +12 -0
  64. package/dist/tools/fuzzy-edit.js.map +1 -0
  65. package/dist/tools/index.cjs +1032 -0
  66. package/dist/tools/index.cjs.map +1 -0
  67. package/dist/tools/index.d.cts +4 -0
  68. package/dist/tools/index.d.ts +4 -0
  69. package/dist/tools/index.js +39 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/types-C11cw5ZD.d.cts +177 -0
  72. package/dist/types-C11cw5ZD.d.ts +177 -0
  73. package/dist/utils-TF4TBXQJ.js +10 -0
  74. package/dist/utils-TF4TBXQJ.js.map +1 -0
  75. package/dist/web-fetch-B42QzYD2.d.cts +85 -0
  76. package/dist/web-fetch-EDdhxmEf.d.ts +85 -0
  77. package/package.json +134 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/tool.ts"],"sourcesContent":["import type { ZodSchema } from 'zod';\nimport type { ToolContext } from '../types.js';\n\n/** JSON Schema representation of a tool for LLM function calling APIs. */\nexport interface APIToolDefinition {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\n/** Core tool abstraction that every tool must implement. */\nexport interface Tool<P = unknown> {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: ZodSchema<P>;\n readonly isReadOnly: boolean;\n readonly isConcurrencySafe: boolean;\n\n execute(input: P, context: ToolContext): Promise<string>;\n toAPI(): APIToolDefinition;\n toString(input: P): string;\n}\n\n/** Configuration object for defining a tool. */\nexport interface ToolExecuteOptions<P = unknown> {\n name: string;\n description: string;\n inputSchema: ZodSchema<P>;\n isReadOnly?: boolean;\n isConcurrencySafe?: boolean;\n execute: (input: P, context: ToolContext) => Promise<string>;\n}\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n const s = schema as { _def: Record<string, unknown> };\n const def = s._def;\n const typeName = def.typeName as string;\n const description = def.description as string | undefined;\n\n const base: Record<string, unknown> = {};\n if (description) base.description = description;\n\n switch (typeName) {\n case 'ZodString':\n return { ...base, type: 'string' };\n case 'ZodNumber':\n return { ...base, type: 'number' };\n case 'ZodBoolean':\n return { ...base, type: 'boolean' };\n case 'ZodNull':\n return { ...base, type: 'null' };\n case 'ZodArray': {\n const items = zodToJsonSchema(def.element);\n return { ...base, type: 'array', items };\n }\n case 'ZodObject': {\n const shapeFn = def.shape as () => Record<string, unknown>;\n const shape = shapeFn();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const propDef = (value as { _def: Record<string, unknown> })._def;\n if (\n propDef.typeName !== 'ZodOptional' &&\n propDef.typeName !== 'ZodNullish' &&\n propDef.typeName !== 'ZodDefault'\n ) {\n required.push(key);\n }\n }\n const result: Record<string, unknown> = { ...base, type: 'object', properties };\n if (required.length > 0) result.required = required;\n return result;\n }\n case 'ZodEnum':\n return { ...base, enum: def.values };\n case 'ZodLiteral':\n return { ...base, const: def.value };\n case 'ZodUnion': {\n const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, anyOf: options };\n }\n case 'ZodDiscriminatedUnion': {\n const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, anyOf: options };\n }\n case 'ZodOptional':\n return zodToJsonSchema(def.innerType);\n case 'ZodNullable': {\n const inner = zodToJsonSchema(def.innerType);\n inner.nullable = true;\n return inner;\n }\n case 'ZodNullish': {\n const inner = zodToJsonSchema(def.innerType);\n inner.nullable = true;\n return inner;\n }\n case 'ZodDefault':\n return zodToJsonSchema(def.innerType);\n case 'ZodRecord': {\n const valueSchema = zodToJsonSchema(def.valueType);\n return { ...base, type: 'object', additionalProperties: valueSchema };\n }\n case 'ZodTuple': {\n const items = (def.items as unknown[]).map((o) => zodToJsonSchema(o));\n return { ...base, type: 'array', items, minItems: items.length, maxItems: items.length };\n }\n case 'ZodEffects': {\n return zodToJsonSchema(def.innerType);\n }\n case 'ZodAny':\n return {};\n case 'ZodUnknown':\n return {};\n case 'ZodVoid':\n return { ...base, type: 'null' };\n case 'ZodNever':\n return { ...base, not: {} };\n default:\n return { ...base, type: 'string' };\n }\n}\n\n/** Define a tool from a configuration object. */\nexport function defineTool<P = unknown>(config: ToolExecuteOptions<P>): Tool<P> {\n const tool: Tool<P> = {\n name: config.name,\n description: config.description,\n inputSchema: config.inputSchema,\n isReadOnly: config.isReadOnly ?? false,\n isConcurrencySafe: config.isConcurrencySafe ?? false,\n execute: config.execute,\n toAPI(): APIToolDefinition {\n return {\n name: config.name,\n description: config.description,\n input_schema: zodToJsonSchema(config.inputSchema),\n };\n },\n toString(input: P): string {\n const entries = Object.entries(input as Record<string, unknown>)\n .map(([k, v]) => {\n if (typeof v === 'string') return `${k}: \"${v}\"`;\n if (v === undefined) return `${k}: undefined`;\n if (v === null) return `${k}: null`;\n return `${k}: ${String(v)}`;\n })\n .join(', ');\n return `${config.name}({ ${entries} })`;\n },\n };\n return tool;\n}\n\n/** Wrap a class-based tool into the standard Tool interface. */\nexport function defineToolFromClass(ctor: new () => Tool): Tool {\n const instance = new ctor();\n return {\n name: instance.name,\n description: instance.description,\n inputSchema: instance.inputSchema,\n isReadOnly: instance.isReadOnly,\n isConcurrencySafe: instance.isConcurrencySafe,\n execute: (input, context) => instance.execute(input, context),\n toAPI: () => instance.toAPI(),\n toString: (input) => instance.toString(input),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,174 @@
1
+ // src/tools/fuzzy-edit.ts
2
+ var FuzzyEditError = class extends Error {
3
+ constructor(kind, message) {
4
+ super(message);
5
+ this.kind = kind;
6
+ this.name = "FuzzyEditError";
7
+ }
8
+ kind;
9
+ };
10
+ function levenshtein(a, b) {
11
+ const m = a.length;
12
+ const n = b.length;
13
+ if (m === 0) return n;
14
+ if (n === 0) return m;
15
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
16
+ for (let i = 0; i <= m; i++) dp[i][0] = i;
17
+ for (let j = 0; j <= n; j++) dp[0][j] = j;
18
+ for (let i = 1; i <= m; i++) {
19
+ for (let j = 1; j <= n; j++) {
20
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
21
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
22
+ }
23
+ }
24
+ return dp[m][n];
25
+ }
26
+ function similarity(a, b) {
27
+ if (a.length > 1e3 || b.length > 1e3) return a === b ? 1 : 0;
28
+ const maxLen = Math.max(a.length, b.length);
29
+ if (maxLen === 0) return 1;
30
+ return 1 - levenshtein(a, b) / maxLen;
31
+ }
32
+ function* simpleReplacer(content, find) {
33
+ if (content.includes(find)) yield find;
34
+ }
35
+ function* lineTrimmedReplacer(content, find) {
36
+ const lines = find.split("\n").map((l) => l.trim());
37
+ const contentLines = content.split("\n");
38
+ for (let i = 0; i <= contentLines.length - lines.length; i++) {
39
+ if (contentLines.slice(i, i + lines.length).every((cl, idx) => cl.trim() === lines[idx])) {
40
+ yield contentLines.slice(i, i + lines.length).join("\n");
41
+ }
42
+ }
43
+ }
44
+ function* blockAnchorReplacer(content, find) {
45
+ const findLines = find.split("\n");
46
+ const contentLines = content.split("\n");
47
+ if (findLines.length < 2) return;
48
+ const firstLine = findLines[0];
49
+ const lastLine = findLines[findLines.length - 1];
50
+ const middleLines = findLines.slice(1, -1);
51
+ for (let i = 0; i <= contentLines.length - findLines.length; i++) {
52
+ if (contentLines[i] !== firstLine) continue;
53
+ const endIdx = i + findLines.length - 1;
54
+ if (contentLines[endIdx] !== lastLine) continue;
55
+ const candidates = [];
56
+ for (let j = i + 1; j < endIdx; j++) {
57
+ candidates.push({ idx: j, score: 0 });
58
+ }
59
+ let totalScore = 0;
60
+ for (let k = 0; k < middleLines.length; k++) {
61
+ const contentLine = contentLines[i + 1 + k];
62
+ const sim = similarity(middleLines[k], contentLine);
63
+ totalScore += sim;
64
+ if (candidates[k]) candidates[k].score = sim;
65
+ }
66
+ const avgScore = totalScore / middleLines.length;
67
+ const threshold = candidates.length > 1 ? 0.3 : 0;
68
+ if (avgScore >= threshold) {
69
+ yield contentLines.slice(i, i + findLines.length).join("\n");
70
+ }
71
+ }
72
+ }
73
+ function* whitespaceNormalizedReplacer(content, find) {
74
+ const normFind = find.replace(/\s+/g, " ").trim();
75
+ if (!normFind) return;
76
+ const normContent = content.replace(/\s+/g, " ").trim();
77
+ const idx = normContent.indexOf(normFind);
78
+ if (idx === -1) return;
79
+ const firstWord = normFind.split(" ")[0];
80
+ const lastWord = normFind.split(" ").filter(Boolean).pop();
81
+ const firstIdx = content.indexOf(firstWord);
82
+ const lastIdx = content.lastIndexOf(lastWord);
83
+ if (firstIdx === -1 || lastIdx === -1 || lastIdx < firstIdx) return;
84
+ yield content.substring(firstIdx, lastIdx + lastWord.length);
85
+ }
86
+ function* indentationFlexibleReplacer(content, find) {
87
+ const lines = find.split("\n");
88
+ const minIndent = Math.min(...lines.filter((l) => l.trim().length > 0).map((l) => l.match(/^(\s*)/)?.[1].length ?? 0));
89
+ const dedented = lines.map((l) => l.substring(minIndent)).join("\n");
90
+ if (content.includes(dedented)) yield dedented;
91
+ }
92
+ function* escapeNormalizedReplacer(content, find) {
93
+ const normalized = find.replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\"/g, '"').replace(/\\'/g, "'");
94
+ if (content.includes(normalized)) yield normalized;
95
+ }
96
+ function* trimmedBoundaryReplacer(content, find) {
97
+ const trimmed = find.trim();
98
+ if (content.includes(trimmed)) yield trimmed;
99
+ }
100
+ function* contextAwareReplacer(content, find) {
101
+ const findLines = find.split("\n");
102
+ if (findLines.length < 3) return;
103
+ const firstLine = findLines[0].trim();
104
+ const lastLine = findLines[findLines.length - 1].trim();
105
+ const contentLines = content.split("\n");
106
+ for (let i = 0; i <= contentLines.length - 3; i++) {
107
+ if (contentLines[i].trim() !== firstLine) continue;
108
+ let bestEndIdx = -1;
109
+ let bestScore = 0;
110
+ for (let j = i + 2; j < contentLines.length; j++) {
111
+ if (contentLines[j].trim() === lastLine) {
112
+ const middleCount = j - i - 1;
113
+ let matchCount = 0;
114
+ for (let k = 1; k <= middleCount; k++) {
115
+ const fIdx = Math.floor(k / (middleCount + 1) * (findLines.length - 2));
116
+ if (fIdx >= 0 && fIdx < findLines.length - 2) {
117
+ if (similarity(contentLines[i + k].trim(), findLines[fIdx + 1].trim()) > 0.5) {
118
+ matchCount++;
119
+ }
120
+ }
121
+ }
122
+ const score = matchCount / middleCount;
123
+ if (score > bestScore) {
124
+ bestScore = score;
125
+ bestEndIdx = j;
126
+ }
127
+ }
128
+ }
129
+ if (bestEndIdx !== -1 && bestScore > 0.5) {
130
+ yield contentLines.slice(i, bestEndIdx + 1).join("\n");
131
+ }
132
+ }
133
+ }
134
+ var REPLACERS = [
135
+ simpleReplacer,
136
+ lineTrimmedReplacer,
137
+ blockAnchorReplacer,
138
+ whitespaceNormalizedReplacer,
139
+ indentationFlexibleReplacer,
140
+ escapeNormalizedReplacer,
141
+ trimmedBoundaryReplacer,
142
+ contextAwareReplacer
143
+ ];
144
+ function fuzzyReplace(content, oldString, newString, replaceAll = false) {
145
+ for (const replacer of REPLACERS) {
146
+ for (const search of replacer(content, oldString)) {
147
+ const idx = content.indexOf(search);
148
+ if (idx === -1) continue;
149
+ if (replaceAll) {
150
+ return content.split(search).join(newString);
151
+ }
152
+ const firstIdx = content.indexOf(search);
153
+ const lastIdx = content.lastIndexOf(search);
154
+ if (firstIdx !== lastIdx) continue;
155
+ return content.substring(0, firstIdx) + newString + content.substring(firstIdx + search.length);
156
+ }
157
+ }
158
+ throw new FuzzyEditError("not_found", `Could not find match for replacement (after 8 fuzzy strategies)`);
159
+ }
160
+ function fuzzyContains(content, find) {
161
+ try {
162
+ fuzzyReplace(content, find, "PLACEHOLDER_CHECK");
163
+ return true;
164
+ } catch {
165
+ return false;
166
+ }
167
+ }
168
+
169
+ export {
170
+ FuzzyEditError,
171
+ fuzzyReplace,
172
+ fuzzyContains
173
+ };
174
+ //# sourceMappingURL=chunk-MQ7XP6VT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/fuzzy-edit.ts"],"sourcesContent":["import type { ToolUseBlock } from \"../types.js\";\n\nexport type ReplacerFn = (content: string, find: string) => Generator<string, void, unknown>;\n\nexport class FuzzyEditError extends Error {\n constructor(public readonly kind: \"not_found\" | \"ambiguous\", message: string) {\n super(message);\n this.name = \"FuzzyEditError\";\n }\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n}\n\nfunction similarity(a: string, b: string): number {\n if (a.length > 1000 || b.length > 1000) return a === b ? 1 : 0;\n const maxLen = Math.max(a.length, b.length);\n if (maxLen === 0) return 1;\n return 1 - levenshtein(a, b) / maxLen;\n}\n\nfunction* simpleReplacer(content: string, find: string): Generator<string, void, unknown> {\n if (content.includes(find)) yield find;\n}\n\nfunction* lineTrimmedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const lines = find.split(\"\\n\").map(l => l.trim());\n const contentLines = content.split(\"\\n\");\n for (let i = 0; i <= contentLines.length - lines.length; i++) {\n if (contentLines.slice(i, i + lines.length).every((cl, idx) => cl.trim() === lines[idx])) {\n yield contentLines.slice(i, i + lines.length).join(\"\\n\");\n }\n }\n}\n\nfunction* blockAnchorReplacer(content: string, find: string): Generator<string, void, unknown> {\n const findLines = find.split(\"\\n\");\n const contentLines = content.split(\"\\n\");\n\n if (findLines.length < 2) return;\n\n const firstLine = findLines[0];\n const lastLine = findLines[findLines.length - 1];\n const middleLines = findLines.slice(1, -1);\n\n for (let i = 0; i <= contentLines.length - findLines.length; i++) {\n if (contentLines[i] !== firstLine) continue;\n const endIdx = i + findLines.length - 1;\n if (contentLines[endIdx] !== lastLine) continue;\n\n const candidates: { idx: number; score: number }[] = [];\n\n for (let j = i + 1; j < endIdx; j++) {\n candidates.push({ idx: j, score: 0 });\n }\n\n let totalScore = 0;\n for (let k = 0; k < middleLines.length; k++) {\n const contentLine = contentLines[i + 1 + k];\n const sim = similarity(middleLines[k], contentLine);\n totalScore += sim;\n if (candidates[k]) candidates[k].score = sim;\n }\n\n const avgScore = totalScore / middleLines.length;\n const threshold = candidates.length > 1 ? 0.3 : 0.0;\n\n if (avgScore >= threshold) {\n yield contentLines.slice(i, i + findLines.length).join(\"\\n\");\n }\n }\n}\n\nfunction* whitespaceNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const normFind = find.replace(/\\s+/g, \" \").trim();\n if (!normFind) return;\n const normContent = content.replace(/\\s+/g, \" \").trim();\n const idx = normContent.indexOf(normFind);\n if (idx === -1) return;\n\n const firstWord = normFind.split(\" \")[0];\n const lastWord = normFind.split(\" \").filter(Boolean).pop()!;\n const firstIdx = content.indexOf(firstWord);\n const lastIdx = content.lastIndexOf(lastWord);\n if (firstIdx === -1 || lastIdx === -1 || lastIdx < firstIdx) return;\n\n yield content.substring(firstIdx, lastIdx + lastWord.length);\n}\n\nfunction* indentationFlexibleReplacer(content: string, find: string): Generator<string, void, unknown> {\n const lines = find.split(\"\\n\");\n const minIndent = Math.min(...lines.filter(l => l.trim().length > 0).map(l => l.match(/^(\\s*)/)?.[1].length ?? 0));\n const dedented = lines.map(l => l.substring(minIndent)).join(\"\\n\");\n if (content.includes(dedented)) yield dedented;\n}\n\nfunction* escapeNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n const normalized = find\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\'/g, \"'\");\n if (content.includes(normalized)) yield normalized;\n}\n\nfunction* trimmedBoundaryReplacer(content: string, find: string): Generator<string, void, unknown> {\n const trimmed = find.trim();\n if (content.includes(trimmed)) yield trimmed;\n}\n\nfunction* contextAwareReplacer(content: string, find: string): Generator<string, void, unknown> {\n const findLines = find.split(\"\\n\");\n if (findLines.length < 3) return;\n\n const firstLine = findLines[0].trim();\n const lastLine = findLines[findLines.length - 1].trim();\n const contentLines = content.split(\"\\n\");\n\n for (let i = 0; i <= contentLines.length - 3; i++) {\n if (contentLines[i].trim() !== firstLine) continue;\n\n let bestEndIdx = -1;\n let bestScore = 0;\n\n for (let j = i + 2; j < contentLines.length; j++) {\n if (contentLines[j].trim() === lastLine) {\n const middleCount = j - i - 1;\n let matchCount = 0;\n for (let k = 1; k <= middleCount; k++) {\n const fIdx = Math.floor((k / (middleCount + 1)) * (findLines.length - 2));\n if (fIdx >= 0 && fIdx < findLines.length - 2) {\n if (similarity(contentLines[i + k].trim(), findLines[fIdx + 1].trim()) > 0.5) {\n matchCount++;\n }\n }\n }\n const score = matchCount / middleCount;\n if (score > bestScore) {\n bestScore = score;\n bestEndIdx = j;\n }\n }\n }\n\n if (bestEndIdx !== -1 && bestScore > 0.5) {\n yield contentLines.slice(i, bestEndIdx + 1).join(\"\\n\");\n }\n }\n}\n\nconst REPLACERS: ReplacerFn[] = [\n simpleReplacer,\n lineTrimmedReplacer,\n blockAnchorReplacer,\n whitespaceNormalizedReplacer,\n indentationFlexibleReplacer,\n escapeNormalizedReplacer,\n trimmedBoundaryReplacer,\n contextAwareReplacer,\n];\n\nexport function fuzzyReplace(\n content: string,\n oldString: string,\n newString: string,\n replaceAll = false,\n): string {\n for (const replacer of REPLACERS) {\n for (const search of replacer(content, oldString)) {\n const idx = content.indexOf(search);\n if (idx === -1) continue;\n\n if (replaceAll) {\n return content.split(search).join(newString);\n }\n\n const firstIdx = content.indexOf(search);\n const lastIdx = content.lastIndexOf(search);\n if (firstIdx !== lastIdx) continue;\n\n return content.substring(0, firstIdx) + newString + content.substring(firstIdx + search.length);\n }\n }\n\n throw new FuzzyEditError(\"not_found\", `Could not find match for replacement (after 8 fuzzy strategies)`);\n}\n\nexport function fuzzyContains(content: string, find: string): boolean {\n try {\n fuzzyReplace(content, find, \"PLACEHOLDER_CHECK\");\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,176 @@
1
+ import {
2
+ defineTool
3
+ } from "./chunk-FK7S2S7V.js";
4
+
5
+ // src/mcp/client.ts
6
+ var MCPClient = class {
7
+ config;
8
+ tools = [];
9
+ proc = null;
10
+ initialized = false;
11
+ nextId = 1;
12
+ messageBuffer = "";
13
+ pendingHandlers = /* @__PURE__ */ new Map();
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ send(proc, method, params, id) {
18
+ const msgId = id ?? this.nextId++;
19
+ const msg = JSON.stringify({ jsonrpc: "2.0", id: msgId, method, params });
20
+ proc.stdin.write(msg + "\n");
21
+ return msgId;
22
+ }
23
+ setupMessageHandler(proc) {
24
+ proc.stdout.on("data", (data) => {
25
+ this.messageBuffer += data.toString();
26
+ const lines = this.messageBuffer.split("\n");
27
+ this.messageBuffer = lines.pop() ?? "";
28
+ for (const line of lines) {
29
+ if (!line.trim()) continue;
30
+ try {
31
+ const msg = JSON.parse(line);
32
+ if (msg.id !== void 0 && this.pendingHandlers.has(msg.id)) {
33
+ const handler = this.pendingHandlers.get(msg.id);
34
+ this.pendingHandlers.delete(msg.id);
35
+ handler(msg);
36
+ } else if (msg.method === "initialize" && msg.id) {
37
+ proc.stdin.write(JSON.stringify({
38
+ jsonrpc: "2.0",
39
+ id: msg.id,
40
+ result: { protocolVersion: "2024-11-05", capabilities: {}, serverInfo: { name: "synthcode-mcp-proxy", version: "0.6.0" } }
41
+ }) + "\n");
42
+ }
43
+ } catch {
44
+ }
45
+ }
46
+ });
47
+ proc.stderr.on("data", () => {
48
+ });
49
+ }
50
+ async connect() {
51
+ if (this.config.type === "stdio") {
52
+ const { spawn } = await import("child_process");
53
+ const proc = spawn(this.config.command, this.config.args ?? [], {
54
+ env: { ...process.env, ...this.config.env },
55
+ stdio: ["pipe", "pipe", "pipe"]
56
+ });
57
+ proc.on("error", (err) => {
58
+ throw err;
59
+ });
60
+ proc.on("close", () => {
61
+ this.initialized = false;
62
+ });
63
+ this.proc = proc;
64
+ this.setupMessageHandler(proc);
65
+ await new Promise((resolve) => {
66
+ const handler = (_data) => {
67
+ proc.stdout.off("data", handler);
68
+ resolve();
69
+ };
70
+ proc.stdout.on("data", handler);
71
+ setTimeout(() => {
72
+ proc.stdout.off("data", handler);
73
+ resolve();
74
+ }, 2e3);
75
+ });
76
+ this.initialized = true;
77
+ }
78
+ if (this.config.type === "sse") {
79
+ if (!this.config.url) throw new Error("SSE MCP server requires a url");
80
+ this.initialized = true;
81
+ }
82
+ }
83
+ async listTools() {
84
+ if (this.config.type === "stdio" && this.proc) {
85
+ const id = this.nextId++;
86
+ const tools = await new Promise((resolve, reject) => {
87
+ const timeout = setTimeout(() => {
88
+ this.pendingHandlers.delete(id);
89
+ reject(new Error("MCP listTools timeout"));
90
+ }, 1e4);
91
+ this.pendingHandlers.set(id, (msg) => {
92
+ clearTimeout(timeout);
93
+ const m = msg;
94
+ if (m.result?.tools) {
95
+ resolve(
96
+ m.result.tools.map((t) => ({
97
+ name: t.name,
98
+ description: t.description ?? "",
99
+ inputSchema: t.inputSchema ?? { type: "object", properties: {} }
100
+ }))
101
+ );
102
+ } else {
103
+ resolve([]);
104
+ }
105
+ });
106
+ });
107
+ this.send(this.proc, "tools/list", {}, id);
108
+ this.tools = tools;
109
+ return tools;
110
+ }
111
+ return [];
112
+ }
113
+ async callTool(name, input) {
114
+ if (this.config.type === "stdio" && this.proc) {
115
+ const id = this.nextId++;
116
+ return new Promise((resolve, reject) => {
117
+ const timeout = setTimeout(() => {
118
+ this.pendingHandlers.delete(id);
119
+ reject(new Error("MCP callTool timeout"));
120
+ }, 3e4);
121
+ this.pendingHandlers.set(id, (msg) => {
122
+ clearTimeout(timeout);
123
+ const m = msg;
124
+ if (m.result) {
125
+ resolve(typeof m.result === "string" ? m.result : JSON.stringify(m.result));
126
+ } else if (m.error) {
127
+ reject(
128
+ new Error(
129
+ m.error.message ?? "MCP tool error"
130
+ )
131
+ );
132
+ }
133
+ });
134
+ this.send(this.proc, "tools/call", { name, arguments: input }, id);
135
+ });
136
+ }
137
+ throw new Error("MCP callTool not implemented for SSE type");
138
+ }
139
+ async disconnect() {
140
+ if (this.proc) {
141
+ this.proc.kill();
142
+ this.proc = null;
143
+ }
144
+ }
145
+ getTools() {
146
+ return this.tools;
147
+ }
148
+ };
149
+
150
+ // src/mcp/adapter.ts
151
+ async function loadMCPTools(config) {
152
+ const { z } = await import("zod");
153
+ const client = new MCPClient(config);
154
+ await client.connect();
155
+ const definitions = await client.listTools();
156
+ const tools = definitions.map(
157
+ (def) => defineTool({
158
+ name: def.name,
159
+ description: def.description,
160
+ inputSchema: z.object({}).passthrough(),
161
+ isReadOnly: true,
162
+ isConcurrencySafe: true,
163
+ execute: async (input, _context) => {
164
+ const result = await client.callTool(def.name, input);
165
+ return result;
166
+ }
167
+ })
168
+ );
169
+ return { tools, client };
170
+ }
171
+
172
+ export {
173
+ MCPClient,
174
+ loadMCPTools
175
+ };
176
+ //# sourceMappingURL=chunk-TLPOO6C3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/client.ts","../src/mcp/adapter.ts"],"sourcesContent":["import type { ChildProcess } from \"node:child_process\";\n\nexport interface MCPToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface MCPServerConfig {\n type: \"stdio\" | \"sse\";\n command?: string;\n args?: string[];\n url?: string;\n env?: Record<string, string>;\n}\n\nexport class MCPClient {\n private config: MCPServerConfig;\n private tools: MCPToolDefinition[] = [];\n private proc: ChildProcess | null = null;\n private initialized = false;\n private nextId = 1;\n private messageBuffer = \"\";\n private pendingHandlers: Map<number, (msg: unknown) => void> = new Map();\n\n constructor(config: MCPServerConfig) {\n this.config = config;\n }\n\n private send(proc: ChildProcess, method: string, params: Record<string, unknown>, id?: number): number {\n const msgId = id ?? this.nextId++;\n const msg = JSON.stringify({ jsonrpc: \"2.0\", id: msgId, method, params });\n proc.stdin!.write(msg + \"\\n\");\n return msgId;\n }\n\n private setupMessageHandler(proc: ChildProcess): void {\n proc.stdout!.on(\"data\", (data: Buffer) => {\n this.messageBuffer += data.toString();\n const lines = this.messageBuffer.split(\"\\n\");\n this.messageBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line);\n if (msg.id !== undefined && this.pendingHandlers.has(msg.id)) {\n const handler = this.pendingHandlers.get(msg.id)!;\n this.pendingHandlers.delete(msg.id);\n handler(msg);\n } else if (msg.method === \"initialize\" && msg.id) {\n proc.stdin!.write(JSON.stringify({\n jsonrpc: \"2.0\",\n id: msg.id,\n result: { protocolVersion: \"2024-11-05\", capabilities: {}, serverInfo: { name: \"synthcode-mcp-proxy\", version: \"0.6.0\" } },\n }) + \"\\n\");\n }\n } catch {}\n }\n });\n proc.stderr!.on(\"data\", () => {});\n }\n\n async connect(): Promise<void> {\n if (this.config.type === \"stdio\") {\n const { spawn } = await import(\"node:child_process\");\n const proc = spawn(this.config.command!, this.config.args ?? [], {\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n proc.on(\"error\", (err) => { throw err; });\n proc.on(\"close\", () => { this.initialized = false; });\n this.proc = proc;\n this.setupMessageHandler(proc);\n await new Promise<void>((resolve) => {\n const handler = (_data: Buffer) => {\n proc.stdout!.off(\"data\", handler);\n resolve();\n };\n proc.stdout!.on(\"data\", handler);\n setTimeout(() => {\n proc.stdout!.off(\"data\", handler);\n resolve();\n }, 2000);\n });\n this.initialized = true;\n }\n if (this.config.type === \"sse\") {\n if (!this.config.url) throw new Error(\"SSE MCP server requires a url\");\n this.initialized = true;\n }\n }\n\n async listTools(): Promise<MCPToolDefinition[]> {\n if (this.config.type === \"stdio\" && this.proc) {\n const id = this.nextId++;\n const tools = await new Promise<MCPToolDefinition[]>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingHandlers.delete(id);\n reject(new Error(\"MCP listTools timeout\"));\n }, 10000);\n this.pendingHandlers.set(id, (msg: unknown) => {\n clearTimeout(timeout);\n const m = msg as Record<string, unknown>;\n if ((m.result as Record<string, unknown>)?.tools) {\n resolve(\n ((m.result as Record<string, unknown>).tools as Record<string, unknown>[]).map((t) => ({\n name: t.name as string,\n description: (t.description as string) ?? \"\",\n inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n })),\n );\n } else {\n resolve([]);\n }\n });\n });\n this.send(this.proc!, \"tools/list\", {}, id);\n this.tools = tools;\n return tools;\n }\n return [];\n }\n\n async callTool(\n name: string,\n input: Record<string, unknown>,\n ): Promise<string> {\n if (this.config.type === \"stdio\" && this.proc) {\n const id = this.nextId++;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingHandlers.delete(id);\n reject(new Error(\"MCP callTool timeout\"));\n }, 30000);\n this.pendingHandlers.set(id, (msg: unknown) => {\n clearTimeout(timeout);\n const m = msg as Record<string, unknown>;\n if (m.result) {\n resolve(typeof m.result === \"string\" ? m.result : JSON.stringify(m.result));\n } else if (m.error) {\n reject(\n new Error(\n ((m.error as Record<string, unknown>).message as string) ?? \"MCP tool error\",\n ),\n );\n }\n });\n this.send(this.proc!, \"tools/call\", { name, arguments: input }, id);\n });\n }\n throw new Error(\"MCP callTool not implemented for SSE type\");\n }\n\n async disconnect(): Promise<void> {\n if (this.proc) {\n this.proc.kill();\n this.proc = null;\n }\n }\n\n getTools(): MCPToolDefinition[] {\n return this.tools;\n }\n}\n","import { defineTool } from \"../tools/tool.js\";\nimport type { Tool } from \"../tools/tool.js\";\nimport type { ToolContext } from \"../types.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { MCPToolDefinition, MCPServerConfig } from \"./client.js\";\n\nexport async function loadMCPTools(\n config: MCPServerConfig,\n): Promise<{ tools: Tool[]; client: MCPClient }> {\n const { z } = await import(\"zod\");\n\n const client = new MCPClient(config);\n await client.connect();\n const definitions = await client.listTools();\n\n const tools = definitions.map((def: MCPToolDefinition) =>\n defineTool({\n name: def.name,\n description: def.description,\n inputSchema: z.object({}).passthrough(),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>, _context: ToolContext) => {\n const result = await client.callTool(def.name, input);\n return result;\n },\n }),\n );\n\n return { tools, client };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,56 @@
1
+ // src/utils.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ function globToRegExp(pattern) {
5
+ const parts = pattern.split("/");
6
+ let regex = "";
7
+ for (let i = 0; i < parts.length; i++) {
8
+ const part = parts[i];
9
+ if (part === "**") {
10
+ regex += "(?:[^/]*(?:\\/|$))*";
11
+ } else {
12
+ const escaped = part.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]*").replace(/\?/g, "[^/]");
13
+ regex += escaped + "\\/";
14
+ }
15
+ }
16
+ regex = regex.replace(/\\\//g, "/").replace(/\/$/, "");
17
+ return new RegExp(`(^|/)${regex}(/|$)`);
18
+ }
19
+ async function walkDir(dir, options) {
20
+ const maxDepth = options?.maxDepth ?? Infinity;
21
+ const followSymlinks = options?.followSymlinks ?? false;
22
+ const results = [];
23
+ async function walk(current, depth) {
24
+ if (depth > maxDepth) return;
25
+ let entries;
26
+ try {
27
+ entries = await fs.promises.readdir(current, { withFileTypes: true });
28
+ } catch {
29
+ return;
30
+ }
31
+ for (const entry of entries) {
32
+ const fullPath = path.join(current, entry.name);
33
+ if (entry.name === "node_modules" || entry.name === ".git") continue;
34
+ try {
35
+ let stat;
36
+ if (entry.isSymbolicLink() && !followSymlinks) continue;
37
+ stat = await fs.promises.stat(fullPath);
38
+ if (stat.isFile()) {
39
+ results.push({ path: fullPath, stat });
40
+ } else if (stat.isDirectory()) {
41
+ await walk(fullPath, depth + 1);
42
+ }
43
+ } catch {
44
+ continue;
45
+ }
46
+ }
47
+ }
48
+ await walk(dir, 0);
49
+ return results;
50
+ }
51
+
52
+ export {
53
+ globToRegExp,
54
+ walkDir
55
+ };
56
+ //# sourceMappingURL=chunk-W6OLZ2OI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport function globToRegExp(pattern: string): RegExp {\n const parts = pattern.split(\"/\");\n let regex = \"\";\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === \"**\") {\n regex += \"(?:[^/]*(?:\\\\/|$))*\";\n } else {\n const escaped = part\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\");\n regex += escaped + \"\\\\/\";\n }\n }\n\n regex = regex.replace(/\\\\\\//g, \"/\").replace(/\\/$/, \"\");\n return new RegExp(`(^|/)${regex}(/|$)`);\n}\n\nexport interface WalkEntry {\n path: string;\n stat: fs.Stats;\n}\n\nexport async function walkDir(dir: string, options?: { maxDepth?: number; followSymlinks?: boolean }): Promise<WalkEntry[]> {\n const maxDepth = options?.maxDepth ?? Infinity;\n const followSymlinks = options?.followSymlinks ?? false;\n const results: WalkEntry[] = [];\n\n async function walk(current: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name);\n\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n\n try {\n let stat: fs.Stats;\n if (entry.isSymbolicLink() && !followSymlinks) continue;\n stat = await fs.promises.stat(fullPath);\n\n if (stat.isFile()) {\n results.push({ path: fullPath, stat });\n } else if (stat.isDirectory()) {\n await walk(fullPath, depth + 1);\n }\n } catch {\n continue;\n }\n }\n }\n\n await walk(dir, 0);\n return results;\n}\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEf,SAAS,aAAa,SAAyB;AACpD,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,QAAQ;AAEZ,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,SAAS,MAAM;AACjB,eAAS;AAAA,IACX,OAAO;AACL,YAAM,UAAU,KACb,QAAQ,qBAAqB,MAAM,EACnC,QAAQ,OAAO,OAAO,EACtB,QAAQ,OAAO,MAAM;AACxB,eAAS,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,UAAQ,MAAM,QAAQ,SAAS,GAAG,EAAE,QAAQ,OAAO,EAAE;AACrD,SAAO,IAAI,OAAO,QAAQ,KAAK,OAAO;AACxC;AAOA,eAAsB,QAAQ,KAAa,SAAiF;AAC1H,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,iBAAiB,SAAS,kBAAkB;AAClD,QAAM,UAAuB,CAAC;AAE9B,iBAAe,KAAK,SAAiB,OAA8B;AACjE,QAAI,QAAQ,SAAU;AAEtB,QAAI;AACJ,QAAI;AACF,gBAAU,MAAS,YAAS,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IACtE,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAgB,UAAK,SAAS,MAAM,IAAI;AAE9C,UAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAQ;AAE5D,UAAI;AACF,YAAI;AACJ,YAAI,MAAM,eAAe,KAAK,CAAC,eAAgB;AAC/C,eAAO,MAAS,YAAS,KAAK,QAAQ;AAEtC,YAAI,KAAK,OAAO,GAAG;AACjB,kBAAQ,KAAK,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,QACvC,WAAW,KAAK,YAAY,GAAG;AAC7B,gBAAM,KAAK,UAAU,QAAQ,CAAC;AAAA,QAChC;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,CAAC;AACjB,SAAO;AACT;","names":[]}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/cli/index.ts
31
+ var cli_exports = {};
32
+ __export(cli_exports, {
33
+ init: () => init
34
+ });
35
+ module.exports = __toCommonJS(cli_exports);
36
+
37
+ // src/cli/init.ts
38
+ var fs = __toESM(require("fs"), 1);
39
+ var path = __toESM(require("path"), 1);
40
+ var import_node_child_process = require("child_process");
41
+ var PACKAGE_JSON = JSON.stringify(
42
+ {
43
+ name: "my-agent",
44
+ version: "1.0.0",
45
+ type: "module",
46
+ scripts: {
47
+ start: "npx tsx src/index.ts",
48
+ test: "npx vitest run",
49
+ typecheck: "tsc --noEmit"
50
+ },
51
+ dependencies: {
52
+ "@avasis-ai/synthcode": "^0.6.0",
53
+ zod: "^3.24.0"
54
+ },
55
+ devDependencies: {
56
+ typescript: "^5.7.0",
57
+ tsx: "^4.19.0",
58
+ vitest: "^2.1.0"
59
+ }
60
+ },
61
+ null,
62
+ 2
63
+ );
64
+ var TSCONFIG_JSON = JSON.stringify(
65
+ {
66
+ compilerOptions: {
67
+ target: "ES2022",
68
+ module: "ESNext",
69
+ moduleResolution: "bundler",
70
+ strict: true,
71
+ esModuleInterop: true,
72
+ skipLibCheck: true,
73
+ outDir: "./dist",
74
+ rootDir: "./src",
75
+ declaration: true
76
+ },
77
+ include: ["src"]
78
+ },
79
+ null,
80
+ 2
81
+ );
82
+ var ENV_EXAMPLE = `# Pick one provider and set its key:
83
+ # ANTHROPIC_API_KEY=your-key-here
84
+ # OPENAI_API_KEY=your-key-here
85
+ # For Ollama (local, zero API costs): no key needed
86
+ `;
87
+ var INDEX_TS = `import { Agent, BashTool, FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, WebFetchTool } from "@avasis-ai/synthcode";
88
+ import { defineTool } from "@avasis-ai/synthcode/tools";
89
+ import { z } from "zod";
90
+
91
+ const agent = new Agent({
92
+ model: process.env.OLLAMA_MODEL
93
+ ? await import("@avasis-ai/synthcode/llm").then(m => new m.OllamaProvider({ model: process.env.OLLAMA_MODEL }))
94
+ : process.env.OPENAI_API_KEY
95
+ ? await import("@avasis-ai/synthcode/llm").then(m => new m.OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }))
96
+ : await import("@avasis-ai/synthcode/llm").then(m => new m.AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })),
97
+ tools: [
98
+ BashTool,
99
+ FileReadTool,
100
+ FileWriteTool,
101
+ FileEditTool,
102
+ GlobTool,
103
+ GrepTool,
104
+ WebFetchTool,
105
+ ],
106
+ systemPrompt: "You are a helpful AI coding assistant with shell and file access.",
107
+ });
108
+
109
+ const prompt = process.argv[2] || "Hello! What can I help you with?";
110
+
111
+ for await (const event of agent.run(prompt)) {
112
+ if (event.type === "text") process.stdout.write(event.text);
113
+ if (event.type === "tool_use") console.log(\`\\n [\${event.name}]\`);
114
+ if (event.type === "tool_result") {
115
+ if (event.isError) console.log(\`\\n [\${event.name}] FAILED\`);
116
+ }
117
+ if (event.type === "thinking") process.stderr.write(\`\\x1b[90m\${event.thinking}\\x1b[0m\`);
118
+ if (event.type === "done") console.log(\`\\n\\nTokens: \${event.usage.inputTokens} in, \${event.usage.outputTokens} out\`);
119
+ if (event.type === "error") {
120
+ console.error(\`\\nError: \${event.error.message}\`);
121
+ process.exit(1);
122
+ }
123
+ }
124
+ `;
125
+ async function init(opts) {
126
+ const name = opts?.projectName ?? "my-agent";
127
+ const cwd = opts?.cwd ?? process.cwd();
128
+ const dir = path.join(cwd, name);
129
+ fs.mkdirSync(path.join(dir, "src", "tools"), { recursive: true });
130
+ fs.mkdirSync(path.join(dir, "tests"), { recursive: true });
131
+ fs.writeFileSync(path.join(dir, "package.json"), PACKAGE_JSON, "utf-8");
132
+ fs.writeFileSync(path.join(dir, "tsconfig.json"), TSCONFIG_JSON, "utf-8");
133
+ fs.writeFileSync(path.join(dir, ".env.example"), ENV_EXAMPLE, "utf-8");
134
+ fs.writeFileSync(path.join(dir, "src", "index.ts"), INDEX_TS, "utf-8");
135
+ fs.writeFileSync(path.join(dir, "tests", "agent.test.ts"), `import { describe, it, expect } from "vitest";
136
+ describe("Agent", () => { it("should have tools registered", () => { expect(true).toBe(true); }); });
137
+ `, "utf-8");
138
+ if (!opts?.skipInstall) {
139
+ console.log("Installing dependencies...");
140
+ (0, import_node_child_process.execSync)("npm install", { cwd: dir, stdio: "inherit" });
141
+ }
142
+ console.log(`
143
+ Created ${name}/`);
144
+ console.log(` cd ${name} && npm start "your prompt here"
145
+ `);
146
+ }
147
+ // Annotate the CommonJS export names for ESM import in node:
148
+ 0 && (module.exports = {
149
+ init
150
+ });
151
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/init.ts"],"sourcesContent":["export { init } from \"./init.js\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport interface InitOptions {\n projectName?: string;\n cwd?: string;\n skipInstall?: boolean;\n}\n\nconst PACKAGE_JSON = JSON.stringify(\n {\n name: \"my-agent\",\n version: \"1.0.0\",\n type: \"module\",\n scripts: {\n start: \"npx tsx src/index.ts\",\n test: \"npx vitest run\",\n typecheck: \"tsc --noEmit\",\n },\n dependencies: {\n \"@avasis-ai/synthcode\": \"^0.6.0\",\n zod: \"^3.24.0\",\n },\n devDependencies: {\n typescript: \"^5.7.0\",\n tsx: \"^4.19.0\",\n vitest: \"^2.1.0\",\n },\n },\n null,\n 2,\n);\n\nconst TSCONFIG_JSON = JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"./dist\",\n rootDir: \"./src\",\n declaration: true,\n },\n include: [\"src\"],\n },\n null,\n 2,\n);\n\nconst ENV_EXAMPLE = `# Pick one provider and set its key:\n# ANTHROPIC_API_KEY=your-key-here\n# OPENAI_API_KEY=your-key-here\n# For Ollama (local, zero API costs): no key needed\n`;\n\nconst INDEX_TS = `import { Agent, BashTool, FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, WebFetchTool } from \"@avasis-ai/synthcode\";\nimport { defineTool } from \"@avasis-ai/synthcode/tools\";\nimport { z } from \"zod\";\n\nconst agent = new Agent({\n model: process.env.OLLAMA_MODEL\n ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OllamaProvider({ model: process.env.OLLAMA_MODEL }))\n : process.env.OPENAI_API_KEY\n ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }))\n : await import(\"@avasis-ai/synthcode/llm\").then(m => new m.AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })),\n tools: [\n BashTool,\n FileReadTool,\n FileWriteTool,\n FileEditTool,\n GlobTool,\n GrepTool,\n WebFetchTool,\n ],\n systemPrompt: \"You are a helpful AI coding assistant with shell and file access.\",\n});\n\nconst prompt = process.argv[2] || \"Hello! What can I help you with?\";\n\nfor await (const event of agent.run(prompt)) {\n if (event.type === \"text\") process.stdout.write(event.text);\n if (event.type === \"tool_use\") console.log(\\`\\\\n [\\${event.name}]\\`);\n if (event.type === \"tool_result\") {\n if (event.isError) console.log(\\`\\\\n [\\${event.name}] FAILED\\`);\n }\n if (event.type === \"thinking\") process.stderr.write(\\`\\\\x1b[90m\\${event.thinking}\\\\x1b[0m\\`);\n if (event.type === \"done\") console.log(\\`\\\\n\\\\nTokens: \\${event.usage.inputTokens} in, \\${event.usage.outputTokens} out\\`);\n if (event.type === \"error\") {\n console.error(\\`\\\\nError: \\${event.error.message}\\`);\n process.exit(1);\n }\n}\n`;\n\nexport async function init(opts?: InitOptions): Promise<void> {\n const name = opts?.projectName ?? \"my-agent\";\n const cwd = opts?.cwd ?? process.cwd();\n const dir = path.join(cwd, name);\n\n fs.mkdirSync(path.join(dir, \"src\", \"tools\"), { recursive: true });\n fs.mkdirSync(path.join(dir, \"tests\"), { recursive: true });\n\n fs.writeFileSync(path.join(dir, \"package.json\"), PACKAGE_JSON, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"tsconfig.json\"), TSCONFIG_JSON, \"utf-8\");\n fs.writeFileSync(path.join(dir, \".env.example\"), ENV_EXAMPLE, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"src\", \"index.ts\"), INDEX_TS, \"utf-8\");\n fs.writeFileSync(path.join(dir, \"tests\", \"agent.test.ts\"), `import { describe, it, expect } from \"vitest\";\\ndescribe(\"Agent\", () => { it(\"should have tools registered\", () => { expect(true).toBe(true); }); });\\n`, \"utf-8\");\n\n if (!opts?.skipInstall) {\n console.log(\"Installing dependencies...\");\n execSync(\"npm install\", { cwd: dir, stdio: \"inherit\" });\n }\n\n console.log(`\\n Created ${name}/`);\n console.log(` cd ${name} && npm start \"your prompt here\"\\n`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAoB;AACpB,WAAsB;AACtB,gCAAyB;AAQzB,IAAM,eAAe,KAAK;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,wBAAwB;AAAA,MACxB,KAAK;AAAA,IACP;AAAA,IACA,iBAAiB;AAAA,MACf,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAgB,KAAK;AAAA,EACzB;AAAA,IACE,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA,SAAS,CAAC,KAAK;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAMpB,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCjB,eAAsB,KAAK,MAAmC;AAC5D,QAAM,OAAO,MAAM,eAAe;AAClC,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,QAAM,MAAW,UAAK,KAAK,IAAI;AAE/B,EAAG,aAAe,UAAK,KAAK,OAAO,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,EAAG,aAAe,UAAK,KAAK,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAEzD,EAAG,iBAAmB,UAAK,KAAK,cAAc,GAAG,cAAc,OAAO;AACtE,EAAG,iBAAmB,UAAK,KAAK,eAAe,GAAG,eAAe,OAAO;AACxE,EAAG,iBAAmB,UAAK,KAAK,cAAc,GAAG,aAAa,OAAO;AACrE,EAAG,iBAAmB,UAAK,KAAK,OAAO,UAAU,GAAG,UAAU,OAAO;AACrE,EAAG,iBAAmB,UAAK,KAAK,SAAS,eAAe,GAAG;AAAA;AAAA,GAA2J,OAAO;AAE7N,MAAI,CAAC,MAAM,aAAa;AACtB,YAAQ,IAAI,4BAA4B;AACxC,4CAAS,eAAe,EAAE,KAAK,KAAK,OAAO,UAAU,CAAC;AAAA,EACxD;AAEA,UAAQ,IAAI;AAAA,YAAe,IAAI,GAAG;AAClC,UAAQ,IAAI,QAAQ,IAAI;AAAA,CAAoC;AAC9D;","names":[]}
@@ -0,0 +1 @@
1
+ export { i as init } from '../index-D-K6sx8s.cjs';
@@ -0,0 +1 @@
1
+ export { i as init } from '../index-D-K6sx8s.js';