@iambarryking/ag 3.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 (50) hide show
  1. package/README.md +199 -0
  2. package/dist/cli/parser.d.ts +6 -0
  3. package/dist/cli/parser.d.ts.map +1 -0
  4. package/dist/cli/parser.js +69 -0
  5. package/dist/cli/parser.js.map +1 -0
  6. package/dist/cli/repl.d.ts +10 -0
  7. package/dist/cli/repl.d.ts.map +1 -0
  8. package/dist/cli/repl.js +256 -0
  9. package/dist/cli/repl.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +80 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/core/agent.d.ts +54 -0
  15. package/dist/core/agent.d.ts.map +1 -0
  16. package/dist/core/agent.js +137 -0
  17. package/dist/core/agent.js.map +1 -0
  18. package/dist/core/colors.d.ts +10 -0
  19. package/dist/core/colors.d.ts.map +1 -0
  20. package/dist/core/colors.js +5 -0
  21. package/dist/core/colors.js.map +1 -0
  22. package/dist/core/config.d.ts +11 -0
  23. package/dist/core/config.d.ts.map +1 -0
  24. package/dist/core/config.js +30 -0
  25. package/dist/core/config.js.map +1 -0
  26. package/dist/core/loader.d.ts +3 -0
  27. package/dist/core/loader.d.ts.map +1 -0
  28. package/dist/core/loader.js +39 -0
  29. package/dist/core/loader.js.map +1 -0
  30. package/dist/core/types.d.ts +47 -0
  31. package/dist/core/types.d.ts.map +1 -0
  32. package/dist/core/types.js +2 -0
  33. package/dist/core/types.js.map +1 -0
  34. package/dist/memory/memory.d.ts +38 -0
  35. package/dist/memory/memory.d.ts.map +1 -0
  36. package/dist/memory/memory.js +153 -0
  37. package/dist/memory/memory.js.map +1 -0
  38. package/dist/tools/bash.d.ts +6 -0
  39. package/dist/tools/bash.d.ts.map +1 -0
  40. package/dist/tools/bash.js +37 -0
  41. package/dist/tools/bash.js.map +1 -0
  42. package/dist/tools/memory.d.ts +3 -0
  43. package/dist/tools/memory.d.ts.map +1 -0
  44. package/dist/tools/memory.js +27 -0
  45. package/dist/tools/memory.js.map +1 -0
  46. package/dist/tools/plan.d.ts +4 -0
  47. package/dist/tools/plan.d.ts.map +1 -0
  48. package/dist/tools/plan.js +49 -0
  49. package/dist/tools/plan.js.map +1 -0
  50. package/package.json +28 -0
package/dist/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import { createInterface } from 'node:readline';
3
+ import { Agent } from './core/agent.js';
4
+ import { REPL } from './cli/repl.js';
5
+ import { parseArgs, showHelp } from './cli/parser.js';
6
+ import { loadUserTools } from './core/loader.js';
7
+ import { loadConfig, saveConfig, configPath } from './core/config.js';
8
+ import { C } from './core/colors.js';
9
+ async function ensureApiKey(cliKey) {
10
+ // 1. CLI flag
11
+ if (cliKey)
12
+ return cliKey;
13
+ // 2. Environment variable
14
+ if (process.env.OPENROUTER_API_KEY)
15
+ return process.env.OPENROUTER_API_KEY;
16
+ // 3. Config file
17
+ const config = loadConfig();
18
+ if (config.apiKey)
19
+ return config.apiKey;
20
+ // 4. Interactive prompt (TTY only)
21
+ if (process.stdin.isTTY) {
22
+ console.error(`\n${C.bold}Welcome to ag!${C.reset}\n`);
23
+ console.error(`Get your API key at: ${C.cyan}https://openrouter.ai/keys${C.reset}\n`);
24
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
25
+ const key = await new Promise(resolve => rl.question(`${C.yellow}Enter your OpenRouter API key:${C.reset} `, resolve));
26
+ rl.close();
27
+ const trimmed = key.trim();
28
+ if (!trimmed) {
29
+ throw new Error('No API key provided.');
30
+ }
31
+ saveConfig({ apiKey: trimmed });
32
+ console.error(`${C.green}Key saved to ${configPath()}${C.reset}\n`);
33
+ return trimmed;
34
+ }
35
+ // 5. Non-interactive failure
36
+ throw new Error('No API key. Set OPENROUTER_API_KEY, pass -k, or run `ag` interactively to configure.');
37
+ }
38
+ async function main() {
39
+ const { positional, ...options } = parseArgs(process.argv.slice(2));
40
+ if (options.help) {
41
+ showHelp();
42
+ process.exit(0);
43
+ }
44
+ const extraTools = await loadUserTools(process.cwd());
45
+ if (extraTools.length > 0) {
46
+ console.error(`${C.dim}Loaded ${extraTools.length} custom tool(s): ${extraTools.map(t => t.function.name).join(', ')}${C.reset}`);
47
+ }
48
+ const config = loadConfig();
49
+ const apiKey = await ensureApiKey(options.key);
50
+ const agent = new Agent({
51
+ apiKey,
52
+ model: options.model || config.model,
53
+ baseURL: options.baseURL || config.baseURL,
54
+ systemPrompt: options.system || config.systemPrompt,
55
+ maxIterations: options.maxIterations || config.maxIterations,
56
+ extraTools,
57
+ });
58
+ if (options.stats) {
59
+ const stats = agent.getStats();
60
+ const p = agent.getPaths();
61
+ console.log('Memory');
62
+ console.log('---');
63
+ console.log(`Global memory: ${stats.globalMemory ? 'yes' : 'none'} (${p.globalMemory})`);
64
+ console.log(`Project memory: ${stats.projectMemory ? 'yes' : 'none'} (${p.projectMemory})`);
65
+ console.log(`Plans: ${stats.planCount} (${p.plansDir}/)`);
66
+ console.log(`History: ${stats.historyLines} messages (${p.history})`);
67
+ console.log(`Config: ${configPath()}`);
68
+ process.exit(0);
69
+ }
70
+ if (positional.length > 0) {
71
+ const response = await agent.chat(positional.join(' '));
72
+ console.log(response);
73
+ process.exit(0);
74
+ }
75
+ const repl = new REPL(agent);
76
+ await repl.start();
77
+ }
78
+ process.on('SIGINT', () => { console.error('\nGoodbye!'); process.exit(0); });
79
+ main().catch(e => { console.error(`Error: ${e.message}`); process.exit(1); });
80
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { Tool, AgentConfig } from './types.js';
2
+ import { type MemoryStats } from '../memory/memory.js';
3
+ export declare class Agent {
4
+ private readonly apiKey;
5
+ private model;
6
+ private readonly baseURL;
7
+ private readonly baseSystemPrompt;
8
+ private readonly maxIterations;
9
+ private readonly tools;
10
+ private readonly cwd;
11
+ private messages;
12
+ constructor(config?: AgentConfig);
13
+ addTool(tool: Tool): void;
14
+ private get systemPrompt();
15
+ chat(content: string): Promise<string>;
16
+ getTools(): Array<{
17
+ name: string;
18
+ description: string;
19
+ }>;
20
+ getModel(): string;
21
+ getBaseURL(): string;
22
+ setModel(model: string): void;
23
+ fetchModels(query?: string): Promise<Array<{
24
+ id: string;
25
+ name: string;
26
+ context_length: number;
27
+ pricing?: {
28
+ prompt?: string;
29
+ completion?: string;
30
+ };
31
+ }>>;
32
+ getStats(): MemoryStats;
33
+ getPaths(): {
34
+ globalMemory: string;
35
+ projectMemory: string;
36
+ plansDir: string;
37
+ history: string;
38
+ projectDir: string;
39
+ };
40
+ getGlobalMemory(): string;
41
+ getProjectMemory(): string;
42
+ getPlan(): string;
43
+ getPlanByName(name: string): string;
44
+ getPlans(): {
45
+ name: string;
46
+ path: string;
47
+ }[];
48
+ setGlobalMemory(content: string): void;
49
+ setProjectMemory(content: string): void;
50
+ setPlan(content: string, name?: string): void;
51
+ clearProject(): void;
52
+ clearAll(): void;
53
+ }
54
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAA6M,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlQ,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,GAAE,WAAgB;IAqBpC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB,OAAO,KAAK,YAAY,GAIvB;IAEK,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE5C,QAAQ,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAGxD,QAAQ,IAAI,MAAM;IAClB,UAAU,IAAI,MAAM;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAEvB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAc3J,QAAQ,IAAI,WAAW;IACvB,QAAQ;;;;;;;IAER,eAAe,IAAI,MAAM;IACzB,gBAAgB,IAAI,MAAM;IAC1B,OAAO,IAAI,MAAM;IACjB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IACnC,QAAQ;;;;IAER,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IACtC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IACvC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAE7C,YAAY,IAAI,IAAI;IACpB,QAAQ,IAAI,IAAI;CACjB"}
@@ -0,0 +1,137 @@
1
+ import { C } from './colors.js';
2
+ import { loadContext, loadHistory, appendHistory, getStats, clearProject, clearAll, paths, saveGlobalMemory, saveProjectMemory, savePlan, loadGlobalMemory, loadProjectMemory, loadPlan, loadPlanByName, listPlans } from '../memory/memory.js';
3
+ import { bashTool } from '../tools/bash.js';
4
+ import { memoryTool } from '../tools/memory.js';
5
+ import { planTool, listPlansTool } from '../tools/plan.js';
6
+ export class Agent {
7
+ apiKey;
8
+ model;
9
+ baseURL;
10
+ baseSystemPrompt;
11
+ maxIterations;
12
+ tools;
13
+ cwd;
14
+ messages = [];
15
+ constructor(config = {}) {
16
+ this.apiKey = config.apiKey || process.env.OPENROUTER_API_KEY || '';
17
+ if (!this.apiKey)
18
+ throw new Error('No API key. Set OPENROUTER_API_KEY, pass -k, or run `ag` interactively to configure.');
19
+ this.model = config.model || 'anthropic/claude-sonnet-4.6';
20
+ this.baseURL = config.baseURL || 'https://openrouter.ai/api/v1';
21
+ this.baseSystemPrompt = config.systemPrompt || 'You are a coding assistant with bash, save_memory, save_plan, and list_plans tools.\n\n- For multi-step coding tasks, create a plan with save_plan before starting, and update it as you go.\n- For simple questions or single commands, just answer directly.\n- Use save_memory when you learn something worth keeping across sessions.\n- Use bash for everything else.';
22
+ this.maxIterations = config.maxIterations || 25;
23
+ this.cwd = config.cwd || process.cwd();
24
+ this.tools = new Map();
25
+ this.addTool(bashTool);
26
+ this.addTool(memoryTool(this.cwd));
27
+ this.addTool(planTool(this.cwd));
28
+ this.addTool(listPlansTool(this.cwd));
29
+ for (const t of config.extraTools ?? [])
30
+ this.addTool(t);
31
+ // Load recent conversation history for continuity
32
+ this.messages = loadHistory(this.cwd);
33
+ }
34
+ addTool(tool) {
35
+ this.tools.set(tool.function.name, tool);
36
+ }
37
+ get systemPrompt() {
38
+ const context = loadContext(this.cwd);
39
+ if (!context)
40
+ return this.baseSystemPrompt;
41
+ return `${this.baseSystemPrompt}\n\n${context}`;
42
+ }
43
+ async chat(content) {
44
+ const userMessage = { role: 'user', content };
45
+ this.messages.push(userMessage);
46
+ appendHistory(userMessage, this.cwd);
47
+ for (let i = 0; i < this.maxIterations; i++) {
48
+ // Context window management: truncate tool output, cap message count
49
+ const trimmed = this.messages.map(m => m.role === 'tool' && m.content.length > 4000
50
+ ? { ...m, content: m.content.slice(0, 4000) + '\n[truncated]' }
51
+ : m);
52
+ const window = trimmed.length > 50
53
+ ? [...trimmed.slice(0, 2), ...trimmed.slice(-40)]
54
+ : trimmed;
55
+ const res = await fetch(`${this.baseURL}/chat/completions`, {
56
+ method: 'POST',
57
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${this.apiKey}` },
58
+ body: JSON.stringify({
59
+ model: this.model,
60
+ messages: [{ role: 'system', content: this.systemPrompt }, ...window],
61
+ tools: Array.from(this.tools.values()).map(t => ({ type: t.type, function: t.function }))
62
+ })
63
+ });
64
+ if (!res.ok)
65
+ throw new Error(`API ${res.status}: ${await res.text()}`);
66
+ const msg = (await res.json()).choices?.[0]?.message;
67
+ if (!msg)
68
+ throw new Error('No response from model');
69
+ this.messages.push(msg);
70
+ if (!msg.tool_calls?.length) {
71
+ appendHistory({ role: 'assistant', content: msg.content || '' }, this.cwd);
72
+ return msg.content || '';
73
+ }
74
+ for (const call of msg.tool_calls) {
75
+ const tool = this.tools.get(call.function.name);
76
+ if (!tool) {
77
+ this.messages.push({ role: 'tool', tool_call_id: call.id, content: `Error: unknown tool "${call.function.name}"` });
78
+ continue;
79
+ }
80
+ let args;
81
+ try {
82
+ args = JSON.parse(call.function.arguments || '{}');
83
+ }
84
+ catch {
85
+ this.messages.push({ role: 'tool', tool_call_id: call.id, content: 'Error: malformed tool arguments' });
86
+ continue;
87
+ }
88
+ process.stderr.write(`${C.cyan}> ${call.function.name}${C.dim}(${args.command ?? JSON.stringify(args).slice(0, 100)})${C.reset}\n`);
89
+ try {
90
+ const result = await tool.execute(args);
91
+ process.stderr.write(`${C.dim} ${result.slice(0, 200)}${result.length > 200 ? '...' : ''}${C.reset}\n`);
92
+ this.messages.push({ role: 'tool', tool_call_id: call.id, content: result });
93
+ }
94
+ catch (error) {
95
+ const errMsg = `Tool error: ${error}`;
96
+ process.stderr.write(`${C.red}${errMsg}${C.reset}\n`);
97
+ this.messages.push({ role: 'tool', tool_call_id: call.id, content: errMsg });
98
+ }
99
+ }
100
+ }
101
+ return '[Max iterations reached]';
102
+ }
103
+ // ── Memory access (delegated to memory module) ──────────────────────────
104
+ getTools() {
105
+ return Array.from(this.tools.values()).map(t => ({ name: t.function.name, description: t.function.description }));
106
+ }
107
+ getModel() { return this.model; }
108
+ getBaseURL() { return this.baseURL; }
109
+ setModel(model) { this.model = model; }
110
+ async fetchModels(query) {
111
+ const res = await fetch(`${this.baseURL}/models`, {
112
+ headers: { 'Authorization': `Bearer ${this.apiKey}` }
113
+ });
114
+ if (!res.ok)
115
+ throw new Error(`Failed to fetch models: ${res.status}`);
116
+ const data = await res.json();
117
+ let models = data.data || [];
118
+ if (query) {
119
+ const q = query.toLowerCase();
120
+ models = models.filter(m => m.id.toLowerCase().includes(q) || m.name.toLowerCase().includes(q));
121
+ }
122
+ return models;
123
+ }
124
+ getStats() { return getStats(this.cwd); }
125
+ getPaths() { return paths(this.cwd); }
126
+ getGlobalMemory() { return loadGlobalMemory(this.cwd); }
127
+ getProjectMemory() { return loadProjectMemory(this.cwd); }
128
+ getPlan() { return loadPlan(this.cwd); }
129
+ getPlanByName(name) { return loadPlanByName(name, this.cwd); }
130
+ getPlans() { return listPlans(this.cwd); }
131
+ setGlobalMemory(content) { saveGlobalMemory(content, this.cwd); }
132
+ setProjectMemory(content) { saveProjectMemory(content, this.cwd); }
133
+ setPlan(content, name) { savePlan(content, name, this.cwd); }
134
+ clearProject() { this.messages = []; clearProject(this.cwd); }
135
+ clearAll() { this.messages = []; clearAll(this.cwd); }
136
+ }
137
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const C: {
2
+ reset: string;
3
+ dim: string;
4
+ cyan: string;
5
+ green: string;
6
+ red: string;
7
+ bold: string;
8
+ yellow: string;
9
+ };
10
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/core/colors.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,CAAC;;;;;;;;CAEqH,CAAC"}
@@ -0,0 +1,5 @@
1
+ const nc = 'NO_COLOR' in process.env || !process.stderr.isTTY;
2
+ export const C = nc
3
+ ? { reset: '', dim: '', cyan: '', green: '', red: '', bold: '', yellow: '' }
4
+ : { reset: '\x1b[0m', dim: '\x1b[2m', cyan: '\x1b[36m', green: '\x1b[32m', red: '\x1b[31m', bold: '\x1b[1m', yellow: '\x1b[33m' };
5
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/core/colors.ts"],"names":[],"mappings":"AAAA,MAAM,EAAE,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAC9D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;IACjB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC5E,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface PersistentConfig {
2
+ apiKey?: string;
3
+ model?: string;
4
+ baseURL?: string;
5
+ systemPrompt?: string;
6
+ maxIterations?: number;
7
+ }
8
+ export declare function configPath(): string;
9
+ export declare function loadConfig(): PersistentConfig;
10
+ export declare function saveConfig(partial: Partial<PersistentConfig>): void;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAO7C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAQnE"}
@@ -0,0 +1,30 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ const AG_DIR = join(homedir(), '.ag');
5
+ const CONFIG_PATH = join(AG_DIR, 'config.json');
6
+ export function configPath() {
7
+ return CONFIG_PATH;
8
+ }
9
+ export function loadConfig() {
10
+ if (!existsSync(CONFIG_PATH))
11
+ return {};
12
+ try {
13
+ return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ export function saveConfig(partial) {
20
+ const existing = loadConfig();
21
+ const merged = { ...existing, ...partial };
22
+ for (const key of Object.keys(merged)) {
23
+ if (merged[key] === undefined || merged[key] === null)
24
+ delete merged[key];
25
+ }
26
+ if (!existsSync(AG_DIR))
27
+ mkdirSync(AG_DIR, { recursive: true });
28
+ writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2) + '\n');
29
+ }
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAUhD,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAkC;IAC3D,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAA+B,EAAE,CAAC;QACpE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from './types.js';
2
+ export declare function loadUserTools(cwd: string): Promise<Tool[]>;
3
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAwBlC,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAShE"}
@@ -0,0 +1,39 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { pathToFileURL } from 'node:url';
5
+ const AG_DIR = join(homedir(), '.ag');
6
+ async function loadToolsFromDir(dir) {
7
+ if (!existsSync(dir))
8
+ return [];
9
+ const files = readdirSync(dir).filter(f => f.endsWith('.mjs'));
10
+ const tools = [];
11
+ for (const file of files) {
12
+ try {
13
+ const mod = await import(pathToFileURL(join(dir, file)).href);
14
+ const tool = mod.default;
15
+ if (tool?.type === 'function' && tool?.function?.name && typeof tool?.execute === 'function') {
16
+ tools.push(tool);
17
+ }
18
+ else {
19
+ process.stderr.write(`Warning: ${file} skipped (invalid tool format)\n`);
20
+ }
21
+ }
22
+ catch (e) {
23
+ process.stderr.write(`Warning: ${file} failed to load: ${e.message}\n`);
24
+ }
25
+ }
26
+ return tools;
27
+ }
28
+ export async function loadUserTools(cwd) {
29
+ const globalTools = await loadToolsFromDir(join(AG_DIR, 'tools'));
30
+ const localTools = await loadToolsFromDir(join(cwd, '.ag', 'tools'));
31
+ // Local tools override global if same name
32
+ const byName = new Map();
33
+ for (const t of globalTools)
34
+ byName.set(t.function.name, t);
35
+ for (const t of localTools)
36
+ byName.set(t.function.name, t);
37
+ return Array.from(byName.values());
38
+ }
39
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAEtC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACzB,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,OAAO,IAAI,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC7F,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,kCAAkC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErE,2CAA2C;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,WAAW;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,47 @@
1
+ export interface Message {
2
+ role: 'system' | 'user' | 'assistant' | 'tool';
3
+ content: string;
4
+ tool_calls?: ToolCall[];
5
+ tool_call_id?: string;
6
+ }
7
+ export interface ToolCall {
8
+ id: string;
9
+ type: 'function';
10
+ function: {
11
+ name: string;
12
+ arguments: string;
13
+ };
14
+ }
15
+ export interface Tool {
16
+ type: 'function';
17
+ function: ToolDefinition;
18
+ execute: (args: any) => Promise<string> | string;
19
+ }
20
+ export interface ToolDefinition {
21
+ name: string;
22
+ description: string;
23
+ parameters: {
24
+ type: 'object';
25
+ properties: Record<string, any>;
26
+ required: string[];
27
+ };
28
+ }
29
+ export interface AgentConfig {
30
+ apiKey?: string;
31
+ model?: string;
32
+ baseURL?: string;
33
+ systemPrompt?: string;
34
+ maxIterations?: number;
35
+ cwd?: string;
36
+ extraTools?: Tool[];
37
+ }
38
+ export interface CLIOptions {
39
+ model?: string;
40
+ key?: string;
41
+ system?: string;
42
+ baseURL?: string;
43
+ maxIterations?: number;
44
+ help?: boolean;
45
+ stats?: boolean;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACrF;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { Message } from '../core/types.js';
2
+ export declare function paths(cwd?: string): {
3
+ globalMemory: string;
4
+ projectMemory: string;
5
+ plansDir: string;
6
+ history: string;
7
+ projectDir: string;
8
+ };
9
+ export declare function loadGlobalMemory(cwd?: string): string;
10
+ export declare function loadProjectMemory(cwd?: string): string;
11
+ export declare function loadPlan(cwd?: string): string;
12
+ /** List all plan files sorted newest first */
13
+ export declare function listPlans(cwd?: string): {
14
+ name: string;
15
+ path: string;
16
+ }[];
17
+ /** Load a specific plan by name */
18
+ export declare function loadPlanByName(name: string, cwd?: string): string;
19
+ /** Build a system prompt prefix from all memory tiers (capped to avoid context bloat) */
20
+ export declare function loadContext(cwd?: string): string;
21
+ /** Load recent user/assistant messages from history (for session continuity) */
22
+ export declare function loadHistory(cwd?: string, limit?: number): Message[];
23
+ export declare function saveGlobalMemory(content: string, cwd?: string): void;
24
+ export declare function appendGlobalMemory(content: string, cwd?: string): void;
25
+ export declare function saveProjectMemory(content: string, cwd?: string): void;
26
+ export declare function appendProjectMemory(content: string, cwd?: string): void;
27
+ export declare function savePlan(content: string, name?: string, cwd?: string): void;
28
+ export declare function appendHistory(message: Message, cwd?: string): void;
29
+ export interface MemoryStats {
30
+ globalMemory: boolean;
31
+ projectMemory: boolean;
32
+ planCount: number;
33
+ historyLines: number;
34
+ }
35
+ export declare function getStats(cwd?: string): MemoryStats;
36
+ export declare function clearProject(cwd?: string): void;
37
+ export declare function clearAll(cwd?: string): void;
38
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/memory/memory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAkB3C,wBAAgB,KAAK,CAAC,GAAG,GAAE,MAAsB;;;;;;EAahD;AAID,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAA0C;AAChG,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAA2C;AAClG,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAQxE;AAED,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjE;AAOD,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBhD;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,EAAE,CAc/D;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAItE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAErE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAIvE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAI3E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CASlE;AAID,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CASlD;AAID,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAED,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAI3C"}