@stan-chen/simple-cli 0.2.3 → 0.2.4

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 (136) hide show
  1. package/README.md +62 -63
  2. package/dist/anyllm.py +62 -0
  3. package/dist/builtins.d.ts +726 -0
  4. package/dist/builtins.js +481 -0
  5. package/dist/cli.d.ts +0 -4
  6. package/dist/cli.js +34 -493
  7. package/dist/engine.d.ts +33 -0
  8. package/dist/engine.js +138 -0
  9. package/dist/learnings.d.ts +15 -0
  10. package/dist/learnings.js +54 -0
  11. package/dist/llm.d.ts +18 -0
  12. package/dist/llm.js +66 -0
  13. package/dist/mcp.d.ts +132 -0
  14. package/dist/mcp.js +43 -0
  15. package/dist/skills.d.ts +5 -16
  16. package/dist/skills.js +91 -253
  17. package/dist/tui.d.ts +1 -0
  18. package/dist/tui.js +10 -0
  19. package/package.json +10 -6
  20. package/dist/claw/jit.d.ts +0 -5
  21. package/dist/claw/jit.js +0 -138
  22. package/dist/claw/management.d.ts +0 -3
  23. package/dist/claw/management.js +0 -107
  24. package/dist/commands/add.d.ts +0 -9
  25. package/dist/commands/add.js +0 -50
  26. package/dist/commands/git/commit.d.ts +0 -12
  27. package/dist/commands/git/commit.js +0 -98
  28. package/dist/commands/git/status.d.ts +0 -6
  29. package/dist/commands/git/status.js +0 -42
  30. package/dist/commands/index.d.ts +0 -16
  31. package/dist/commands/index.js +0 -377
  32. package/dist/commands/mcp/status.d.ts +0 -6
  33. package/dist/commands/mcp/status.js +0 -31
  34. package/dist/commands/swarm.d.ts +0 -36
  35. package/dist/commands/swarm.js +0 -236
  36. package/dist/commands.d.ts +0 -32
  37. package/dist/commands.js +0 -427
  38. package/dist/context.d.ts +0 -116
  39. package/dist/context.js +0 -337
  40. package/dist/index.d.ts +0 -6
  41. package/dist/index.js +0 -109
  42. package/dist/lib/agent.d.ts +0 -99
  43. package/dist/lib/agent.js +0 -313
  44. package/dist/lib/editor.d.ts +0 -74
  45. package/dist/lib/editor.js +0 -441
  46. package/dist/lib/git.d.ts +0 -164
  47. package/dist/lib/git.js +0 -356
  48. package/dist/lib/shim.d.ts +0 -4
  49. package/dist/lib/shim.js +0 -30
  50. package/dist/lib/ui.d.ts +0 -159
  51. package/dist/lib/ui.js +0 -277
  52. package/dist/mcp/client.d.ts +0 -22
  53. package/dist/mcp/client.js +0 -81
  54. package/dist/mcp/manager.d.ts +0 -186
  55. package/dist/mcp/manager.js +0 -446
  56. package/dist/prompts/provider.d.ts +0 -22
  57. package/dist/prompts/provider.js +0 -79
  58. package/dist/providers/index.d.ts +0 -31
  59. package/dist/providers/index.js +0 -93
  60. package/dist/providers/multi.d.ts +0 -12
  61. package/dist/providers/multi.js +0 -28
  62. package/dist/registry.d.ts +0 -29
  63. package/dist/registry.js +0 -443
  64. package/dist/repoMap.d.ts +0 -5
  65. package/dist/repoMap.js +0 -79
  66. package/dist/router.d.ts +0 -41
  67. package/dist/router.js +0 -118
  68. package/dist/swarm/coordinator.d.ts +0 -86
  69. package/dist/swarm/coordinator.js +0 -257
  70. package/dist/swarm/index.d.ts +0 -28
  71. package/dist/swarm/index.js +0 -29
  72. package/dist/swarm/task.d.ts +0 -104
  73. package/dist/swarm/task.js +0 -221
  74. package/dist/swarm/types.d.ts +0 -132
  75. package/dist/swarm/types.js +0 -37
  76. package/dist/swarm/worker.d.ts +0 -109
  77. package/dist/swarm/worker.js +0 -369
  78. package/dist/tools/analyzeFile.d.ts +0 -16
  79. package/dist/tools/analyzeFile.js +0 -43
  80. package/dist/tools/analyze_file.d.ts +0 -16
  81. package/dist/tools/analyze_file.js +0 -43
  82. package/dist/tools/clawBrain.d.ts +0 -23
  83. package/dist/tools/clawBrain.js +0 -136
  84. package/dist/tools/claw_brain.d.ts +0 -23
  85. package/dist/tools/claw_brain.js +0 -139
  86. package/dist/tools/deleteFile.d.ts +0 -19
  87. package/dist/tools/deleteFile.js +0 -36
  88. package/dist/tools/delete_file.d.ts +0 -19
  89. package/dist/tools/delete_file.js +0 -36
  90. package/dist/tools/fileOps.d.ts +0 -22
  91. package/dist/tools/fileOps.js +0 -43
  92. package/dist/tools/file_ops.d.ts +0 -22
  93. package/dist/tools/file_ops.js +0 -43
  94. package/dist/tools/git.d.ts +0 -40
  95. package/dist/tools/git.js +0 -236
  96. package/dist/tools/glob.d.ts +0 -34
  97. package/dist/tools/glob.js +0 -165
  98. package/dist/tools/grep.d.ts +0 -53
  99. package/dist/tools/grep.js +0 -296
  100. package/dist/tools/linter.d.ts +0 -35
  101. package/dist/tools/linter.js +0 -407
  102. package/dist/tools/listDir.d.ts +0 -29
  103. package/dist/tools/listDir.js +0 -50
  104. package/dist/tools/list_dir.d.ts +0 -29
  105. package/dist/tools/list_dir.js +0 -50
  106. package/dist/tools/memory.d.ts +0 -34
  107. package/dist/tools/memory.js +0 -215
  108. package/dist/tools/organizer.d.ts +0 -1
  109. package/dist/tools/organizer.js +0 -65
  110. package/dist/tools/readFiles.d.ts +0 -25
  111. package/dist/tools/readFiles.js +0 -31
  112. package/dist/tools/read_files.d.ts +0 -25
  113. package/dist/tools/read_files.js +0 -31
  114. package/dist/tools/reloadTools.d.ts +0 -11
  115. package/dist/tools/reloadTools.js +0 -22
  116. package/dist/tools/reload_tools.d.ts +0 -11
  117. package/dist/tools/reload_tools.js +0 -22
  118. package/dist/tools/runCommand.d.ts +0 -32
  119. package/dist/tools/runCommand.js +0 -79
  120. package/dist/tools/run_command.d.ts +0 -32
  121. package/dist/tools/run_command.js +0 -103
  122. package/dist/tools/scheduler.d.ts +0 -25
  123. package/dist/tools/scheduler.js +0 -65
  124. package/dist/tools/scraper.d.ts +0 -31
  125. package/dist/tools/scraper.js +0 -211
  126. package/dist/tools/writeFiles.d.ts +0 -63
  127. package/dist/tools/writeFiles.js +0 -87
  128. package/dist/tools/write_files.d.ts +0 -84
  129. package/dist/tools/write_files.js +0 -91
  130. package/dist/tools/write_to_file.d.ts +0 -15
  131. package/dist/tools/write_to_file.js +0 -21
  132. package/dist/ui/server.d.ts +0 -5
  133. package/dist/ui/server.js +0 -74
  134. package/dist/watcher.d.ts +0 -35
  135. package/dist/watcher.js +0 -164
  136. /package/{docs/assets → assets}/logo.jpeg +0 -0
@@ -1,28 +0,0 @@
1
- /**
2
- * Multi-Provider: Manages multiple LLM models for MoE routing via LiteLLM
3
- * Each tier can use a different model from any provider
4
- */
5
- import { createProviderForModel } from './index.js';
6
- // Create multi-provider system using LiteLLM
7
- export const createMultiProvider = (tierConfigs) => {
8
- const providerCache = new Map();
9
- const getProvider = (tier) => {
10
- const cached = providerCache.get(tier);
11
- if (cached)
12
- return cached;
13
- const config = tierConfigs.get(tier);
14
- if (!config) {
15
- throw new Error(`No configuration for tier ${tier}`);
16
- }
17
- const provider = createProviderForModel(config.model);
18
- providerCache.set(tier, provider);
19
- return provider;
20
- };
21
- return {
22
- getProvider,
23
- generateWithTier: async (tier, systemPrompt, messages) => {
24
- const provider = getProvider(tier);
25
- return provider.generateResponse(systemPrompt, messages);
26
- }
27
- };
28
- };
@@ -1,29 +0,0 @@
1
- /**
2
- * Tool Registry: Auto-imports tools from src/tools/, skills/, and scripts/
3
- * Supports built-in tools, MCP tools, and project-specific custom tools
4
- */
5
- import { z } from 'zod';
6
- export type Permission = 'read' | 'write' | 'execute';
7
- export interface Tool {
8
- name: string;
9
- description: string;
10
- permission: Permission;
11
- inputSchema: z.ZodType;
12
- execute: (args: Record<string, unknown>) => Promise<unknown>;
13
- source?: 'builtin' | 'mcp' | 'project';
14
- serverName?: string;
15
- specification?: string;
16
- }
17
- export type { Tool as ToolModule };
18
- /**
19
- * Parses a tool definition from a Markdown file (.md) or string
20
- * Supports YAML frontmatter as per OpenClaw PRD.
21
- */
22
- export declare function getMeta(content: string, filename: string): any;
23
- export declare const loadTools: () => Promise<Map<string, Tool>>;
24
- export declare const loadAllTools: () => Promise<Map<string, Tool>>;
25
- export declare const getToolDefinitions: (tools: Map<string, Tool>) => string;
26
- export declare const validateToolArgs: (tool: Tool, args: unknown) => {
27
- valid: boolean;
28
- error?: string;
29
- };
package/dist/registry.js DELETED
@@ -1,443 +0,0 @@
1
- /**
2
- * Tool Registry: Auto-imports tools from src/tools/, skills/, and scripts/
3
- * Supports built-in tools, MCP tools, and project-specific custom tools
4
- */
5
- import { readdir, readFile, stat } from 'fs/promises';
6
- import { spawn } from 'child_process';
7
- import { join, dirname, basename, extname } from 'path';
8
- import { fileURLToPath, pathToFileURL } from 'url';
9
- import { z } from 'zod';
10
- import { getMCPManager } from './mcp/manager.js';
11
- import YAML from 'yaml';
12
- const __dirname = dirname(fileURLToPath(import.meta.url));
13
- const TOOLS_DIR = join(__dirname, 'tools');
14
- /**
15
- * Extract documentation from the beginning of a file (comments)
16
- */
17
- function extractDocFromComments(content) {
18
- const lines = content.split('\n');
19
- let doc = '';
20
- let inDoc = false;
21
- for (const line of lines) {
22
- const trimmed = line.trim();
23
- if (trimmed.startsWith('/**') || trimmed.startsWith('"""')) {
24
- inDoc = true;
25
- continue;
26
- }
27
- if (inDoc && (trimmed.endsWith('*/') || trimmed.endsWith('"""'))) {
28
- inDoc = false;
29
- break;
30
- }
31
- if (inDoc) {
32
- doc += trimmed.replace(/^\* ?/, '') + '\n';
33
- }
34
- else if (trimmed.startsWith('//') || trimmed.startsWith('#')) {
35
- doc += trimmed.replace(/^(\/\/|#) ?/, '') + '\n';
36
- }
37
- else if (trimmed && !trimmed.startsWith('import') && !trimmed.startsWith('from')) {
38
- break;
39
- }
40
- }
41
- return doc.trim();
42
- }
43
- /**
44
- * Parses a tool definition from a Markdown file (.md) or string
45
- * Supports YAML frontmatter as per OpenClaw PRD.
46
- */
47
- export function getMeta(content, filename) {
48
- let meta = {
49
- name: basename(filename, extname(filename)),
50
- description: '',
51
- command: '',
52
- parameters: {},
53
- permission: 'execute'
54
- };
55
- // 1. Try YAML frontmatter (OpenClaw style)
56
- if (content.startsWith('---')) {
57
- const end = content.indexOf('---', 3);
58
- if (end > -1) {
59
- try {
60
- const yamlStr = content.slice(3, end);
61
- const yamlMeta = YAML.parse(yamlStr);
62
- if (yamlMeta) {
63
- return { ...meta, ...yamlMeta };
64
- }
65
- }
66
- catch {
67
- // Fall back to manual parsing if YAML fails
68
- }
69
- }
70
- }
71
- // 2. Fallback to manual Markdown section parsing
72
- const lines = content.split('\n');
73
- let currentSection = '';
74
- for (const line of lines) {
75
- if (line.startsWith('# ')) {
76
- meta.name = line.replace('# ', '').trim();
77
- }
78
- else if (line.startsWith('## ')) {
79
- currentSection = line.replace('## ', '').trim().toLowerCase();
80
- }
81
- else if (currentSection === 'command' && line.trim()) {
82
- meta.command = line.trim();
83
- }
84
- else if (currentSection === 'parameters' && line.trim().startsWith('- ')) {
85
- const match = line.match(/- (\w+): (\w+)(?: - (.+))?/);
86
- if (match) {
87
- meta.parameters[match[1]] = { type: match[2], description: match[3] || '' };
88
- }
89
- }
90
- else if (!currentSection && line.trim() && !line.startsWith('#')) {
91
- meta.description += line.trim() + ' ';
92
- }
93
- }
94
- meta.description = meta.description.trim();
95
- return meta;
96
- }
97
- // Helper to create a Tool from metadata (JSON or MD)
98
- function createScriptTool(meta, source, spec) {
99
- let inputSchema = z.object({}).passthrough();
100
- if (meta.parameters && typeof meta.parameters === 'object') {
101
- const shape = {};
102
- for (const [key, param] of Object.entries(meta.parameters)) {
103
- const p = param;
104
- let schema = z.string();
105
- if (p.type === 'number' || p === 'number')
106
- schema = z.number();
107
- else if (p.type === 'boolean' || p === 'boolean')
108
- schema = z.boolean();
109
- else if (p.type === 'array' || p === 'array')
110
- schema = z.array(z.any());
111
- else if (p.type === 'object' || p === 'object')
112
- schema = z.object({}).passthrough();
113
- if (typeof p === 'object' && p.description) {
114
- schema = schema.describe(p.description);
115
- }
116
- shape[key] = schema;
117
- }
118
- inputSchema = z.object(shape).passthrough();
119
- }
120
- return {
121
- name: meta.name,
122
- description: meta.description || `Script tool: ${meta.command}`,
123
- permission: meta.permission || 'execute',
124
- inputSchema,
125
- source,
126
- specification: spec,
127
- execute: async (args) => {
128
- return new Promise((resolve, reject) => {
129
- let finalCommand = meta.command;
130
- const isWindows = process.platform === 'win32';
131
- if (isWindows && finalCommand.endsWith('.ps1')) {
132
- finalCommand = `powershell -ExecutionPolicy Bypass -File ${finalCommand}`;
133
- }
134
- const env = { ...process.env, TOOL_INPUT: JSON.stringify(args) };
135
- // Pass arguments as INPUT_{NAME} for OpenClaw parity
136
- for (const [key, value] of Object.entries(args)) {
137
- env[`INPUT_${key.toUpperCase()}`] = typeof value === 'string' ? value : JSON.stringify(value);
138
- }
139
- const child = spawn(finalCommand, {
140
- shell: true,
141
- cwd: process.cwd(),
142
- env,
143
- });
144
- let stdout = '';
145
- let stderr = '';
146
- child.stdout?.on('data', (data) => stdout += data.toString());
147
- child.stderr?.on('data', (data) => stderr += data.toString());
148
- child.on('close', (code) => {
149
- if (code === 0)
150
- resolve(stdout.trim());
151
- else
152
- reject(new Error(`Exit ${code}: ${stderr.trim()}`));
153
- });
154
- child.stdin?.write(JSON.stringify(args));
155
- child.stdin?.end();
156
- });
157
- }
158
- };
159
- }
160
- /**
161
- * Recursively search for a documentation file (.md or .json) for a given tool name
162
- */
163
- async function findDocInDir(dir, baseName) {
164
- const files = await readdir(dir);
165
- for (const f of files) {
166
- if (basename(f, extname(f)) === baseName && (f.endsWith('.md') || f.endsWith('.json') || f.endsWith('.txt'))) {
167
- const content = await readFile(join(dir, f), 'utf-8');
168
- return { content, file: f };
169
- }
170
- }
171
- return null;
172
- }
173
- // Helper to load tools from a specific directory (recursive)
174
- async function loadToolsFromDir(dir, source) {
175
- const tools = new Map();
176
- try {
177
- const items = await readdir(dir);
178
- for (const item of items) {
179
- const fullPath = join(dir, item);
180
- const s = await stat(fullPath);
181
- if (s.isDirectory()) {
182
- // Recursive call for subdirectories
183
- const subTools = await loadToolsFromDir(fullPath, source);
184
- for (const [name, tool] of subTools) {
185
- tools.set(name, tool);
186
- }
187
- // Special case: Folder named ' heavy_lifting' might have 'heavy_lifting.md' inside it
188
- if (!tools.has(item)) {
189
- const doc = await findDocInDir(fullPath, item);
190
- if (doc && doc.file.endsWith('.md')) {
191
- const meta = getMeta(doc.content, doc.file);
192
- if (meta && meta.command) {
193
- tools.set(meta.name, createScriptTool(meta, source, doc.content));
194
- }
195
- }
196
- }
197
- continue;
198
- }
199
- const ext = extname(item);
200
- const base = basename(item, ext);
201
- // 1. Native Node tools
202
- if (ext === '.ts' || ext === '.js' || ext === '.mjs') {
203
- if (item.includes('.test.'))
204
- continue;
205
- try {
206
- // Peek at file content to see if it looks like a module with exports
207
- // This avoids executing scripts with top-level side effects during import
208
- const content = await readFile(fullPath, 'utf-8');
209
- if (!content.includes('export ')) {
210
- // Fall through to Case 2 (Generic Script)
211
- }
212
- else {
213
- const module = await import(pathToFileURL(fullPath).href);
214
- const toolDef = module.tool || module;
215
- if (toolDef.name && toolDef.execute) {
216
- const schema = toolDef.inputSchema || toolDef.schema;
217
- tools.set(toolDef.name, {
218
- name: toolDef.name,
219
- description: toolDef.description || 'No description',
220
- permission: toolDef.permission || 'read',
221
- inputSchema: schema || z.object({}),
222
- execute: toolDef.execute,
223
- source,
224
- });
225
- continue;
226
- }
227
- }
228
- }
229
- catch { /* might be a script, fall through */ }
230
- }
231
- // 2. Generic Script with internal docs or companion meta file
232
- if (ext !== '.md' && ext !== '.txt' && ext !== '.json') {
233
- try {
234
- const content = await readFile(fullPath, 'utf-8');
235
- const internalDoc = extractDocFromComments(content);
236
- // Check for companion meta file in the SAME directory
237
- const companion = await findDocInDir(dir, base);
238
- let meta = null;
239
- let specContent = internalDoc;
240
- if (companion) {
241
- if (companion.file.endsWith('.json')) {
242
- meta = JSON.parse(companion.content);
243
- }
244
- else {
245
- meta = getMeta(companion.content, companion.file);
246
- specContent = companion.content;
247
- }
248
- }
249
- else if (internalDoc) {
250
- meta = getMeta(internalDoc, item);
251
- if (!meta.command) {
252
- if (ext === '.py')
253
- meta.command = `python ${fullPath}`;
254
- else if (ext === '.sh')
255
- meta.command = `bash ${fullPath}`;
256
- else if (ext === '.ps1')
257
- meta.command = `powershell ${fullPath}`;
258
- else
259
- meta.command = fullPath;
260
- }
261
- }
262
- if (meta && meta.name && meta.command) {
263
- tools.set(meta.name, createScriptTool(meta, source, specContent));
264
- }
265
- }
266
- catch { /* skip errors */ }
267
- }
268
- // 3. Standalone Meta/Documentation Tools
269
- if (ext === '.json' || ext === '.md' || ext === '.txt') {
270
- if (Array.from(tools.values()).some(t => t.name === base))
271
- continue;
272
- try {
273
- const content = await readFile(fullPath, 'utf-8');
274
- let meta = null;
275
- if (ext === '.json') {
276
- meta = JSON.parse(content);
277
- }
278
- else {
279
- meta = getMeta(content, item);
280
- }
281
- if (meta && meta.name && meta.command) {
282
- tools.set(meta.name, createScriptTool(meta, source, content));
283
- }
284
- }
285
- catch { /* skip */ }
286
- }
287
- }
288
- }
289
- catch (error) {
290
- // Directory might not exist
291
- }
292
- return tools;
293
- }
294
- // Load all tools from the tools directory
295
- export const loadTools = async () => {
296
- const customDirs = ['skills', 'scripts', 'tools', '.simple-cli/tools'];
297
- const builtinTools = await loadToolsFromDir(TOOLS_DIR, 'builtin');
298
- const allProjectTools = new Map();
299
- // Local project dirs
300
- for (const d of customDirs) {
301
- const dirPath = join(process.cwd(), d);
302
- const tools = await loadToolsFromDir(dirPath, 'project');
303
- for (const [name, tool] of tools) {
304
- allProjectTools.set(name, tool);
305
- }
306
- }
307
- // Global OpenClaw skills (from PRD)
308
- const home = process.env.HOME || process.env.USERPROFILE || '';
309
- const globalClawDir = join(home, '.openclaw', 'workspace', 'skills');
310
- const globalTools = await loadToolsFromDir(globalClawDir, 'project');
311
- for (const [name, tool] of globalTools) {
312
- if (!allProjectTools.has(name)) {
313
- allProjectTools.set(name, tool);
314
- }
315
- }
316
- return new Map([...builtinTools, ...allProjectTools]);
317
- };
318
- // Load MCP tools and merge with built-in tools
319
- export const loadAllTools = async () => {
320
- const tools = await loadTools();
321
- try {
322
- const mcpManager = getMCPManager();
323
- const mcpTools = mcpManager.getAllTools();
324
- for (const mcpTool of mcpTools) {
325
- const toolName = `mcp_${mcpTool.serverName}_${mcpTool.name}`;
326
- tools.set(toolName, {
327
- name: toolName,
328
- description: mcpTool.description,
329
- permission: 'execute',
330
- inputSchema: z.object(mcpTool.inputSchema).passthrough(),
331
- execute: mcpTool.execute,
332
- source: 'mcp',
333
- serverName: mcpTool.serverName,
334
- });
335
- }
336
- }
337
- catch {
338
- // MCP not configured, skip
339
- }
340
- return tools;
341
- };
342
- // Get tool definitions for LLM prompt
343
- export const getToolDefinitions = (tools) => {
344
- const sections = [];
345
- const builtinTools = [];
346
- const projectTools = [];
347
- const mcpTools = [];
348
- const isClaw = process.argv.includes('--claw') || process.argv.includes('-claw');
349
- for (const tool of tools.values()) {
350
- if (tool.source === 'mcp') {
351
- mcpTools.push(tool);
352
- }
353
- else if (tool.source === 'project') {
354
- projectTools.push(tool);
355
- }
356
- else {
357
- builtinTools.push(tool);
358
- }
359
- }
360
- if (builtinTools.length > 0) {
361
- sections.push('## Built-in Tools\n');
362
- for (const tool of builtinTools) {
363
- sections.push(formatToolDefinition(tool));
364
- }
365
- }
366
- if (projectTools.length > 0) {
367
- sections.push('\n## Project Skills (Custom Tools)\n');
368
- for (const tool of projectTools) {
369
- sections.push(formatToolDefinition(tool));
370
- }
371
- }
372
- if (mcpTools.length > 0) {
373
- sections.push('\n## MCP Tools\n');
374
- for (const tool of mcpTools) {
375
- sections.push(formatToolDefinition(tool));
376
- }
377
- }
378
- return sections.join('\n');
379
- };
380
- // Format a single tool definition
381
- function formatToolDefinition(tool) {
382
- const lines = [
383
- `### ${tool.name}`,
384
- tool.description,
385
- `Permission: ${tool.permission}`,
386
- ];
387
- if (tool.serverName) {
388
- lines.push(`Server: ${tool.serverName}`);
389
- }
390
- // Extract parameters from schema
391
- if (tool.inputSchema && 'shape' in tool.inputSchema) {
392
- const shape = tool.inputSchema.shape;
393
- const params = Object.entries(shape)
394
- .map(([key, value]) => {
395
- const zodType = value;
396
- const description = zodType.description || '';
397
- const typeName = getTypeName(zodType);
398
- const optional = zodType.isOptional() ? '?' : '';
399
- return ` - ${key}${optional}: ${typeName}${description ? ` - ${description}` : ''}`;
400
- })
401
- .join('\n');
402
- if (params) {
403
- lines.push('Parameters:');
404
- lines.push(params);
405
- }
406
- }
407
- return lines.join('\n') + '\n';
408
- }
409
- // Get human-readable type name from Zod type
410
- function getTypeName(zodType) {
411
- const def = zodType._def;
412
- if (def.typeName === 'ZodString')
413
- return 'string';
414
- if (def.typeName === 'ZodNumber')
415
- return 'number';
416
- if (def.typeName === 'ZodBoolean')
417
- return 'boolean';
418
- if (def.typeName === 'ZodArray')
419
- return 'array';
420
- if (def.typeName === 'ZodObject')
421
- return 'object';
422
- if (def.typeName === 'ZodEnum')
423
- return `enum(${def.values.join('|')})`;
424
- if (def.typeName === 'ZodOptional')
425
- return getTypeName(def.innerType);
426
- if (def.typeName === 'ZodDefault')
427
- return getTypeName(def.innerType);
428
- return def.typeName?.replace('Zod', '').toLowerCase() || 'unknown';
429
- }
430
- // Validate tool arguments
431
- export const validateToolArgs = (tool, args) => {
432
- try {
433
- tool.inputSchema.parse(args);
434
- return { valid: true };
435
- }
436
- catch (error) {
437
- if (error instanceof z.ZodError) {
438
- const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`);
439
- return { valid: false, error: messages.join('; ') };
440
- }
441
- return { valid: false, error: String(error) };
442
- }
443
- };
package/dist/repoMap.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /**
2
- * RepoMap: Symbol-aware context generation
3
- * Uses ts-morph for TypeScript/JavaScript and simple parsing for others.
4
- */
5
- export declare const generateRepoMap: (rootDir?: string) => Promise<string>;
package/dist/repoMap.js DELETED
@@ -1,79 +0,0 @@
1
- /**
2
- * RepoMap: Symbol-aware context generation
3
- * Uses ts-morph for TypeScript/JavaScript and simple parsing for others.
4
- */
5
- import { Project, ScriptTarget } from 'ts-morph';
6
- import { readdir, readFile } from 'fs/promises';
7
- import { join, extname, relative } from 'path';
8
- const IGNORED_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage']);
9
- const TS_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
10
- export const generateRepoMap = async (rootDir = '.') => {
11
- const fileMaps = [];
12
- // Initialize ts-morph project
13
- const project = new Project({
14
- compilerOptions: { target: ScriptTarget.ESNext, allowJs: true },
15
- skipAddingFilesFromTsConfig: true,
16
- useInMemoryFileSystem: true // Don't actually load files until we say so
17
- });
18
- const stack = [rootDir];
19
- const validFiles = [];
20
- // 1. Walk directory to find files
21
- while (stack.length > 0) {
22
- const dir = stack.pop();
23
- try {
24
- const entries = await readdir(dir, { withFileTypes: true });
25
- for (const entry of entries) {
26
- if (IGNORED_DIRS.has(entry.name))
27
- continue;
28
- const fullPath = join(dir, entry.name);
29
- if (entry.isDirectory()) {
30
- stack.push(fullPath);
31
- }
32
- else if (entry.isFile()) {
33
- validFiles.push(fullPath);
34
- }
35
- }
36
- }
37
- catch { /* ignore access errors */ }
38
- }
39
- // 2. Process Files in parallel
40
- // Limit to 50 files for now to avoid context explosion
41
- const filesToProcess = validFiles.slice(0, 50);
42
- const results = await Promise.all(filesToProcess.map(async (filePath) => {
43
- const ext = extname(filePath);
44
- const relPath = relative(rootDir, filePath);
45
- if (TS_EXTENSIONS.has(ext)) {
46
- try {
47
- const content = await readFile(filePath, 'utf-8');
48
- const sourceFile = project.createSourceFile(filePath, content, { overwrite: true });
49
- const symbols = [];
50
- sourceFile.getClasses().forEach((c) => symbols.push(`class ${c.getName()}`));
51
- sourceFile.getFunctions().forEach((f) => symbols.push(`func ${f.getName()}`));
52
- sourceFile.getInterfaces().forEach((i) => symbols.push(`interface ${i.getName()}`));
53
- sourceFile.getTypeAliases().forEach((t) => symbols.push(`type ${t.getName()}`));
54
- sourceFile.getVariableStatements().forEach((v) => {
55
- v.getDeclarations().forEach((d) => symbols.push(`const ${d.getName()}`));
56
- });
57
- return { path: relPath, symbols };
58
- }
59
- catch (e) {
60
- return null;
61
- }
62
- }
63
- else {
64
- return { path: relPath, symbols: [] };
65
- }
66
- }));
67
- for (const res of results) {
68
- if (res)
69
- fileMaps.push(res);
70
- }
71
- if (fileMaps.length === 0)
72
- return 'No source files found.';
73
- return fileMaps.map(fm => {
74
- if (fm.symbols.length === 0)
75
- return `📄 ${fm.path}`;
76
- const syms = fm.symbols.map(s => ` ${s}`).join('\n');
77
- return `📄 ${fm.path}\n${syms}`;
78
- }).join('\n\n');
79
- };
package/dist/router.d.ts DELETED
@@ -1,41 +0,0 @@
1
- /**
2
- * MoE Router: Mix of Experts task routing
3
- * Routes tasks to appropriate model tiers based on complexity
4
- */
5
- import { z } from 'zod';
6
- export type Tier = 1 | 2 | 3 | 4 | 5;
7
- export interface TierConfig {
8
- tier: Tier;
9
- role: string;
10
- model: string;
11
- provider: 'openai' | 'anthropic' | 'gemini';
12
- }
13
- export interface RoutingDecision {
14
- tier: Tier;
15
- complexity: number;
16
- contextRequired: 'high' | 'low';
17
- risk: 'high' | 'low';
18
- reasoning: string;
19
- }
20
- export declare const RoutingResponseSchema: z.ZodObject<{
21
- complexity: z.ZodNumber;
22
- contextRequired: z.ZodEnum<["high", "low"]>;
23
- risk: z.ZodEnum<["high", "low"]>;
24
- recommendedTier: z.ZodNumber;
25
- reasoning: z.ZodString;
26
- }, "strip", z.ZodTypeAny, {
27
- complexity: number;
28
- contextRequired: "high" | "low";
29
- risk: "high" | "low";
30
- recommendedTier: number;
31
- reasoning: string;
32
- }, {
33
- complexity: number;
34
- contextRequired: "high" | "low";
35
- risk: "high" | "low";
36
- recommendedTier: number;
37
- reasoning: string;
38
- }>;
39
- export declare const loadTierConfig: () => Map<Tier, TierConfig>;
40
- export declare const routeTask: (task: string, orchestratorCall: (prompt: string) => Promise<string>) => Promise<RoutingDecision>;
41
- export declare const formatRoutingDecision: (decision: RoutingDecision, tiers: Map<Tier, TierConfig>) => string;