codebot-ai 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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/bin/codebot +5 -0
  4. package/dist/agent.d.ts +31 -0
  5. package/dist/agent.js +256 -0
  6. package/dist/banner.d.ts +19 -0
  7. package/dist/banner.js +148 -0
  8. package/dist/browser/cdp.d.ts +29 -0
  9. package/dist/browser/cdp.js +292 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +518 -0
  12. package/dist/context/manager.d.ts +27 -0
  13. package/dist/context/manager.js +139 -0
  14. package/dist/context/repo-map.d.ts +5 -0
  15. package/dist/context/repo-map.js +100 -0
  16. package/dist/history.d.ts +27 -0
  17. package/dist/history.js +146 -0
  18. package/dist/index.d.ts +13 -0
  19. package/dist/index.js +42 -0
  20. package/dist/memory.d.ts +39 -0
  21. package/dist/memory.js +168 -0
  22. package/dist/parser.d.ts +8 -0
  23. package/dist/parser.js +79 -0
  24. package/dist/providers/anthropic.d.ts +9 -0
  25. package/dist/providers/anthropic.js +288 -0
  26. package/dist/providers/index.d.ts +5 -0
  27. package/dist/providers/index.js +13 -0
  28. package/dist/providers/openai.d.ts +11 -0
  29. package/dist/providers/openai.js +173 -0
  30. package/dist/providers/registry.d.ts +15 -0
  31. package/dist/providers/registry.js +115 -0
  32. package/dist/setup.d.ts +17 -0
  33. package/dist/setup.js +243 -0
  34. package/dist/tools/browser.d.ts +43 -0
  35. package/dist/tools/browser.js +329 -0
  36. package/dist/tools/edit.d.ts +26 -0
  37. package/dist/tools/edit.js +73 -0
  38. package/dist/tools/execute.d.ts +26 -0
  39. package/dist/tools/execute.js +52 -0
  40. package/dist/tools/glob.d.ts +24 -0
  41. package/dist/tools/glob.js +102 -0
  42. package/dist/tools/grep.d.ts +29 -0
  43. package/dist/tools/grep.js +125 -0
  44. package/dist/tools/index.d.ts +10 -0
  45. package/dist/tools/index.js +49 -0
  46. package/dist/tools/memory.d.ts +36 -0
  47. package/dist/tools/memory.js +114 -0
  48. package/dist/tools/read.d.ts +26 -0
  49. package/dist/tools/read.js +75 -0
  50. package/dist/tools/think.d.ts +18 -0
  51. package/dist/tools/think.js +20 -0
  52. package/dist/tools/web-fetch.d.ts +36 -0
  53. package/dist/tools/web-fetch.js +83 -0
  54. package/dist/tools/write.d.ts +22 -0
  55. package/dist/tools/write.js +65 -0
  56. package/dist/types.d.ts +82 -0
  57. package/dist/types.js +3 -0
  58. package/package.json +57 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildRepoMap = buildRepoMap;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Build a lightweight repo map (~200-500 tokens) to give the model project awareness.
41
+ */
42
+ function buildRepoMap(rootDir) {
43
+ const lines = ['Project structure:'];
44
+ const maxFiles = 50;
45
+ let fileCount = 0;
46
+ const skip = new Set([
47
+ 'node_modules', '.git', 'dist', 'build', 'coverage',
48
+ '__pycache__', '.next', '.cache', '.codebot', '.venv', 'venv',
49
+ ]);
50
+ const walk = (dir, prefix, depth) => {
51
+ if (depth > 4 || fileCount > maxFiles)
52
+ return;
53
+ let entries;
54
+ try {
55
+ entries = fs.readdirSync(dir, { withFileTypes: true });
56
+ }
57
+ catch {
58
+ return;
59
+ }
60
+ entries.sort((a, b) => {
61
+ if (a.isDirectory() && !b.isDirectory())
62
+ return -1;
63
+ if (!a.isDirectory() && b.isDirectory())
64
+ return 1;
65
+ return a.name.localeCompare(b.name);
66
+ });
67
+ for (const entry of entries) {
68
+ if (skip.has(entry.name) || (entry.name.startsWith('.') && entry.name !== '.env.example'))
69
+ continue;
70
+ if (fileCount > maxFiles)
71
+ break;
72
+ const fullPath = path.join(dir, entry.name);
73
+ if (entry.isDirectory()) {
74
+ lines.push(`${prefix}${entry.name}/`);
75
+ walk(fullPath, prefix + ' ', depth + 1);
76
+ }
77
+ else {
78
+ fileCount++;
79
+ lines.push(`${prefix}${entry.name}`);
80
+ }
81
+ }
82
+ };
83
+ walk(rootDir, ' ', 0);
84
+ // Add key file info
85
+ const pkgPath = path.join(rootDir, 'package.json');
86
+ if (fs.existsSync(pkgPath)) {
87
+ try {
88
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
89
+ lines.push(`\npackage.json: ${pkg.name || 'unnamed'} v${pkg.version || '0.0.0'}`);
90
+ if (pkg.scripts) {
91
+ lines.push(` scripts: ${Object.keys(pkg.scripts).join(', ')}`);
92
+ }
93
+ }
94
+ catch {
95
+ // skip
96
+ }
97
+ }
98
+ return lines.join('\n');
99
+ }
100
+ //# sourceMappingURL=repo-map.js.map
@@ -0,0 +1,27 @@
1
+ import { Message } from './types';
2
+ export interface SessionMeta {
3
+ id: string;
4
+ model: string;
5
+ created: string;
6
+ updated: string;
7
+ messageCount: number;
8
+ preview: string;
9
+ }
10
+ export declare class SessionManager {
11
+ private sessionId;
12
+ private filePath;
13
+ private model;
14
+ constructor(model: string, sessionId?: string);
15
+ getId(): string;
16
+ /** Append a message to the session file */
17
+ save(message: Message): void;
18
+ /** Save all messages (overwrite) */
19
+ saveAll(messages: Message[]): void;
20
+ /** Load messages from a session file */
21
+ load(): Message[];
22
+ /** List recent sessions */
23
+ static list(limit?: number): SessionMeta[];
24
+ /** Get the most recent session ID */
25
+ static latest(): string | undefined;
26
+ }
27
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SessionManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const crypto = __importStar(require("crypto"));
41
+ const SESSIONS_DIR = path.join(os.homedir(), '.codebot', 'sessions');
42
+ class SessionManager {
43
+ sessionId;
44
+ filePath;
45
+ model;
46
+ constructor(model, sessionId) {
47
+ this.model = model;
48
+ this.sessionId = sessionId || crypto.randomUUID();
49
+ fs.mkdirSync(SESSIONS_DIR, { recursive: true });
50
+ this.filePath = path.join(SESSIONS_DIR, `${this.sessionId}.jsonl`);
51
+ }
52
+ getId() {
53
+ return this.sessionId;
54
+ }
55
+ /** Append a message to the session file */
56
+ save(message) {
57
+ const line = JSON.stringify({
58
+ ...message,
59
+ _ts: new Date().toISOString(),
60
+ _model: this.model,
61
+ });
62
+ fs.appendFileSync(this.filePath, line + '\n');
63
+ }
64
+ /** Save all messages (overwrite) */
65
+ saveAll(messages) {
66
+ const lines = messages.map(m => JSON.stringify({ ...m, _ts: new Date().toISOString(), _model: this.model }));
67
+ fs.writeFileSync(this.filePath, lines.join('\n') + '\n');
68
+ }
69
+ /** Load messages from a session file */
70
+ load() {
71
+ if (!fs.existsSync(this.filePath))
72
+ return [];
73
+ const content = fs.readFileSync(this.filePath, 'utf-8').trim();
74
+ if (!content)
75
+ return [];
76
+ return content.split('\n').map(line => {
77
+ const obj = JSON.parse(line);
78
+ delete obj._ts;
79
+ delete obj._model;
80
+ return obj;
81
+ });
82
+ }
83
+ /** List recent sessions */
84
+ static list(limit = 10) {
85
+ if (!fs.existsSync(SESSIONS_DIR))
86
+ return [];
87
+ const files = fs.readdirSync(SESSIONS_DIR)
88
+ .filter(f => f.endsWith('.jsonl'))
89
+ .map(f => {
90
+ const fullPath = path.join(SESSIONS_DIR, f);
91
+ const stat = fs.statSync(fullPath);
92
+ return { name: f, mtime: stat.mtime };
93
+ })
94
+ .sort((a, b) => b.mtime.getTime() - a.mtime.getTime())
95
+ .slice(0, limit);
96
+ return files.map(f => {
97
+ const id = f.name.replace('.jsonl', '');
98
+ const fullPath = path.join(SESSIONS_DIR, f.name);
99
+ const content = fs.readFileSync(fullPath, 'utf-8').trim();
100
+ const lines = content ? content.split('\n') : [];
101
+ let model = '';
102
+ let created = '';
103
+ let updated = '';
104
+ let preview = '';
105
+ if (lines.length > 0) {
106
+ try {
107
+ const first = JSON.parse(lines[0]);
108
+ created = first._ts || '';
109
+ model = first._model || '';
110
+ }
111
+ catch { /* skip */ }
112
+ try {
113
+ const last = JSON.parse(lines[lines.length - 1]);
114
+ updated = last._ts || '';
115
+ }
116
+ catch { /* skip */ }
117
+ // Find first user message for preview
118
+ for (const line of lines) {
119
+ try {
120
+ const msg = JSON.parse(line);
121
+ if (msg.role === 'user') {
122
+ preview = msg.content.substring(0, 80);
123
+ break;
124
+ }
125
+ }
126
+ catch { /* skip */ }
127
+ }
128
+ }
129
+ return {
130
+ id,
131
+ model,
132
+ created,
133
+ updated,
134
+ messageCount: lines.length,
135
+ preview,
136
+ };
137
+ });
138
+ }
139
+ /** Get the most recent session ID */
140
+ static latest() {
141
+ const sessions = SessionManager.list(1);
142
+ return sessions[0]?.id;
143
+ }
144
+ }
145
+ exports.SessionManager = SessionManager;
146
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1,13 @@
1
+ export { Agent } from './agent';
2
+ export { OpenAIProvider } from './providers/openai';
3
+ export { AnthropicProvider } from './providers/anthropic';
4
+ export { ToolRegistry } from './tools';
5
+ export { ContextManager } from './context/manager';
6
+ export { buildRepoMap } from './context/repo-map';
7
+ export { SessionManager } from './history';
8
+ export { MemoryManager } from './memory';
9
+ export { parseToolCalls } from './parser';
10
+ export { MODEL_REGISTRY, PROVIDER_DEFAULTS, getModelInfo, detectProvider } from './providers/registry';
11
+ export type { ModelInfo } from './providers/registry';
12
+ export * from './types';
13
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.detectProvider = exports.getModelInfo = exports.PROVIDER_DEFAULTS = exports.MODEL_REGISTRY = exports.parseToolCalls = exports.MemoryManager = exports.SessionManager = exports.buildRepoMap = exports.ContextManager = exports.ToolRegistry = exports.AnthropicProvider = exports.OpenAIProvider = exports.Agent = void 0;
18
+ var agent_1 = require("./agent");
19
+ Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_1.Agent; } });
20
+ var openai_1 = require("./providers/openai");
21
+ Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_1.OpenAIProvider; } });
22
+ var anthropic_1 = require("./providers/anthropic");
23
+ Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_1.AnthropicProvider; } });
24
+ var tools_1 = require("./tools");
25
+ Object.defineProperty(exports, "ToolRegistry", { enumerable: true, get: function () { return tools_1.ToolRegistry; } });
26
+ var manager_1 = require("./context/manager");
27
+ Object.defineProperty(exports, "ContextManager", { enumerable: true, get: function () { return manager_1.ContextManager; } });
28
+ var repo_map_1 = require("./context/repo-map");
29
+ Object.defineProperty(exports, "buildRepoMap", { enumerable: true, get: function () { return repo_map_1.buildRepoMap; } });
30
+ var history_1 = require("./history");
31
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return history_1.SessionManager; } });
32
+ var memory_1 = require("./memory");
33
+ Object.defineProperty(exports, "MemoryManager", { enumerable: true, get: function () { return memory_1.MemoryManager; } });
34
+ var parser_1 = require("./parser");
35
+ Object.defineProperty(exports, "parseToolCalls", { enumerable: true, get: function () { return parser_1.parseToolCalls; } });
36
+ var registry_1 = require("./providers/registry");
37
+ Object.defineProperty(exports, "MODEL_REGISTRY", { enumerable: true, get: function () { return registry_1.MODEL_REGISTRY; } });
38
+ Object.defineProperty(exports, "PROVIDER_DEFAULTS", { enumerable: true, get: function () { return registry_1.PROVIDER_DEFAULTS; } });
39
+ Object.defineProperty(exports, "getModelInfo", { enumerable: true, get: function () { return registry_1.getModelInfo; } });
40
+ Object.defineProperty(exports, "detectProvider", { enumerable: true, get: function () { return registry_1.detectProvider; } });
41
+ __exportStar(require("./types"), exports);
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,39 @@
1
+ export interface MemoryEntry {
2
+ key: string;
3
+ value: string;
4
+ source: 'user' | 'agent';
5
+ created: string;
6
+ }
7
+ /**
8
+ * Persistent memory system for CodeBot.
9
+ * Stores project-level and global notes that survive across sessions.
10
+ * Memory is injected into the system prompt so the model always has context.
11
+ */
12
+ export declare class MemoryManager {
13
+ private projectDir;
14
+ private globalDir;
15
+ constructor(projectRoot?: string);
16
+ /** Read the global memory file */
17
+ readGlobal(): string;
18
+ /** Read project-level memory */
19
+ readProject(): string;
20
+ /** Write to global memory */
21
+ writeGlobal(content: string): void;
22
+ /** Write to project memory */
23
+ writeProject(content: string): void;
24
+ /** Append an entry to global memory */
25
+ appendGlobal(entry: string): void;
26
+ /** Append an entry to project memory */
27
+ appendProject(entry: string): void;
28
+ /** Read all memory files from a directory */
29
+ private readDir;
30
+ /** Get all memory content formatted for system prompt injection */
31
+ getContextBlock(): string;
32
+ /** List all memory files */
33
+ list(): Array<{
34
+ scope: 'global' | 'project';
35
+ file: string;
36
+ size: number;
37
+ }>;
38
+ }
39
+ //# sourceMappingURL=memory.d.ts.map
package/dist/memory.js ADDED
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MemoryManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const MEMORY_DIR = path.join(os.homedir(), '.codebot', 'memory');
41
+ const GLOBAL_MEMORY = path.join(MEMORY_DIR, 'MEMORY.md');
42
+ /**
43
+ * Persistent memory system for CodeBot.
44
+ * Stores project-level and global notes that survive across sessions.
45
+ * Memory is injected into the system prompt so the model always has context.
46
+ */
47
+ class MemoryManager {
48
+ projectDir;
49
+ globalDir;
50
+ constructor(projectRoot) {
51
+ this.projectDir = projectRoot
52
+ ? path.join(projectRoot, '.codebot', 'memory')
53
+ : '';
54
+ this.globalDir = MEMORY_DIR;
55
+ fs.mkdirSync(this.globalDir, { recursive: true });
56
+ if (this.projectDir) {
57
+ fs.mkdirSync(this.projectDir, { recursive: true });
58
+ }
59
+ }
60
+ /** Read the global memory file */
61
+ readGlobal() {
62
+ if (fs.existsSync(GLOBAL_MEMORY)) {
63
+ return fs.readFileSync(GLOBAL_MEMORY, 'utf-8');
64
+ }
65
+ return '';
66
+ }
67
+ /** Read project-level memory */
68
+ readProject() {
69
+ if (!this.projectDir)
70
+ return '';
71
+ const memFile = path.join(this.projectDir, 'MEMORY.md');
72
+ if (fs.existsSync(memFile)) {
73
+ return fs.readFileSync(memFile, 'utf-8');
74
+ }
75
+ return '';
76
+ }
77
+ /** Write to global memory */
78
+ writeGlobal(content) {
79
+ fs.writeFileSync(GLOBAL_MEMORY, content);
80
+ }
81
+ /** Write to project memory */
82
+ writeProject(content) {
83
+ if (!this.projectDir)
84
+ return;
85
+ const memFile = path.join(this.projectDir, 'MEMORY.md');
86
+ fs.writeFileSync(memFile, content);
87
+ }
88
+ /** Append an entry to global memory */
89
+ appendGlobal(entry) {
90
+ const current = this.readGlobal();
91
+ const updated = current ? `${current.trimEnd()}\n\n${entry}` : entry;
92
+ this.writeGlobal(updated);
93
+ }
94
+ /** Append an entry to project memory */
95
+ appendProject(entry) {
96
+ if (!this.projectDir)
97
+ return;
98
+ const current = this.readProject();
99
+ const updated = current ? `${current.trimEnd()}\n\n${entry}` : entry;
100
+ this.writeProject(updated);
101
+ }
102
+ /** Read all memory files from a directory */
103
+ readDir(dir) {
104
+ const files = {};
105
+ if (!fs.existsSync(dir))
106
+ return files;
107
+ for (const name of fs.readdirSync(dir)) {
108
+ if (!name.endsWith('.md'))
109
+ continue;
110
+ files[name] = fs.readFileSync(path.join(dir, name), 'utf-8');
111
+ }
112
+ return files;
113
+ }
114
+ /** Get all memory content formatted for system prompt injection */
115
+ getContextBlock() {
116
+ const parts = [];
117
+ const global = this.readGlobal();
118
+ if (global.trim()) {
119
+ parts.push(`## Global Memory\n${global.trim()}`);
120
+ }
121
+ // Read additional global topic files
122
+ const globalFiles = this.readDir(this.globalDir);
123
+ for (const [name, content] of Object.entries(globalFiles)) {
124
+ if (name === 'MEMORY.md' || !content.trim())
125
+ continue;
126
+ parts.push(`## ${name.replace('.md', '')}\n${content.trim()}`);
127
+ }
128
+ const project = this.readProject();
129
+ if (project.trim()) {
130
+ parts.push(`## Project Memory\n${project.trim()}`);
131
+ }
132
+ // Read additional project topic files
133
+ if (this.projectDir) {
134
+ const projFiles = this.readDir(this.projectDir);
135
+ for (const [name, content] of Object.entries(projFiles)) {
136
+ if (name === 'MEMORY.md' || !content.trim())
137
+ continue;
138
+ parts.push(`## Project: ${name.replace('.md', '')}\n${content.trim()}`);
139
+ }
140
+ }
141
+ if (parts.length === 0)
142
+ return '';
143
+ return `\n\n--- Persistent Memory ---\n${parts.join('\n\n')}`;
144
+ }
145
+ /** List all memory files */
146
+ list() {
147
+ const result = [];
148
+ if (fs.existsSync(this.globalDir)) {
149
+ for (const name of fs.readdirSync(this.globalDir)) {
150
+ if (!name.endsWith('.md'))
151
+ continue;
152
+ const stat = fs.statSync(path.join(this.globalDir, name));
153
+ result.push({ scope: 'global', file: name, size: stat.size });
154
+ }
155
+ }
156
+ if (this.projectDir && fs.existsSync(this.projectDir)) {
157
+ for (const name of fs.readdirSync(this.projectDir)) {
158
+ if (!name.endsWith('.md'))
159
+ continue;
160
+ const stat = fs.statSync(path.join(this.projectDir, name));
161
+ result.push({ scope: 'project', file: name, size: stat.size });
162
+ }
163
+ }
164
+ return result;
165
+ }
166
+ }
167
+ exports.MemoryManager = MemoryManager;
168
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1,8 @@
1
+ import { ToolCall } from './types';
2
+ /**
3
+ * Parse tool calls from LLM text output.
4
+ * Used as fallback when models don't support native tool calling.
5
+ * Tries multiple formats: XML tags, code blocks, function notation.
6
+ */
7
+ export declare function parseToolCalls(text: string): ToolCall[];
8
+ //# sourceMappingURL=parser.d.ts.map
package/dist/parser.js ADDED
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseToolCalls = parseToolCalls;
4
+ const KNOWN_TOOLS = ['read_file', 'write_file', 'edit_file', 'execute', 'glob', 'grep', 'git', 'think'];
5
+ /**
6
+ * Parse tool calls from LLM text output.
7
+ * Used as fallback when models don't support native tool calling.
8
+ * Tries multiple formats: XML tags, code blocks, function notation.
9
+ */
10
+ function parseToolCalls(text) {
11
+ const calls = [];
12
+ let id = 0;
13
+ // Pattern 1: <tool_call>{"name": "...", "arguments": {...}}</tool_call>
14
+ const xmlPattern = /<tool_call>\s*([\s\S]*?)\s*<\/tool_call>/g;
15
+ let match;
16
+ while ((match = xmlPattern.exec(text)) !== null) {
17
+ try {
18
+ const parsed = JSON.parse(match[1]);
19
+ if (parsed.name) {
20
+ calls.push({
21
+ id: `call_${id++}`,
22
+ type: 'function',
23
+ function: {
24
+ name: parsed.name,
25
+ arguments: JSON.stringify(parsed.arguments || parsed.params || {}),
26
+ },
27
+ });
28
+ }
29
+ }
30
+ catch {
31
+ // skip malformed
32
+ }
33
+ }
34
+ if (calls.length > 0)
35
+ return calls;
36
+ // Pattern 2: ```tool_call\n{...}\n``` or ```json\n{...}\n```
37
+ const codeBlockPattern = /```(?:tool_call|json)?\s*\n\s*(\{[\s\S]*?\})\s*\n\s*```/g;
38
+ while ((match = codeBlockPattern.exec(text)) !== null) {
39
+ try {
40
+ const parsed = JSON.parse(match[1]);
41
+ if (parsed.name && (parsed.arguments || parsed.params)) {
42
+ calls.push({
43
+ id: `call_${id++}`,
44
+ type: 'function',
45
+ function: {
46
+ name: parsed.name,
47
+ arguments: JSON.stringify(parsed.arguments || parsed.params || {}),
48
+ },
49
+ });
50
+ }
51
+ }
52
+ catch {
53
+ // skip malformed
54
+ }
55
+ }
56
+ if (calls.length > 0)
57
+ return calls;
58
+ // Pattern 3: tool_name({"arg": "value"})
59
+ const toolNames = KNOWN_TOOLS.join('|');
60
+ const funcPattern = new RegExp(`\\b(${toolNames})\\s*\\(\\s*(\\{[\\s\\S]*?\\})\\s*\\)`, 'g');
61
+ while ((match = funcPattern.exec(text)) !== null) {
62
+ try {
63
+ const args = JSON.parse(match[2]);
64
+ calls.push({
65
+ id: `call_${id++}`,
66
+ type: 'function',
67
+ function: {
68
+ name: match[1],
69
+ arguments: JSON.stringify(args),
70
+ },
71
+ });
72
+ }
73
+ catch {
74
+ // skip malformed
75
+ }
76
+ }
77
+ return calls;
78
+ }
79
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1,9 @@
1
+ import { LLMProvider, Message, ToolSchema, StreamEvent, ProviderConfig } from '../types';
2
+ export declare class AnthropicProvider implements LLMProvider {
3
+ name: string;
4
+ private config;
5
+ constructor(config: ProviderConfig);
6
+ chat(messages: Message[], tools?: ToolSchema[]): AsyncGenerator<StreamEvent>;
7
+ private convertMessages;
8
+ }
9
+ //# sourceMappingURL=anthropic.d.ts.map