@console-agent/agent 1.1.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 +214 -0
- package/dist/index.cjs +858 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +187 -0
- package/dist/index.d.ts +187 -0
- package/dist/index.js +850 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
interface ToolCall {
|
|
2
|
+
name: string;
|
|
3
|
+
args: Record<string, unknown>;
|
|
4
|
+
result?: unknown;
|
|
5
|
+
}
|
|
6
|
+
interface AgentResult {
|
|
7
|
+
/** Overall task success */
|
|
8
|
+
success: boolean;
|
|
9
|
+
/** Human-readable conclusion */
|
|
10
|
+
summary: string;
|
|
11
|
+
/** Agent's thought process (if thinking enabled) */
|
|
12
|
+
reasoning?: string;
|
|
13
|
+
/** Structured findings */
|
|
14
|
+
data: Record<string, unknown>;
|
|
15
|
+
/** Tools used / steps taken */
|
|
16
|
+
actions: string[];
|
|
17
|
+
/** 0-1 confidence score */
|
|
18
|
+
confidence: number;
|
|
19
|
+
/** Execution metadata */
|
|
20
|
+
metadata: {
|
|
21
|
+
model: string;
|
|
22
|
+
tokensUsed: number;
|
|
23
|
+
latencyMs: number;
|
|
24
|
+
toolCalls: ToolCall[];
|
|
25
|
+
cached: boolean;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
type PersonaName = 'debugger' | 'security' | 'architect' | 'general';
|
|
29
|
+
interface PersonaDefinition {
|
|
30
|
+
name: PersonaName;
|
|
31
|
+
systemPrompt: string;
|
|
32
|
+
icon: string;
|
|
33
|
+
label: string;
|
|
34
|
+
defaultTools: ToolName[];
|
|
35
|
+
keywords: string[];
|
|
36
|
+
}
|
|
37
|
+
type ToolName = 'code_execution' | 'google_search' | 'file_analysis';
|
|
38
|
+
interface GoogleSearchConfig {
|
|
39
|
+
mode?: 'MODE_DYNAMIC' | 'MODE_UNSPECIFIED';
|
|
40
|
+
dynamicThreshold?: number;
|
|
41
|
+
}
|
|
42
|
+
interface ToolConfig {
|
|
43
|
+
type: ToolName;
|
|
44
|
+
config?: GoogleSearchConfig;
|
|
45
|
+
}
|
|
46
|
+
interface ThinkingConfig {
|
|
47
|
+
/** For gemini-3 models */
|
|
48
|
+
level?: 'minimal' | 'low' | 'medium' | 'high';
|
|
49
|
+
/** For gemini-2.5 models */
|
|
50
|
+
budget?: number;
|
|
51
|
+
/** Return reasoning summary in result */
|
|
52
|
+
includeThoughts?: boolean;
|
|
53
|
+
}
|
|
54
|
+
type HarmCategory = 'HARM_CATEGORY_HATE_SPEECH' | 'HARM_CATEGORY_DANGEROUS_CONTENT' | 'HARM_CATEGORY_HARASSMENT' | 'HARM_CATEGORY_SEXUALLY_EXPLICIT';
|
|
55
|
+
type HarmBlockThreshold = 'BLOCK_NONE' | 'BLOCK_ONLY_HIGH' | 'BLOCK_MEDIUM_AND_ABOVE' | 'BLOCK_LOW_AND_ABOVE';
|
|
56
|
+
interface SafetySetting {
|
|
57
|
+
category: HarmCategory;
|
|
58
|
+
threshold: HarmBlockThreshold;
|
|
59
|
+
}
|
|
60
|
+
interface BudgetConfig {
|
|
61
|
+
/** Max API calls per day (default: 100) */
|
|
62
|
+
maxCallsPerDay: number;
|
|
63
|
+
/** Max tokens per single call (default: 8000) */
|
|
64
|
+
maxTokensPerCall: number;
|
|
65
|
+
/** Hard daily cost cap in USD (default: 1.00) */
|
|
66
|
+
costCapDaily: number;
|
|
67
|
+
}
|
|
68
|
+
interface ResponseFormat {
|
|
69
|
+
/** Must be 'json_object' */
|
|
70
|
+
type: 'json_object';
|
|
71
|
+
/** JSON Schema object describing the desired output shape */
|
|
72
|
+
schema: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
interface AgentCallOptions {
|
|
75
|
+
/** Override model for this call */
|
|
76
|
+
model?: string;
|
|
77
|
+
/** Tools to enable */
|
|
78
|
+
tools?: (ToolName | ToolConfig)[];
|
|
79
|
+
/** Thinking/reasoning config */
|
|
80
|
+
thinking?: ThinkingConfig;
|
|
81
|
+
/** Force persona for this call */
|
|
82
|
+
persona?: PersonaName;
|
|
83
|
+
/** Override execution mode */
|
|
84
|
+
mode?: 'fire-and-forget' | 'blocking';
|
|
85
|
+
/**
|
|
86
|
+
* Zod schema for typed structured output.
|
|
87
|
+
* When provided, the AI returns data matching this schema.
|
|
88
|
+
* The result is placed in `AgentResult.data`.
|
|
89
|
+
* Takes priority over `responseFormat` if both are specified.
|
|
90
|
+
*/
|
|
91
|
+
schema?: any;
|
|
92
|
+
/**
|
|
93
|
+
* Plain JSON Schema for structured output (no Zod dependency needed).
|
|
94
|
+
* Use `{ type: 'json_object', schema: { ... } }` with a standard JSON Schema.
|
|
95
|
+
* The result is placed in `AgentResult.data`.
|
|
96
|
+
*/
|
|
97
|
+
responseFormat?: ResponseFormat;
|
|
98
|
+
}
|
|
99
|
+
type LogLevel = 'silent' | 'errors' | 'info' | 'debug';
|
|
100
|
+
interface AgentConfig {
|
|
101
|
+
/** AI provider — only 'google' in v1.0 */
|
|
102
|
+
provider: 'google';
|
|
103
|
+
/** Gemini API key */
|
|
104
|
+
apiKey?: string;
|
|
105
|
+
/** Model to use */
|
|
106
|
+
model: string;
|
|
107
|
+
/** Default persona */
|
|
108
|
+
persona: PersonaName;
|
|
109
|
+
/** Budget controls */
|
|
110
|
+
budget: BudgetConfig;
|
|
111
|
+
/** Execution mode */
|
|
112
|
+
mode: 'fire-and-forget' | 'blocking';
|
|
113
|
+
/** Timeout in ms before fallback */
|
|
114
|
+
timeout: number;
|
|
115
|
+
/** Auto-strip secrets/PII before sending */
|
|
116
|
+
anonymize: boolean;
|
|
117
|
+
/** Disable cloud tools (enterprise mode) */
|
|
118
|
+
localOnly: boolean;
|
|
119
|
+
/** Log prompts without sending */
|
|
120
|
+
dryRun: boolean;
|
|
121
|
+
/** Console log level */
|
|
122
|
+
logLevel: LogLevel;
|
|
123
|
+
/** Safety settings */
|
|
124
|
+
safetySettings: SafetySetting[];
|
|
125
|
+
}
|
|
126
|
+
interface AgentFunction {
|
|
127
|
+
(prompt: string, context?: unknown, options?: AgentCallOptions): Promise<AgentResult>;
|
|
128
|
+
security: (prompt: string, context?: unknown, options?: AgentCallOptions) => Promise<AgentResult>;
|
|
129
|
+
debug: (prompt: string, context?: unknown, options?: AgentCallOptions) => Promise<AgentResult>;
|
|
130
|
+
architect: (prompt: string, context?: unknown, options?: AgentCallOptions) => Promise<AgentResult>;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Core agent engine — orchestrates persona selection, budget checks,
|
|
135
|
+
* anonymization, provider calls, and console output.
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
declare const DEFAULT_CONFIG: AgentConfig;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @console-agent/agent
|
|
142
|
+
*
|
|
143
|
+
* Drop console.agent(...) anywhere in your code to execute agentic workflows
|
|
144
|
+
* — as easy as console.log()
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* import { init } from '@console-agent/agent';
|
|
149
|
+
*
|
|
150
|
+
* // Optional configuration (works with sensible defaults)
|
|
151
|
+
* init({ apiKey: process.env.GEMINI_API_KEY });
|
|
152
|
+
*
|
|
153
|
+
* // Fire-and-forget (default)
|
|
154
|
+
* console.agent("analyze this error", error);
|
|
155
|
+
*
|
|
156
|
+
* // Blocking mode
|
|
157
|
+
* const result = await console.agent("validate email format", email);
|
|
158
|
+
*
|
|
159
|
+
* // Persona shortcuts
|
|
160
|
+
* console.agent.security("audit SQL query", query);
|
|
161
|
+
* console.agent.debug("investigate slow query", { duration, sql });
|
|
162
|
+
* console.agent.architect("review API design", endpoint);
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Initialize console.agent with custom configuration.
|
|
168
|
+
* Call this once at app startup. Works with sensible defaults if not called.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```ts
|
|
172
|
+
* init({
|
|
173
|
+
* apiKey: process.env.GEMINI_API_KEY,
|
|
174
|
+
* model: 'gemini-2.5-flash-lite',
|
|
175
|
+
* persona: 'debugger',
|
|
176
|
+
* budget: { maxCallsPerDay: 200 },
|
|
177
|
+
* });
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
declare function init(config?: Partial<AgentConfig>): void;
|
|
181
|
+
declare global {
|
|
182
|
+
interface Console {
|
|
183
|
+
agent: AgentFunction;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export { type AgentCallOptions, type AgentConfig, type AgentFunction, type AgentResult, type BudgetConfig, DEFAULT_CONFIG, type GoogleSearchConfig, type HarmBlockThreshold, type HarmCategory, type LogLevel, type PersonaDefinition, type PersonaName, type ResponseFormat, type SafetySetting, type ThinkingConfig, type ToolCall, type ToolConfig, type ToolName, init };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
interface ToolCall {
|
|
2
|
+
name: string;
|
|
3
|
+
args: Record<string, unknown>;
|
|
4
|
+
result?: unknown;
|
|
5
|
+
}
|
|
6
|
+
interface AgentResult {
|
|
7
|
+
/** Overall task success */
|
|
8
|
+
success: boolean;
|
|
9
|
+
/** Human-readable conclusion */
|
|
10
|
+
summary: string;
|
|
11
|
+
/** Agent's thought process (if thinking enabled) */
|
|
12
|
+
reasoning?: string;
|
|
13
|
+
/** Structured findings */
|
|
14
|
+
data: Record<string, unknown>;
|
|
15
|
+
/** Tools used / steps taken */
|
|
16
|
+
actions: string[];
|
|
17
|
+
/** 0-1 confidence score */
|
|
18
|
+
confidence: number;
|
|
19
|
+
/** Execution metadata */
|
|
20
|
+
metadata: {
|
|
21
|
+
model: string;
|
|
22
|
+
tokensUsed: number;
|
|
23
|
+
latencyMs: number;
|
|
24
|
+
toolCalls: ToolCall[];
|
|
25
|
+
cached: boolean;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
type PersonaName = 'debugger' | 'security' | 'architect' | 'general';
|
|
29
|
+
interface PersonaDefinition {
|
|
30
|
+
name: PersonaName;
|
|
31
|
+
systemPrompt: string;
|
|
32
|
+
icon: string;
|
|
33
|
+
label: string;
|
|
34
|
+
defaultTools: ToolName[];
|
|
35
|
+
keywords: string[];
|
|
36
|
+
}
|
|
37
|
+
type ToolName = 'code_execution' | 'google_search' | 'file_analysis';
|
|
38
|
+
interface GoogleSearchConfig {
|
|
39
|
+
mode?: 'MODE_DYNAMIC' | 'MODE_UNSPECIFIED';
|
|
40
|
+
dynamicThreshold?: number;
|
|
41
|
+
}
|
|
42
|
+
interface ToolConfig {
|
|
43
|
+
type: ToolName;
|
|
44
|
+
config?: GoogleSearchConfig;
|
|
45
|
+
}
|
|
46
|
+
interface ThinkingConfig {
|
|
47
|
+
/** For gemini-3 models */
|
|
48
|
+
level?: 'minimal' | 'low' | 'medium' | 'high';
|
|
49
|
+
/** For gemini-2.5 models */
|
|
50
|
+
budget?: number;
|
|
51
|
+
/** Return reasoning summary in result */
|
|
52
|
+
includeThoughts?: boolean;
|
|
53
|
+
}
|
|
54
|
+
type HarmCategory = 'HARM_CATEGORY_HATE_SPEECH' | 'HARM_CATEGORY_DANGEROUS_CONTENT' | 'HARM_CATEGORY_HARASSMENT' | 'HARM_CATEGORY_SEXUALLY_EXPLICIT';
|
|
55
|
+
type HarmBlockThreshold = 'BLOCK_NONE' | 'BLOCK_ONLY_HIGH' | 'BLOCK_MEDIUM_AND_ABOVE' | 'BLOCK_LOW_AND_ABOVE';
|
|
56
|
+
interface SafetySetting {
|
|
57
|
+
category: HarmCategory;
|
|
58
|
+
threshold: HarmBlockThreshold;
|
|
59
|
+
}
|
|
60
|
+
interface BudgetConfig {
|
|
61
|
+
/** Max API calls per day (default: 100) */
|
|
62
|
+
maxCallsPerDay: number;
|
|
63
|
+
/** Max tokens per single call (default: 8000) */
|
|
64
|
+
maxTokensPerCall: number;
|
|
65
|
+
/** Hard daily cost cap in USD (default: 1.00) */
|
|
66
|
+
costCapDaily: number;
|
|
67
|
+
}
|
|
68
|
+
interface ResponseFormat {
|
|
69
|
+
/** Must be 'json_object' */
|
|
70
|
+
type: 'json_object';
|
|
71
|
+
/** JSON Schema object describing the desired output shape */
|
|
72
|
+
schema: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
interface AgentCallOptions {
|
|
75
|
+
/** Override model for this call */
|
|
76
|
+
model?: string;
|
|
77
|
+
/** Tools to enable */
|
|
78
|
+
tools?: (ToolName | ToolConfig)[];
|
|
79
|
+
/** Thinking/reasoning config */
|
|
80
|
+
thinking?: ThinkingConfig;
|
|
81
|
+
/** Force persona for this call */
|
|
82
|
+
persona?: PersonaName;
|
|
83
|
+
/** Override execution mode */
|
|
84
|
+
mode?: 'fire-and-forget' | 'blocking';
|
|
85
|
+
/**
|
|
86
|
+
* Zod schema for typed structured output.
|
|
87
|
+
* When provided, the AI returns data matching this schema.
|
|
88
|
+
* The result is placed in `AgentResult.data`.
|
|
89
|
+
* Takes priority over `responseFormat` if both are specified.
|
|
90
|
+
*/
|
|
91
|
+
schema?: any;
|
|
92
|
+
/**
|
|
93
|
+
* Plain JSON Schema for structured output (no Zod dependency needed).
|
|
94
|
+
* Use `{ type: 'json_object', schema: { ... } }` with a standard JSON Schema.
|
|
95
|
+
* The result is placed in `AgentResult.data`.
|
|
96
|
+
*/
|
|
97
|
+
responseFormat?: ResponseFormat;
|
|
98
|
+
}
|
|
99
|
+
type LogLevel = 'silent' | 'errors' | 'info' | 'debug';
|
|
100
|
+
interface AgentConfig {
|
|
101
|
+
/** AI provider — only 'google' in v1.0 */
|
|
102
|
+
provider: 'google';
|
|
103
|
+
/** Gemini API key */
|
|
104
|
+
apiKey?: string;
|
|
105
|
+
/** Model to use */
|
|
106
|
+
model: string;
|
|
107
|
+
/** Default persona */
|
|
108
|
+
persona: PersonaName;
|
|
109
|
+
/** Budget controls */
|
|
110
|
+
budget: BudgetConfig;
|
|
111
|
+
/** Execution mode */
|
|
112
|
+
mode: 'fire-and-forget' | 'blocking';
|
|
113
|
+
/** Timeout in ms before fallback */
|
|
114
|
+
timeout: number;
|
|
115
|
+
/** Auto-strip secrets/PII before sending */
|
|
116
|
+
anonymize: boolean;
|
|
117
|
+
/** Disable cloud tools (enterprise mode) */
|
|
118
|
+
localOnly: boolean;
|
|
119
|
+
/** Log prompts without sending */
|
|
120
|
+
dryRun: boolean;
|
|
121
|
+
/** Console log level */
|
|
122
|
+
logLevel: LogLevel;
|
|
123
|
+
/** Safety settings */
|
|
124
|
+
safetySettings: SafetySetting[];
|
|
125
|
+
}
|
|
126
|
+
interface AgentFunction {
|
|
127
|
+
(prompt: string, context?: unknown, options?: AgentCallOptions): Promise<AgentResult>;
|
|
128
|
+
security: (prompt: string, context?: unknown, options?: AgentCallOptions) => Promise<AgentResult>;
|
|
129
|
+
debug: (prompt: string, context?: unknown, options?: AgentCallOptions) => Promise<AgentResult>;
|
|
130
|
+
architect: (prompt: string, context?: unknown, options?: AgentCallOptions) => Promise<AgentResult>;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Core agent engine — orchestrates persona selection, budget checks,
|
|
135
|
+
* anonymization, provider calls, and console output.
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
declare const DEFAULT_CONFIG: AgentConfig;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @console-agent/agent
|
|
142
|
+
*
|
|
143
|
+
* Drop console.agent(...) anywhere in your code to execute agentic workflows
|
|
144
|
+
* — as easy as console.log()
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* import { init } from '@console-agent/agent';
|
|
149
|
+
*
|
|
150
|
+
* // Optional configuration (works with sensible defaults)
|
|
151
|
+
* init({ apiKey: process.env.GEMINI_API_KEY });
|
|
152
|
+
*
|
|
153
|
+
* // Fire-and-forget (default)
|
|
154
|
+
* console.agent("analyze this error", error);
|
|
155
|
+
*
|
|
156
|
+
* // Blocking mode
|
|
157
|
+
* const result = await console.agent("validate email format", email);
|
|
158
|
+
*
|
|
159
|
+
* // Persona shortcuts
|
|
160
|
+
* console.agent.security("audit SQL query", query);
|
|
161
|
+
* console.agent.debug("investigate slow query", { duration, sql });
|
|
162
|
+
* console.agent.architect("review API design", endpoint);
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Initialize console.agent with custom configuration.
|
|
168
|
+
* Call this once at app startup. Works with sensible defaults if not called.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```ts
|
|
172
|
+
* init({
|
|
173
|
+
* apiKey: process.env.GEMINI_API_KEY,
|
|
174
|
+
* model: 'gemini-2.5-flash-lite',
|
|
175
|
+
* persona: 'debugger',
|
|
176
|
+
* budget: { maxCallsPerDay: 200 },
|
|
177
|
+
* });
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
declare function init(config?: Partial<AgentConfig>): void;
|
|
181
|
+
declare global {
|
|
182
|
+
interface Console {
|
|
183
|
+
agent: AgentFunction;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export { type AgentCallOptions, type AgentConfig, type AgentFunction, type AgentResult, type BudgetConfig, DEFAULT_CONFIG, type GoogleSearchConfig, type HarmBlockThreshold, type HarmCategory, type LogLevel, type PersonaDefinition, type PersonaName, type ResponseFormat, type SafetySetting, type ThinkingConfig, type ToolCall, type ToolConfig, type ToolName, init };
|