@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 CHANGED
@@ -14,9 +14,9 @@
14
14
  ## Install
15
15
 
16
16
  ```bash
17
- bun add @console-agent/agent @ai-sdk/google
17
+ bun add @console-agent/agent
18
18
  # or
19
- npm install @console-agent/agent @ai-sdk/google
19
+ npm install @console-agent/agent
20
20
  ```
21
21
 
22
22
  ## Quick Start
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
- if (!config2.localOnly) {
359
- const toolNames = options?.tools ?? persona.defaultTools;
360
- logDebug(`Persona tools (informational): ${toolNames.join(", ")}`);
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$1(modelName),
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,
@@ -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
- if (!config2.localOnly) {
352
- const toolNames = options?.tools ?? persona.defaultTools;
353
- logDebug(`Persona tools (informational): ${toolNames.join(", ")}`);
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.1.0",
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"