@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.
- package/LICENSE +21 -0
- package/README.md +292 -0
- package/dist/chunk-53ZOIXM4.js +624 -0
- package/dist/chunk-53ZOIXM4.js.map +1 -0
- package/dist/chunk-BWXHO6UJ.js +115 -0
- package/dist/chunk-BWXHO6UJ.js.map +1 -0
- package/dist/chunk-CARUMOML.js +123 -0
- package/dist/chunk-CARUMOML.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-F34HO4RA.js +487 -0
- package/dist/chunk-F34HO4RA.js.map +1 -0
- package/dist/chunk-FK7S2S7V.js +132 -0
- package/dist/chunk-FK7S2S7V.js.map +1 -0
- package/dist/chunk-MQ7XP6VT.js +174 -0
- package/dist/chunk-MQ7XP6VT.js.map +1 -0
- package/dist/chunk-TLPOO6C3.js +176 -0
- package/dist/chunk-TLPOO6C3.js.map +1 -0
- package/dist/chunk-W6OLZ2OI.js +56 -0
- package/dist/chunk-W6OLZ2OI.js.map +1 -0
- package/dist/cli/index.cjs +151 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.cjs +128 -0
- package/dist/cli/run.cjs.map +1 -0
- package/dist/cli/run.d.cts +1 -0
- package/dist/cli/run.d.ts +1 -0
- package/dist/cli/run.js +126 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/index-D-K6sx8s.d.cts +8 -0
- package/dist/index-D-K6sx8s.d.ts +8 -0
- package/dist/index.cjs +2909 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +274 -0
- package/dist/index.d.ts +274 -0
- package/dist/index.js +1048 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.cjs +531 -0
- package/dist/llm/index.cjs.map +1 -0
- package/dist/llm/index.d.cts +70 -0
- package/dist/llm/index.d.ts +70 -0
- package/dist/llm/index.js +24 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/index.cjs +323 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +39 -0
- package/dist/mcp/index.d.ts +39 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/memory/index.cjs +146 -0
- package/dist/memory/index.cjs.map +1 -0
- package/dist/memory/index.d.cts +51 -0
- package/dist/memory/index.d.ts +51 -0
- package/dist/memory/index.js +10 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/tools/fuzzy-edit.cjs +200 -0
- package/dist/tools/fuzzy-edit.cjs.map +1 -0
- package/dist/tools/fuzzy-edit.d.cts +9 -0
- package/dist/tools/fuzzy-edit.d.ts +9 -0
- package/dist/tools/fuzzy-edit.js +12 -0
- package/dist/tools/fuzzy-edit.js.map +1 -0
- package/dist/tools/index.cjs +1032 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +4 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.js +39 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types-C11cw5ZD.d.cts +177 -0
- package/dist/types-C11cw5ZD.d.ts +177 -0
- package/dist/utils-TF4TBXQJ.js +10 -0
- package/dist/utils-TF4TBXQJ.js.map +1 -0
- package/dist/web-fetch-B42QzYD2.d.cts +85 -0
- package/dist/web-fetch-EDdhxmEf.d.ts +85 -0
- package/package.json +134 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/cli/run.cjs
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
// src/cli/run.ts
|
|
5
|
+
var import_node_module = require("module");
|
|
6
|
+
var import_meta = {};
|
|
7
|
+
var require2 = (0, import_node_module.createRequire)(import_meta.url);
|
|
8
|
+
var p = require2("../index.js");
|
|
9
|
+
var { AnthropicProvider, OpenAIProvider, OllamaProvider } = require2("../llm/index.js");
|
|
10
|
+
var ALL_TOOLS = [
|
|
11
|
+
p.BashTool,
|
|
12
|
+
p.FileReadTool,
|
|
13
|
+
p.FileWriteTool,
|
|
14
|
+
p.FileEditTool,
|
|
15
|
+
p.GlobTool,
|
|
16
|
+
p.GrepTool,
|
|
17
|
+
p.WebFetchTool
|
|
18
|
+
];
|
|
19
|
+
var args = process.argv.slice(2);
|
|
20
|
+
function usage() {
|
|
21
|
+
console.log(`synthcode <prompt> [options]
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--model <model> Use specific model (auto-detects provider)
|
|
25
|
+
--ollama <model> Use Ollama (default: qwen3:32b)
|
|
26
|
+
--anthropic <model> Use Anthropic (default: claude-sonnet-4-20250514)
|
|
27
|
+
--openai <model> Use OpenAI (default: gpt-4o)
|
|
28
|
+
--max-turns <n> Max agentic turns (default: 50)
|
|
29
|
+
--system <prompt> System prompt
|
|
30
|
+
--cwd <dir> Working directory (default: .)
|
|
31
|
+
--json Output final result as JSON
|
|
32
|
+
--help Show this help`);
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
if (args.includes("--help") || args.length === 0) usage();
|
|
36
|
+
var promptIdx = args.findIndex((a) => !a.startsWith("--"));
|
|
37
|
+
if (promptIdx === -1) {
|
|
38
|
+
console.error("Error: no prompt provided. Run 'synthcode --help' for usage.");
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
var prompt = args[promptIdx];
|
|
42
|
+
var flags = args.filter((_, i) => i !== promptIdx);
|
|
43
|
+
function getFlag(flag) {
|
|
44
|
+
const idx = flags.indexOf(flag);
|
|
45
|
+
return idx !== -1 && idx + 1 < flags.length ? flags[idx + 1] : void 0;
|
|
46
|
+
}
|
|
47
|
+
function hasFlag(flag) {
|
|
48
|
+
return flags.includes(flag);
|
|
49
|
+
}
|
|
50
|
+
function resolveProvider() {
|
|
51
|
+
if (hasFlag("--ollama")) {
|
|
52
|
+
return new OllamaProvider({ model: getFlag("--ollama") ?? "qwen3:32b" });
|
|
53
|
+
}
|
|
54
|
+
if (hasFlag("--anthropic")) {
|
|
55
|
+
const model = getFlag("--anthropic") ?? "claude-sonnet-4-20250514";
|
|
56
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
57
|
+
console.error("Error: ANTHROPIC_API_KEY not set");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model });
|
|
61
|
+
}
|
|
62
|
+
if (hasFlag("--openai")) {
|
|
63
|
+
const model = getFlag("--openai") ?? "gpt-4o";
|
|
64
|
+
if (!process.env.OPENAI_API_KEY) {
|
|
65
|
+
console.error("Error: OPENAI_API_KEY not set");
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model });
|
|
69
|
+
}
|
|
70
|
+
if (hasFlag("--model")) {
|
|
71
|
+
return new OllamaProvider({ model: getFlag("--model") });
|
|
72
|
+
}
|
|
73
|
+
if (process.env.ANTHROPIC_API_KEY) return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model: "claude-sonnet-4-20250514" });
|
|
74
|
+
if (process.env.OPENAI_API_KEY) return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model: "gpt-4o" });
|
|
75
|
+
return new OllamaProvider({ model: "qwen3:32b" });
|
|
76
|
+
}
|
|
77
|
+
async function main() {
|
|
78
|
+
const provider = resolveProvider();
|
|
79
|
+
const systemPrompt = getFlag("--system");
|
|
80
|
+
const maxTurns = parseInt(getFlag("--max-turns") ?? "50", 10);
|
|
81
|
+
const cwd = getFlag("--cwd") ?? process.cwd();
|
|
82
|
+
const jsonMode = hasFlag("--json");
|
|
83
|
+
const agent = new p.Agent({
|
|
84
|
+
model: provider,
|
|
85
|
+
tools: ALL_TOOLS,
|
|
86
|
+
...systemPrompt ? { systemPrompt } : {},
|
|
87
|
+
maxTurns,
|
|
88
|
+
cwd,
|
|
89
|
+
disableTitle: true
|
|
90
|
+
});
|
|
91
|
+
const finalText = [];
|
|
92
|
+
let finalUsage = { inputTokens: 0, outputTokens: 0 };
|
|
93
|
+
for await (const event of agent.run(prompt)) {
|
|
94
|
+
switch (event.type) {
|
|
95
|
+
case "text":
|
|
96
|
+
process.stdout.write(event.text);
|
|
97
|
+
finalText.push(event.text);
|
|
98
|
+
break;
|
|
99
|
+
case "tool_use":
|
|
100
|
+
console.log(`
|
|
101
|
+
\x1B[36m[${event.name}]\x1B[0m`);
|
|
102
|
+
break;
|
|
103
|
+
case "tool_result":
|
|
104
|
+
if (event.isError) console.log(` \x1B[31mFAILED\x1B[0m`);
|
|
105
|
+
break;
|
|
106
|
+
case "thinking":
|
|
107
|
+
process.stderr.write(`\x1B[90m${event.thinking}\x1B[0m`);
|
|
108
|
+
break;
|
|
109
|
+
case "done":
|
|
110
|
+
finalUsage.inputTokens = event.usage.inputTokens;
|
|
111
|
+
finalUsage.outputTokens = event.usage.outputTokens;
|
|
112
|
+
console.log(`
|
|
113
|
+
|
|
114
|
+
\x1B[90mTokens: ${event.usage.inputTokens} in, ${event.usage.outputTokens} out\x1B[0m`);
|
|
115
|
+
break;
|
|
116
|
+
case "error":
|
|
117
|
+
console.error(`
|
|
118
|
+
\x1B[31mError: ${event.error.message}\x1B[0m`);
|
|
119
|
+
if (jsonMode) console.log(JSON.stringify({ ok: false, error: event.error.message }));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (jsonMode) {
|
|
124
|
+
console.log(JSON.stringify({ ok: true, text: finalText.join(""), usage: finalUsage, model: provider.model }));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
main();
|
|
128
|
+
//# sourceMappingURL=run.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/run.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst p = require(\"../index.js\");\nconst { AnthropicProvider, OpenAIProvider, OllamaProvider } = require(\"../llm/index.js\");\n\nconst ALL_TOOLS = [\n p.BashTool,\n p.FileReadTool,\n p.FileWriteTool,\n p.FileEditTool,\n p.GlobTool,\n p.GrepTool,\n p.WebFetchTool,\n];\n\nconst args = process.argv.slice(2);\n\nfunction usage() {\n console.log(`synthcode <prompt> [options]\n\nOptions:\n --model <model> Use specific model (auto-detects provider)\n --ollama <model> Use Ollama (default: qwen3:32b)\n --anthropic <model> Use Anthropic (default: claude-sonnet-4-20250514)\n --openai <model> Use OpenAI (default: gpt-4o)\n --max-turns <n> Max agentic turns (default: 50)\n --system <prompt> System prompt\n --cwd <dir> Working directory (default: .)\n --json Output final result as JSON\n --help Show this help`);\n process.exit(0);\n}\n\nif (args.includes(\"--help\") || args.length === 0) usage();\n\nconst promptIdx = args.findIndex(a => !a.startsWith(\"--\"));\nif (promptIdx === -1) {\n console.error(\"Error: no prompt provided. Run 'synthcode --help' for usage.\");\n process.exit(1);\n}\n\nconst prompt = args[promptIdx];\nconst flags = args.filter((_, i) => i !== promptIdx);\n\nfunction getFlag(flag: string): string | undefined {\n const idx = flags.indexOf(flag);\n return idx !== -1 && idx + 1 < flags.length ? flags[idx + 1] : undefined;\n}\nfunction hasFlag(flag: string): boolean {\n return flags.includes(flag);\n}\n\nfunction resolveProvider() {\n if (hasFlag(\"--ollama\")) {\n return new OllamaProvider({ model: getFlag(\"--ollama\") ?? \"qwen3:32b\" });\n }\n if (hasFlag(\"--anthropic\")) {\n const model = getFlag(\"--anthropic\") ?? \"claude-sonnet-4-20250514\";\n if (!process.env.ANTHROPIC_API_KEY) {\n console.error(\"Error: ANTHROPIC_API_KEY not set\");\n process.exit(1);\n }\n return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model });\n }\n if (hasFlag(\"--openai\")) {\n const model = getFlag(\"--openai\") ?? \"gpt-4o\";\n if (!process.env.OPENAI_API_KEY) {\n console.error(\"Error: OPENAI_API_KEY not set\");\n process.exit(1);\n }\n return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model });\n }\n if (hasFlag(\"--model\")) {\n return new OllamaProvider({ model: getFlag(\"--model\")! });\n }\n if (process.env.ANTHROPIC_API_KEY) return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model: \"claude-sonnet-4-20250514\" });\n if (process.env.OPENAI_API_KEY) return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model: \"gpt-4o\" });\n return new OllamaProvider({ model: \"qwen3:32b\" });\n}\n\nasync function main() {\n const provider = resolveProvider();\n const systemPrompt = getFlag(\"--system\");\n const maxTurns = parseInt(getFlag(\"--max-turns\") ?? \"50\", 10);\n const cwd = getFlag(\"--cwd\") ?? process.cwd();\n const jsonMode = hasFlag(\"--json\");\n\n const agent = new p.Agent({\n model: provider,\n tools: ALL_TOOLS,\n ...(systemPrompt ? { systemPrompt } : {}),\n maxTurns,\n cwd,\n disableTitle: true,\n });\n\n const finalText = [];\n let finalUsage = { inputTokens: 0, outputTokens: 0 };\n\n for await (const event of agent.run(prompt)) {\n switch (event.type) {\n case \"text\":\n process.stdout.write(event.text);\n finalText.push(event.text);\n break;\n case \"tool_use\":\n console.log(`\\n \\x1b[36m[${event.name}]\\x1b[0m`);\n break;\n case \"tool_result\":\n if (event.isError) console.log(` \\x1b[31mFAILED\\x1b[0m`);\n break;\n case \"thinking\":\n process.stderr.write(`\\x1b[90m${event.thinking}\\x1b[0m`);\n break;\n case \"done\":\n finalUsage.inputTokens = event.usage.inputTokens;\n finalUsage.outputTokens = event.usage.outputTokens;\n console.log(`\\n\\n\\x1b[90mTokens: ${event.usage.inputTokens} in, ${event.usage.outputTokens} out\\x1b[0m`);\n break;\n case \"error\":\n console.error(`\\n\\x1b[31mError: ${event.error.message}\\x1b[0m`);\n if (jsonMode) console.log(JSON.stringify({ ok: false, error: event.error.message }));\n process.exit(1);\n }\n }\n\n if (jsonMode) {\n console.log(JSON.stringify({ ok: true, text: finalText.join(\"\"), usage: finalUsage, model: provider.model }));\n }\n}\n\nmain();\n"],"mappings":"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","names":["require"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli/run.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli/run.ts
|
|
4
|
+
import { createRequire } from "module";
|
|
5
|
+
var require2 = createRequire(import.meta.url);
|
|
6
|
+
var p = require2("../index.js");
|
|
7
|
+
var { AnthropicProvider, OpenAIProvider, OllamaProvider } = require2("../llm/index.js");
|
|
8
|
+
var ALL_TOOLS = [
|
|
9
|
+
p.BashTool,
|
|
10
|
+
p.FileReadTool,
|
|
11
|
+
p.FileWriteTool,
|
|
12
|
+
p.FileEditTool,
|
|
13
|
+
p.GlobTool,
|
|
14
|
+
p.GrepTool,
|
|
15
|
+
p.WebFetchTool
|
|
16
|
+
];
|
|
17
|
+
var args = process.argv.slice(2);
|
|
18
|
+
function usage() {
|
|
19
|
+
console.log(`synthcode <prompt> [options]
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--model <model> Use specific model (auto-detects provider)
|
|
23
|
+
--ollama <model> Use Ollama (default: qwen3:32b)
|
|
24
|
+
--anthropic <model> Use Anthropic (default: claude-sonnet-4-20250514)
|
|
25
|
+
--openai <model> Use OpenAI (default: gpt-4o)
|
|
26
|
+
--max-turns <n> Max agentic turns (default: 50)
|
|
27
|
+
--system <prompt> System prompt
|
|
28
|
+
--cwd <dir> Working directory (default: .)
|
|
29
|
+
--json Output final result as JSON
|
|
30
|
+
--help Show this help`);
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
if (args.includes("--help") || args.length === 0) usage();
|
|
34
|
+
var promptIdx = args.findIndex((a) => !a.startsWith("--"));
|
|
35
|
+
if (promptIdx === -1) {
|
|
36
|
+
console.error("Error: no prompt provided. Run 'synthcode --help' for usage.");
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
var prompt = args[promptIdx];
|
|
40
|
+
var flags = args.filter((_, i) => i !== promptIdx);
|
|
41
|
+
function getFlag(flag) {
|
|
42
|
+
const idx = flags.indexOf(flag);
|
|
43
|
+
return idx !== -1 && idx + 1 < flags.length ? flags[idx + 1] : void 0;
|
|
44
|
+
}
|
|
45
|
+
function hasFlag(flag) {
|
|
46
|
+
return flags.includes(flag);
|
|
47
|
+
}
|
|
48
|
+
function resolveProvider() {
|
|
49
|
+
if (hasFlag("--ollama")) {
|
|
50
|
+
return new OllamaProvider({ model: getFlag("--ollama") ?? "qwen3:32b" });
|
|
51
|
+
}
|
|
52
|
+
if (hasFlag("--anthropic")) {
|
|
53
|
+
const model = getFlag("--anthropic") ?? "claude-sonnet-4-20250514";
|
|
54
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
55
|
+
console.error("Error: ANTHROPIC_API_KEY not set");
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model });
|
|
59
|
+
}
|
|
60
|
+
if (hasFlag("--openai")) {
|
|
61
|
+
const model = getFlag("--openai") ?? "gpt-4o";
|
|
62
|
+
if (!process.env.OPENAI_API_KEY) {
|
|
63
|
+
console.error("Error: OPENAI_API_KEY not set");
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model });
|
|
67
|
+
}
|
|
68
|
+
if (hasFlag("--model")) {
|
|
69
|
+
return new OllamaProvider({ model: getFlag("--model") });
|
|
70
|
+
}
|
|
71
|
+
if (process.env.ANTHROPIC_API_KEY) return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model: "claude-sonnet-4-20250514" });
|
|
72
|
+
if (process.env.OPENAI_API_KEY) return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model: "gpt-4o" });
|
|
73
|
+
return new OllamaProvider({ model: "qwen3:32b" });
|
|
74
|
+
}
|
|
75
|
+
async function main() {
|
|
76
|
+
const provider = resolveProvider();
|
|
77
|
+
const systemPrompt = getFlag("--system");
|
|
78
|
+
const maxTurns = parseInt(getFlag("--max-turns") ?? "50", 10);
|
|
79
|
+
const cwd = getFlag("--cwd") ?? process.cwd();
|
|
80
|
+
const jsonMode = hasFlag("--json");
|
|
81
|
+
const agent = new p.Agent({
|
|
82
|
+
model: provider,
|
|
83
|
+
tools: ALL_TOOLS,
|
|
84
|
+
...systemPrompt ? { systemPrompt } : {},
|
|
85
|
+
maxTurns,
|
|
86
|
+
cwd,
|
|
87
|
+
disableTitle: true
|
|
88
|
+
});
|
|
89
|
+
const finalText = [];
|
|
90
|
+
let finalUsage = { inputTokens: 0, outputTokens: 0 };
|
|
91
|
+
for await (const event of agent.run(prompt)) {
|
|
92
|
+
switch (event.type) {
|
|
93
|
+
case "text":
|
|
94
|
+
process.stdout.write(event.text);
|
|
95
|
+
finalText.push(event.text);
|
|
96
|
+
break;
|
|
97
|
+
case "tool_use":
|
|
98
|
+
console.log(`
|
|
99
|
+
\x1B[36m[${event.name}]\x1B[0m`);
|
|
100
|
+
break;
|
|
101
|
+
case "tool_result":
|
|
102
|
+
if (event.isError) console.log(` \x1B[31mFAILED\x1B[0m`);
|
|
103
|
+
break;
|
|
104
|
+
case "thinking":
|
|
105
|
+
process.stderr.write(`\x1B[90m${event.thinking}\x1B[0m`);
|
|
106
|
+
break;
|
|
107
|
+
case "done":
|
|
108
|
+
finalUsage.inputTokens = event.usage.inputTokens;
|
|
109
|
+
finalUsage.outputTokens = event.usage.outputTokens;
|
|
110
|
+
console.log(`
|
|
111
|
+
|
|
112
|
+
\x1B[90mTokens: ${event.usage.inputTokens} in, ${event.usage.outputTokens} out\x1B[0m`);
|
|
113
|
+
break;
|
|
114
|
+
case "error":
|
|
115
|
+
console.error(`
|
|
116
|
+
\x1B[31mError: ${event.error.message}\x1B[0m`);
|
|
117
|
+
if (jsonMode) console.log(JSON.stringify({ ok: false, error: event.error.message }));
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (jsonMode) {
|
|
122
|
+
console.log(JSON.stringify({ ok: true, text: finalText.join(""), usage: finalUsage, model: provider.model }));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
main();
|
|
126
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/run.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst p = require(\"../index.js\");\nconst { AnthropicProvider, OpenAIProvider, OllamaProvider } = require(\"../llm/index.js\");\n\nconst ALL_TOOLS = [\n p.BashTool,\n p.FileReadTool,\n p.FileWriteTool,\n p.FileEditTool,\n p.GlobTool,\n p.GrepTool,\n p.WebFetchTool,\n];\n\nconst args = process.argv.slice(2);\n\nfunction usage() {\n console.log(`synthcode <prompt> [options]\n\nOptions:\n --model <model> Use specific model (auto-detects provider)\n --ollama <model> Use Ollama (default: qwen3:32b)\n --anthropic <model> Use Anthropic (default: claude-sonnet-4-20250514)\n --openai <model> Use OpenAI (default: gpt-4o)\n --max-turns <n> Max agentic turns (default: 50)\n --system <prompt> System prompt\n --cwd <dir> Working directory (default: .)\n --json Output final result as JSON\n --help Show this help`);\n process.exit(0);\n}\n\nif (args.includes(\"--help\") || args.length === 0) usage();\n\nconst promptIdx = args.findIndex(a => !a.startsWith(\"--\"));\nif (promptIdx === -1) {\n console.error(\"Error: no prompt provided. Run 'synthcode --help' for usage.\");\n process.exit(1);\n}\n\nconst prompt = args[promptIdx];\nconst flags = args.filter((_, i) => i !== promptIdx);\n\nfunction getFlag(flag: string): string | undefined {\n const idx = flags.indexOf(flag);\n return idx !== -1 && idx + 1 < flags.length ? flags[idx + 1] : undefined;\n}\nfunction hasFlag(flag: string): boolean {\n return flags.includes(flag);\n}\n\nfunction resolveProvider() {\n if (hasFlag(\"--ollama\")) {\n return new OllamaProvider({ model: getFlag(\"--ollama\") ?? \"qwen3:32b\" });\n }\n if (hasFlag(\"--anthropic\")) {\n const model = getFlag(\"--anthropic\") ?? \"claude-sonnet-4-20250514\";\n if (!process.env.ANTHROPIC_API_KEY) {\n console.error(\"Error: ANTHROPIC_API_KEY not set\");\n process.exit(1);\n }\n return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model });\n }\n if (hasFlag(\"--openai\")) {\n const model = getFlag(\"--openai\") ?? \"gpt-4o\";\n if (!process.env.OPENAI_API_KEY) {\n console.error(\"Error: OPENAI_API_KEY not set\");\n process.exit(1);\n }\n return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model });\n }\n if (hasFlag(\"--model\")) {\n return new OllamaProvider({ model: getFlag(\"--model\")! });\n }\n if (process.env.ANTHROPIC_API_KEY) return new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY, model: \"claude-sonnet-4-20250514\" });\n if (process.env.OPENAI_API_KEY) return new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY, model: \"gpt-4o\" });\n return new OllamaProvider({ model: \"qwen3:32b\" });\n}\n\nasync function main() {\n const provider = resolveProvider();\n const systemPrompt = getFlag(\"--system\");\n const maxTurns = parseInt(getFlag(\"--max-turns\") ?? \"50\", 10);\n const cwd = getFlag(\"--cwd\") ?? process.cwd();\n const jsonMode = hasFlag(\"--json\");\n\n const agent = new p.Agent({\n model: provider,\n tools: ALL_TOOLS,\n ...(systemPrompt ? { systemPrompt } : {}),\n maxTurns,\n cwd,\n disableTitle: true,\n });\n\n const finalText = [];\n let finalUsage = { inputTokens: 0, outputTokens: 0 };\n\n for await (const event of agent.run(prompt)) {\n switch (event.type) {\n case \"text\":\n process.stdout.write(event.text);\n finalText.push(event.text);\n break;\n case \"tool_use\":\n console.log(`\\n \\x1b[36m[${event.name}]\\x1b[0m`);\n break;\n case \"tool_result\":\n if (event.isError) console.log(` \\x1b[31mFAILED\\x1b[0m`);\n break;\n case \"thinking\":\n process.stderr.write(`\\x1b[90m${event.thinking}\\x1b[0m`);\n break;\n case \"done\":\n finalUsage.inputTokens = event.usage.inputTokens;\n finalUsage.outputTokens = event.usage.outputTokens;\n console.log(`\\n\\n\\x1b[90mTokens: ${event.usage.inputTokens} in, ${event.usage.outputTokens} out\\x1b[0m`);\n break;\n case \"error\":\n console.error(`\\n\\x1b[31mError: ${event.error.message}\\x1b[0m`);\n if (jsonMode) console.log(JSON.stringify({ ok: false, error: event.error.message }));\n process.exit(1);\n }\n }\n\n if (jsonMode) {\n console.log(JSON.stringify({ ok: true, text: finalText.join(\"\"), usage: finalUsage, model: provider.model }));\n }\n}\n\nmain();\n"],"mappings":"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","names":["require"]}
|