@console-agent/agent 1.1.0 → 1.2.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/README.md +2 -2
- package/dist/index.cjs +95 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +95 -4
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -210,6 +210,31 @@ function detectPersona(prompt, defaultPersona) {
|
|
|
210
210
|
function getPersona(name) {
|
|
211
211
|
return personas[name];
|
|
212
212
|
}
|
|
213
|
+
|
|
214
|
+
// src/tools/index.ts
|
|
215
|
+
var TOOLS_MIN_TIMEOUT = 3e4;
|
|
216
|
+
function resolveTools(tools, google) {
|
|
217
|
+
const resolved = {};
|
|
218
|
+
for (const tool of tools) {
|
|
219
|
+
const name = typeof tool === "string" ? tool : tool.type;
|
|
220
|
+
const config2 = typeof tool === "object" ? tool.config : void 0;
|
|
221
|
+
switch (name) {
|
|
222
|
+
case "google_search":
|
|
223
|
+
resolved["google_search"] = google.tools.googleSearch(config2 ?? {});
|
|
224
|
+
break;
|
|
225
|
+
case "code_execution":
|
|
226
|
+
resolved["code_execution"] = google.tools.codeExecution(config2 ?? {});
|
|
227
|
+
break;
|
|
228
|
+
case "url_context":
|
|
229
|
+
resolved["url_context"] = google.tools.urlContext({});
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return resolved;
|
|
234
|
+
}
|
|
235
|
+
function hasExplicitTools(options) {
|
|
236
|
+
return !!(options?.tools && options.tools.length > 0);
|
|
237
|
+
}
|
|
213
238
|
var currentLogLevel = "info";
|
|
214
239
|
function setLogLevel(level) {
|
|
215
240
|
currentLogLevel = level;
|
|
@@ -334,6 +359,11 @@ var agentOutputSchema = ai.jsonSchema({
|
|
|
334
359
|
required: ["success", "summary", "data", "actions", "confidence"],
|
|
335
360
|
additionalProperties: false
|
|
336
361
|
});
|
|
362
|
+
var JSON_RESPONSE_INSTRUCTION = `
|
|
363
|
+
|
|
364
|
+
IMPORTANT: You MUST respond with ONLY a valid JSON object (no markdown, no code fences, no extra text).
|
|
365
|
+
Use this exact format:
|
|
366
|
+
{"success": true, "summary": "one-line conclusion", "reasoning": "your thought process", "data": {"result": "primary finding"}, "actions": ["tools/steps used"], "confidence": 0.95}`;
|
|
337
367
|
async function callGoogle(prompt, context, persona, config2, options) {
|
|
338
368
|
const startTime = Date.now();
|
|
339
369
|
const modelName = options?.model ?? config2.model;
|
|
@@ -355,10 +385,71 @@ async function callGoogle(prompt, context, persona, config2, options) {
|
|
|
355
385
|
if (Object.keys(googleOpts).length > 0) {
|
|
356
386
|
providerOptions["google"] = googleOpts;
|
|
357
387
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
logDebug(
|
|
388
|
+
const useTools = hasExplicitTools(options) && !config2.localOnly;
|
|
389
|
+
if (useTools) {
|
|
390
|
+
logDebug("Tools requested \u2014 using generateText path (no structured output)");
|
|
391
|
+
return callWithTools(prompt, context, persona, config2, options, google$1, modelName, startTime, providerOptions);
|
|
361
392
|
}
|
|
393
|
+
logDebug("No tools \u2014 using ToolLoopAgent with structured output");
|
|
394
|
+
return callWithStructuredOutput(prompt, context, persona, config2, options, google$1, modelName, startTime, providerOptions);
|
|
395
|
+
}
|
|
396
|
+
async function callWithTools(prompt, context, persona, config2, options, google, modelName, startTime, providerOptions) {
|
|
397
|
+
const resolvedTools = resolveTools(options.tools, google);
|
|
398
|
+
const toolNames = Object.keys(resolvedTools);
|
|
399
|
+
logDebug(`Tools enabled: ${toolNames.join(", ")}`);
|
|
400
|
+
const effectiveTimeout = Math.max(config2.timeout, TOOLS_MIN_TIMEOUT);
|
|
401
|
+
const userMessage = context ? `${prompt}
|
|
402
|
+
|
|
403
|
+
--- Context ---
|
|
404
|
+
${context}` : prompt;
|
|
405
|
+
const result = await ai.generateText({
|
|
406
|
+
model: google(modelName),
|
|
407
|
+
system: persona.systemPrompt + JSON_RESPONSE_INSTRUCTION,
|
|
408
|
+
prompt: userMessage,
|
|
409
|
+
tools: resolvedTools,
|
|
410
|
+
stopWhen: ai.stepCountIs(5),
|
|
411
|
+
// Allow multi-step: tool invocation → response
|
|
412
|
+
maxOutputTokens: config2.budget.maxTokensPerCall,
|
|
413
|
+
providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : void 0,
|
|
414
|
+
abortSignal: AbortSignal.timeout(effectiveTimeout)
|
|
415
|
+
});
|
|
416
|
+
const latencyMs = Date.now() - startTime;
|
|
417
|
+
const tokensUsed = result.usage?.totalTokens ?? 0;
|
|
418
|
+
logDebug(`Response received (tools path): ${latencyMs}ms, ${tokensUsed} tokens`);
|
|
419
|
+
const collectedToolCalls = [];
|
|
420
|
+
if (result.steps) {
|
|
421
|
+
for (const step of result.steps) {
|
|
422
|
+
if (step.toolCalls) {
|
|
423
|
+
for (const tc of step.toolCalls) {
|
|
424
|
+
collectedToolCalls.push({
|
|
425
|
+
name: tc.toolName,
|
|
426
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
427
|
+
args: tc.args ?? {},
|
|
428
|
+
result: tc.toolName
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
logDebug(`Tool calls collected: ${collectedToolCalls.length}`);
|
|
435
|
+
const parsed = parseResponse(result.text);
|
|
436
|
+
return {
|
|
437
|
+
success: parsed?.success ?? true,
|
|
438
|
+
summary: parsed?.summary ?? result.text.substring(0, 200),
|
|
439
|
+
reasoning: parsed?.reasoning,
|
|
440
|
+
data: parsed?.data ?? { raw: result.text },
|
|
441
|
+
actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),
|
|
442
|
+
confidence: parsed?.confidence ?? 0.5,
|
|
443
|
+
metadata: {
|
|
444
|
+
model: modelName,
|
|
445
|
+
tokensUsed,
|
|
446
|
+
latencyMs,
|
|
447
|
+
toolCalls: collectedToolCalls,
|
|
448
|
+
cached: false
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
async function callWithStructuredOutput(prompt, context, persona, config2, options, google, modelName, startTime, providerOptions) {
|
|
362
453
|
const userMessage = context ? `${prompt}
|
|
363
454
|
|
|
364
455
|
--- Context ---
|
|
@@ -379,7 +470,7 @@ ${context}` : prompt;
|
|
|
379
470
|
outputConfig = ai.Output.object({ schema: agentOutputSchema });
|
|
380
471
|
}
|
|
381
472
|
const agent = new ai.ToolLoopAgent({
|
|
382
|
-
model: google
|
|
473
|
+
model: google(modelName),
|
|
383
474
|
instructions: useCustomSchema ? `${persona.systemPrompt}
|
|
384
475
|
|
|
385
476
|
IMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields \u2014 just return the data matching the schema.` : persona.systemPrompt,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/personas/debugger.ts","../src/personas/security.ts","../src/personas/architect.ts","../src/personas/general.ts","../src/personas/index.ts","../src/utils/format.ts","../src/providers/google.ts","../src/utils/anonymize.ts","../src/utils/rate-limit.ts","../src/utils/budget.ts","../src/agent.ts","../src/index.ts"],"names":["ora","chalk","jsonSchema","config","google","createGoogleGenerativeAI","Output","ToolLoopAgent"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PersonaDefinition } from '../types.js';\n\nexport const debuggerPersona: PersonaDefinition = {\n name: 'debugger',\n icon: '🐛',\n label: 'Debugging',\n systemPrompt: `You are a senior debugging expert and performance engineer.\n\nYour role:\n- Analyze errors, stack traces, exceptions, and performance issues\n- Identify root causes with high confidence\n- Provide concrete fixes with code examples\n- Suggest preventive measures\n\nOutput format:\n- Start with a one-line summary of the issue\n- Explain the root cause clearly\n- Provide a concrete fix (with code if applicable)\n- Rate severity: LOW / MEDIUM / HIGH / CRITICAL\n- Include confidence score (0-1)\n\nAlways be concise, technical, and actionable. No fluff.`,\n defaultTools: ['code_execution', 'google_search'],\n keywords: [\n 'slow', 'perf', 'performance', 'optimize', 'optimization',\n 'debug', 'error', 'bug', 'crash', 'exception', 'stack',\n 'trace', 'memory', 'leak', 'timeout', 'latency', 'bottleneck',\n 'hang', 'freeze', 'deadlock', 'race condition',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const securityPersona: PersonaDefinition = {\n name: 'security',\n icon: '🛡️',\n label: 'Security audit',\n systemPrompt: `You are an OWASP security expert and penetration testing specialist.\n\nYour role:\n- Audit code and inputs for vulnerabilities (SQL injection, XSS, CSRF, SSRF, etc.)\n- Flag security risks immediately with severity ratings\n- Check for known CVEs in dependencies\n- Recommend secure coding practices\n\nOutput format:\n- Start with overall risk level: SAFE / LOW RISK / MEDIUM RISK / HIGH RISK / CRITICAL\n- List each vulnerability found with:\n - Type (e.g., SQL Injection, XSS)\n - Location (where in the code/input)\n - Impact (what an attacker could do)\n - Fix (concrete remediation)\n- Include confidence score (0-1)\n\nBe thorough, explicit about risks, and always err on the side of caution.`,\n defaultTools: ['google_search'],\n keywords: [\n 'security', 'vuln', 'vulnerability', 'exploit', 'injection',\n 'xss', 'csrf', 'ssrf', 'sql injection', 'auth', 'authentication',\n 'authorization', 'permission', 'privilege', 'escalation',\n 'sanitize', 'escape', 'encrypt', 'decrypt', 'hash', 'token',\n 'secret', 'api key', 'password', 'credential', 'owasp', 'cve',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const architectPersona: PersonaDefinition = {\n name: 'architect',\n icon: '🏗️',\n label: 'Architecture review',\n systemPrompt: `You are a principal software engineer and system architect.\n\nYour role:\n- Review system design, API design, and code architecture\n- Evaluate scalability, maintainability, and performance characteristics\n- Identify design pattern opportunities and anti-patterns\n- Suggest architectural improvements with trade-off analysis\n\nOutput format:\n- Start with an overall assessment: SOLID / NEEDS IMPROVEMENT / SIGNIFICANT CONCERNS\n- List strengths of the current design\n- List concerns with severity and impact\n- Provide concrete recommendations with:\n - What to change\n - Why (trade-offs)\n - How (implementation guidance)\n- Include confidence score (0-1)\n\nThink like a senior architect reviewing a design doc. Be constructive, not pedantic.`,\n defaultTools: ['google_search', 'file_analysis'],\n keywords: [\n 'design', 'architecture', 'architect', 'pattern', 'scalab',\n 'microservice', 'monolith', 'api design', 'schema', 'database',\n 'system design', 'infrastructure', 'deploy', 'ci/cd', 'pipeline',\n 'refactor', 'modular', 'coupling', 'cohesion', 'solid',\n 'clean architecture', 'domain driven', 'event driven',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const generalPersona: PersonaDefinition = {\n name: 'general',\n icon: '🔍',\n label: 'Analyzing',\n systemPrompt: `You are a helpful senior full-stack engineer with broad expertise.\n\nYour role:\n- Provide actionable advice on any technical topic\n- Analyze code, data, configurations, and systems\n- Validate inputs, schemas, and data integrity\n- Answer questions with practical, real-world guidance\n\nOutput format:\n- Start with a clear, one-line answer or summary\n- Provide supporting details and reasoning\n- Include code examples when relevant\n- List any caveats or edge cases\n- Include confidence score (0-1)\n\nBe balanced, practical, and concise. Prioritize actionable insights over theory.`,\n defaultTools: ['code_execution', 'google_search', 'file_analysis'],\n keywords: [], // General catches everything not matched by specific personas\n};\n","import type { PersonaDefinition, PersonaName } from '../types.js';\nimport { debuggerPersona } from './debugger.js';\nimport { securityPersona } from './security.js';\nimport { architectPersona } from './architect.js';\nimport { generalPersona } from './general.js';\n\nexport const personas: Record<PersonaName, PersonaDefinition> = {\n debugger: debuggerPersona,\n security: securityPersona,\n architect: architectPersona,\n general: generalPersona,\n};\n\n/**\n * Auto-detect the best persona based on keywords in the prompt.\n * Returns the explicitly set persona if provided, otherwise scans for keywords.\n */\nexport function detectPersona(prompt: string, defaultPersona: PersonaName): PersonaDefinition {\n const lower = prompt.toLowerCase();\n\n // Check specific personas in priority order (security > debugger > architect)\n for (const name of ['security', 'debugger', 'architect'] as PersonaName[]) {\n const persona = personas[name];\n if (persona.keywords.some((kw) => lower.includes(kw))) {\n return persona;\n }\n }\n\n return personas[defaultPersona];\n}\n\nexport function getPersona(name: PersonaName): PersonaDefinition {\n return personas[name];\n}\n","/**\n * Console formatting — rich output with colors, icons, and tree structure.\n * Uses chalk for colors and ora for spinners.\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport type { AgentResult, PersonaDefinition, LogLevel } from '../types.js';\n\nlet currentLogLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel): void {\n currentLogLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['silent', 'errors', 'info', 'debug'];\n return levels.indexOf(currentLogLevel) >= levels.indexOf(level);\n}\n\n// ─── Spinner Management ──────────────────────────────────────────────────────\n\nexport function startSpinner(persona: PersonaDefinition, prompt: string): Ora | null {\n if (!shouldLog('info')) return null;\n\n const truncated = prompt.length > 60 ? prompt.substring(0, 57) + '...' : prompt;\n const spinner = ora({\n text: chalk.cyan(`${persona.icon} ${persona.label}... `) + chalk.dim(truncated),\n prefixText: chalk.gray('[AGENT]'),\n }).start();\n\n return spinner;\n}\n\nexport function stopSpinner(spinner: Ora | null, success: boolean): void {\n if (!spinner) return;\n\n if (success) {\n spinner.succeed();\n } else {\n spinner.fail();\n }\n}\n\n// ─── Result Formatting ──────────────────────────────────────────────────────\n\nexport function formatResult(result: AgentResult, persona: PersonaDefinition): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n const confidenceColor = result.confidence >= 0.8 ? chalk.green : result.confidence >= 0.5 ? chalk.yellow : chalk.red;\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.bold(persona.label)} Complete`);\n console.log(`${prefix} ├─ ${statusIcon} ${chalk.white(result.summary)}`);\n\n // Show actions/tools used\n if (result.actions.length > 0) {\n for (let i = 0; i < result.actions.length; i++) {\n const connector = i < result.actions.length - 1 ? '├─' : '├─';\n console.log(`${prefix} ${connector} ${chalk.dim('Tool:')} ${chalk.cyan(result.actions[i])}`);\n }\n }\n\n // Show key data points\n const dataEntries = Object.entries(result.data);\n if (dataEntries.length > 0) {\n for (const [key, value] of dataEntries) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${prefix} ├─ ${chalk.dim(key + ':')} ${chalk.white(displayValue)}`);\n }\n }\n\n // Show reasoning if available\n if (result.reasoning) {\n const reasoningLines = result.reasoning.split('\\n').slice(0, 3);\n console.log(`${prefix} ├─ ${chalk.dim('Reasoning:')}`);\n for (const line of reasoningLines) {\n console.log(`${prefix} │ ${chalk.dim(line.trim())}`);\n }\n }\n\n // Footer with metadata\n const confidence = confidenceColor(`confidence: ${result.confidence.toFixed(2)}`);\n const latency = chalk.dim(`${result.metadata.latencyMs}ms`);\n const tokens = chalk.dim(`${result.metadata.tokensUsed} tokens`);\n const cached = result.metadata.cached ? chalk.green(' (cached)') : '';\n\n console.log(`${prefix} └─ ${confidence} | ${latency} | ${tokens}${cached}`);\n console.log('');\n}\n\n// ─── Error Formatting ────────────────────────────────────────────────────────\n\nexport function formatError(error: Error, persona: PersonaDefinition): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.red('Error:')} ${error.message}`);\n if (shouldLog('debug') && error.stack) {\n console.log(`${prefix} ${chalk.dim(error.stack)}`);\n }\n console.log('');\n}\n\n// ─── Budget Warning ──────────────────────────────────────────────────────────\n\nexport function formatBudgetWarning(reason: string): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Budget limit:')} ${reason}`);\n}\n\n// ─── Rate Limit Warning ─────────────────────────────────────────────────────\n\nexport function formatRateLimitWarning(): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Rate limited:')} Too many calls. Try again later.`);\n}\n\n// ─── Dry Run ─────────────────────────────────────────────────────────────────\n\nexport function formatDryRun(prompt: string, persona: PersonaDefinition, context?: unknown): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${chalk.magenta('DRY RUN')} ${persona.icon} ${persona.label}`);\n console.log(`${prefix} ├─ ${chalk.dim('Persona:')} ${persona.name}`);\n console.log(`${prefix} ├─ ${chalk.dim('Prompt:')} ${prompt}`);\n if (context !== undefined) {\n const contextStr = typeof context === 'string' ? context : JSON.stringify(context, null, 2);\n const lines = contextStr.split('\\n').slice(0, 5);\n console.log(`${prefix} ├─ ${chalk.dim('Context:')}`);\n for (const line of lines) {\n console.log(`${prefix} │ ${chalk.dim(line)}`);\n }\n }\n console.log(`${prefix} └─ ${chalk.dim('(No API call made)')}`);\n console.log('');\n}\n\n// ─── Debug logging ───────────────────────────────────────────────────────────\n\nexport function logDebug(message: string): void {\n if (!shouldLog('debug')) return;\n console.log(`${chalk.gray('[AGENT DEBUG]')} ${chalk.dim(message)}`);\n}\n","/**\n * Google AI provider — integrates with Gemini via @ai-sdk/google + Vercel AI SDK.\n * Uses ToolLoopAgent for multi-step reasoning with structured output.\n * This is the only provider in v1.0.\n */\n\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { ToolLoopAgent, Output, jsonSchema } from 'ai';\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaDefinition, ToolCall } from '../types.js';\nimport { logDebug } from '../utils/format.js';\nimport { z } from 'zod';\n\n// ─── Structured Output Schema (JSON Schema compatible with Gemini) ───────────\n// Gemini requires OBJECT types to have non-empty `properties`.\n// We define a `result` property inside `data` to satisfy this constraint.\n\nconst agentOutputSchema = jsonSchema({\n type: 'object' as const,\n properties: {\n success: { type: 'boolean' as const, description: 'Whether the task was completed successfully' },\n summary: { type: 'string' as const, description: 'One-line human-readable conclusion' },\n reasoning: { type: 'string' as const, description: 'Your thought process' },\n data: {\n type: 'object' as const,\n description: 'Structured findings as key-value pairs',\n properties: {\n result: { type: 'string' as const, description: 'Primary result or finding' },\n },\n additionalProperties: true,\n },\n actions: { type: 'array' as const, items: { type: 'string' as const }, description: 'List of tools/steps you used' },\n confidence: { type: 'number' as const, minimum: 0, maximum: 1, description: '0-1 confidence score' },\n },\n required: ['success', 'summary', 'data', 'actions', 'confidence'] as const,\n additionalProperties: false,\n});\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport async function callGoogle(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n const startTime = Date.now();\n const modelName = options?.model ?? config.model;\n\n logDebug(`Using model: ${modelName}`);\n logDebug(`Persona: ${persona.name}`);\n\n // Create Google AI provider instance\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n });\n\n // Build provider options for thinking config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerOptions: Record<string, any> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const googleOpts: Record<string, any> = {};\n\n // Add thinking config if specified\n if (options?.thinking) {\n const thinking = options.thinking;\n if (thinking.budget !== undefined) {\n googleOpts['thinkingConfig'] = { thinkingBudget: thinking.budget };\n } else if (thinking.level) {\n googleOpts['thinkingConfig'] = { thinkingLevel: thinking.level };\n }\n }\n\n if (Object.keys(googleOpts).length > 0) {\n providerOptions['google'] = googleOpts;\n }\n\n // Note: Gemini's built-in tools (code_execution, google_search) are\n // incompatible with structured JSON output (response_mime_type: application/json).\n // Since structured output is essential for AgentResult, we skip built-in tools\n // and rely on the model's knowledge + structured output instead.\n if (!config.localOnly) {\n const toolNames = options?.tools ?? persona.defaultTools;\n logDebug(`Persona tools (informational): ${toolNames.join(', ')}`);\n }\n\n // Build the user message with context\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n // Collect tool calls across steps\n const collectedToolCalls: ToolCall[] = [];\n\n // ─── Determine output schema ─────────────────────────────────────────────\n // Priority: options.schema (Zod) > options.responseFormat (JSON Schema) > default\n const useCustomSchema = !!(options?.schema || options?.responseFormat);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let outputConfig: any;\n\n if (options?.schema) {\n // Zod schema — user passed a z.object(...) or similar\n if (options.responseFormat) {\n logDebug('Both schema (Zod) and responseFormat provided — using schema (Zod)');\n }\n logDebug('Using custom Zod schema for structured output');\n outputConfig = Output.object({ schema: options.schema });\n } else if (options?.responseFormat) {\n // Plain JSON Schema object\n logDebug('Using custom JSON Schema (responseFormat) for structured output');\n outputConfig = Output.object({ schema: jsonSchema(options.responseFormat.schema) });\n } else {\n // Default: standard AgentResult schema\n outputConfig = Output.object({ schema: agentOutputSchema });\n }\n\n // Create the ToolLoopAgent for multi-step reasoning\n const agent = new ToolLoopAgent({\n model: google(modelName),\n instructions: useCustomSchema\n ? `${persona.systemPrompt}\\n\\nIMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields — just return the data matching the schema.`\n : persona.systemPrompt,\n maxOutputTokens: config.budget.maxTokensPerCall,\n output: outputConfig,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n onStepFinish: (step) => {\n // Collect tool calls from each step\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n logDebug(`Step finished: ${step.finishReason}`);\n },\n });\n\n // Execute the agent\n const result = await agent.generate({\n prompt: userMessage,\n timeout: config.timeout,\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received: ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // ─── Custom schema: wrap AI output in AgentResult ──────────────────────\n if (useCustomSchema && result.output) {\n const customData = result.output as Record<string, unknown>;\n logDebug('Custom schema output received, wrapping in AgentResult');\n return {\n success: true,\n summary: `Structured output returned (${Object.keys(customData).length} fields)`,\n data: customData,\n actions: collectedToolCalls.map((tc) => tc.name),\n confidence: 1,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // ─── Default schema: use AgentResult fields directly ───────────────────\n if (result.output) {\n const output = result.output as {\n success: boolean;\n summary: string;\n reasoning?: string;\n data: Record<string, unknown>;\n actions: string[];\n confidence: number;\n };\n return {\n success: output.success,\n summary: output.summary,\n reasoning: output.reasoning,\n data: output.data,\n actions: output.actions,\n confidence: output.confidence,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Fallback: parse text response\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Response Parser (fallback for unstructured output) ──────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseResponse(text: string): any {\n // Try direct JSON parse\n try {\n return JSON.parse(text);\n } catch {\n // Try extracting JSON from markdown code fences\n const jsonMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[1]);\n } catch {\n // Fall through\n }\n }\n\n // Try finding JSON object in text\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n return JSON.parse(objectMatch[0]);\n } catch {\n // Fall through\n }\n }\n\n // Return as raw fallback\n return {\n success: true,\n summary: text.substring(0, 200),\n data: { raw: text },\n actions: [],\n confidence: 0.5,\n };\n }\n}\n","/**\n * Content anonymization — strips secrets, PII, and sensitive data\n * before sending to the AI provider.\n */\n\n// Patterns for sensitive content\nconst patterns = {\n // API keys and tokens (long alphanumeric strings near sensitive keywords)\n apiKey: /(?:api[_-]?key|token|secret|password|credential|auth)['\":\\s=]+['\"]?([A-Za-z0-9_\\-/.]{20,})['\"]?/gi,\n // Bearer tokens\n bearer: /Bearer\\s+[A-Za-z0-9_\\-/.+]{20,}/gi,\n // Email addresses\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // IPv4 addresses\n ipv4: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g,\n // IPv6 addresses (simplified)\n ipv6: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}/g,\n // AWS keys\n awsKey: /(?:AKIA|ASIA)[A-Z0-9]{16}/g,\n // Private keys\n privateKey: /-----BEGIN (?:RSA )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA )?PRIVATE KEY-----/g,\n // Connection strings\n connectionString: /(?:mongodb|postgres|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n // .env style secrets\n envSecret: /^(?:DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|AWS_SECRET|STRIPE_KEY|SENDGRID_KEY)[=:].+$/gm,\n};\n\n/**\n * Anonymize sensitive content in a string.\n * Replaces detected secrets/PII with safe placeholders.\n */\nexport function anonymize(content: string): string {\n let result = content;\n\n result = result.replace(patterns.privateKey, '[REDACTED_PRIVATE_KEY]');\n result = result.replace(patterns.connectionString, '[REDACTED_CONNECTION_STRING]');\n result = result.replace(patterns.awsKey, '[REDACTED_AWS_KEY]');\n result = result.replace(patterns.bearer, 'Bearer [REDACTED_TOKEN]');\n result = result.replace(patterns.apiKey, (match, _key) => {\n // Keep the key name but redact the value\n const colonIdx = match.search(/['\":\\s=]/);\n const prefix = match.substring(0, colonIdx);\n return `${prefix}: [REDACTED]`;\n });\n result = result.replace(patterns.envSecret, (match) => {\n const eqIdx = match.search(/[=:]/);\n const key = match.substring(0, eqIdx);\n return `${key}=[REDACTED]`;\n });\n result = result.replace(patterns.email, '[EMAIL]');\n result = result.replace(patterns.ipv4, '[IP]');\n result = result.replace(patterns.ipv6, '[IP]');\n\n return result;\n}\n\n/**\n * Anonymize any value — handles strings, objects, arrays, and primitives.\n */\nexport function anonymizeValue(value: unknown): unknown {\n if (typeof value === 'string') {\n return anonymize(value);\n }\n if (Array.isArray(value)) {\n return value.map(anonymizeValue);\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = anonymizeValue(v);\n }\n return result;\n }\n return value;\n}\n","/**\n * Token bucket rate limiter.\n * Controls the rate of API calls to prevent abuse and stay within budget.\n */\n\nexport class RateLimiter {\n private tokens: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per millisecond\n private lastRefill: number;\n\n /**\n * @param maxCallsPerDay Maximum calls allowed per day\n */\n constructor(maxCallsPerDay: number) {\n this.maxTokens = maxCallsPerDay;\n this.tokens = maxCallsPerDay;\n // Refill rate: spread calls evenly across 24 hours\n this.refillRate = maxCallsPerDay / (24 * 60 * 60 * 1000);\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume one token.\n * @returns true if allowed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Get remaining tokens (calls available)\n */\n remaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /**\n * Reset the limiter (e.g., for testing or manual override)\n */\n reset(): void {\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","/**\n * Budget tracker — monitors daily token usage and cost.\n * Enforces hard caps to prevent cost explosion.\n */\n\nimport type { BudgetConfig } from '../types.js';\n\nexport class BudgetTracker {\n private callsToday = 0;\n private tokensToday = 0;\n private costToday = 0;\n private dayStart: number;\n private readonly config: BudgetConfig;\n\n constructor(config: BudgetConfig) {\n this.config = config;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Check if a call is within budget. Resets counters at midnight UTC.\n */\n canMakeCall(): { allowed: boolean; reason?: string } {\n this.maybeResetDay();\n\n if (this.callsToday >= this.config.maxCallsPerDay) {\n return {\n allowed: false,\n reason: `Daily call limit reached (${this.config.maxCallsPerDay} calls/day)`,\n };\n }\n\n if (this.costToday >= this.config.costCapDaily) {\n return {\n allowed: false,\n reason: `Daily cost cap reached ($${this.config.costCapDaily.toFixed(2)})`,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Record a completed call's usage.\n */\n recordUsage(tokensUsed: number, costUsd: number): void {\n this.maybeResetDay();\n this.callsToday += 1;\n this.tokensToday += tokensUsed;\n this.costToday += costUsd;\n }\n\n /**\n * Get current usage stats.\n */\n getStats() {\n this.maybeResetDay();\n return {\n callsToday: this.callsToday,\n callsRemaining: Math.max(0, this.config.maxCallsPerDay - this.callsToday),\n tokensToday: this.tokensToday,\n costToday: this.costToday,\n costRemaining: Math.max(0, this.config.costCapDaily - this.costToday),\n };\n }\n\n /**\n * Reset all counters (for testing).\n */\n reset(): void {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Get the max tokens allowed per call.\n */\n get maxTokensPerCall(): number {\n return this.config.maxTokensPerCall;\n }\n\n private maybeResetDay(): void {\n const currentDayStart = this.getStartOfDay();\n if (currentDayStart > this.dayStart) {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = currentDayStart;\n }\n }\n\n private getStartOfDay(): number {\n const now = new Date();\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n}\n","/**\n * Core agent engine — orchestrates persona selection, budget checks,\n * anonymization, provider calls, and console output.\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaName } from './types.js';\nimport { detectPersona, getPersona } from './personas/index.js';\nimport { callGoogle } from './providers/google.js';\nimport { anonymizeValue } from './utils/anonymize.js';\nimport { RateLimiter } from './utils/rate-limit.js';\nimport { BudgetTracker } from './utils/budget.js';\nimport {\n startSpinner,\n stopSpinner,\n formatResult,\n formatError,\n formatBudgetWarning,\n formatRateLimitWarning,\n formatDryRun,\n logDebug,\n} from './utils/format.js';\n\n// ─── Default Config ──────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: AgentConfig = {\n provider: 'google',\n model: 'gemini-2.5-flash-lite',\n persona: 'general',\n budget: {\n maxCallsPerDay: 100,\n maxTokensPerCall: 8000,\n costCapDaily: 1.0,\n },\n mode: 'fire-and-forget',\n timeout: 10000,\n anonymize: true,\n localOnly: false,\n dryRun: false,\n logLevel: 'info',\n safetySettings: [],\n};\n\n// ─── Singleton State ─────────────────────────────────────────────────────────\n\nlet config: AgentConfig = { ...DEFAULT_CONFIG };\nlet rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\nlet budgetTracker = new BudgetTracker(config.budget);\n\n/**\n * Update the global configuration. Reinitializes rate limiter and budget tracker.\n */\nexport function updateConfig(newConfig: Partial<AgentConfig>): void {\n config = { ...DEFAULT_CONFIG, ...newConfig };\n\n // Merge budget with defaults\n if (newConfig.budget) {\n config.budget = { ...DEFAULT_CONFIG.budget, ...newConfig.budget };\n }\n\n // Reinitialize limiters with new config\n rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\n budgetTracker = new BudgetTracker(config.budget);\n}\n\n/**\n * Get the current config (for testing/inspection).\n */\nexport function getConfig(): AgentConfig {\n return { ...config };\n}\n\n// ─── Core Execution ──────────────────────────────────────────────────────────\n\n/**\n * Execute an agent call. This is the core function behind console.agent().\n */\nexport async function executeAgent(\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n // Determine persona\n const personaName: PersonaName = options?.persona ?? config.persona;\n const persona = options?.persona\n ? getPersona(options.persona)\n : detectPersona(prompt, personaName);\n\n logDebug(`Selected persona: ${persona.name} (${persona.icon})`);\n\n // Dry run — log without calling API\n if (config.dryRun) {\n formatDryRun(prompt, persona, context);\n return createDryRunResult(persona.name);\n }\n\n // Check rate limits\n if (!rateLimiter.tryConsume()) {\n formatRateLimitWarning();\n return createErrorResult('Rate limited — too many calls. Try again later.');\n }\n\n // Check budget\n const budgetCheck = budgetTracker.canMakeCall();\n if (!budgetCheck.allowed) {\n formatBudgetWarning(budgetCheck.reason!);\n return createErrorResult(budgetCheck.reason!);\n }\n\n // Anonymize context if enabled\n let contextStr = '';\n if (context !== undefined) {\n const processed = config.anonymize ? anonymizeValue(context) : context;\n contextStr = typeof processed === 'string'\n ? processed\n : JSON.stringify(processed, null, 2);\n\n // Handle Error objects: JSON.stringify(Error) returns \"{}\" because\n // message/stack/name are non-enumerable. Extract them explicitly.\n if (context instanceof Error) {\n const errObj = {\n name: context.name,\n message: context.message,\n stack: context.stack,\n ...(typeof context === 'object' ? Object.getOwnPropertyNames(context).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (acc as any)[key] = (context as any)[key];\n return acc;\n }, {} as Record<string, unknown>) : {}),\n };\n const processed2 = config.anonymize ? anonymizeValue(errObj) : errObj;\n contextStr = typeof processed2 === 'string' ? processed2 : JSON.stringify(processed2, null, 2);\n }\n }\n\n // Anonymize prompt if enabled\n const processedPrompt = config.anonymize\n ? (anonymizeValue(prompt) as string)\n : prompt;\n\n // Start spinner\n const spinner = startSpinner(persona, processedPrompt);\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n callGoogle(processedPrompt, contextStr, persona, config, options),\n createTimeout(config.timeout),\n ]);\n\n // Record usage\n budgetTracker.recordUsage(\n result.metadata.tokensUsed,\n estimateCost(result.metadata.tokensUsed, result.metadata.model),\n );\n\n // Stop spinner and format output\n stopSpinner(spinner, result.success);\n formatResult(result, persona);\n\n return result;\n } catch (error) {\n stopSpinner(spinner, false);\n const err = error instanceof Error ? error : new Error(String(error));\n formatError(err, persona);\n return createErrorResult(err.message);\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Agent timed out after ${ms}ms`)), ms);\n });\n}\n\nfunction createErrorResult(message: string): AgentResult {\n return {\n success: false,\n summary: message,\n data: {},\n actions: [],\n confidence: 0,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\nfunction createDryRunResult(personaName: string): AgentResult {\n return {\n success: true,\n summary: `[DRY RUN] Would have executed with ${personaName} persona`,\n data: { dryRun: true },\n actions: [],\n confidence: 1,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\n/**\n * Rough cost estimation based on model and token count.\n */\nfunction estimateCost(tokens: number, model: string): number {\n // Approximate cost per 1M tokens\n const costPer1M: Record<string, number> = {\n 'gemini-2.5-flash-lite': 0.01,\n 'gemini-3-flash-preview': 0.03,\n };\n const rate = costPer1M[model] ?? 0.01;\n return (tokens / 1_000_000) * rate;\n}\n","/**\n * @console-agent/agent\n *\n * Drop console.agent(...) anywhere in your code to execute agentic workflows\n * — as easy as console.log()\n *\n * @example\n * ```ts\n * import { init } from '@console-agent/agent';\n *\n * // Optional configuration (works with sensible defaults)\n * init({ apiKey: process.env.GEMINI_API_KEY });\n *\n * // Fire-and-forget (default)\n * console.agent(\"analyze this error\", error);\n *\n * // Blocking mode\n * const result = await console.agent(\"validate email format\", email);\n *\n * // Persona shortcuts\n * console.agent.security(\"audit SQL query\", query);\n * console.agent.debug(\"investigate slow query\", { duration, sql });\n * console.agent.architect(\"review API design\", endpoint);\n * ```\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, AgentFunction } from './types.js';\nimport { executeAgent, updateConfig, getConfig } from './agent.js';\nimport { setLogLevel } from './utils/format.js';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport type {\n AgentConfig,\n AgentCallOptions,\n AgentResult,\n AgentFunction,\n ResponseFormat,\n ToolCall,\n PersonaName,\n PersonaDefinition,\n ToolName,\n ToolConfig,\n ThinkingConfig,\n BudgetConfig,\n SafetySetting,\n HarmCategory,\n HarmBlockThreshold,\n LogLevel,\n GoogleSearchConfig,\n} from './types.js';\n\nexport { DEFAULT_CONFIG } from './agent.js';\n\n// ─── Init ────────────────────────────────────────────────────────────────────\n\n/**\n * Initialize console.agent with custom configuration.\n * Call this once at app startup. Works with sensible defaults if not called.\n *\n * @example\n * ```ts\n * init({\n * apiKey: process.env.GEMINI_API_KEY,\n * model: 'gemini-2.5-flash-lite',\n * persona: 'debugger',\n * budget: { maxCallsPerDay: 200 },\n * });\n * ```\n */\nexport function init(config: Partial<AgentConfig> = {}): void {\n updateConfig(config);\n\n const fullConfig = getConfig();\n setLogLevel(fullConfig.logLevel);\n\n // Attach console.agent\n attachConsoleAgent();\n}\n\n// ─── Console Agent Proxy ─────────────────────────────────────────────────────\n\n/**\n * Create the console.agent callable with persona methods.\n * Uses a Proxy to make it both callable and have methods.\n */\nfunction createAgentProxy(): AgentFunction {\n // The base function that handles direct calls\n const agentFn = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n const config = getConfig();\n\n if (config.mode === 'fire-and-forget' && !options?.mode) {\n // Fire-and-forget: start async execution but don't return the promise\n // We still return a Promise for type compatibility, but the caller doesn't await it\n const promise = executeAgent(prompt, context, options);\n // Catch unhandled rejections silently\n promise.catch(() => { /* fire-and-forget errors are logged to console */ });\n return promise;\n }\n\n // Blocking mode: return the promise for awaiting\n return executeAgent(prompt, context, options);\n };\n\n // Add persona shortcuts\n agentFn.security = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'security' });\n };\n\n agentFn.debug = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'debugger' });\n };\n\n agentFn.architect = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'architect' });\n };\n\n return agentFn as AgentFunction;\n}\n\n// ─── Attach to console ───────────────────────────────────────────────────────\n\n// Extend console type\ndeclare global {\n interface Console {\n agent: AgentFunction;\n }\n}\n\nlet attached = false;\n\nfunction attachConsoleAgent(): void {\n if (attached) return;\n\n const agentProxy = createAgentProxy();\n // Attach to global console object\n (console as unknown as Record<string, unknown>).agent = agentProxy;\n attached = true;\n}\n\n// ─── Auto-attach with defaults on import ─────────────────────────────────────\n\n// Auto-attach console.agent on first import with default config\nattachConsoleAgent();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/personas/debugger.ts","../src/personas/security.ts","../src/personas/architect.ts","../src/personas/general.ts","../src/personas/index.ts","../src/tools/index.ts","../src/utils/format.ts","../src/providers/google.ts","../src/utils/anonymize.ts","../src/utils/rate-limit.ts","../src/utils/budget.ts","../src/agent.ts","../src/index.ts"],"names":["config","ora","chalk","jsonSchema","google","createGoogleGenerativeAI","generateText","stepCountIs","Output","ToolLoopAgent"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PersonaDefinition } from '../types.js';\n\nexport const debuggerPersona: PersonaDefinition = {\n name: 'debugger',\n icon: '🐛',\n label: 'Debugging',\n systemPrompt: `You are a senior debugging expert and performance engineer.\n\nYour role:\n- Analyze errors, stack traces, exceptions, and performance issues\n- Identify root causes with high confidence\n- Provide concrete fixes with code examples\n- Suggest preventive measures\n\nOutput format:\n- Start with a one-line summary of the issue\n- Explain the root cause clearly\n- Provide a concrete fix (with code if applicable)\n- Rate severity: LOW / MEDIUM / HIGH / CRITICAL\n- Include confidence score (0-1)\n\nAlways be concise, technical, and actionable. No fluff.`,\n defaultTools: ['code_execution', 'google_search'],\n keywords: [\n 'slow', 'perf', 'performance', 'optimize', 'optimization',\n 'debug', 'error', 'bug', 'crash', 'exception', 'stack',\n 'trace', 'memory', 'leak', 'timeout', 'latency', 'bottleneck',\n 'hang', 'freeze', 'deadlock', 'race condition',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const securityPersona: PersonaDefinition = {\n name: 'security',\n icon: '🛡️',\n label: 'Security audit',\n systemPrompt: `You are an OWASP security expert and penetration testing specialist.\n\nYour role:\n- Audit code and inputs for vulnerabilities (SQL injection, XSS, CSRF, SSRF, etc.)\n- Flag security risks immediately with severity ratings\n- Check for known CVEs in dependencies\n- Recommend secure coding practices\n\nOutput format:\n- Start with overall risk level: SAFE / LOW RISK / MEDIUM RISK / HIGH RISK / CRITICAL\n- List each vulnerability found with:\n - Type (e.g., SQL Injection, XSS)\n - Location (where in the code/input)\n - Impact (what an attacker could do)\n - Fix (concrete remediation)\n- Include confidence score (0-1)\n\nBe thorough, explicit about risks, and always err on the side of caution.`,\n defaultTools: ['google_search'],\n keywords: [\n 'security', 'vuln', 'vulnerability', 'exploit', 'injection',\n 'xss', 'csrf', 'ssrf', 'sql injection', 'auth', 'authentication',\n 'authorization', 'permission', 'privilege', 'escalation',\n 'sanitize', 'escape', 'encrypt', 'decrypt', 'hash', 'token',\n 'secret', 'api key', 'password', 'credential', 'owasp', 'cve',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const architectPersona: PersonaDefinition = {\n name: 'architect',\n icon: '🏗️',\n label: 'Architecture review',\n systemPrompt: `You are a principal software engineer and system architect.\n\nYour role:\n- Review system design, API design, and code architecture\n- Evaluate scalability, maintainability, and performance characteristics\n- Identify design pattern opportunities and anti-patterns\n- Suggest architectural improvements with trade-off analysis\n\nOutput format:\n- Start with an overall assessment: SOLID / NEEDS IMPROVEMENT / SIGNIFICANT CONCERNS\n- List strengths of the current design\n- List concerns with severity and impact\n- Provide concrete recommendations with:\n - What to change\n - Why (trade-offs)\n - How (implementation guidance)\n- Include confidence score (0-1)\n\nThink like a senior architect reviewing a design doc. Be constructive, not pedantic.`,\n defaultTools: ['google_search', 'file_analysis'],\n keywords: [\n 'design', 'architecture', 'architect', 'pattern', 'scalab',\n 'microservice', 'monolith', 'api design', 'schema', 'database',\n 'system design', 'infrastructure', 'deploy', 'ci/cd', 'pipeline',\n 'refactor', 'modular', 'coupling', 'cohesion', 'solid',\n 'clean architecture', 'domain driven', 'event driven',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const generalPersona: PersonaDefinition = {\n name: 'general',\n icon: '🔍',\n label: 'Analyzing',\n systemPrompt: `You are a helpful senior full-stack engineer with broad expertise.\n\nYour role:\n- Provide actionable advice on any technical topic\n- Analyze code, data, configurations, and systems\n- Validate inputs, schemas, and data integrity\n- Answer questions with practical, real-world guidance\n\nOutput format:\n- Start with a clear, one-line answer or summary\n- Provide supporting details and reasoning\n- Include code examples when relevant\n- List any caveats or edge cases\n- Include confidence score (0-1)\n\nBe balanced, practical, and concise. Prioritize actionable insights over theory.`,\n defaultTools: ['code_execution', 'google_search', 'file_analysis'],\n keywords: [], // General catches everything not matched by specific personas\n};\n","import type { PersonaDefinition, PersonaName } from '../types.js';\nimport { debuggerPersona } from './debugger.js';\nimport { securityPersona } from './security.js';\nimport { architectPersona } from './architect.js';\nimport { generalPersona } from './general.js';\n\nexport const personas: Record<PersonaName, PersonaDefinition> = {\n debugger: debuggerPersona,\n security: securityPersona,\n architect: architectPersona,\n general: generalPersona,\n};\n\n/**\n * Auto-detect the best persona based on keywords in the prompt.\n * Returns the explicitly set persona if provided, otherwise scans for keywords.\n */\nexport function detectPersona(prompt: string, defaultPersona: PersonaName): PersonaDefinition {\n const lower = prompt.toLowerCase();\n\n // Check specific personas in priority order (security > debugger > architect)\n for (const name of ['security', 'debugger', 'architect'] as PersonaName[]) {\n const persona = personas[name];\n if (persona.keywords.some((kw) => lower.includes(kw))) {\n return persona;\n }\n }\n\n return personas[defaultPersona];\n}\n\nexport function getPersona(name: PersonaName): PersonaDefinition {\n return personas[name];\n}\n","/**\n * Tools index — resolves tool configurations using the native @ai-sdk/google tools API.\n *\n * Tools are opt-in only: they are passed to the AI model ONLY when the user\n * explicitly specifies `tools: [...]` in their console.agent() call options.\n */\n\nimport type { ToolConfig, ToolName } from '../types.js';\n\nexport { prepareFileContent, detectMimeType } from './file-analysis.js';\n\n/**\n * Minimum timeout (ms) when tools are active.\n * Tools like google_search and code_execution add latency.\n */\nexport const TOOLS_MIN_TIMEOUT = 30_000;\n\n/**\n * Resolve tool names/configs into SDK tool objects using the google provider instance.\n *\n * @param tools - Array of tool names or tool configs from user's options\n * @param google - The Google Generative AI provider instance (from createGoogleGenerativeAI)\n * @returns Record of tool name → SDK tool object, ready for ToolLoopAgent\n */\nexport function resolveTools(\n tools: (ToolName | ToolConfig)[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const tool of tools) {\n const name: ToolName = typeof tool === 'string' ? tool : tool.type;\n const config = typeof tool === 'object' ? tool.config : undefined;\n\n switch (name) {\n case 'google_search':\n resolved['google_search'] = google.tools.googleSearch(config ?? {});\n break;\n case 'code_execution':\n resolved['code_execution'] = google.tools.codeExecution(config ?? {});\n break;\n case 'url_context':\n resolved['url_context'] = google.tools.urlContext({});\n break;\n case 'file_analysis':\n // File analysis is handled via multimodal content, not as an SDK tool\n break;\n }\n }\n\n return resolved;\n}\n\n/**\n * Check if any tools were explicitly requested.\n */\nexport function hasExplicitTools(options?: { tools?: (ToolName | ToolConfig)[] }): boolean {\n return !!(options?.tools && options.tools.length > 0);\n}\n","/**\n * Console formatting — rich output with colors, icons, and tree structure.\n * Uses chalk for colors and ora for spinners.\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport type { AgentResult, PersonaDefinition, LogLevel } from '../types.js';\n\nlet currentLogLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel): void {\n currentLogLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['silent', 'errors', 'info', 'debug'];\n return levels.indexOf(currentLogLevel) >= levels.indexOf(level);\n}\n\n// ─── Spinner Management ──────────────────────────────────────────────────────\n\nexport function startSpinner(persona: PersonaDefinition, prompt: string): Ora | null {\n if (!shouldLog('info')) return null;\n\n const truncated = prompt.length > 60 ? prompt.substring(0, 57) + '...' : prompt;\n const spinner = ora({\n text: chalk.cyan(`${persona.icon} ${persona.label}... `) + chalk.dim(truncated),\n prefixText: chalk.gray('[AGENT]'),\n }).start();\n\n return spinner;\n}\n\nexport function stopSpinner(spinner: Ora | null, success: boolean): void {\n if (!spinner) return;\n\n if (success) {\n spinner.succeed();\n } else {\n spinner.fail();\n }\n}\n\n// ─── Result Formatting ──────────────────────────────────────────────────────\n\nexport function formatResult(result: AgentResult, persona: PersonaDefinition): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n const confidenceColor = result.confidence >= 0.8 ? chalk.green : result.confidence >= 0.5 ? chalk.yellow : chalk.red;\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.bold(persona.label)} Complete`);\n console.log(`${prefix} ├─ ${statusIcon} ${chalk.white(result.summary)}`);\n\n // Show actions/tools used\n if (result.actions.length > 0) {\n for (let i = 0; i < result.actions.length; i++) {\n const connector = i < result.actions.length - 1 ? '├─' : '├─';\n console.log(`${prefix} ${connector} ${chalk.dim('Tool:')} ${chalk.cyan(result.actions[i])}`);\n }\n }\n\n // Show key data points\n const dataEntries = Object.entries(result.data);\n if (dataEntries.length > 0) {\n for (const [key, value] of dataEntries) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${prefix} ├─ ${chalk.dim(key + ':')} ${chalk.white(displayValue)}`);\n }\n }\n\n // Show reasoning if available\n if (result.reasoning) {\n const reasoningLines = result.reasoning.split('\\n').slice(0, 3);\n console.log(`${prefix} ├─ ${chalk.dim('Reasoning:')}`);\n for (const line of reasoningLines) {\n console.log(`${prefix} │ ${chalk.dim(line.trim())}`);\n }\n }\n\n // Footer with metadata\n const confidence = confidenceColor(`confidence: ${result.confidence.toFixed(2)}`);\n const latency = chalk.dim(`${result.metadata.latencyMs}ms`);\n const tokens = chalk.dim(`${result.metadata.tokensUsed} tokens`);\n const cached = result.metadata.cached ? chalk.green(' (cached)') : '';\n\n console.log(`${prefix} └─ ${confidence} | ${latency} | ${tokens}${cached}`);\n console.log('');\n}\n\n// ─── Error Formatting ────────────────────────────────────────────────────────\n\nexport function formatError(error: Error, persona: PersonaDefinition): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.red('Error:')} ${error.message}`);\n if (shouldLog('debug') && error.stack) {\n console.log(`${prefix} ${chalk.dim(error.stack)}`);\n }\n console.log('');\n}\n\n// ─── Budget Warning ──────────────────────────────────────────────────────────\n\nexport function formatBudgetWarning(reason: string): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Budget limit:')} ${reason}`);\n}\n\n// ─── Rate Limit Warning ─────────────────────────────────────────────────────\n\nexport function formatRateLimitWarning(): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Rate limited:')} Too many calls. Try again later.`);\n}\n\n// ─── Dry Run ─────────────────────────────────────────────────────────────────\n\nexport function formatDryRun(prompt: string, persona: PersonaDefinition, context?: unknown): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${chalk.magenta('DRY RUN')} ${persona.icon} ${persona.label}`);\n console.log(`${prefix} ├─ ${chalk.dim('Persona:')} ${persona.name}`);\n console.log(`${prefix} ├─ ${chalk.dim('Prompt:')} ${prompt}`);\n if (context !== undefined) {\n const contextStr = typeof context === 'string' ? context : JSON.stringify(context, null, 2);\n const lines = contextStr.split('\\n').slice(0, 5);\n console.log(`${prefix} ├─ ${chalk.dim('Context:')}`);\n for (const line of lines) {\n console.log(`${prefix} │ ${chalk.dim(line)}`);\n }\n }\n console.log(`${prefix} └─ ${chalk.dim('(No API call made)')}`);\n console.log('');\n}\n\n// ─── Debug logging ───────────────────────────────────────────────────────────\n\nexport function logDebug(message: string): void {\n if (!shouldLog('debug')) return;\n console.log(`${chalk.gray('[AGENT DEBUG]')} ${chalk.dim(message)}`);\n}\n","/**\n * Google AI provider — integrates with Gemini via @ai-sdk/google + Vercel AI SDK.\n *\n * Two execution paths:\n * 1. WITHOUT tools → ToolLoopAgent with structured output (JSON schema)\n * 2. WITH tools → generateText with provider tools (google_search, code_execution, etc.)\n * Tools are incompatible with structured JSON output at the Gemini API level,\n * so we instruct the model via prompt and parse the text response.\n */\n\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { ToolLoopAgent, Output, jsonSchema, generateText, stepCountIs, type ToolSet } from 'ai';\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaDefinition, ToolCall } from '../types.js';\nimport { resolveTools, hasExplicitTools, TOOLS_MIN_TIMEOUT } from '../tools/index.js';\nimport { logDebug } from '../utils/format.js';\nimport { z } from 'zod';\n\n// ─── Structured Output Schema (JSON Schema compatible with Gemini) ───────────\n\nconst agentOutputSchema = jsonSchema({\n type: 'object' as const,\n properties: {\n success: { type: 'boolean' as const, description: 'Whether the task was completed successfully' },\n summary: { type: 'string' as const, description: 'One-line human-readable conclusion' },\n reasoning: { type: 'string' as const, description: 'Your thought process' },\n data: {\n type: 'object' as const,\n description: 'Structured findings as key-value pairs',\n properties: {\n result: { type: 'string' as const, description: 'Primary result or finding' },\n },\n additionalProperties: true,\n },\n actions: { type: 'array' as const, items: { type: 'string' as const }, description: 'List of tools/steps you used' },\n confidence: { type: 'number' as const, minimum: 0, maximum: 1, description: '0-1 confidence score' },\n },\n required: ['success', 'summary', 'data', 'actions', 'confidence'] as const,\n additionalProperties: false,\n});\n\n// ─── JSON prompt suffix for tool-mode (no structured output available) ───────\n\nconst JSON_RESPONSE_INSTRUCTION = `\n\nIMPORTANT: You MUST respond with ONLY a valid JSON object (no markdown, no code fences, no extra text).\nUse this exact format:\n{\"success\": true, \"summary\": \"one-line conclusion\", \"reasoning\": \"your thought process\", \"data\": {\"result\": \"primary finding\"}, \"actions\": [\"tools/steps used\"], \"confidence\": 0.95}`;\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport async function callGoogle(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n const startTime = Date.now();\n const modelName = options?.model ?? config.model;\n\n logDebug(`Using model: ${modelName}`);\n logDebug(`Persona: ${persona.name}`);\n\n // Create Google AI provider instance\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n });\n\n // Build provider options for thinking config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerOptions: Record<string, any> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const googleOpts: Record<string, any> = {};\n\n if (options?.thinking) {\n const thinking = options.thinking;\n if (thinking.budget !== undefined) {\n googleOpts['thinkingConfig'] = { thinkingBudget: thinking.budget };\n } else if (thinking.level) {\n googleOpts['thinkingConfig'] = { thinkingLevel: thinking.level };\n }\n }\n\n if (Object.keys(googleOpts).length > 0) {\n providerOptions['google'] = googleOpts;\n }\n\n // ─── Resolve tools (opt-in only) ──────────────────────────────────────────\n const useTools = hasExplicitTools(options) && !config.localOnly;\n\n if (useTools) {\n logDebug('Tools requested — using generateText path (no structured output)');\n return callWithTools(prompt, context, persona, config, options!, google, modelName, startTime, providerOptions);\n }\n\n logDebug('No tools — using ToolLoopAgent with structured output');\n return callWithStructuredOutput(prompt, context, persona, config, options, google, modelName, startTime, providerOptions);\n}\n\n// ─── Path 1: WITH TOOLS (generateText, no structured output) ────────────────\n\nasync function callWithTools(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options: AgentCallOptions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n modelName: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n providerOptions: Record<string, any>,\n): Promise<AgentResult> {\n const resolvedTools = resolveTools(options.tools!, google);\n const toolNames = Object.keys(resolvedTools);\n logDebug(`Tools enabled: ${toolNames.join(', ')}`);\n\n const effectiveTimeout = Math.max(config.timeout, TOOLS_MIN_TIMEOUT);\n\n // Build user message\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n // Use generateText with provider tools\n // Provider tools (google_search, code_execution, url_context) run server-side\n // and are incompatible with structured JSON output (response_mime_type).\n const result = await generateText({\n model: google(modelName),\n system: persona.systemPrompt + JSON_RESPONSE_INSTRUCTION,\n prompt: userMessage,\n tools: resolvedTools as ToolSet,\n stopWhen: stepCountIs(5), // Allow multi-step: tool invocation → response\n maxOutputTokens: config.budget.maxTokensPerCall,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n abortSignal: AbortSignal.timeout(effectiveTimeout),\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received (tools path): ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // Collect tool calls from steps\n const collectedToolCalls: ToolCall[] = [];\n if (result.steps) {\n for (const step of result.steps) {\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n }\n }\n\n logDebug(`Tool calls collected: ${collectedToolCalls.length}`);\n\n // Parse text response (no structured output in tools mode)\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Path 2: WITHOUT TOOLS (ToolLoopAgent, structured output) ────────────────\n\nasync function callWithStructuredOutput(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options: AgentCallOptions | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n modelName: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n providerOptions: Record<string, any>,\n): Promise<AgentResult> {\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n const collectedToolCalls: ToolCall[] = [];\n\n // Determine output schema\n const useCustomSchema = !!(options?.schema || options?.responseFormat);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let outputConfig: any;\n\n if (options?.schema) {\n if (options.responseFormat) {\n logDebug('Both schema (Zod) and responseFormat provided — using schema (Zod)');\n }\n logDebug('Using custom Zod schema for structured output');\n outputConfig = Output.object({ schema: options.schema });\n } else if (options?.responseFormat) {\n logDebug('Using custom JSON Schema (responseFormat) for structured output');\n outputConfig = Output.object({ schema: jsonSchema(options.responseFormat.schema) });\n } else {\n outputConfig = Output.object({ schema: agentOutputSchema });\n }\n\n const agent = new ToolLoopAgent({\n model: google(modelName),\n instructions: useCustomSchema\n ? `${persona.systemPrompt}\\n\\nIMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields — just return the data matching the schema.`\n : persona.systemPrompt,\n maxOutputTokens: config.budget.maxTokensPerCall,\n output: outputConfig,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n onStepFinish: (step) => {\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n logDebug(`Step finished: ${step.finishReason}`);\n },\n });\n\n const result = await agent.generate({\n prompt: userMessage,\n timeout: config.timeout,\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received: ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // Custom schema: wrap AI output in AgentResult\n if (useCustomSchema && result.output) {\n const customData = result.output as Record<string, unknown>;\n logDebug('Custom schema output received, wrapping in AgentResult');\n return {\n success: true,\n summary: `Structured output returned (${Object.keys(customData).length} fields)`,\n data: customData,\n actions: collectedToolCalls.map((tc) => tc.name),\n confidence: 1,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Default schema: use AgentResult fields directly\n if (result.output) {\n const output = result.output as {\n success: boolean;\n summary: string;\n reasoning?: string;\n data: Record<string, unknown>;\n actions: string[];\n confidence: number;\n };\n return {\n success: output.success,\n summary: output.summary,\n reasoning: output.reasoning,\n data: output.data,\n actions: output.actions,\n confidence: output.confidence,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Fallback: parse text response\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Response Parser (fallback for unstructured output) ──────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseResponse(text: string): any {\n // Try direct JSON parse\n try {\n return JSON.parse(text);\n } catch {\n // Try extracting JSON from markdown code fences\n const jsonMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[1]);\n } catch {\n // Fall through\n }\n }\n\n // Try finding JSON object in text\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n return JSON.parse(objectMatch[0]);\n } catch {\n // Fall through\n }\n }\n\n // Return as raw fallback\n return {\n success: true,\n summary: text.substring(0, 200),\n data: { raw: text },\n actions: [],\n confidence: 0.5,\n };\n }\n}\n","/**\n * Content anonymization — strips secrets, PII, and sensitive data\n * before sending to the AI provider.\n */\n\n// Patterns for sensitive content\nconst patterns = {\n // API keys and tokens (long alphanumeric strings near sensitive keywords)\n apiKey: /(?:api[_-]?key|token|secret|password|credential|auth)['\":\\s=]+['\"]?([A-Za-z0-9_\\-/.]{20,})['\"]?/gi,\n // Bearer tokens\n bearer: /Bearer\\s+[A-Za-z0-9_\\-/.+]{20,}/gi,\n // Email addresses\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // IPv4 addresses\n ipv4: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g,\n // IPv6 addresses (simplified)\n ipv6: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}/g,\n // AWS keys\n awsKey: /(?:AKIA|ASIA)[A-Z0-9]{16}/g,\n // Private keys\n privateKey: /-----BEGIN (?:RSA )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA )?PRIVATE KEY-----/g,\n // Connection strings\n connectionString: /(?:mongodb|postgres|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n // .env style secrets\n envSecret: /^(?:DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|AWS_SECRET|STRIPE_KEY|SENDGRID_KEY)[=:].+$/gm,\n};\n\n/**\n * Anonymize sensitive content in a string.\n * Replaces detected secrets/PII with safe placeholders.\n */\nexport function anonymize(content: string): string {\n let result = content;\n\n result = result.replace(patterns.privateKey, '[REDACTED_PRIVATE_KEY]');\n result = result.replace(patterns.connectionString, '[REDACTED_CONNECTION_STRING]');\n result = result.replace(patterns.awsKey, '[REDACTED_AWS_KEY]');\n result = result.replace(patterns.bearer, 'Bearer [REDACTED_TOKEN]');\n result = result.replace(patterns.apiKey, (match, _key) => {\n // Keep the key name but redact the value\n const colonIdx = match.search(/['\":\\s=]/);\n const prefix = match.substring(0, colonIdx);\n return `${prefix}: [REDACTED]`;\n });\n result = result.replace(patterns.envSecret, (match) => {\n const eqIdx = match.search(/[=:]/);\n const key = match.substring(0, eqIdx);\n return `${key}=[REDACTED]`;\n });\n result = result.replace(patterns.email, '[EMAIL]');\n result = result.replace(patterns.ipv4, '[IP]');\n result = result.replace(patterns.ipv6, '[IP]');\n\n return result;\n}\n\n/**\n * Anonymize any value — handles strings, objects, arrays, and primitives.\n */\nexport function anonymizeValue(value: unknown): unknown {\n if (typeof value === 'string') {\n return anonymize(value);\n }\n if (Array.isArray(value)) {\n return value.map(anonymizeValue);\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = anonymizeValue(v);\n }\n return result;\n }\n return value;\n}\n","/**\n * Token bucket rate limiter.\n * Controls the rate of API calls to prevent abuse and stay within budget.\n */\n\nexport class RateLimiter {\n private tokens: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per millisecond\n private lastRefill: number;\n\n /**\n * @param maxCallsPerDay Maximum calls allowed per day\n */\n constructor(maxCallsPerDay: number) {\n this.maxTokens = maxCallsPerDay;\n this.tokens = maxCallsPerDay;\n // Refill rate: spread calls evenly across 24 hours\n this.refillRate = maxCallsPerDay / (24 * 60 * 60 * 1000);\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume one token.\n * @returns true if allowed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Get remaining tokens (calls available)\n */\n remaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /**\n * Reset the limiter (e.g., for testing or manual override)\n */\n reset(): void {\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","/**\n * Budget tracker — monitors daily token usage and cost.\n * Enforces hard caps to prevent cost explosion.\n */\n\nimport type { BudgetConfig } from '../types.js';\n\nexport class BudgetTracker {\n private callsToday = 0;\n private tokensToday = 0;\n private costToday = 0;\n private dayStart: number;\n private readonly config: BudgetConfig;\n\n constructor(config: BudgetConfig) {\n this.config = config;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Check if a call is within budget. Resets counters at midnight UTC.\n */\n canMakeCall(): { allowed: boolean; reason?: string } {\n this.maybeResetDay();\n\n if (this.callsToday >= this.config.maxCallsPerDay) {\n return {\n allowed: false,\n reason: `Daily call limit reached (${this.config.maxCallsPerDay} calls/day)`,\n };\n }\n\n if (this.costToday >= this.config.costCapDaily) {\n return {\n allowed: false,\n reason: `Daily cost cap reached ($${this.config.costCapDaily.toFixed(2)})`,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Record a completed call's usage.\n */\n recordUsage(tokensUsed: number, costUsd: number): void {\n this.maybeResetDay();\n this.callsToday += 1;\n this.tokensToday += tokensUsed;\n this.costToday += costUsd;\n }\n\n /**\n * Get current usage stats.\n */\n getStats() {\n this.maybeResetDay();\n return {\n callsToday: this.callsToday,\n callsRemaining: Math.max(0, this.config.maxCallsPerDay - this.callsToday),\n tokensToday: this.tokensToday,\n costToday: this.costToday,\n costRemaining: Math.max(0, this.config.costCapDaily - this.costToday),\n };\n }\n\n /**\n * Reset all counters (for testing).\n */\n reset(): void {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Get the max tokens allowed per call.\n */\n get maxTokensPerCall(): number {\n return this.config.maxTokensPerCall;\n }\n\n private maybeResetDay(): void {\n const currentDayStart = this.getStartOfDay();\n if (currentDayStart > this.dayStart) {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = currentDayStart;\n }\n }\n\n private getStartOfDay(): number {\n const now = new Date();\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n}\n","/**\n * Core agent engine — orchestrates persona selection, budget checks,\n * anonymization, provider calls, and console output.\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaName } from './types.js';\nimport { detectPersona, getPersona } from './personas/index.js';\nimport { callGoogle } from './providers/google.js';\nimport { anonymizeValue } from './utils/anonymize.js';\nimport { RateLimiter } from './utils/rate-limit.js';\nimport { BudgetTracker } from './utils/budget.js';\nimport {\n startSpinner,\n stopSpinner,\n formatResult,\n formatError,\n formatBudgetWarning,\n formatRateLimitWarning,\n formatDryRun,\n logDebug,\n} from './utils/format.js';\n\n// ─── Default Config ──────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: AgentConfig = {\n provider: 'google',\n model: 'gemini-2.5-flash-lite',\n persona: 'general',\n budget: {\n maxCallsPerDay: 100,\n maxTokensPerCall: 8000,\n costCapDaily: 1.0,\n },\n mode: 'fire-and-forget',\n timeout: 10000,\n anonymize: true,\n localOnly: false,\n dryRun: false,\n logLevel: 'info',\n safetySettings: [],\n};\n\n// ─── Singleton State ─────────────────────────────────────────────────────────\n\nlet config: AgentConfig = { ...DEFAULT_CONFIG };\nlet rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\nlet budgetTracker = new BudgetTracker(config.budget);\n\n/**\n * Update the global configuration. Reinitializes rate limiter and budget tracker.\n */\nexport function updateConfig(newConfig: Partial<AgentConfig>): void {\n config = { ...DEFAULT_CONFIG, ...newConfig };\n\n // Merge budget with defaults\n if (newConfig.budget) {\n config.budget = { ...DEFAULT_CONFIG.budget, ...newConfig.budget };\n }\n\n // Reinitialize limiters with new config\n rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\n budgetTracker = new BudgetTracker(config.budget);\n}\n\n/**\n * Get the current config (for testing/inspection).\n */\nexport function getConfig(): AgentConfig {\n return { ...config };\n}\n\n// ─── Core Execution ──────────────────────────────────────────────────────────\n\n/**\n * Execute an agent call. This is the core function behind console.agent().\n */\nexport async function executeAgent(\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n // Determine persona\n const personaName: PersonaName = options?.persona ?? config.persona;\n const persona = options?.persona\n ? getPersona(options.persona)\n : detectPersona(prompt, personaName);\n\n logDebug(`Selected persona: ${persona.name} (${persona.icon})`);\n\n // Dry run — log without calling API\n if (config.dryRun) {\n formatDryRun(prompt, persona, context);\n return createDryRunResult(persona.name);\n }\n\n // Check rate limits\n if (!rateLimiter.tryConsume()) {\n formatRateLimitWarning();\n return createErrorResult('Rate limited — too many calls. Try again later.');\n }\n\n // Check budget\n const budgetCheck = budgetTracker.canMakeCall();\n if (!budgetCheck.allowed) {\n formatBudgetWarning(budgetCheck.reason!);\n return createErrorResult(budgetCheck.reason!);\n }\n\n // Anonymize context if enabled\n let contextStr = '';\n if (context !== undefined) {\n const processed = config.anonymize ? anonymizeValue(context) : context;\n contextStr = typeof processed === 'string'\n ? processed\n : JSON.stringify(processed, null, 2);\n\n // Handle Error objects: JSON.stringify(Error) returns \"{}\" because\n // message/stack/name are non-enumerable. Extract them explicitly.\n if (context instanceof Error) {\n const errObj = {\n name: context.name,\n message: context.message,\n stack: context.stack,\n ...(typeof context === 'object' ? Object.getOwnPropertyNames(context).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (acc as any)[key] = (context as any)[key];\n return acc;\n }, {} as Record<string, unknown>) : {}),\n };\n const processed2 = config.anonymize ? anonymizeValue(errObj) : errObj;\n contextStr = typeof processed2 === 'string' ? processed2 : JSON.stringify(processed2, null, 2);\n }\n }\n\n // Anonymize prompt if enabled\n const processedPrompt = config.anonymize\n ? (anonymizeValue(prompt) as string)\n : prompt;\n\n // Start spinner\n const spinner = startSpinner(persona, processedPrompt);\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n callGoogle(processedPrompt, contextStr, persona, config, options),\n createTimeout(config.timeout),\n ]);\n\n // Record usage\n budgetTracker.recordUsage(\n result.metadata.tokensUsed,\n estimateCost(result.metadata.tokensUsed, result.metadata.model),\n );\n\n // Stop spinner and format output\n stopSpinner(spinner, result.success);\n formatResult(result, persona);\n\n return result;\n } catch (error) {\n stopSpinner(spinner, false);\n const err = error instanceof Error ? error : new Error(String(error));\n formatError(err, persona);\n return createErrorResult(err.message);\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Agent timed out after ${ms}ms`)), ms);\n });\n}\n\nfunction createErrorResult(message: string): AgentResult {\n return {\n success: false,\n summary: message,\n data: {},\n actions: [],\n confidence: 0,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\nfunction createDryRunResult(personaName: string): AgentResult {\n return {\n success: true,\n summary: `[DRY RUN] Would have executed with ${personaName} persona`,\n data: { dryRun: true },\n actions: [],\n confidence: 1,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\n/**\n * Rough cost estimation based on model and token count.\n */\nfunction estimateCost(tokens: number, model: string): number {\n // Approximate cost per 1M tokens\n const costPer1M: Record<string, number> = {\n 'gemini-2.5-flash-lite': 0.01,\n 'gemini-3-flash-preview': 0.03,\n };\n const rate = costPer1M[model] ?? 0.01;\n return (tokens / 1_000_000) * rate;\n}\n","/**\n * @console-agent/agent\n *\n * Drop console.agent(...) anywhere in your code to execute agentic workflows\n * — as easy as console.log()\n *\n * @example\n * ```ts\n * import { init } from '@console-agent/agent';\n *\n * // Optional configuration (works with sensible defaults)\n * init({ apiKey: process.env.GEMINI_API_KEY });\n *\n * // Fire-and-forget (default)\n * console.agent(\"analyze this error\", error);\n *\n * // Blocking mode\n * const result = await console.agent(\"validate email format\", email);\n *\n * // Persona shortcuts\n * console.agent.security(\"audit SQL query\", query);\n * console.agent.debug(\"investigate slow query\", { duration, sql });\n * console.agent.architect(\"review API design\", endpoint);\n * ```\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, AgentFunction } from './types.js';\nimport { executeAgent, updateConfig, getConfig } from './agent.js';\nimport { setLogLevel } from './utils/format.js';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport type {\n AgentConfig,\n AgentCallOptions,\n AgentResult,\n AgentFunction,\n ResponseFormat,\n ToolCall,\n PersonaName,\n PersonaDefinition,\n ToolName,\n ToolConfig,\n ThinkingConfig,\n BudgetConfig,\n SafetySetting,\n HarmCategory,\n HarmBlockThreshold,\n LogLevel,\n GoogleSearchConfig,\n} from './types.js';\n\nexport { DEFAULT_CONFIG } from './agent.js';\n\n// ─── Init ────────────────────────────────────────────────────────────────────\n\n/**\n * Initialize console.agent with custom configuration.\n * Call this once at app startup. Works with sensible defaults if not called.\n *\n * @example\n * ```ts\n * init({\n * apiKey: process.env.GEMINI_API_KEY,\n * model: 'gemini-2.5-flash-lite',\n * persona: 'debugger',\n * budget: { maxCallsPerDay: 200 },\n * });\n * ```\n */\nexport function init(config: Partial<AgentConfig> = {}): void {\n updateConfig(config);\n\n const fullConfig = getConfig();\n setLogLevel(fullConfig.logLevel);\n\n // Attach console.agent\n attachConsoleAgent();\n}\n\n// ─── Console Agent Proxy ─────────────────────────────────────────────────────\n\n/**\n * Create the console.agent callable with persona methods.\n * Uses a Proxy to make it both callable and have methods.\n */\nfunction createAgentProxy(): AgentFunction {\n // The base function that handles direct calls\n const agentFn = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n const config = getConfig();\n\n if (config.mode === 'fire-and-forget' && !options?.mode) {\n // Fire-and-forget: start async execution but don't return the promise\n // We still return a Promise for type compatibility, but the caller doesn't await it\n const promise = executeAgent(prompt, context, options);\n // Catch unhandled rejections silently\n promise.catch(() => { /* fire-and-forget errors are logged to console */ });\n return promise;\n }\n\n // Blocking mode: return the promise for awaiting\n return executeAgent(prompt, context, options);\n };\n\n // Add persona shortcuts\n agentFn.security = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'security' });\n };\n\n agentFn.debug = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'debugger' });\n };\n\n agentFn.architect = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'architect' });\n };\n\n return agentFn as AgentFunction;\n}\n\n// ─── Attach to console ───────────────────────────────────────────────────────\n\n// Extend console type\ndeclare global {\n interface Console {\n agent: AgentFunction;\n }\n}\n\nlet attached = false;\n\nfunction attachConsoleAgent(): void {\n if (attached) return;\n\n const agentProxy = createAgentProxy();\n // Attach to global console object\n (console as unknown as Record<string, unknown>).agent = agentProxy;\n attached = true;\n}\n\n// ─── Auto-attach with defaults on import ─────────────────────────────────────\n\n// Auto-attach console.agent on first import with default config\nattachConsoleAgent();\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -34,7 +34,7 @@ interface PersonaDefinition {
|
|
|
34
34
|
defaultTools: ToolName[];
|
|
35
35
|
keywords: string[];
|
|
36
36
|
}
|
|
37
|
-
type ToolName = 'code_execution' | 'google_search' | 'file_analysis';
|
|
37
|
+
type ToolName = 'code_execution' | 'google_search' | 'url_context' | 'file_analysis';
|
|
38
38
|
interface GoogleSearchConfig {
|
|
39
39
|
mode?: 'MODE_DYNAMIC' | 'MODE_UNSPECIFIED';
|
|
40
40
|
dynamicThreshold?: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ interface PersonaDefinition {
|
|
|
34
34
|
defaultTools: ToolName[];
|
|
35
35
|
keywords: string[];
|
|
36
36
|
}
|
|
37
|
-
type ToolName = 'code_execution' | 'google_search' | 'file_analysis';
|
|
37
|
+
type ToolName = 'code_execution' | 'google_search' | 'url_context' | 'file_analysis';
|
|
38
38
|
interface GoogleSearchConfig {
|
|
39
39
|
mode?: 'MODE_DYNAMIC' | 'MODE_UNSPECIFIED';
|
|
40
40
|
dynamicThreshold?: number;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
|
2
|
-
import { jsonSchema, Output, ToolLoopAgent } from 'ai';
|
|
2
|
+
import { jsonSchema, generateText, stepCountIs, Output, ToolLoopAgent } from 'ai';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import ora from 'ora';
|
|
5
5
|
|
|
@@ -203,6 +203,31 @@ function detectPersona(prompt, defaultPersona) {
|
|
|
203
203
|
function getPersona(name) {
|
|
204
204
|
return personas[name];
|
|
205
205
|
}
|
|
206
|
+
|
|
207
|
+
// src/tools/index.ts
|
|
208
|
+
var TOOLS_MIN_TIMEOUT = 3e4;
|
|
209
|
+
function resolveTools(tools, google) {
|
|
210
|
+
const resolved = {};
|
|
211
|
+
for (const tool of tools) {
|
|
212
|
+
const name = typeof tool === "string" ? tool : tool.type;
|
|
213
|
+
const config2 = typeof tool === "object" ? tool.config : void 0;
|
|
214
|
+
switch (name) {
|
|
215
|
+
case "google_search":
|
|
216
|
+
resolved["google_search"] = google.tools.googleSearch(config2 ?? {});
|
|
217
|
+
break;
|
|
218
|
+
case "code_execution":
|
|
219
|
+
resolved["code_execution"] = google.tools.codeExecution(config2 ?? {});
|
|
220
|
+
break;
|
|
221
|
+
case "url_context":
|
|
222
|
+
resolved["url_context"] = google.tools.urlContext({});
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return resolved;
|
|
227
|
+
}
|
|
228
|
+
function hasExplicitTools(options) {
|
|
229
|
+
return !!(options?.tools && options.tools.length > 0);
|
|
230
|
+
}
|
|
206
231
|
var currentLogLevel = "info";
|
|
207
232
|
function setLogLevel(level) {
|
|
208
233
|
currentLogLevel = level;
|
|
@@ -327,6 +352,11 @@ var agentOutputSchema = jsonSchema({
|
|
|
327
352
|
required: ["success", "summary", "data", "actions", "confidence"],
|
|
328
353
|
additionalProperties: false
|
|
329
354
|
});
|
|
355
|
+
var JSON_RESPONSE_INSTRUCTION = `
|
|
356
|
+
|
|
357
|
+
IMPORTANT: You MUST respond with ONLY a valid JSON object (no markdown, no code fences, no extra text).
|
|
358
|
+
Use this exact format:
|
|
359
|
+
{"success": true, "summary": "one-line conclusion", "reasoning": "your thought process", "data": {"result": "primary finding"}, "actions": ["tools/steps used"], "confidence": 0.95}`;
|
|
330
360
|
async function callGoogle(prompt, context, persona, config2, options) {
|
|
331
361
|
const startTime = Date.now();
|
|
332
362
|
const modelName = options?.model ?? config2.model;
|
|
@@ -348,10 +378,71 @@ async function callGoogle(prompt, context, persona, config2, options) {
|
|
|
348
378
|
if (Object.keys(googleOpts).length > 0) {
|
|
349
379
|
providerOptions["google"] = googleOpts;
|
|
350
380
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
logDebug(
|
|
381
|
+
const useTools = hasExplicitTools(options) && !config2.localOnly;
|
|
382
|
+
if (useTools) {
|
|
383
|
+
logDebug("Tools requested \u2014 using generateText path (no structured output)");
|
|
384
|
+
return callWithTools(prompt, context, persona, config2, options, google, modelName, startTime, providerOptions);
|
|
385
|
+
}
|
|
386
|
+
logDebug("No tools \u2014 using ToolLoopAgent with structured output");
|
|
387
|
+
return callWithStructuredOutput(prompt, context, persona, config2, options, google, modelName, startTime, providerOptions);
|
|
388
|
+
}
|
|
389
|
+
async function callWithTools(prompt, context, persona, config2, options, google, modelName, startTime, providerOptions) {
|
|
390
|
+
const resolvedTools = resolveTools(options.tools, google);
|
|
391
|
+
const toolNames = Object.keys(resolvedTools);
|
|
392
|
+
logDebug(`Tools enabled: ${toolNames.join(", ")}`);
|
|
393
|
+
const effectiveTimeout = Math.max(config2.timeout, TOOLS_MIN_TIMEOUT);
|
|
394
|
+
const userMessage = context ? `${prompt}
|
|
395
|
+
|
|
396
|
+
--- Context ---
|
|
397
|
+
${context}` : prompt;
|
|
398
|
+
const result = await generateText({
|
|
399
|
+
model: google(modelName),
|
|
400
|
+
system: persona.systemPrompt + JSON_RESPONSE_INSTRUCTION,
|
|
401
|
+
prompt: userMessage,
|
|
402
|
+
tools: resolvedTools,
|
|
403
|
+
stopWhen: stepCountIs(5),
|
|
404
|
+
// Allow multi-step: tool invocation → response
|
|
405
|
+
maxOutputTokens: config2.budget.maxTokensPerCall,
|
|
406
|
+
providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : void 0,
|
|
407
|
+
abortSignal: AbortSignal.timeout(effectiveTimeout)
|
|
408
|
+
});
|
|
409
|
+
const latencyMs = Date.now() - startTime;
|
|
410
|
+
const tokensUsed = result.usage?.totalTokens ?? 0;
|
|
411
|
+
logDebug(`Response received (tools path): ${latencyMs}ms, ${tokensUsed} tokens`);
|
|
412
|
+
const collectedToolCalls = [];
|
|
413
|
+
if (result.steps) {
|
|
414
|
+
for (const step of result.steps) {
|
|
415
|
+
if (step.toolCalls) {
|
|
416
|
+
for (const tc of step.toolCalls) {
|
|
417
|
+
collectedToolCalls.push({
|
|
418
|
+
name: tc.toolName,
|
|
419
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
420
|
+
args: tc.args ?? {},
|
|
421
|
+
result: tc.toolName
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
354
426
|
}
|
|
427
|
+
logDebug(`Tool calls collected: ${collectedToolCalls.length}`);
|
|
428
|
+
const parsed = parseResponse(result.text);
|
|
429
|
+
return {
|
|
430
|
+
success: parsed?.success ?? true,
|
|
431
|
+
summary: parsed?.summary ?? result.text.substring(0, 200),
|
|
432
|
+
reasoning: parsed?.reasoning,
|
|
433
|
+
data: parsed?.data ?? { raw: result.text },
|
|
434
|
+
actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),
|
|
435
|
+
confidence: parsed?.confidence ?? 0.5,
|
|
436
|
+
metadata: {
|
|
437
|
+
model: modelName,
|
|
438
|
+
tokensUsed,
|
|
439
|
+
latencyMs,
|
|
440
|
+
toolCalls: collectedToolCalls,
|
|
441
|
+
cached: false
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
async function callWithStructuredOutput(prompt, context, persona, config2, options, google, modelName, startTime, providerOptions) {
|
|
355
446
|
const userMessage = context ? `${prompt}
|
|
356
447
|
|
|
357
448
|
--- Context ---
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/personas/debugger.ts","../src/personas/security.ts","../src/personas/architect.ts","../src/personas/general.ts","../src/personas/index.ts","../src/utils/format.ts","../src/providers/google.ts","../src/utils/anonymize.ts","../src/utils/rate-limit.ts","../src/utils/budget.ts","../src/agent.ts","../src/index.ts"],"names":["config"],"mappings":"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","file":"index.js","sourcesContent":["import type { PersonaDefinition } from '../types.js';\n\nexport const debuggerPersona: PersonaDefinition = {\n name: 'debugger',\n icon: '🐛',\n label: 'Debugging',\n systemPrompt: `You are a senior debugging expert and performance engineer.\n\nYour role:\n- Analyze errors, stack traces, exceptions, and performance issues\n- Identify root causes with high confidence\n- Provide concrete fixes with code examples\n- Suggest preventive measures\n\nOutput format:\n- Start with a one-line summary of the issue\n- Explain the root cause clearly\n- Provide a concrete fix (with code if applicable)\n- Rate severity: LOW / MEDIUM / HIGH / CRITICAL\n- Include confidence score (0-1)\n\nAlways be concise, technical, and actionable. No fluff.`,\n defaultTools: ['code_execution', 'google_search'],\n keywords: [\n 'slow', 'perf', 'performance', 'optimize', 'optimization',\n 'debug', 'error', 'bug', 'crash', 'exception', 'stack',\n 'trace', 'memory', 'leak', 'timeout', 'latency', 'bottleneck',\n 'hang', 'freeze', 'deadlock', 'race condition',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const securityPersona: PersonaDefinition = {\n name: 'security',\n icon: '🛡️',\n label: 'Security audit',\n systemPrompt: `You are an OWASP security expert and penetration testing specialist.\n\nYour role:\n- Audit code and inputs for vulnerabilities (SQL injection, XSS, CSRF, SSRF, etc.)\n- Flag security risks immediately with severity ratings\n- Check for known CVEs in dependencies\n- Recommend secure coding practices\n\nOutput format:\n- Start with overall risk level: SAFE / LOW RISK / MEDIUM RISK / HIGH RISK / CRITICAL\n- List each vulnerability found with:\n - Type (e.g., SQL Injection, XSS)\n - Location (where in the code/input)\n - Impact (what an attacker could do)\n - Fix (concrete remediation)\n- Include confidence score (0-1)\n\nBe thorough, explicit about risks, and always err on the side of caution.`,\n defaultTools: ['google_search'],\n keywords: [\n 'security', 'vuln', 'vulnerability', 'exploit', 'injection',\n 'xss', 'csrf', 'ssrf', 'sql injection', 'auth', 'authentication',\n 'authorization', 'permission', 'privilege', 'escalation',\n 'sanitize', 'escape', 'encrypt', 'decrypt', 'hash', 'token',\n 'secret', 'api key', 'password', 'credential', 'owasp', 'cve',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const architectPersona: PersonaDefinition = {\n name: 'architect',\n icon: '🏗️',\n label: 'Architecture review',\n systemPrompt: `You are a principal software engineer and system architect.\n\nYour role:\n- Review system design, API design, and code architecture\n- Evaluate scalability, maintainability, and performance characteristics\n- Identify design pattern opportunities and anti-patterns\n- Suggest architectural improvements with trade-off analysis\n\nOutput format:\n- Start with an overall assessment: SOLID / NEEDS IMPROVEMENT / SIGNIFICANT CONCERNS\n- List strengths of the current design\n- List concerns with severity and impact\n- Provide concrete recommendations with:\n - What to change\n - Why (trade-offs)\n - How (implementation guidance)\n- Include confidence score (0-1)\n\nThink like a senior architect reviewing a design doc. Be constructive, not pedantic.`,\n defaultTools: ['google_search', 'file_analysis'],\n keywords: [\n 'design', 'architecture', 'architect', 'pattern', 'scalab',\n 'microservice', 'monolith', 'api design', 'schema', 'database',\n 'system design', 'infrastructure', 'deploy', 'ci/cd', 'pipeline',\n 'refactor', 'modular', 'coupling', 'cohesion', 'solid',\n 'clean architecture', 'domain driven', 'event driven',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const generalPersona: PersonaDefinition = {\n name: 'general',\n icon: '🔍',\n label: 'Analyzing',\n systemPrompt: `You are a helpful senior full-stack engineer with broad expertise.\n\nYour role:\n- Provide actionable advice on any technical topic\n- Analyze code, data, configurations, and systems\n- Validate inputs, schemas, and data integrity\n- Answer questions with practical, real-world guidance\n\nOutput format:\n- Start with a clear, one-line answer or summary\n- Provide supporting details and reasoning\n- Include code examples when relevant\n- List any caveats or edge cases\n- Include confidence score (0-1)\n\nBe balanced, practical, and concise. Prioritize actionable insights over theory.`,\n defaultTools: ['code_execution', 'google_search', 'file_analysis'],\n keywords: [], // General catches everything not matched by specific personas\n};\n","import type { PersonaDefinition, PersonaName } from '../types.js';\nimport { debuggerPersona } from './debugger.js';\nimport { securityPersona } from './security.js';\nimport { architectPersona } from './architect.js';\nimport { generalPersona } from './general.js';\n\nexport const personas: Record<PersonaName, PersonaDefinition> = {\n debugger: debuggerPersona,\n security: securityPersona,\n architect: architectPersona,\n general: generalPersona,\n};\n\n/**\n * Auto-detect the best persona based on keywords in the prompt.\n * Returns the explicitly set persona if provided, otherwise scans for keywords.\n */\nexport function detectPersona(prompt: string, defaultPersona: PersonaName): PersonaDefinition {\n const lower = prompt.toLowerCase();\n\n // Check specific personas in priority order (security > debugger > architect)\n for (const name of ['security', 'debugger', 'architect'] as PersonaName[]) {\n const persona = personas[name];\n if (persona.keywords.some((kw) => lower.includes(kw))) {\n return persona;\n }\n }\n\n return personas[defaultPersona];\n}\n\nexport function getPersona(name: PersonaName): PersonaDefinition {\n return personas[name];\n}\n","/**\n * Console formatting — rich output with colors, icons, and tree structure.\n * Uses chalk for colors and ora for spinners.\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport type { AgentResult, PersonaDefinition, LogLevel } from '../types.js';\n\nlet currentLogLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel): void {\n currentLogLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['silent', 'errors', 'info', 'debug'];\n return levels.indexOf(currentLogLevel) >= levels.indexOf(level);\n}\n\n// ─── Spinner Management ──────────────────────────────────────────────────────\n\nexport function startSpinner(persona: PersonaDefinition, prompt: string): Ora | null {\n if (!shouldLog('info')) return null;\n\n const truncated = prompt.length > 60 ? prompt.substring(0, 57) + '...' : prompt;\n const spinner = ora({\n text: chalk.cyan(`${persona.icon} ${persona.label}... `) + chalk.dim(truncated),\n prefixText: chalk.gray('[AGENT]'),\n }).start();\n\n return spinner;\n}\n\nexport function stopSpinner(spinner: Ora | null, success: boolean): void {\n if (!spinner) return;\n\n if (success) {\n spinner.succeed();\n } else {\n spinner.fail();\n }\n}\n\n// ─── Result Formatting ──────────────────────────────────────────────────────\n\nexport function formatResult(result: AgentResult, persona: PersonaDefinition): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n const confidenceColor = result.confidence >= 0.8 ? chalk.green : result.confidence >= 0.5 ? chalk.yellow : chalk.red;\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.bold(persona.label)} Complete`);\n console.log(`${prefix} ├─ ${statusIcon} ${chalk.white(result.summary)}`);\n\n // Show actions/tools used\n if (result.actions.length > 0) {\n for (let i = 0; i < result.actions.length; i++) {\n const connector = i < result.actions.length - 1 ? '├─' : '├─';\n console.log(`${prefix} ${connector} ${chalk.dim('Tool:')} ${chalk.cyan(result.actions[i])}`);\n }\n }\n\n // Show key data points\n const dataEntries = Object.entries(result.data);\n if (dataEntries.length > 0) {\n for (const [key, value] of dataEntries) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${prefix} ├─ ${chalk.dim(key + ':')} ${chalk.white(displayValue)}`);\n }\n }\n\n // Show reasoning if available\n if (result.reasoning) {\n const reasoningLines = result.reasoning.split('\\n').slice(0, 3);\n console.log(`${prefix} ├─ ${chalk.dim('Reasoning:')}`);\n for (const line of reasoningLines) {\n console.log(`${prefix} │ ${chalk.dim(line.trim())}`);\n }\n }\n\n // Footer with metadata\n const confidence = confidenceColor(`confidence: ${result.confidence.toFixed(2)}`);\n const latency = chalk.dim(`${result.metadata.latencyMs}ms`);\n const tokens = chalk.dim(`${result.metadata.tokensUsed} tokens`);\n const cached = result.metadata.cached ? chalk.green(' (cached)') : '';\n\n console.log(`${prefix} └─ ${confidence} | ${latency} | ${tokens}${cached}`);\n console.log('');\n}\n\n// ─── Error Formatting ────────────────────────────────────────────────────────\n\nexport function formatError(error: Error, persona: PersonaDefinition): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.red('Error:')} ${error.message}`);\n if (shouldLog('debug') && error.stack) {\n console.log(`${prefix} ${chalk.dim(error.stack)}`);\n }\n console.log('');\n}\n\n// ─── Budget Warning ──────────────────────────────────────────────────────────\n\nexport function formatBudgetWarning(reason: string): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Budget limit:')} ${reason}`);\n}\n\n// ─── Rate Limit Warning ─────────────────────────────────────────────────────\n\nexport function formatRateLimitWarning(): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Rate limited:')} Too many calls. Try again later.`);\n}\n\n// ─── Dry Run ─────────────────────────────────────────────────────────────────\n\nexport function formatDryRun(prompt: string, persona: PersonaDefinition, context?: unknown): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${chalk.magenta('DRY RUN')} ${persona.icon} ${persona.label}`);\n console.log(`${prefix} ├─ ${chalk.dim('Persona:')} ${persona.name}`);\n console.log(`${prefix} ├─ ${chalk.dim('Prompt:')} ${prompt}`);\n if (context !== undefined) {\n const contextStr = typeof context === 'string' ? context : JSON.stringify(context, null, 2);\n const lines = contextStr.split('\\n').slice(0, 5);\n console.log(`${prefix} ├─ ${chalk.dim('Context:')}`);\n for (const line of lines) {\n console.log(`${prefix} │ ${chalk.dim(line)}`);\n }\n }\n console.log(`${prefix} └─ ${chalk.dim('(No API call made)')}`);\n console.log('');\n}\n\n// ─── Debug logging ───────────────────────────────────────────────────────────\n\nexport function logDebug(message: string): void {\n if (!shouldLog('debug')) return;\n console.log(`${chalk.gray('[AGENT DEBUG]')} ${chalk.dim(message)}`);\n}\n","/**\n * Google AI provider — integrates with Gemini via @ai-sdk/google + Vercel AI SDK.\n * Uses ToolLoopAgent for multi-step reasoning with structured output.\n * This is the only provider in v1.0.\n */\n\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { ToolLoopAgent, Output, jsonSchema } from 'ai';\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaDefinition, ToolCall } from '../types.js';\nimport { logDebug } from '../utils/format.js';\nimport { z } from 'zod';\n\n// ─── Structured Output Schema (JSON Schema compatible with Gemini) ───────────\n// Gemini requires OBJECT types to have non-empty `properties`.\n// We define a `result` property inside `data` to satisfy this constraint.\n\nconst agentOutputSchema = jsonSchema({\n type: 'object' as const,\n properties: {\n success: { type: 'boolean' as const, description: 'Whether the task was completed successfully' },\n summary: { type: 'string' as const, description: 'One-line human-readable conclusion' },\n reasoning: { type: 'string' as const, description: 'Your thought process' },\n data: {\n type: 'object' as const,\n description: 'Structured findings as key-value pairs',\n properties: {\n result: { type: 'string' as const, description: 'Primary result or finding' },\n },\n additionalProperties: true,\n },\n actions: { type: 'array' as const, items: { type: 'string' as const }, description: 'List of tools/steps you used' },\n confidence: { type: 'number' as const, minimum: 0, maximum: 1, description: '0-1 confidence score' },\n },\n required: ['success', 'summary', 'data', 'actions', 'confidence'] as const,\n additionalProperties: false,\n});\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport async function callGoogle(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n const startTime = Date.now();\n const modelName = options?.model ?? config.model;\n\n logDebug(`Using model: ${modelName}`);\n logDebug(`Persona: ${persona.name}`);\n\n // Create Google AI provider instance\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n });\n\n // Build provider options for thinking config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerOptions: Record<string, any> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const googleOpts: Record<string, any> = {};\n\n // Add thinking config if specified\n if (options?.thinking) {\n const thinking = options.thinking;\n if (thinking.budget !== undefined) {\n googleOpts['thinkingConfig'] = { thinkingBudget: thinking.budget };\n } else if (thinking.level) {\n googleOpts['thinkingConfig'] = { thinkingLevel: thinking.level };\n }\n }\n\n if (Object.keys(googleOpts).length > 0) {\n providerOptions['google'] = googleOpts;\n }\n\n // Note: Gemini's built-in tools (code_execution, google_search) are\n // incompatible with structured JSON output (response_mime_type: application/json).\n // Since structured output is essential for AgentResult, we skip built-in tools\n // and rely on the model's knowledge + structured output instead.\n if (!config.localOnly) {\n const toolNames = options?.tools ?? persona.defaultTools;\n logDebug(`Persona tools (informational): ${toolNames.join(', ')}`);\n }\n\n // Build the user message with context\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n // Collect tool calls across steps\n const collectedToolCalls: ToolCall[] = [];\n\n // ─── Determine output schema ─────────────────────────────────────────────\n // Priority: options.schema (Zod) > options.responseFormat (JSON Schema) > default\n const useCustomSchema = !!(options?.schema || options?.responseFormat);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let outputConfig: any;\n\n if (options?.schema) {\n // Zod schema — user passed a z.object(...) or similar\n if (options.responseFormat) {\n logDebug('Both schema (Zod) and responseFormat provided — using schema (Zod)');\n }\n logDebug('Using custom Zod schema for structured output');\n outputConfig = Output.object({ schema: options.schema });\n } else if (options?.responseFormat) {\n // Plain JSON Schema object\n logDebug('Using custom JSON Schema (responseFormat) for structured output');\n outputConfig = Output.object({ schema: jsonSchema(options.responseFormat.schema) });\n } else {\n // Default: standard AgentResult schema\n outputConfig = Output.object({ schema: agentOutputSchema });\n }\n\n // Create the ToolLoopAgent for multi-step reasoning\n const agent = new ToolLoopAgent({\n model: google(modelName),\n instructions: useCustomSchema\n ? `${persona.systemPrompt}\\n\\nIMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields — just return the data matching the schema.`\n : persona.systemPrompt,\n maxOutputTokens: config.budget.maxTokensPerCall,\n output: outputConfig,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n onStepFinish: (step) => {\n // Collect tool calls from each step\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n logDebug(`Step finished: ${step.finishReason}`);\n },\n });\n\n // Execute the agent\n const result = await agent.generate({\n prompt: userMessage,\n timeout: config.timeout,\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received: ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // ─── Custom schema: wrap AI output in AgentResult ──────────────────────\n if (useCustomSchema && result.output) {\n const customData = result.output as Record<string, unknown>;\n logDebug('Custom schema output received, wrapping in AgentResult');\n return {\n success: true,\n summary: `Structured output returned (${Object.keys(customData).length} fields)`,\n data: customData,\n actions: collectedToolCalls.map((tc) => tc.name),\n confidence: 1,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // ─── Default schema: use AgentResult fields directly ───────────────────\n if (result.output) {\n const output = result.output as {\n success: boolean;\n summary: string;\n reasoning?: string;\n data: Record<string, unknown>;\n actions: string[];\n confidence: number;\n };\n return {\n success: output.success,\n summary: output.summary,\n reasoning: output.reasoning,\n data: output.data,\n actions: output.actions,\n confidence: output.confidence,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Fallback: parse text response\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Response Parser (fallback for unstructured output) ──────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseResponse(text: string): any {\n // Try direct JSON parse\n try {\n return JSON.parse(text);\n } catch {\n // Try extracting JSON from markdown code fences\n const jsonMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[1]);\n } catch {\n // Fall through\n }\n }\n\n // Try finding JSON object in text\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n return JSON.parse(objectMatch[0]);\n } catch {\n // Fall through\n }\n }\n\n // Return as raw fallback\n return {\n success: true,\n summary: text.substring(0, 200),\n data: { raw: text },\n actions: [],\n confidence: 0.5,\n };\n }\n}\n","/**\n * Content anonymization — strips secrets, PII, and sensitive data\n * before sending to the AI provider.\n */\n\n// Patterns for sensitive content\nconst patterns = {\n // API keys and tokens (long alphanumeric strings near sensitive keywords)\n apiKey: /(?:api[_-]?key|token|secret|password|credential|auth)['\":\\s=]+['\"]?([A-Za-z0-9_\\-/.]{20,})['\"]?/gi,\n // Bearer tokens\n bearer: /Bearer\\s+[A-Za-z0-9_\\-/.+]{20,}/gi,\n // Email addresses\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // IPv4 addresses\n ipv4: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g,\n // IPv6 addresses (simplified)\n ipv6: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}/g,\n // AWS keys\n awsKey: /(?:AKIA|ASIA)[A-Z0-9]{16}/g,\n // Private keys\n privateKey: /-----BEGIN (?:RSA )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA )?PRIVATE KEY-----/g,\n // Connection strings\n connectionString: /(?:mongodb|postgres|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n // .env style secrets\n envSecret: /^(?:DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|AWS_SECRET|STRIPE_KEY|SENDGRID_KEY)[=:].+$/gm,\n};\n\n/**\n * Anonymize sensitive content in a string.\n * Replaces detected secrets/PII with safe placeholders.\n */\nexport function anonymize(content: string): string {\n let result = content;\n\n result = result.replace(patterns.privateKey, '[REDACTED_PRIVATE_KEY]');\n result = result.replace(patterns.connectionString, '[REDACTED_CONNECTION_STRING]');\n result = result.replace(patterns.awsKey, '[REDACTED_AWS_KEY]');\n result = result.replace(patterns.bearer, 'Bearer [REDACTED_TOKEN]');\n result = result.replace(patterns.apiKey, (match, _key) => {\n // Keep the key name but redact the value\n const colonIdx = match.search(/['\":\\s=]/);\n const prefix = match.substring(0, colonIdx);\n return `${prefix}: [REDACTED]`;\n });\n result = result.replace(patterns.envSecret, (match) => {\n const eqIdx = match.search(/[=:]/);\n const key = match.substring(0, eqIdx);\n return `${key}=[REDACTED]`;\n });\n result = result.replace(patterns.email, '[EMAIL]');\n result = result.replace(patterns.ipv4, '[IP]');\n result = result.replace(patterns.ipv6, '[IP]');\n\n return result;\n}\n\n/**\n * Anonymize any value — handles strings, objects, arrays, and primitives.\n */\nexport function anonymizeValue(value: unknown): unknown {\n if (typeof value === 'string') {\n return anonymize(value);\n }\n if (Array.isArray(value)) {\n return value.map(anonymizeValue);\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = anonymizeValue(v);\n }\n return result;\n }\n return value;\n}\n","/**\n * Token bucket rate limiter.\n * Controls the rate of API calls to prevent abuse and stay within budget.\n */\n\nexport class RateLimiter {\n private tokens: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per millisecond\n private lastRefill: number;\n\n /**\n * @param maxCallsPerDay Maximum calls allowed per day\n */\n constructor(maxCallsPerDay: number) {\n this.maxTokens = maxCallsPerDay;\n this.tokens = maxCallsPerDay;\n // Refill rate: spread calls evenly across 24 hours\n this.refillRate = maxCallsPerDay / (24 * 60 * 60 * 1000);\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume one token.\n * @returns true if allowed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Get remaining tokens (calls available)\n */\n remaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /**\n * Reset the limiter (e.g., for testing or manual override)\n */\n reset(): void {\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","/**\n * Budget tracker — monitors daily token usage and cost.\n * Enforces hard caps to prevent cost explosion.\n */\n\nimport type { BudgetConfig } from '../types.js';\n\nexport class BudgetTracker {\n private callsToday = 0;\n private tokensToday = 0;\n private costToday = 0;\n private dayStart: number;\n private readonly config: BudgetConfig;\n\n constructor(config: BudgetConfig) {\n this.config = config;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Check if a call is within budget. Resets counters at midnight UTC.\n */\n canMakeCall(): { allowed: boolean; reason?: string } {\n this.maybeResetDay();\n\n if (this.callsToday >= this.config.maxCallsPerDay) {\n return {\n allowed: false,\n reason: `Daily call limit reached (${this.config.maxCallsPerDay} calls/day)`,\n };\n }\n\n if (this.costToday >= this.config.costCapDaily) {\n return {\n allowed: false,\n reason: `Daily cost cap reached ($${this.config.costCapDaily.toFixed(2)})`,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Record a completed call's usage.\n */\n recordUsage(tokensUsed: number, costUsd: number): void {\n this.maybeResetDay();\n this.callsToday += 1;\n this.tokensToday += tokensUsed;\n this.costToday += costUsd;\n }\n\n /**\n * Get current usage stats.\n */\n getStats() {\n this.maybeResetDay();\n return {\n callsToday: this.callsToday,\n callsRemaining: Math.max(0, this.config.maxCallsPerDay - this.callsToday),\n tokensToday: this.tokensToday,\n costToday: this.costToday,\n costRemaining: Math.max(0, this.config.costCapDaily - this.costToday),\n };\n }\n\n /**\n * Reset all counters (for testing).\n */\n reset(): void {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Get the max tokens allowed per call.\n */\n get maxTokensPerCall(): number {\n return this.config.maxTokensPerCall;\n }\n\n private maybeResetDay(): void {\n const currentDayStart = this.getStartOfDay();\n if (currentDayStart > this.dayStart) {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = currentDayStart;\n }\n }\n\n private getStartOfDay(): number {\n const now = new Date();\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n}\n","/**\n * Core agent engine — orchestrates persona selection, budget checks,\n * anonymization, provider calls, and console output.\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaName } from './types.js';\nimport { detectPersona, getPersona } from './personas/index.js';\nimport { callGoogle } from './providers/google.js';\nimport { anonymizeValue } from './utils/anonymize.js';\nimport { RateLimiter } from './utils/rate-limit.js';\nimport { BudgetTracker } from './utils/budget.js';\nimport {\n startSpinner,\n stopSpinner,\n formatResult,\n formatError,\n formatBudgetWarning,\n formatRateLimitWarning,\n formatDryRun,\n logDebug,\n} from './utils/format.js';\n\n// ─── Default Config ──────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: AgentConfig = {\n provider: 'google',\n model: 'gemini-2.5-flash-lite',\n persona: 'general',\n budget: {\n maxCallsPerDay: 100,\n maxTokensPerCall: 8000,\n costCapDaily: 1.0,\n },\n mode: 'fire-and-forget',\n timeout: 10000,\n anonymize: true,\n localOnly: false,\n dryRun: false,\n logLevel: 'info',\n safetySettings: [],\n};\n\n// ─── Singleton State ─────────────────────────────────────────────────────────\n\nlet config: AgentConfig = { ...DEFAULT_CONFIG };\nlet rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\nlet budgetTracker = new BudgetTracker(config.budget);\n\n/**\n * Update the global configuration. Reinitializes rate limiter and budget tracker.\n */\nexport function updateConfig(newConfig: Partial<AgentConfig>): void {\n config = { ...DEFAULT_CONFIG, ...newConfig };\n\n // Merge budget with defaults\n if (newConfig.budget) {\n config.budget = { ...DEFAULT_CONFIG.budget, ...newConfig.budget };\n }\n\n // Reinitialize limiters with new config\n rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\n budgetTracker = new BudgetTracker(config.budget);\n}\n\n/**\n * Get the current config (for testing/inspection).\n */\nexport function getConfig(): AgentConfig {\n return { ...config };\n}\n\n// ─── Core Execution ──────────────────────────────────────────────────────────\n\n/**\n * Execute an agent call. This is the core function behind console.agent().\n */\nexport async function executeAgent(\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n // Determine persona\n const personaName: PersonaName = options?.persona ?? config.persona;\n const persona = options?.persona\n ? getPersona(options.persona)\n : detectPersona(prompt, personaName);\n\n logDebug(`Selected persona: ${persona.name} (${persona.icon})`);\n\n // Dry run — log without calling API\n if (config.dryRun) {\n formatDryRun(prompt, persona, context);\n return createDryRunResult(persona.name);\n }\n\n // Check rate limits\n if (!rateLimiter.tryConsume()) {\n formatRateLimitWarning();\n return createErrorResult('Rate limited — too many calls. Try again later.');\n }\n\n // Check budget\n const budgetCheck = budgetTracker.canMakeCall();\n if (!budgetCheck.allowed) {\n formatBudgetWarning(budgetCheck.reason!);\n return createErrorResult(budgetCheck.reason!);\n }\n\n // Anonymize context if enabled\n let contextStr = '';\n if (context !== undefined) {\n const processed = config.anonymize ? anonymizeValue(context) : context;\n contextStr = typeof processed === 'string'\n ? processed\n : JSON.stringify(processed, null, 2);\n\n // Handle Error objects: JSON.stringify(Error) returns \"{}\" because\n // message/stack/name are non-enumerable. Extract them explicitly.\n if (context instanceof Error) {\n const errObj = {\n name: context.name,\n message: context.message,\n stack: context.stack,\n ...(typeof context === 'object' ? Object.getOwnPropertyNames(context).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (acc as any)[key] = (context as any)[key];\n return acc;\n }, {} as Record<string, unknown>) : {}),\n };\n const processed2 = config.anonymize ? anonymizeValue(errObj) : errObj;\n contextStr = typeof processed2 === 'string' ? processed2 : JSON.stringify(processed2, null, 2);\n }\n }\n\n // Anonymize prompt if enabled\n const processedPrompt = config.anonymize\n ? (anonymizeValue(prompt) as string)\n : prompt;\n\n // Start spinner\n const spinner = startSpinner(persona, processedPrompt);\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n callGoogle(processedPrompt, contextStr, persona, config, options),\n createTimeout(config.timeout),\n ]);\n\n // Record usage\n budgetTracker.recordUsage(\n result.metadata.tokensUsed,\n estimateCost(result.metadata.tokensUsed, result.metadata.model),\n );\n\n // Stop spinner and format output\n stopSpinner(spinner, result.success);\n formatResult(result, persona);\n\n return result;\n } catch (error) {\n stopSpinner(spinner, false);\n const err = error instanceof Error ? error : new Error(String(error));\n formatError(err, persona);\n return createErrorResult(err.message);\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Agent timed out after ${ms}ms`)), ms);\n });\n}\n\nfunction createErrorResult(message: string): AgentResult {\n return {\n success: false,\n summary: message,\n data: {},\n actions: [],\n confidence: 0,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\nfunction createDryRunResult(personaName: string): AgentResult {\n return {\n success: true,\n summary: `[DRY RUN] Would have executed with ${personaName} persona`,\n data: { dryRun: true },\n actions: [],\n confidence: 1,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\n/**\n * Rough cost estimation based on model and token count.\n */\nfunction estimateCost(tokens: number, model: string): number {\n // Approximate cost per 1M tokens\n const costPer1M: Record<string, number> = {\n 'gemini-2.5-flash-lite': 0.01,\n 'gemini-3-flash-preview': 0.03,\n };\n const rate = costPer1M[model] ?? 0.01;\n return (tokens / 1_000_000) * rate;\n}\n","/**\n * @console-agent/agent\n *\n * Drop console.agent(...) anywhere in your code to execute agentic workflows\n * — as easy as console.log()\n *\n * @example\n * ```ts\n * import { init } from '@console-agent/agent';\n *\n * // Optional configuration (works with sensible defaults)\n * init({ apiKey: process.env.GEMINI_API_KEY });\n *\n * // Fire-and-forget (default)\n * console.agent(\"analyze this error\", error);\n *\n * // Blocking mode\n * const result = await console.agent(\"validate email format\", email);\n *\n * // Persona shortcuts\n * console.agent.security(\"audit SQL query\", query);\n * console.agent.debug(\"investigate slow query\", { duration, sql });\n * console.agent.architect(\"review API design\", endpoint);\n * ```\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, AgentFunction } from './types.js';\nimport { executeAgent, updateConfig, getConfig } from './agent.js';\nimport { setLogLevel } from './utils/format.js';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport type {\n AgentConfig,\n AgentCallOptions,\n AgentResult,\n AgentFunction,\n ResponseFormat,\n ToolCall,\n PersonaName,\n PersonaDefinition,\n ToolName,\n ToolConfig,\n ThinkingConfig,\n BudgetConfig,\n SafetySetting,\n HarmCategory,\n HarmBlockThreshold,\n LogLevel,\n GoogleSearchConfig,\n} from './types.js';\n\nexport { DEFAULT_CONFIG } from './agent.js';\n\n// ─── Init ────────────────────────────────────────────────────────────────────\n\n/**\n * Initialize console.agent with custom configuration.\n * Call this once at app startup. Works with sensible defaults if not called.\n *\n * @example\n * ```ts\n * init({\n * apiKey: process.env.GEMINI_API_KEY,\n * model: 'gemini-2.5-flash-lite',\n * persona: 'debugger',\n * budget: { maxCallsPerDay: 200 },\n * });\n * ```\n */\nexport function init(config: Partial<AgentConfig> = {}): void {\n updateConfig(config);\n\n const fullConfig = getConfig();\n setLogLevel(fullConfig.logLevel);\n\n // Attach console.agent\n attachConsoleAgent();\n}\n\n// ─── Console Agent Proxy ─────────────────────────────────────────────────────\n\n/**\n * Create the console.agent callable with persona methods.\n * Uses a Proxy to make it both callable and have methods.\n */\nfunction createAgentProxy(): AgentFunction {\n // The base function that handles direct calls\n const agentFn = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n const config = getConfig();\n\n if (config.mode === 'fire-and-forget' && !options?.mode) {\n // Fire-and-forget: start async execution but don't return the promise\n // We still return a Promise for type compatibility, but the caller doesn't await it\n const promise = executeAgent(prompt, context, options);\n // Catch unhandled rejections silently\n promise.catch(() => { /* fire-and-forget errors are logged to console */ });\n return promise;\n }\n\n // Blocking mode: return the promise for awaiting\n return executeAgent(prompt, context, options);\n };\n\n // Add persona shortcuts\n agentFn.security = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'security' });\n };\n\n agentFn.debug = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'debugger' });\n };\n\n agentFn.architect = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'architect' });\n };\n\n return agentFn as AgentFunction;\n}\n\n// ─── Attach to console ───────────────────────────────────────────────────────\n\n// Extend console type\ndeclare global {\n interface Console {\n agent: AgentFunction;\n }\n}\n\nlet attached = false;\n\nfunction attachConsoleAgent(): void {\n if (attached) return;\n\n const agentProxy = createAgentProxy();\n // Attach to global console object\n (console as unknown as Record<string, unknown>).agent = agentProxy;\n attached = true;\n}\n\n// ─── Auto-attach with defaults on import ─────────────────────────────────────\n\n// Auto-attach console.agent on first import with default config\nattachConsoleAgent();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/personas/debugger.ts","../src/personas/security.ts","../src/personas/architect.ts","../src/personas/general.ts","../src/personas/index.ts","../src/tools/index.ts","../src/utils/format.ts","../src/providers/google.ts","../src/utils/anonymize.ts","../src/utils/rate-limit.ts","../src/utils/budget.ts","../src/agent.ts","../src/index.ts"],"names":["config"],"mappings":"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","file":"index.js","sourcesContent":["import type { PersonaDefinition } from '../types.js';\n\nexport const debuggerPersona: PersonaDefinition = {\n name: 'debugger',\n icon: '🐛',\n label: 'Debugging',\n systemPrompt: `You are a senior debugging expert and performance engineer.\n\nYour role:\n- Analyze errors, stack traces, exceptions, and performance issues\n- Identify root causes with high confidence\n- Provide concrete fixes with code examples\n- Suggest preventive measures\n\nOutput format:\n- Start with a one-line summary of the issue\n- Explain the root cause clearly\n- Provide a concrete fix (with code if applicable)\n- Rate severity: LOW / MEDIUM / HIGH / CRITICAL\n- Include confidence score (0-1)\n\nAlways be concise, technical, and actionable. No fluff.`,\n defaultTools: ['code_execution', 'google_search'],\n keywords: [\n 'slow', 'perf', 'performance', 'optimize', 'optimization',\n 'debug', 'error', 'bug', 'crash', 'exception', 'stack',\n 'trace', 'memory', 'leak', 'timeout', 'latency', 'bottleneck',\n 'hang', 'freeze', 'deadlock', 'race condition',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const securityPersona: PersonaDefinition = {\n name: 'security',\n icon: '🛡️',\n label: 'Security audit',\n systemPrompt: `You are an OWASP security expert and penetration testing specialist.\n\nYour role:\n- Audit code and inputs for vulnerabilities (SQL injection, XSS, CSRF, SSRF, etc.)\n- Flag security risks immediately with severity ratings\n- Check for known CVEs in dependencies\n- Recommend secure coding practices\n\nOutput format:\n- Start with overall risk level: SAFE / LOW RISK / MEDIUM RISK / HIGH RISK / CRITICAL\n- List each vulnerability found with:\n - Type (e.g., SQL Injection, XSS)\n - Location (where in the code/input)\n - Impact (what an attacker could do)\n - Fix (concrete remediation)\n- Include confidence score (0-1)\n\nBe thorough, explicit about risks, and always err on the side of caution.`,\n defaultTools: ['google_search'],\n keywords: [\n 'security', 'vuln', 'vulnerability', 'exploit', 'injection',\n 'xss', 'csrf', 'ssrf', 'sql injection', 'auth', 'authentication',\n 'authorization', 'permission', 'privilege', 'escalation',\n 'sanitize', 'escape', 'encrypt', 'decrypt', 'hash', 'token',\n 'secret', 'api key', 'password', 'credential', 'owasp', 'cve',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const architectPersona: PersonaDefinition = {\n name: 'architect',\n icon: '🏗️',\n label: 'Architecture review',\n systemPrompt: `You are a principal software engineer and system architect.\n\nYour role:\n- Review system design, API design, and code architecture\n- Evaluate scalability, maintainability, and performance characteristics\n- Identify design pattern opportunities and anti-patterns\n- Suggest architectural improvements with trade-off analysis\n\nOutput format:\n- Start with an overall assessment: SOLID / NEEDS IMPROVEMENT / SIGNIFICANT CONCERNS\n- List strengths of the current design\n- List concerns with severity and impact\n- Provide concrete recommendations with:\n - What to change\n - Why (trade-offs)\n - How (implementation guidance)\n- Include confidence score (0-1)\n\nThink like a senior architect reviewing a design doc. Be constructive, not pedantic.`,\n defaultTools: ['google_search', 'file_analysis'],\n keywords: [\n 'design', 'architecture', 'architect', 'pattern', 'scalab',\n 'microservice', 'monolith', 'api design', 'schema', 'database',\n 'system design', 'infrastructure', 'deploy', 'ci/cd', 'pipeline',\n 'refactor', 'modular', 'coupling', 'cohesion', 'solid',\n 'clean architecture', 'domain driven', 'event driven',\n ],\n};\n","import type { PersonaDefinition } from '../types.js';\n\nexport const generalPersona: PersonaDefinition = {\n name: 'general',\n icon: '🔍',\n label: 'Analyzing',\n systemPrompt: `You are a helpful senior full-stack engineer with broad expertise.\n\nYour role:\n- Provide actionable advice on any technical topic\n- Analyze code, data, configurations, and systems\n- Validate inputs, schemas, and data integrity\n- Answer questions with practical, real-world guidance\n\nOutput format:\n- Start with a clear, one-line answer or summary\n- Provide supporting details and reasoning\n- Include code examples when relevant\n- List any caveats or edge cases\n- Include confidence score (0-1)\n\nBe balanced, practical, and concise. Prioritize actionable insights over theory.`,\n defaultTools: ['code_execution', 'google_search', 'file_analysis'],\n keywords: [], // General catches everything not matched by specific personas\n};\n","import type { PersonaDefinition, PersonaName } from '../types.js';\nimport { debuggerPersona } from './debugger.js';\nimport { securityPersona } from './security.js';\nimport { architectPersona } from './architect.js';\nimport { generalPersona } from './general.js';\n\nexport const personas: Record<PersonaName, PersonaDefinition> = {\n debugger: debuggerPersona,\n security: securityPersona,\n architect: architectPersona,\n general: generalPersona,\n};\n\n/**\n * Auto-detect the best persona based on keywords in the prompt.\n * Returns the explicitly set persona if provided, otherwise scans for keywords.\n */\nexport function detectPersona(prompt: string, defaultPersona: PersonaName): PersonaDefinition {\n const lower = prompt.toLowerCase();\n\n // Check specific personas in priority order (security > debugger > architect)\n for (const name of ['security', 'debugger', 'architect'] as PersonaName[]) {\n const persona = personas[name];\n if (persona.keywords.some((kw) => lower.includes(kw))) {\n return persona;\n }\n }\n\n return personas[defaultPersona];\n}\n\nexport function getPersona(name: PersonaName): PersonaDefinition {\n return personas[name];\n}\n","/**\n * Tools index — resolves tool configurations using the native @ai-sdk/google tools API.\n *\n * Tools are opt-in only: they are passed to the AI model ONLY when the user\n * explicitly specifies `tools: [...]` in their console.agent() call options.\n */\n\nimport type { ToolConfig, ToolName } from '../types.js';\n\nexport { prepareFileContent, detectMimeType } from './file-analysis.js';\n\n/**\n * Minimum timeout (ms) when tools are active.\n * Tools like google_search and code_execution add latency.\n */\nexport const TOOLS_MIN_TIMEOUT = 30_000;\n\n/**\n * Resolve tool names/configs into SDK tool objects using the google provider instance.\n *\n * @param tools - Array of tool names or tool configs from user's options\n * @param google - The Google Generative AI provider instance (from createGoogleGenerativeAI)\n * @returns Record of tool name → SDK tool object, ready for ToolLoopAgent\n */\nexport function resolveTools(\n tools: (ToolName | ToolConfig)[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const tool of tools) {\n const name: ToolName = typeof tool === 'string' ? tool : tool.type;\n const config = typeof tool === 'object' ? tool.config : undefined;\n\n switch (name) {\n case 'google_search':\n resolved['google_search'] = google.tools.googleSearch(config ?? {});\n break;\n case 'code_execution':\n resolved['code_execution'] = google.tools.codeExecution(config ?? {});\n break;\n case 'url_context':\n resolved['url_context'] = google.tools.urlContext({});\n break;\n case 'file_analysis':\n // File analysis is handled via multimodal content, not as an SDK tool\n break;\n }\n }\n\n return resolved;\n}\n\n/**\n * Check if any tools were explicitly requested.\n */\nexport function hasExplicitTools(options?: { tools?: (ToolName | ToolConfig)[] }): boolean {\n return !!(options?.tools && options.tools.length > 0);\n}\n","/**\n * Console formatting — rich output with colors, icons, and tree structure.\n * Uses chalk for colors and ora for spinners.\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport type { AgentResult, PersonaDefinition, LogLevel } from '../types.js';\n\nlet currentLogLevel: LogLevel = 'info';\n\nexport function setLogLevel(level: LogLevel): void {\n currentLogLevel = level;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['silent', 'errors', 'info', 'debug'];\n return levels.indexOf(currentLogLevel) >= levels.indexOf(level);\n}\n\n// ─── Spinner Management ──────────────────────────────────────────────────────\n\nexport function startSpinner(persona: PersonaDefinition, prompt: string): Ora | null {\n if (!shouldLog('info')) return null;\n\n const truncated = prompt.length > 60 ? prompt.substring(0, 57) + '...' : prompt;\n const spinner = ora({\n text: chalk.cyan(`${persona.icon} ${persona.label}... `) + chalk.dim(truncated),\n prefixText: chalk.gray('[AGENT]'),\n }).start();\n\n return spinner;\n}\n\nexport function stopSpinner(spinner: Ora | null, success: boolean): void {\n if (!spinner) return;\n\n if (success) {\n spinner.succeed();\n } else {\n spinner.fail();\n }\n}\n\n// ─── Result Formatting ──────────────────────────────────────────────────────\n\nexport function formatResult(result: AgentResult, persona: PersonaDefinition): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n const confidenceColor = result.confidence >= 0.8 ? chalk.green : result.confidence >= 0.5 ? chalk.yellow : chalk.red;\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.bold(persona.label)} Complete`);\n console.log(`${prefix} ├─ ${statusIcon} ${chalk.white(result.summary)}`);\n\n // Show actions/tools used\n if (result.actions.length > 0) {\n for (let i = 0; i < result.actions.length; i++) {\n const connector = i < result.actions.length - 1 ? '├─' : '├─';\n console.log(`${prefix} ${connector} ${chalk.dim('Tool:')} ${chalk.cyan(result.actions[i])}`);\n }\n }\n\n // Show key data points\n const dataEntries = Object.entries(result.data);\n if (dataEntries.length > 0) {\n for (const [key, value] of dataEntries) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value);\n console.log(`${prefix} ├─ ${chalk.dim(key + ':')} ${chalk.white(displayValue)}`);\n }\n }\n\n // Show reasoning if available\n if (result.reasoning) {\n const reasoningLines = result.reasoning.split('\\n').slice(0, 3);\n console.log(`${prefix} ├─ ${chalk.dim('Reasoning:')}`);\n for (const line of reasoningLines) {\n console.log(`${prefix} │ ${chalk.dim(line.trim())}`);\n }\n }\n\n // Footer with metadata\n const confidence = confidenceColor(`confidence: ${result.confidence.toFixed(2)}`);\n const latency = chalk.dim(`${result.metadata.latencyMs}ms`);\n const tokens = chalk.dim(`${result.metadata.tokensUsed} tokens`);\n const cached = result.metadata.cached ? chalk.green(' (cached)') : '';\n\n console.log(`${prefix} └─ ${confidence} | ${latency} | ${tokens}${cached}`);\n console.log('');\n}\n\n// ─── Error Formatting ────────────────────────────────────────────────────────\n\nexport function formatError(error: Error, persona: PersonaDefinition): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${persona.icon} ${chalk.red('Error:')} ${error.message}`);\n if (shouldLog('debug') && error.stack) {\n console.log(`${prefix} ${chalk.dim(error.stack)}`);\n }\n console.log('');\n}\n\n// ─── Budget Warning ──────────────────────────────────────────────────────────\n\nexport function formatBudgetWarning(reason: string): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Budget limit:')} ${reason}`);\n}\n\n// ─── Rate Limit Warning ─────────────────────────────────────────────────────\n\nexport function formatRateLimitWarning(): void {\n if (!shouldLog('errors')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log(`${prefix} ${chalk.yellow('⚠ Rate limited:')} Too many calls. Try again later.`);\n}\n\n// ─── Dry Run ─────────────────────────────────────────────────────────────────\n\nexport function formatDryRun(prompt: string, persona: PersonaDefinition, context?: unknown): void {\n if (!shouldLog('info')) return;\n\n const prefix = chalk.gray('[AGENT]');\n console.log('');\n console.log(`${prefix} ${chalk.magenta('DRY RUN')} ${persona.icon} ${persona.label}`);\n console.log(`${prefix} ├─ ${chalk.dim('Persona:')} ${persona.name}`);\n console.log(`${prefix} ├─ ${chalk.dim('Prompt:')} ${prompt}`);\n if (context !== undefined) {\n const contextStr = typeof context === 'string' ? context : JSON.stringify(context, null, 2);\n const lines = contextStr.split('\\n').slice(0, 5);\n console.log(`${prefix} ├─ ${chalk.dim('Context:')}`);\n for (const line of lines) {\n console.log(`${prefix} │ ${chalk.dim(line)}`);\n }\n }\n console.log(`${prefix} └─ ${chalk.dim('(No API call made)')}`);\n console.log('');\n}\n\n// ─── Debug logging ───────────────────────────────────────────────────────────\n\nexport function logDebug(message: string): void {\n if (!shouldLog('debug')) return;\n console.log(`${chalk.gray('[AGENT DEBUG]')} ${chalk.dim(message)}`);\n}\n","/**\n * Google AI provider — integrates with Gemini via @ai-sdk/google + Vercel AI SDK.\n *\n * Two execution paths:\n * 1. WITHOUT tools → ToolLoopAgent with structured output (JSON schema)\n * 2. WITH tools → generateText with provider tools (google_search, code_execution, etc.)\n * Tools are incompatible with structured JSON output at the Gemini API level,\n * so we instruct the model via prompt and parse the text response.\n */\n\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { ToolLoopAgent, Output, jsonSchema, generateText, stepCountIs, type ToolSet } from 'ai';\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaDefinition, ToolCall } from '../types.js';\nimport { resolveTools, hasExplicitTools, TOOLS_MIN_TIMEOUT } from '../tools/index.js';\nimport { logDebug } from '../utils/format.js';\nimport { z } from 'zod';\n\n// ─── Structured Output Schema (JSON Schema compatible with Gemini) ───────────\n\nconst agentOutputSchema = jsonSchema({\n type: 'object' as const,\n properties: {\n success: { type: 'boolean' as const, description: 'Whether the task was completed successfully' },\n summary: { type: 'string' as const, description: 'One-line human-readable conclusion' },\n reasoning: { type: 'string' as const, description: 'Your thought process' },\n data: {\n type: 'object' as const,\n description: 'Structured findings as key-value pairs',\n properties: {\n result: { type: 'string' as const, description: 'Primary result or finding' },\n },\n additionalProperties: true,\n },\n actions: { type: 'array' as const, items: { type: 'string' as const }, description: 'List of tools/steps you used' },\n confidence: { type: 'number' as const, minimum: 0, maximum: 1, description: '0-1 confidence score' },\n },\n required: ['success', 'summary', 'data', 'actions', 'confidence'] as const,\n additionalProperties: false,\n});\n\n// ─── JSON prompt suffix for tool-mode (no structured output available) ───────\n\nconst JSON_RESPONSE_INSTRUCTION = `\n\nIMPORTANT: You MUST respond with ONLY a valid JSON object (no markdown, no code fences, no extra text).\nUse this exact format:\n{\"success\": true, \"summary\": \"one-line conclusion\", \"reasoning\": \"your thought process\", \"data\": {\"result\": \"primary finding\"}, \"actions\": [\"tools/steps used\"], \"confidence\": 0.95}`;\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport async function callGoogle(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n const startTime = Date.now();\n const modelName = options?.model ?? config.model;\n\n logDebug(`Using model: ${modelName}`);\n logDebug(`Persona: ${persona.name}`);\n\n // Create Google AI provider instance\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n });\n\n // Build provider options for thinking config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerOptions: Record<string, any> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const googleOpts: Record<string, any> = {};\n\n if (options?.thinking) {\n const thinking = options.thinking;\n if (thinking.budget !== undefined) {\n googleOpts['thinkingConfig'] = { thinkingBudget: thinking.budget };\n } else if (thinking.level) {\n googleOpts['thinkingConfig'] = { thinkingLevel: thinking.level };\n }\n }\n\n if (Object.keys(googleOpts).length > 0) {\n providerOptions['google'] = googleOpts;\n }\n\n // ─── Resolve tools (opt-in only) ──────────────────────────────────────────\n const useTools = hasExplicitTools(options) && !config.localOnly;\n\n if (useTools) {\n logDebug('Tools requested — using generateText path (no structured output)');\n return callWithTools(prompt, context, persona, config, options!, google, modelName, startTime, providerOptions);\n }\n\n logDebug('No tools — using ToolLoopAgent with structured output');\n return callWithStructuredOutput(prompt, context, persona, config, options, google, modelName, startTime, providerOptions);\n}\n\n// ─── Path 1: WITH TOOLS (generateText, no structured output) ────────────────\n\nasync function callWithTools(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options: AgentCallOptions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n modelName: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n providerOptions: Record<string, any>,\n): Promise<AgentResult> {\n const resolvedTools = resolveTools(options.tools!, google);\n const toolNames = Object.keys(resolvedTools);\n logDebug(`Tools enabled: ${toolNames.join(', ')}`);\n\n const effectiveTimeout = Math.max(config.timeout, TOOLS_MIN_TIMEOUT);\n\n // Build user message\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n // Use generateText with provider tools\n // Provider tools (google_search, code_execution, url_context) run server-side\n // and are incompatible with structured JSON output (response_mime_type).\n const result = await generateText({\n model: google(modelName),\n system: persona.systemPrompt + JSON_RESPONSE_INSTRUCTION,\n prompt: userMessage,\n tools: resolvedTools as ToolSet,\n stopWhen: stepCountIs(5), // Allow multi-step: tool invocation → response\n maxOutputTokens: config.budget.maxTokensPerCall,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n abortSignal: AbortSignal.timeout(effectiveTimeout),\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received (tools path): ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // Collect tool calls from steps\n const collectedToolCalls: ToolCall[] = [];\n if (result.steps) {\n for (const step of result.steps) {\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n }\n }\n\n logDebug(`Tool calls collected: ${collectedToolCalls.length}`);\n\n // Parse text response (no structured output in tools mode)\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Path 2: WITHOUT TOOLS (ToolLoopAgent, structured output) ────────────────\n\nasync function callWithStructuredOutput(\n prompt: string,\n context: string,\n persona: PersonaDefinition,\n config: AgentConfig,\n options: AgentCallOptions | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n google: any,\n modelName: string,\n startTime: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n providerOptions: Record<string, any>,\n): Promise<AgentResult> {\n const userMessage = context\n ? `${prompt}\\n\\n--- Context ---\\n${context}`\n : prompt;\n\n const collectedToolCalls: ToolCall[] = [];\n\n // Determine output schema\n const useCustomSchema = !!(options?.schema || options?.responseFormat);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let outputConfig: any;\n\n if (options?.schema) {\n if (options.responseFormat) {\n logDebug('Both schema (Zod) and responseFormat provided — using schema (Zod)');\n }\n logDebug('Using custom Zod schema for structured output');\n outputConfig = Output.object({ schema: options.schema });\n } else if (options?.responseFormat) {\n logDebug('Using custom JSON Schema (responseFormat) for structured output');\n outputConfig = Output.object({ schema: jsonSchema(options.responseFormat.schema) });\n } else {\n outputConfig = Output.object({ schema: agentOutputSchema });\n }\n\n const agent = new ToolLoopAgent({\n model: google(modelName),\n instructions: useCustomSchema\n ? `${persona.systemPrompt}\\n\\nIMPORTANT: You must respond with structured data matching the requested output schema. Do not include AgentResult wrapper fields — just return the data matching the schema.`\n : persona.systemPrompt,\n maxOutputTokens: config.budget.maxTokensPerCall,\n output: outputConfig,\n providerOptions: Object.keys(providerOptions).length > 0 ? providerOptions : undefined,\n onStepFinish: (step) => {\n if (step.toolCalls) {\n for (const tc of step.toolCalls) {\n collectedToolCalls.push({\n name: tc.toolName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: (tc as any).args ?? {},\n result: tc.toolName,\n });\n }\n }\n logDebug(`Step finished: ${step.finishReason}`);\n },\n });\n\n const result = await agent.generate({\n prompt: userMessage,\n timeout: config.timeout,\n });\n\n const latencyMs = Date.now() - startTime;\n const tokensUsed = result.usage?.totalTokens ?? 0;\n\n logDebug(`Response received: ${latencyMs}ms, ${tokensUsed} tokens`);\n\n // Custom schema: wrap AI output in AgentResult\n if (useCustomSchema && result.output) {\n const customData = result.output as Record<string, unknown>;\n logDebug('Custom schema output received, wrapping in AgentResult');\n return {\n success: true,\n summary: `Structured output returned (${Object.keys(customData).length} fields)`,\n data: customData,\n actions: collectedToolCalls.map((tc) => tc.name),\n confidence: 1,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Default schema: use AgentResult fields directly\n if (result.output) {\n const output = result.output as {\n success: boolean;\n summary: string;\n reasoning?: string;\n data: Record<string, unknown>;\n actions: string[];\n confidence: number;\n };\n return {\n success: output.success,\n summary: output.summary,\n reasoning: output.reasoning,\n data: output.data,\n actions: output.actions,\n confidence: output.confidence,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n }\n\n // Fallback: parse text response\n const parsed = parseResponse(result.text);\n\n return {\n success: parsed?.success ?? true,\n summary: parsed?.summary ?? result.text.substring(0, 200),\n reasoning: parsed?.reasoning,\n data: parsed?.data ?? { raw: result.text },\n actions: parsed?.actions ?? collectedToolCalls.map((tc) => tc.name),\n confidence: parsed?.confidence ?? 0.5,\n metadata: {\n model: modelName,\n tokensUsed,\n latencyMs,\n toolCalls: collectedToolCalls,\n cached: false,\n },\n };\n}\n\n// ─── Response Parser (fallback for unstructured output) ──────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseResponse(text: string): any {\n // Try direct JSON parse\n try {\n return JSON.parse(text);\n } catch {\n // Try extracting JSON from markdown code fences\n const jsonMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[1]);\n } catch {\n // Fall through\n }\n }\n\n // Try finding JSON object in text\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n return JSON.parse(objectMatch[0]);\n } catch {\n // Fall through\n }\n }\n\n // Return as raw fallback\n return {\n success: true,\n summary: text.substring(0, 200),\n data: { raw: text },\n actions: [],\n confidence: 0.5,\n };\n }\n}\n","/**\n * Content anonymization — strips secrets, PII, and sensitive data\n * before sending to the AI provider.\n */\n\n// Patterns for sensitive content\nconst patterns = {\n // API keys and tokens (long alphanumeric strings near sensitive keywords)\n apiKey: /(?:api[_-]?key|token|secret|password|credential|auth)['\":\\s=]+['\"]?([A-Za-z0-9_\\-/.]{20,})['\"]?/gi,\n // Bearer tokens\n bearer: /Bearer\\s+[A-Za-z0-9_\\-/.+]{20,}/gi,\n // Email addresses\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // IPv4 addresses\n ipv4: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g,\n // IPv6 addresses (simplified)\n ipv6: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}/g,\n // AWS keys\n awsKey: /(?:AKIA|ASIA)[A-Z0-9]{16}/g,\n // Private keys\n privateKey: /-----BEGIN (?:RSA )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA )?PRIVATE KEY-----/g,\n // Connection strings\n connectionString: /(?:mongodb|postgres|mysql|redis|amqp):\\/\\/[^\\s'\"]+/gi,\n // .env style secrets\n envSecret: /^(?:DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|AWS_SECRET|STRIPE_KEY|SENDGRID_KEY)[=:].+$/gm,\n};\n\n/**\n * Anonymize sensitive content in a string.\n * Replaces detected secrets/PII with safe placeholders.\n */\nexport function anonymize(content: string): string {\n let result = content;\n\n result = result.replace(patterns.privateKey, '[REDACTED_PRIVATE_KEY]');\n result = result.replace(patterns.connectionString, '[REDACTED_CONNECTION_STRING]');\n result = result.replace(patterns.awsKey, '[REDACTED_AWS_KEY]');\n result = result.replace(patterns.bearer, 'Bearer [REDACTED_TOKEN]');\n result = result.replace(patterns.apiKey, (match, _key) => {\n // Keep the key name but redact the value\n const colonIdx = match.search(/['\":\\s=]/);\n const prefix = match.substring(0, colonIdx);\n return `${prefix}: [REDACTED]`;\n });\n result = result.replace(patterns.envSecret, (match) => {\n const eqIdx = match.search(/[=:]/);\n const key = match.substring(0, eqIdx);\n return `${key}=[REDACTED]`;\n });\n result = result.replace(patterns.email, '[EMAIL]');\n result = result.replace(patterns.ipv4, '[IP]');\n result = result.replace(patterns.ipv6, '[IP]');\n\n return result;\n}\n\n/**\n * Anonymize any value — handles strings, objects, arrays, and primitives.\n */\nexport function anonymizeValue(value: unknown): unknown {\n if (typeof value === 'string') {\n return anonymize(value);\n }\n if (Array.isArray(value)) {\n return value.map(anonymizeValue);\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = anonymizeValue(v);\n }\n return result;\n }\n return value;\n}\n","/**\n * Token bucket rate limiter.\n * Controls the rate of API calls to prevent abuse and stay within budget.\n */\n\nexport class RateLimiter {\n private tokens: number;\n private readonly maxTokens: number;\n private readonly refillRate: number; // tokens per millisecond\n private lastRefill: number;\n\n /**\n * @param maxCallsPerDay Maximum calls allowed per day\n */\n constructor(maxCallsPerDay: number) {\n this.maxTokens = maxCallsPerDay;\n this.tokens = maxCallsPerDay;\n // Refill rate: spread calls evenly across 24 hours\n this.refillRate = maxCallsPerDay / (24 * 60 * 60 * 1000);\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume one token.\n * @returns true if allowed, false if rate limited\n */\n tryConsume(): boolean {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n\n return false;\n }\n\n /**\n * Get remaining tokens (calls available)\n */\n remaining(): number {\n this.refill();\n return Math.floor(this.tokens);\n }\n\n /**\n * Reset the limiter (e.g., for testing or manual override)\n */\n reset(): void {\n this.tokens = this.maxTokens;\n this.lastRefill = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const newTokens = elapsed * this.refillRate;\n\n this.tokens = Math.min(this.maxTokens, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","/**\n * Budget tracker — monitors daily token usage and cost.\n * Enforces hard caps to prevent cost explosion.\n */\n\nimport type { BudgetConfig } from '../types.js';\n\nexport class BudgetTracker {\n private callsToday = 0;\n private tokensToday = 0;\n private costToday = 0;\n private dayStart: number;\n private readonly config: BudgetConfig;\n\n constructor(config: BudgetConfig) {\n this.config = config;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Check if a call is within budget. Resets counters at midnight UTC.\n */\n canMakeCall(): { allowed: boolean; reason?: string } {\n this.maybeResetDay();\n\n if (this.callsToday >= this.config.maxCallsPerDay) {\n return {\n allowed: false,\n reason: `Daily call limit reached (${this.config.maxCallsPerDay} calls/day)`,\n };\n }\n\n if (this.costToday >= this.config.costCapDaily) {\n return {\n allowed: false,\n reason: `Daily cost cap reached ($${this.config.costCapDaily.toFixed(2)})`,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Record a completed call's usage.\n */\n recordUsage(tokensUsed: number, costUsd: number): void {\n this.maybeResetDay();\n this.callsToday += 1;\n this.tokensToday += tokensUsed;\n this.costToday += costUsd;\n }\n\n /**\n * Get current usage stats.\n */\n getStats() {\n this.maybeResetDay();\n return {\n callsToday: this.callsToday,\n callsRemaining: Math.max(0, this.config.maxCallsPerDay - this.callsToday),\n tokensToday: this.tokensToday,\n costToday: this.costToday,\n costRemaining: Math.max(0, this.config.costCapDaily - this.costToday),\n };\n }\n\n /**\n * Reset all counters (for testing).\n */\n reset(): void {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = this.getStartOfDay();\n }\n\n /**\n * Get the max tokens allowed per call.\n */\n get maxTokensPerCall(): number {\n return this.config.maxTokensPerCall;\n }\n\n private maybeResetDay(): void {\n const currentDayStart = this.getStartOfDay();\n if (currentDayStart > this.dayStart) {\n this.callsToday = 0;\n this.tokensToday = 0;\n this.costToday = 0;\n this.dayStart = currentDayStart;\n }\n }\n\n private getStartOfDay(): number {\n const now = new Date();\n return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());\n }\n}\n","/**\n * Core agent engine — orchestrates persona selection, budget checks,\n * anonymization, provider calls, and console output.\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, PersonaName } from './types.js';\nimport { detectPersona, getPersona } from './personas/index.js';\nimport { callGoogle } from './providers/google.js';\nimport { anonymizeValue } from './utils/anonymize.js';\nimport { RateLimiter } from './utils/rate-limit.js';\nimport { BudgetTracker } from './utils/budget.js';\nimport {\n startSpinner,\n stopSpinner,\n formatResult,\n formatError,\n formatBudgetWarning,\n formatRateLimitWarning,\n formatDryRun,\n logDebug,\n} from './utils/format.js';\n\n// ─── Default Config ──────────────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: AgentConfig = {\n provider: 'google',\n model: 'gemini-2.5-flash-lite',\n persona: 'general',\n budget: {\n maxCallsPerDay: 100,\n maxTokensPerCall: 8000,\n costCapDaily: 1.0,\n },\n mode: 'fire-and-forget',\n timeout: 10000,\n anonymize: true,\n localOnly: false,\n dryRun: false,\n logLevel: 'info',\n safetySettings: [],\n};\n\n// ─── Singleton State ─────────────────────────────────────────────────────────\n\nlet config: AgentConfig = { ...DEFAULT_CONFIG };\nlet rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\nlet budgetTracker = new BudgetTracker(config.budget);\n\n/**\n * Update the global configuration. Reinitializes rate limiter and budget tracker.\n */\nexport function updateConfig(newConfig: Partial<AgentConfig>): void {\n config = { ...DEFAULT_CONFIG, ...newConfig };\n\n // Merge budget with defaults\n if (newConfig.budget) {\n config.budget = { ...DEFAULT_CONFIG.budget, ...newConfig.budget };\n }\n\n // Reinitialize limiters with new config\n rateLimiter = new RateLimiter(config.budget.maxCallsPerDay);\n budgetTracker = new BudgetTracker(config.budget);\n}\n\n/**\n * Get the current config (for testing/inspection).\n */\nexport function getConfig(): AgentConfig {\n return { ...config };\n}\n\n// ─── Core Execution ──────────────────────────────────────────────────────────\n\n/**\n * Execute an agent call. This is the core function behind console.agent().\n */\nexport async function executeAgent(\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n): Promise<AgentResult> {\n // Determine persona\n const personaName: PersonaName = options?.persona ?? config.persona;\n const persona = options?.persona\n ? getPersona(options.persona)\n : detectPersona(prompt, personaName);\n\n logDebug(`Selected persona: ${persona.name} (${persona.icon})`);\n\n // Dry run — log without calling API\n if (config.dryRun) {\n formatDryRun(prompt, persona, context);\n return createDryRunResult(persona.name);\n }\n\n // Check rate limits\n if (!rateLimiter.tryConsume()) {\n formatRateLimitWarning();\n return createErrorResult('Rate limited — too many calls. Try again later.');\n }\n\n // Check budget\n const budgetCheck = budgetTracker.canMakeCall();\n if (!budgetCheck.allowed) {\n formatBudgetWarning(budgetCheck.reason!);\n return createErrorResult(budgetCheck.reason!);\n }\n\n // Anonymize context if enabled\n let contextStr = '';\n if (context !== undefined) {\n const processed = config.anonymize ? anonymizeValue(context) : context;\n contextStr = typeof processed === 'string'\n ? processed\n : JSON.stringify(processed, null, 2);\n\n // Handle Error objects: JSON.stringify(Error) returns \"{}\" because\n // message/stack/name are non-enumerable. Extract them explicitly.\n if (context instanceof Error) {\n const errObj = {\n name: context.name,\n message: context.message,\n stack: context.stack,\n ...(typeof context === 'object' ? Object.getOwnPropertyNames(context).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (acc as any)[key] = (context as any)[key];\n return acc;\n }, {} as Record<string, unknown>) : {}),\n };\n const processed2 = config.anonymize ? anonymizeValue(errObj) : errObj;\n contextStr = typeof processed2 === 'string' ? processed2 : JSON.stringify(processed2, null, 2);\n }\n }\n\n // Anonymize prompt if enabled\n const processedPrompt = config.anonymize\n ? (anonymizeValue(prompt) as string)\n : prompt;\n\n // Start spinner\n const spinner = startSpinner(persona, processedPrompt);\n\n try {\n // Execute with timeout\n const result = await Promise.race([\n callGoogle(processedPrompt, contextStr, persona, config, options),\n createTimeout(config.timeout),\n ]);\n\n // Record usage\n budgetTracker.recordUsage(\n result.metadata.tokensUsed,\n estimateCost(result.metadata.tokensUsed, result.metadata.model),\n );\n\n // Stop spinner and format output\n stopSpinner(spinner, result.success);\n formatResult(result, persona);\n\n return result;\n } catch (error) {\n stopSpinner(spinner, false);\n const err = error instanceof Error ? error : new Error(String(error));\n formatError(err, persona);\n return createErrorResult(err.message);\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Agent timed out after ${ms}ms`)), ms);\n });\n}\n\nfunction createErrorResult(message: string): AgentResult {\n return {\n success: false,\n summary: message,\n data: {},\n actions: [],\n confidence: 0,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\nfunction createDryRunResult(personaName: string): AgentResult {\n return {\n success: true,\n summary: `[DRY RUN] Would have executed with ${personaName} persona`,\n data: { dryRun: true },\n actions: [],\n confidence: 1,\n metadata: {\n model: config.model,\n tokensUsed: 0,\n latencyMs: 0,\n toolCalls: [],\n cached: false,\n },\n };\n}\n\n/**\n * Rough cost estimation based on model and token count.\n */\nfunction estimateCost(tokens: number, model: string): number {\n // Approximate cost per 1M tokens\n const costPer1M: Record<string, number> = {\n 'gemini-2.5-flash-lite': 0.01,\n 'gemini-3-flash-preview': 0.03,\n };\n const rate = costPer1M[model] ?? 0.01;\n return (tokens / 1_000_000) * rate;\n}\n","/**\n * @console-agent/agent\n *\n * Drop console.agent(...) anywhere in your code to execute agentic workflows\n * — as easy as console.log()\n *\n * @example\n * ```ts\n * import { init } from '@console-agent/agent';\n *\n * // Optional configuration (works with sensible defaults)\n * init({ apiKey: process.env.GEMINI_API_KEY });\n *\n * // Fire-and-forget (default)\n * console.agent(\"analyze this error\", error);\n *\n * // Blocking mode\n * const result = await console.agent(\"validate email format\", email);\n *\n * // Persona shortcuts\n * console.agent.security(\"audit SQL query\", query);\n * console.agent.debug(\"investigate slow query\", { duration, sql });\n * console.agent.architect(\"review API design\", endpoint);\n * ```\n */\n\nimport type { AgentConfig, AgentCallOptions, AgentResult, AgentFunction } from './types.js';\nimport { executeAgent, updateConfig, getConfig } from './agent.js';\nimport { setLogLevel } from './utils/format.js';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport type {\n AgentConfig,\n AgentCallOptions,\n AgentResult,\n AgentFunction,\n ResponseFormat,\n ToolCall,\n PersonaName,\n PersonaDefinition,\n ToolName,\n ToolConfig,\n ThinkingConfig,\n BudgetConfig,\n SafetySetting,\n HarmCategory,\n HarmBlockThreshold,\n LogLevel,\n GoogleSearchConfig,\n} from './types.js';\n\nexport { DEFAULT_CONFIG } from './agent.js';\n\n// ─── Init ────────────────────────────────────────────────────────────────────\n\n/**\n * Initialize console.agent with custom configuration.\n * Call this once at app startup. Works with sensible defaults if not called.\n *\n * @example\n * ```ts\n * init({\n * apiKey: process.env.GEMINI_API_KEY,\n * model: 'gemini-2.5-flash-lite',\n * persona: 'debugger',\n * budget: { maxCallsPerDay: 200 },\n * });\n * ```\n */\nexport function init(config: Partial<AgentConfig> = {}): void {\n updateConfig(config);\n\n const fullConfig = getConfig();\n setLogLevel(fullConfig.logLevel);\n\n // Attach console.agent\n attachConsoleAgent();\n}\n\n// ─── Console Agent Proxy ─────────────────────────────────────────────────────\n\n/**\n * Create the console.agent callable with persona methods.\n * Uses a Proxy to make it both callable and have methods.\n */\nfunction createAgentProxy(): AgentFunction {\n // The base function that handles direct calls\n const agentFn = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n const config = getConfig();\n\n if (config.mode === 'fire-and-forget' && !options?.mode) {\n // Fire-and-forget: start async execution but don't return the promise\n // We still return a Promise for type compatibility, but the caller doesn't await it\n const promise = executeAgent(prompt, context, options);\n // Catch unhandled rejections silently\n promise.catch(() => { /* fire-and-forget errors are logged to console */ });\n return promise;\n }\n\n // Blocking mode: return the promise for awaiting\n return executeAgent(prompt, context, options);\n };\n\n // Add persona shortcuts\n agentFn.security = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'security' });\n };\n\n agentFn.debug = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'debugger' });\n };\n\n agentFn.architect = (\n prompt: string,\n context?: unknown,\n options?: AgentCallOptions,\n ): Promise<AgentResult> => {\n return executeAgent(prompt, context, { ...options, persona: 'architect' });\n };\n\n return agentFn as AgentFunction;\n}\n\n// ─── Attach to console ───────────────────────────────────────────────────────\n\n// Extend console type\ndeclare global {\n interface Console {\n agent: AgentFunction;\n }\n}\n\nlet attached = false;\n\nfunction attachConsoleAgent(): void {\n if (attached) return;\n\n const agentProxy = createAgentProxy();\n // Attach to global console object\n (console as unknown as Record<string, unknown>).agent = agentProxy;\n attached = true;\n}\n\n// ─── Auto-attach with defaults on import ─────────────────────────────────────\n\n// Auto-attach console.agent on first import with default config\nattachConsoleAgent();\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@console-agent/agent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Drop console.agent(...) anywhere in your code to execute agentic workflows — as easy as console.log()",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Pavel",
|
|
@@ -48,6 +48,10 @@
|
|
|
48
48
|
"llm",
|
|
49
49
|
"tool-calling"
|
|
50
50
|
],
|
|
51
|
+
"homepage": "https://console-agent.github.io",
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/console-agent/console_agent/issues"
|
|
54
|
+
},
|
|
51
55
|
"repository": {
|
|
52
56
|
"type": "git",
|
|
53
57
|
"url": "https://github.com/console-agent/console_agent.git"
|