@awi-protocol/sdk 0.1.1 → 0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/advisory-executor.ts","../src/compiler/local-axir.ts","../src/compiler/grammar/axir-schema.gbnf"],"sourcesContent":["/**\n * AWI (Agent Web Interface) JavaScript SDK\n * \n * Deterministic web automation for AI agents.\n * \n * @example\n * ```typescript\n * import { AWIClient } from '@awi-protocol/sdk';\n * \n * const client = new AWIClient({\n * endpoint: 'https://awi.example.com',\n * certificate: 'your-jwt-token',\n * });\n * \n * const result = await client.execute({\n * target: 'awi://linkedin.com/jobs/search/v1',\n * params: { query: 'rust engineer' },\n * });\n * ```\n */\n\nexport { AWIClient, AWIError } from './client';\nexport { AdvisoryExecutor } from './advisory-executor';\nexport {\n LocalAXIRCompiler,\n type LocalAXIRCompilerOptions,\n} from './compiler/local-axir';\nexport type {\n AgentRequest,\n AgentResponse,\n Recipe,\n RecipeStep,\n SelectorSet,\n Selector,\n ExtractionSpec,\n ExtractionField,\n ValidationRules,\n AXIRIntent,\n RegistryEntry,\n FeedbackRequest,\n DelegationRequest,\n AWIClientOptions,\n ExecutionMetrics,\n ExecutionMode,\n RecipeStatus,\n AgentTier,\n} from './types';\nexport type {\n AXIRNode,\n AXIREdge,\n AXIRWorkflow,\n AXIRIntentMapping,\n AXIRField,\n AXIRCompilationResult,\n AXIRHealingResult,\n SelectorCandidate,\n PageType,\n} from './compiler/types';\n\nexport { default } from './client';\n","/**\n * AWI Client\n * \n * Main SDK class for interacting with AWI servers.\n * Supports proxy mode (server executes browser) and advisory mode (returns blueprint).\n */\n\nimport fetch from 'cross-fetch';\nimport type {\n AgentRequest,\n AgentResponse,\n AWIClientOptions,\n Recipe,\n RegistryEntry,\n FeedbackRequest,\n DelegationRequest,\n ExecutionMetrics,\n} from './types';\n\nexport class AWIError extends Error {\n code: string;\n statusCode: number;\n details?: Record<string, unknown>;\n\n constructor(code: string, message: string, statusCode: number, details?: Record<string, unknown>) {\n super(message);\n this.name = 'AWIError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n }\n}\n\nexport class AWIClient {\n private endpoint: string;\n private certificate: string;\n private timeout: number;\n private retries: number;\n\n constructor(options: AWIClientOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, '');\n this.certificate = options.certificate;\n this.timeout = options.timeout || 30000;\n this.retries = options.retries || 3;\n }\n\n /**\n * Execute a recipe in proxy mode.\n * The server runs the browser and returns structured data.\n */\n async execute<T = unknown>(request: Omit<AgentRequest, 'mode'>): Promise<AgentResponse<T>> {\n return this._request<AgentResponse<T>>('/v1/execute', {\n ...request,\n mode: 'proxy',\n });\n }\n\n /**\n * Get advisory blueprint for agent-side execution.\n * Returns the recipe structure without running the browser.\n */\n async getAdvisory(target: string): Promise<AgentResponse<Recipe>> {\n return this._request<AgentResponse<Recipe>>('/v1/advisory', {\n target,\n });\n }\n\n /**\n * Execute in advisory mode - get blueprint then run locally.\n * This is useful when you want to control the browser yourself.\n */\n async executeAdvisory<T = unknown>(\n request: Omit<AgentRequest, 'mode'>,\n localExecutor: (blueprint: Recipe, params: Record<string, unknown>) => Promise<T>\n ): Promise<AgentResponse<T>> {\n // Get blueprint\n const advisory = await this.getAdvisory(request.target);\n\n if (!advisory.success || !advisory.data) {\n return {\n ...advisory,\n data: null,\n } as AgentResponse<T>;\n }\n\n // Execute locally\n const startTime = Date.now();\n try {\n const data = await localExecutor(advisory.data, request.params);\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n data,\n errors: [],\n metadata: {\n ...advisory.metadata,\n latency_ms: latency,\n mode: 'advisory-local',\n },\n execution_path: ['advisory', 'local-execution'],\n axir_intent: advisory.axir_intent,\n };\n } catch (error) {\n return {\n success: false,\n data: null,\n errors: [{\n code: 'LOCAL_EXECUTION_ERROR',\n message: error instanceof Error ? error.message : 'Unknown error',\n }],\n metadata: advisory.metadata,\n execution_path: ['advisory', 'local-execution-failed'],\n };\n }\n }\n\n /**\n * Submit feedback on execution quality.\n */\n async feedback(request: FeedbackRequest): Promise<AgentResponse<{ feedback_received: boolean }>> {\n return this._request('/v1/feedback', request);\n }\n\n /**\n * Explore an unknown domain and generate a recipe.\n */\n async explore(domain: string, action: string, resource?: string): Promise<AgentResponse<Recipe>> {\n const target = `awi://${domain}/${resource || action}/${action}/v1`;\n return this._request('/v1/execute', {\n target,\n params: {},\n mode: 'proxy',\n options: { explore: true },\n });\n }\n\n /**\n * List supported sites in the registry.\n */\n async listRegistry(options?: {\n category?: string;\n certifiedOnly?: boolean;\n minConfidence?: number;\n search?: string;\n limit?: number;\n }): Promise<AgentResponse<{ sites: RegistryEntry[]; stats: Record<string, unknown> }>> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.certifiedOnly) params.set('certified_only', 'true');\n if (options?.minConfidence) params.set('min_confidence', String(options.minConfidence));\n if (options?.search) params.set('search', options.search);\n if (options?.limit) params.set('limit', String(options.limit));\n\n return this._request(`/v1/registry?${params.toString()}`, undefined, 'GET');\n }\n\n /**\n * Search registry.\n */\n async searchRegistry(query: string, limit?: number): Promise<AgentResponse<{ results: RegistryEntry[] }>> {\n const params = new URLSearchParams();\n params.set('q', query);\n if (limit) params.set('limit', String(limit));\n\n return this._request(`/v1/registry/search?${params.toString()}`, undefined, 'GET');\n }\n\n /**\n * Delegate execution to another agent.\n */\n async delegate(request: DelegationRequest): Promise<AgentResponse<{ delegation_id: string }>> {\n return this._request('/v1/delegate', request);\n }\n\n /**\n * Join a multi-agent session.\n */\n async joinSession(sessionId: string): Promise<AgentResponse<{ session_id: string; participants: string[] }>> {\n return this._request('/v1/session/join', { session_id: sessionId });\n }\n\n /**\n * Check server health.\n */\n async health(): Promise<{ status: string; version: string }> {\n const response = await fetch(`${this.endpoint}/health`, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new AWIError('HEALTH_CHECK_FAILED', 'Server health check failed', response.status);\n }\n\n return response.json();\n }\n\n /**\n * Get execution metrics from a response.\n */\n getMetrics(response: AgentResponse<unknown>): ExecutionMetrics {\n return {\n latency_ms: response.metadata?.latency_ms || 0,\n fallback_count: (response.metadata?.fallback_count as number) || 0,\n selectors_used: (response.metadata?.selectors_used as string[]) || [],\n cache_status: response.metadata?.cache_status || 'miss',\n };\n }\n\n private async _request<T>(\n path: string,\n body?: unknown,\n method: string = 'POST'\n ): Promise<T> {\n const url = `${this.endpoint}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'AWI-Agent-Certificate': this.certificate,\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new AWIError(\n errorData.errors?.[0]?.code || 'REQUEST_FAILED',\n errorData.errors?.[0]?.message || `HTTP ${response.status}`,\n response.status,\n errorData\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on 4xx errors (client errors)\n if (error instanceof AWIError && error.statusCode >= 400 && error.statusCode < 500) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n if (attempt < this.retries - 1) {\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n }\n\n throw lastError || new AWIError('MAX_RETRIES', 'Max retries exceeded', 502);\n }\n}\n\nexport default AWIClient;\n","/**\n * Advisory Mode Executor\n * \n * Executes recipe blueprints locally in a browser or Node.js environment.\n * Useful when you want to control the browser yourself but use AWI selectors.\n */\n\nimport type { Recipe, RecipeStep, SelectorSet, ExecutionMetrics } from './types';\n\nexport interface LocalExecutionContext {\n document: Document;\n window: Window;\n console: Console;\n}\n\nexport class AdvisoryExecutor {\n private context: LocalExecutionContext;\n private metrics: ExecutionMetrics;\n\n constructor(context: LocalExecutionContext) {\n this.context = context;\n this.metrics = {\n latency_ms: 0,\n fallback_count: 0,\n selectors_used: [],\n cache_status: 'bypass',\n };\n }\n\n /**\n * Execute a recipe blueprint locally.\n */\n async execute<T = unknown>(recipe: Recipe, params: Record<string, unknown>): Promise<{\n success: boolean;\n data: T | null;\n errors: Array<{ code: string; message: string }>;\n metrics: ExecutionMetrics;\n }> {\n const startTime = Date.now();\n const errors: Array<{ code: string; message: string }> = [];\n const executionPath: string[] = [];\n\n try {\n // Execute steps\n for (const step of recipe.steps) {\n const stepResult = await this._executeStep(step, params, recipe);\n\n if (stepResult.error) {\n errors.push(stepResult.error);\n break;\n }\n\n executionPath.push(`${step.type}:${step.name || 'unnamed'}`);\n }\n\n // Extract data if all steps passed\n let data: T | null = null;\n if (errors.length === 0 && recipe.extraction) {\n data = await this._extractData<T>(recipe);\n }\n\n this.metrics.latency_ms = Date.now() - startTime;\n\n return {\n success: errors.length === 0,\n data,\n errors,\n metrics: { ...this.metrics },\n };\n } catch (error) {\n return {\n success: false,\n data: null,\n errors: [{\n code: 'EXECUTION_ERROR',\n message: error instanceof Error ? error.message : 'Unknown error',\n }],\n metrics: { ...this.metrics },\n };\n }\n }\n\n private async _executeStep(\n step: RecipeStep,\n params: Record<string, unknown>,\n recipe: Recipe\n ): Promise<{ error?: { code: string; message: string } }> {\n try {\n switch (step.type) {\n case 'navigate':\n if (step.url) {\n const url = this._interpolate(step.url, params);\n this.context.window.location.href = url;\n }\n break;\n\n case 'wait':\n if (step.selector) {\n const selectorSet = recipe.selectors[step.selector];\n if (selectorSet) {\n await this._waitForSelector(selectorSet);\n }\n } else {\n await this._sleep(1000);\n }\n break;\n\n case 'click':\n if (step.selector) {\n const element = this._resolveSelector(recipe.selectors[step.selector]);\n if (element) {\n element.click();\n } else {\n return { error: { code: 'CLICK_FAILED', message: `Selector not found: ${step.selector}` } };\n }\n }\n break;\n\n case 'type':\n if (step.selector && step.value) {\n const element = this._resolveSelector(recipe.selectors[step.selector]) as HTMLInputElement | null;\n if (element) {\n const value = this._interpolate(step.value, params);\n element.value = value;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n return { error: { code: 'TYPE_FAILED', message: `Selector not found: ${step.selector}` } };\n }\n }\n break;\n\n case 'scroll':\n const amount = step.amount || 500;\n this.context.window.scrollBy(0, amount);\n break;\n\n case 'extract_list':\n case 'extract_one':\n // Extraction happens after all steps\n break;\n }\n\n return {};\n } catch (error) {\n return {\n error: {\n code: 'STEP_ERROR',\n message: error instanceof Error ? error.message : 'Unknown step error',\n },\n };\n }\n }\n\n private async _extractData<T>(recipe: Recipe): Promise<T | null> {\n const extraction = recipe.extraction;\n if (!extraction) return null;\n\n const containerSet = recipe.selectors[extraction.container];\n if (!containerSet) return null;\n\n const container = this._resolveSelector(containerSet);\n if (!container) return null;\n\n const items = extraction.mode === 'list' \n ? Array.from(container.children)\n : [container];\n\n const results: Array<Record<string, unknown>> = [];\n\n for (const item of items) {\n const record: Record<string, unknown> = {};\n\n for (const field of extraction.fields) {\n const fieldSet = recipe.selectors[field.selector];\n if (fieldSet) {\n const fieldElement = this._resolveSelectorWithin(item as HTMLElement, fieldSet);\n if (fieldElement) {\n let value = fieldElement.textContent || '';\n\n // Apply transform\n if (field.transform) {\n value = String(this._applyTransform(value, field.transform));\n }\n\n record[field.name] = value;\n } else {\n record[field.name] = null;\n }\n }\n }\n\n results.push(record);\n }\n\n return (extraction.mode === 'one' ? results[0] : results) as T;\n }\n\n private _resolveSelector(selectorSet: SelectorSet): HTMLElement | null {\n for (const selector of selectorSet.selectors) {\n const element = this._trySelector(selector.type, selector.value);\n if (element) {\n this.metrics.selectors_used.push(selectorSet.name);\n return element;\n }\n this.metrics.fallback_count++;\n }\n return null;\n }\n\n private _resolveSelectorWithin(parent: HTMLElement, selectorSet: SelectorSet): HTMLElement | null {\n for (const selector of selectorSet.selectors) {\n try {\n const element = parent.querySelector(selector.value) as HTMLElement | null;\n if (element) {\n this.metrics.selectors_used.push(selectorSet.name);\n return element;\n }\n } catch {\n // Invalid selector, try next\n }\n }\n return null;\n }\n\n private _trySelector(type: string, value: string): HTMLElement | null {\n try {\n switch (type) {\n case 'css':\n return this.context.document.querySelector(value) as HTMLElement | null;\n case 'semantic':\n // Try data-testid\n return this.context.document.querySelector(`[data-testid=\"${value}\"]`) as HTMLElement | null;\n case 'text':\n // XPath or text content search\n const xpath = `//*[contains(text(), \"${value}\")]`;\n const result = this.context.document.evaluate(\n xpath,\n this.context.document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n return result.singleNodeValue as HTMLElement | null;\n case 'attribute':\n return this.context.document.querySelector(`[${value}]`) as HTMLElement | null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }\n\n private async _waitForSelector(selectorSet: SelectorSet, timeout: number = 10000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeout) {\n if (this._resolveSelector(selectorSet)) {\n return;\n }\n await this._sleep(100);\n }\n throw new Error(`Timeout waiting for selector: ${selectorSet.name}`);\n }\n\n private _interpolate(template: string, params: Record<string, unknown>): string {\n return template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n private _applyTransform(value: string, transform: string): string | number {\n switch (transform) {\n case 'strip':\n return value.trim();\n case 'strip_currency':\n return value.replace(/[$€,\\s]/g, '').trim();\n case 'number':\n const digits = value.replace(/[^0-9.]/g, '');\n return digits.includes('.') ? parseFloat(digits) : parseInt(digits, 10);\n case 'lower':\n return value.toLowerCase();\n case 'upper':\n return value.toUpperCase();\n default:\n return value;\n }\n }\n\n private _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\nexport default AdvisoryExecutor;\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\n\nimport type {\n AXIRCompilationResult,\n AXIRHealingResult,\n} from './types';\n\nimport AXIR_GRAMMAR from './grammar/axir-schema.gbnf';\n\nlet nativeAvailable = false;\nlet getLlama: any;\n\n// Dynamically load the optional native dependency so the SDK works without it\ntry {\n const llama = require('node-llama-cpp');\n getLlama = llama.getLlama;\n nativeAvailable = true;\n} catch {\n nativeAvailable = false;\n}\n\nconst DEFAULT_MODEL_URL =\n 'https://huggingface.co/bartowski/Phi-3-mini-128k-instruct-GGUF/resolve/main/Phi-3-mini-128k-instruct-Q4_K_M.gguf';\n\nconst DEFAULT_MODEL_FILENAME = 'phi3-128k-q4.gguf';\n\nexport interface LocalAXIRCompilerOptions {\n modelPath?: string;\n modelUrl?: string;\n contextSize?: number;\n gpuLayers?: number;\n onDownloadProgress?: (downloaded: number, total: number) => void;\n onStatus?: (message: string) => void;\n}\n\nexport class LocalAXIRCompiler {\n private modelPath: string;\n private modelUrl: string;\n private contextSize: number;\n private gpuLayers: number | undefined;\n private onDownloadProgress?: (downloaded: number, total: number) => void;\n private onStatus?: (message: string) => void;\n\n private model: any = null;\n private context: any = null;\n private grammar: any = null;\n private ready = false;\n\n constructor(options: LocalAXIRCompilerOptions = {}) {\n if (!nativeAvailable) {\n throw new Error(\n 'Local AXIR compilation requires node-llama-cpp.\\n' +\n 'Install it: npm install node-llama-cpp\\n' +\n 'Note: this package contains native C++ bindings and needs build tools.\\n' +\n ' * macOS: Xcode Command Line Tools (xcode-select --install)\\n' +\n ' * Linux: build-essential / gcc-c++ / python3\\n' +\n ' * Windows: Visual Studio Build Tools or windows-build-tools npm package\\n' +\n 'Docs: https://github.com/withcatai/node-llama-cpp#installation'\n );\n }\n\n const cacheDir = path.join(os.homedir(), '.awi', 'models');\n this.modelPath = options.modelPath || path.join(cacheDir, DEFAULT_MODEL_FILENAME);\n this.modelUrl = options.modelUrl || DEFAULT_MODEL_URL;\n this.contextSize = options.contextSize || 32768;\n this.gpuLayers = options.gpuLayers;\n this.onDownloadProgress = options.onDownloadProgress;\n this.onStatus = options.onStatus;\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n async compile(\n domHTML: string,\n a11yTree: string | undefined,\n intent: string,\n params?: Record<string, unknown>\n ): Promise<AXIRCompilationResult> {\n await this._ensureModel();\n await this._ensureGrammar();\n\n const a11y = a11yTree ?? 'No accessibility tree available.';\n const prompt = this._buildCompilePrompt(domHTML, a11y, intent, params);\n const start = Date.now();\n\n this._status('Compiling AXIR locally...');\n const resultText = await this._complete(prompt, 4096, 0.3);\n const parsed = JSON.parse(resultText) as AXIRCompilationResult;\n\n parsed.model_used = 'phi-3-mini-128k-q4-local';\n parsed.tokens_used = this._estimateTokens(prompt, resultText);\n parsed.compilation_time_ms = Date.now() - start;\n\n this._status(`AXIR compiled in ${parsed.compilation_time_ms}ms`);\n return parsed;\n }\n\n async heal(\n domHTML: string,\n brokenSelector: string,\n semanticIntent: string\n ): Promise<AXIRHealingResult> {\n await this._ensureModel();\n\n const prompt = this._buildHealPrompt(domHTML, brokenSelector, semanticIntent);\n const start = Date.now();\n\n this._status('Healing selector locally...');\n const resultText = await this._complete(prompt, 256, 0.1);\n\n let selector: string;\n let confidence = 0.85;\n let reasoning: string | undefined;\n\n try {\n const parsed = JSON.parse(resultText);\n selector = parsed.selector ?? parsed;\n confidence = parsed.confidence ?? 0.85;\n reasoning = parsed.reasoning;\n } catch {\n selector = resultText.trim().replace(/^[\"']|[\"']$/g, '');\n }\n\n this._status(`Selector healed in ${Date.now() - start}ms`);\n return { selector, confidence, reasoning };\n }\n\n isModelCached(): boolean {\n return fs.existsSync(this.modelPath);\n }\n\n clearCache(): void {\n if (fs.existsSync(this.modelPath)) {\n fs.unlinkSync(this.modelPath);\n this.model = null;\n this.context = null;\n this.grammar = null;\n this.ready = false;\n }\n }\n\n // -------------------------------------------------------------------------\n // Model lifecycle\n // -------------------------------------------------------------------------\n\n private async _ensureModel(): Promise<void> {\n if (this.ready) return;\n\n if (!fs.existsSync(this.modelPath)) {\n await this._downloadModel();\n }\n\n this._status('Loading local model...');\n const llama = await getLlama();\n\n const gpuLayers = this.gpuLayers ?? this._autoDetectGPULayers();\n this.model = new llama.LlamaModel({\n modelPath: this.modelPath,\n gpuLayers,\n });\n\n // node-llama-cpp v3 API: context is created via the model\n this.context = await this.model.createContext({\n contextSize: this.contextSize,\n });\n\n this.ready = true;\n this._status('Local model ready.');\n }\n\n private async _ensureGrammar(): Promise<void> {\n if (this.grammar) return;\n const llama = await getLlama();\n this.grammar = new llama.LlamaGrammar({\n grammar: AXIR_GRAMMAR,\n });\n }\n\n private _autoDetectGPULayers(): number {\n if (process.env.AWI_GPU_LAYERS) {\n return parseInt(process.env.AWI_GPU_LAYERS, 10);\n }\n return 0;\n }\n\n // -------------------------------------------------------------------------\n // Resumable model download\n // -------------------------------------------------------------------------\n\n private async _downloadModel(): Promise<void> {\n const dir = path.dirname(this.modelPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const tempPath = `${this.modelPath}.tmp`;\n const urlObj = new URL(this.modelUrl);\n const protocol = urlObj.protocol === 'https:' ? https : http;\n\n let startByte = 0;\n if (fs.existsSync(tempPath)) {\n startByte = fs.statSync(tempPath).size;\n this._status(`Resuming download from ${startByte} bytes...`);\n } else {\n this._status('Downloading local compiler model (2.7GB, one-time)...');\n }\n\n return new Promise<void>((resolve, reject) => {\n const headers: http.OutgoingHttpHeaders = {\n 'User-Agent': 'AWI-SDK/1.0',\n };\n if (startByte > 0) {\n headers['Range'] = `bytes=${startByte}-`;\n }\n\n const request = protocol.get(\n urlObj,\n { headers },\n (response) => {\n if (response.statusCode === 301 || response.statusCode === 302) {\n if (response.headers.location) {\n this.modelUrl = response.headers.location;\n return this._downloadModel().then(resolve).catch(reject);\n }\n }\n\n if (response.statusCode !== 200 && response.statusCode !== 206) {\n return reject(\n new Error(`Model download failed: HTTP ${response.statusCode}`)\n );\n }\n\n const total = parseInt(\n response.headers['content-length'] || '0',\n 10\n );\n const append = startByte > 0 && response.statusCode === 206;\n const file = fs.createWriteStream(tempPath, { flags: append ? 'a' : 'w' });\n let downloaded = startByte;\n\n response.on('data', (chunk: Buffer) => {\n downloaded += chunk.length;\n this.onDownloadProgress?.(downloaded, total + startByte);\n });\n\n response.pipe(file);\n file.on('finish', () => {\n file.close();\n fs.renameSync(tempPath, this.modelPath);\n this._status('Model download complete.');\n resolve();\n });\n\n file.on('error', (err: Error) => {\n fs.unlinkSync(tempPath);\n reject(err);\n });\n }\n );\n\n request.on('error', reject);\n request.setTimeout(300_000, () => {\n request.destroy();\n reject(new Error('Model download timed out after 5 minutes'));\n });\n });\n }\n\n // -------------------------------------------------------------------------\n // Inference\n // -------------------------------------------------------------------------\n\n private async _complete(\n prompt: string,\n maxTokens: number,\n temperature: number\n ): Promise<string> {\n if (!this.context) throw new Error('Model not loaded');\n\n const sequence = this.context.getSequence();\n await sequence.evaluate(prompt);\n\n const response = await sequence.generateResponse(maxTokens, {\n temperature,\n grammar: this.grammar,\n });\n\n let text = '';\n for await (const token of response) {\n text += token;\n }\n return text;\n }\n\n // -------------------------------------------------------------------------\n // Prompt builders\n // -------------------------------------------------------------------------\n\n private _buildCompilePrompt(\n domHTML: string,\n a11yTree: string,\n intent: string,\n params?: Record<string, unknown>\n ): string {\n // a11yTree is guaranteed non-null by the caller\n const paramsJson = params ? JSON.stringify(params, null, 2) : '{}';\n\n return [\n `<|system|>`,\n `You are an expert web-scraping analyst. Your job is to read a simplified DOM and accessibility tree, then output a structured JSON object describing the page layout, interactive elements, and data extraction plan.`,\n ``,\n `Output MUST be valid JSON matching this schema:`,\n `- workflow.nodes: map of node_id -> {element_type, semantic_role, intent, tag, selector_candidates[], parent_id?, children_ids?, aria_label?, aria_role?, text_content?, confidence, reasoning?}`,\n `- workflow.edges: list of {from_node, to_node, action, condition?, probability}`,\n `- workflow.entry_points: list of starting node_ids`,\n `- workflow.exit_points: list of terminal node_ids`,\n `- workflow.domain: the domain name`,\n `- workflow.page_type: one of landing|search|listing|detail|form|checkout|dashboard|unknown`,\n `- intents: list of {intent, action, parameters[], context}`,\n `- selectors: map of selector_name -> list of {type, value, priority}`,\n `- fields: list of {name, selector, transform?, required}`,\n `- container?: string (optional container selector name)`,\n ``,\n `Element types: button, link, input, form, navigation, search, filter, sort, pagination, container, list, item, heading, text, image, unknown.`,\n `Selector types: css, semantic, text, attribute.`,\n `<|user|>`,\n `Intent: ${intent}`,\n `Parameters: ${paramsJson}`,\n ``,\n `Simplified DOM:`,\n `${this._truncate(domHTML, 40_000)}`,\n ``,\n `Accessibility Tree:`,\n `${this._truncate(a11yTree, 8_000)}`,\n ``,\n `Compile AXIR:`,\n `<|assistant|>`,\n ].join('\\n');\n }\n\n private _buildHealPrompt(\n domHTML: string,\n brokenSelector: string,\n semanticIntent: string\n ): string {\n return [\n `<|system|>`,\n `You are a CSS selector repair tool. Given a broken selector and the current DOM, output the new CSS selector that targets the same semantic element.`,\n ``,\n `Output JSON: {\"selector\": \"...\", \"confidence\": 0.0-1.0, \"reasoning\": \"...\"}`,\n `<|user|>`,\n `Broken selector: ${brokenSelector}`,\n `Semantic intent: ${semanticIntent}`,\n ``,\n `Current DOM (truncated):`,\n `${this._truncate(domHTML, 20_000)}`,\n ``,\n `New selector:`,\n `<|assistant|>`,\n ].join('\\n');\n }\n\n private _truncate(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text;\n return text.slice(0, maxChars) + '\\n[...truncated...]';\n }\n\n private _estimateTokens(prompt: string, response: string): number {\n return Math.ceil((prompt.length + response.length) / 4);\n }\n\n private _status(message: string): void {\n this.onStatus?.(message);\n }\n}\n","root ::= \"{\" ws axir-fields ws \"}\"\n\naxir-fields ::=\n \"\\\"workflow\\\"\" \":\" workflow ws \",\"\n ws \"\\\"intents\\\"\" \":\" intents ws \",\"\n ws \"\\\"selectors\\\"\" \":\" selectors ws \",\"\n ws \"\\\"fields\\\"\" \":\" fields\n [\",\" ws \"\\\"container\\\"\" \":\" string]\n [\",\" ws \"\\\"model_used\\\"\" \":\" string]\n [\",\" ws \"\\\"tokens_used\\\"\" \":\" number]\n [\",\" ws \"\\\"compilation_time_ms\\\"\" \":\" number]\n\nworkflow ::=\n \"{\" ws\n \"\\\"nodes\\\"\" \":\" \"{\" ws node-list ws \"}\" ws \",\"\n ws \"\\\"edges\\\"\" \":\" \"[\" ws edge-list ws \"]\" ws \",\"\n ws \"\\\"entry_points\\\"\" \":\" \"[\" ws string-list ws \"]\" ws \",\"\n ws \"\\\"exit_points\\\"\" \":\" \"[\" ws string-list ws \"]\" ws \",\"\n ws \"\\\"domain\\\"\" \":\" string ws \",\"\n ws \"\\\"page_type\\\"\" \":\" page-type\n [\",\" ws \"\\\"structure_hash\\\"\" \":\" string]\n ws \"}\"\n\nnode-list ::= [node-pair (\",\" ws node-pair)*]\nnode-pair ::= string \":\" \"{\" ws\n \"\\\"element_type\\\"\" \":\" element-type ws \",\"\n ws \"\\\"semantic_role\\\"\" \":\" string ws \",\"\n ws \"\\\"intent\\\"\" \":\" string ws \",\"\n ws \"\\\"tag\\\"\" \":\" string ws \",\"\n ws \"\\\"selector_candidates\\\"\" \":\" \"[\" ws selector-list ws \"]\"\n [\",\" ws \"\\\"parent_id\\\"\" \":\" string]\n [\",\" ws \"\\\"children_ids\\\"\" \":\" \"[\" ws string-list ws \"]\"]\n [\",\" ws \"\\\"aria_label\\\"\" \":\" string]\n [\",\" ws \"\\\"aria_role\\\"\" \":\" string]\n [\",\" ws \"\\\"text_content\\\"\" \":\" string]\n \",\" ws \"\\\"confidence\\\"\" \":\" number\n [\",\" ws \"\\\"reasoning\\\"\" \":\" string]\nws \"}\"\n\nelement-type ::=\n \"\\\"button\\\"\" | \"\\\"link\\\"\" | \"\\\"input\\\"\" | \"\\\"form\\\"\" |\n \"\\\"navigation\\\"\" | \"\\\"search\\\"\" | \"\\\"filter\\\"\" | \"\\\"sort\\\"\" |\n \"\\\"pagination\\\"\" | \"\\\"container\\\"\" | \"\\\"list\\\"\" | \"\\\"item\\\"\" |\n \"\\\"heading\\\"\" | \"\\\"text\\\"\" | \"\\\"image\\\"\" | \"\\\"unknown\\\"\"\n\npage-type ::=\n \"\\\"landing\\\"\" | \"\\\"search\\\"\" | \"\\\"listing\\\"\" | \"\\\"detail\\\"\" |\n \"\\\"form\\\"\" | \"\\\"checkout\\\"\" | \"\\\"dashboard\\\"\" | \"\\\"unknown\\\"\"\n\nedge-list ::= [edge (\",\" ws edge)*]\nedge ::= \"{\" ws\n \"\\\"from_node\\\"\" \":\" string ws \",\"\n ws \"\\\"to_node\\\"\" \":\" string ws \",\"\n ws \"\\\"action\\\"\" \":\" string\n [\",\" ws \"\\\"condition\\\"\" \":\" string]\n [\",\" ws \"\\\"probability\\\"\" \":\" number]\nws \"}\"\n\nselector-list ::= [selector (\",\" ws selector)*]\nselector ::= \"{\" ws\n \"\\\"type\\\"\" \":\" selector-type ws \",\"\n ws \"\\\"value\\\"\" \":\" string ws \",\"\n ws \"\\\"priority\\\"\" \":\" number\n [\",\" ws \"\\\"confidence\\\"\" \":\" number]\nws \"}\"\n\nselector-type ::= \"\\\"css\\\"\" | \"\\\"semantic\\\"\" | \"\\\"text\\\"\" | \"\\\"attribute\\\"\"\n\nintents ::= \"[\" ws [intent (\",\" ws intent)*] ws \"]\"\nintent ::= \"{\" ws\n \"\\\"intent\\\"\" \":\" string ws \",\"\n ws \"\\\"action\\\"\" \":\" string ws \",\"\n ws \"\\\"parameters\\\"\" \":\" \"[\" ws [string (\",\" ws string)*] ws \"]\" ws \",\"\n ws \"\\\"context\\\"\" \":\" string\nws \"}\"\n\nfields ::= \"[\" ws [field (\",\" ws field)*] ws \"]\"\nfield ::= \"{\" ws\n \"\\\"name\\\"\" \":\" string ws \",\"\n ws \"\\\"selector\\\"\" \":\" string\n [\",\" ws \"\\\"transform\\\"\" \":\" string]\n [\",\" ws \"\\\"required\\\"\" \":\" boolean]\nws \"}\"\n\nselectors ::= \"{\" ws [selector-pair (\",\" ws selector-pair)*] ws \"}\"\nselector-pair ::= string \":\" \"[\" ws selector-list ws \"]\"\n\nstring-list ::= [string (\",\" ws string)*]\n\nstring ::= \"\\\"\" char* \"\\\"\"\nchar ::= [^\"\\\\] | \"\\\\\" ([\"\\\\/bfnrt] | \"u\" [0-9a-fA-F]{4})\n\nnumber ::= [\"-\"]? (\"0\" | [1-9] [0-9]*) ([.] [0-9]+)? ([eE] [\"-\"]? [0-9]+)?\n\nboolean ::= \"true\" | \"false\"\n\nws ::= [ \\t\\n\\r]*\n"],"mappings":"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","names":["fetch","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/advisory-executor.ts","../src/compiler/axir-compiler.ts","../src/compiler/local-axir.ts"],"sourcesContent":["export { AWIClient } from './client';\nexport { AdvisoryExecutor } from './advisory-executor';\nexport { AXIRCompiler, type CompileOptions } from './compiler/axir-compiler';\nexport { LocalAXIRCompiler, type LocalAXIRCompilerOptions } from './compiler/local-axir';\nexport type {\n AXIRNode, AXIREdge, AXIRWorkflow, AXIRIntentMapping, AXIRField,\n AXIRCompilationResult, AXIRHealingResult, SelectorCandidate,\n} from './compiler/types';\nexport type {\n AgentRequest, AgentResponse, FeedbackRequest, DelegationRequest,\n Recipe, RecipeStep, ExtractionField,\n} from './types';\n","/**\n * AWI Client\n * \n * Main SDK class for interacting with AWI servers.\n * Supports proxy mode (server executes browser) and advisory mode (returns blueprint).\n */\n\nimport fetch from 'cross-fetch';\nimport type {\n AgentRequest,\n AgentResponse,\n AWIClientOptions,\n Recipe,\n RegistryEntry,\n FeedbackRequest,\n DelegationRequest,\n ExecutionMetrics,\n} from './types';\n\nexport class AWIError extends Error {\n code: string;\n statusCode: number;\n details?: Record<string, unknown>;\n\n constructor(code: string, message: string, statusCode: number, details?: Record<string, unknown>) {\n super(message);\n this.name = 'AWIError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n }\n}\n\nexport class AWIClient {\n private endpoint: string;\n private certificate: string;\n private timeout: number;\n private retries: number;\n\n constructor(options: AWIClientOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, '');\n this.certificate = options.certificate;\n this.timeout = options.timeout || 30000;\n this.retries = options.retries || 3;\n }\n\n /**\n * Execute a recipe in proxy mode.\n * The server runs the browser and returns structured data.\n */\n async execute<T = unknown>(request: Omit<AgentRequest, 'mode'>): Promise<AgentResponse<T>> {\n return this._request<AgentResponse<T>>('/v1/execute', {\n ...request,\n mode: 'proxy',\n });\n }\n\n /**\n * Get advisory blueprint for agent-side execution.\n * Returns the recipe structure without running the browser.\n */\n async getAdvisory(target: string): Promise<AgentResponse<Recipe>> {\n return this._request<AgentResponse<Recipe>>('/v1/advisory', {\n target,\n });\n }\n\n /**\n * Execute in advisory mode - get blueprint then run locally.\n * This is useful when you want to control the browser yourself.\n */\n async executeAdvisory<T = unknown>(\n request: Omit<AgentRequest, 'mode'>,\n localExecutor: (blueprint: Recipe, params: Record<string, unknown>) => Promise<T>\n ): Promise<AgentResponse<T>> {\n // Get blueprint\n const advisory = await this.getAdvisory(request.target);\n\n if (!advisory.success || !advisory.data) {\n return {\n ...advisory,\n data: null,\n } as AgentResponse<T>;\n }\n\n // Execute locally\n const startTime = Date.now();\n try {\n const data = await localExecutor(advisory.data, request.params);\n const latency = Date.now() - startTime;\n\n return {\n success: true,\n data,\n errors: [],\n metadata: {\n ...advisory.metadata,\n latency_ms: latency,\n mode: 'advisory-local',\n },\n execution_path: ['advisory', 'local-execution'],\n axir_intent: advisory.axir_intent,\n };\n } catch (error) {\n return {\n success: false,\n data: null,\n errors: [{\n code: 'LOCAL_EXECUTION_ERROR',\n message: error instanceof Error ? error.message : 'Unknown error',\n }],\n metadata: advisory.metadata,\n execution_path: ['advisory', 'local-execution-failed'],\n };\n }\n }\n\n /**\n * Submit feedback on execution quality.\n */\n async feedback(request: FeedbackRequest): Promise<AgentResponse<{ feedback_received: boolean }>> {\n return this._request('/v1/feedback', request);\n }\n\n /**\n * Explore an unknown domain and generate a recipe.\n */\n async explore(domain: string, action: string, resource?: string): Promise<AgentResponse<Recipe>> {\n const target = `awi://${domain}/${resource || action}/${action}/v1`;\n return this._request('/v1/execute', {\n target,\n params: {},\n mode: 'proxy',\n options: { explore: true },\n });\n }\n\n /**\n * List supported sites in the registry.\n */\n async listRegistry(options?: {\n category?: string;\n certifiedOnly?: boolean;\n minConfidence?: number;\n search?: string;\n limit?: number;\n }): Promise<AgentResponse<{ sites: RegistryEntry[]; stats: Record<string, unknown> }>> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.certifiedOnly) params.set('certified_only', 'true');\n if (options?.minConfidence) params.set('min_confidence', String(options.minConfidence));\n if (options?.search) params.set('search', options.search);\n if (options?.limit) params.set('limit', String(options.limit));\n\n return this._request(`/v1/registry?${params.toString()}`, undefined, 'GET');\n }\n\n /**\n * Search registry.\n */\n async searchRegistry(query: string, limit?: number): Promise<AgentResponse<{ results: RegistryEntry[] }>> {\n const params = new URLSearchParams();\n params.set('q', query);\n if (limit) params.set('limit', String(limit));\n\n return this._request(`/v1/registry/search?${params.toString()}`, undefined, 'GET');\n }\n\n /**\n * Delegate execution to another agent.\n */\n async delegate(request: DelegationRequest): Promise<AgentResponse<{ delegation_id: string }>> {\n return this._request('/v1/delegate', request);\n }\n\n /**\n * Join a multi-agent session.\n */\n async joinSession(sessionId: string): Promise<AgentResponse<{ session_id: string; participants: string[] }>> {\n return this._request('/v1/session/join', { session_id: sessionId });\n }\n\n /**\n * Check server health.\n */\n async health(): Promise<{ status: string; version: string }> {\n const response = await fetch(`${this.endpoint}/health`, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new AWIError('HEALTH_CHECK_FAILED', 'Server health check failed', response.status);\n }\n\n return response.json();\n }\n\n /**\n * Get execution metrics from a response.\n */\n getMetrics(response: AgentResponse<unknown>): ExecutionMetrics {\n return {\n latency_ms: response.metadata?.latency_ms || 0,\n fallback_count: (response.metadata?.fallback_count as number) || 0,\n selectors_used: (response.metadata?.selectors_used as string[]) || [],\n cache_status: response.metadata?.cache_status || 'miss',\n };\n }\n\n private async _request<T>(\n path: string,\n body?: unknown,\n method: string = 'POST'\n ): Promise<T> {\n const url = `${this.endpoint}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'AWI-Agent-Certificate': this.certificate,\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new AWIError(\n errorData.errors?.[0]?.code || 'REQUEST_FAILED',\n errorData.errors?.[0]?.message || `HTTP ${response.status}`,\n response.status,\n errorData\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on 4xx errors (client errors)\n if (error instanceof AWIError && error.statusCode >= 400 && error.statusCode < 500) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n if (attempt < this.retries - 1) {\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n }\n\n throw lastError || new AWIError('MAX_RETRIES', 'Max retries exceeded', 502);\n }\n}\n\nexport default AWIClient;\n","/**\n * Advisory Mode Executor\n * \n * Executes recipe blueprints locally in a browser or Node.js environment.\n * Useful when you want to control the browser yourself but use AWI selectors.\n */\n\nimport type { Recipe, RecipeStep, SelectorSet, ExecutionMetrics } from './types';\n\nexport interface LocalExecutionContext {\n document: Document;\n window: Window;\n console: Console;\n}\n\nexport class AdvisoryExecutor {\n private context: LocalExecutionContext;\n private metrics: ExecutionMetrics;\n\n constructor(context: LocalExecutionContext) {\n this.context = context;\n this.metrics = {\n latency_ms: 0,\n fallback_count: 0,\n selectors_used: [],\n cache_status: 'bypass',\n };\n }\n\n /**\n * Execute a recipe blueprint locally.\n */\n async execute<T = unknown>(recipe: Recipe, params: Record<string, unknown>): Promise<{\n success: boolean;\n data: T | null;\n errors: Array<{ code: string; message: string }>;\n metrics: ExecutionMetrics;\n }> {\n const startTime = Date.now();\n const errors: Array<{ code: string; message: string }> = [];\n const executionPath: string[] = [];\n\n try {\n // Execute steps\n for (const step of recipe.steps) {\n const stepResult = await this._executeStep(step, params, recipe);\n\n if (stepResult.error) {\n errors.push(stepResult.error);\n break;\n }\n\n executionPath.push(`${step.type}:${step.name || 'unnamed'}`);\n }\n\n // Extract data if all steps passed\n let data: T | null = null;\n if (errors.length === 0 && recipe.extraction) {\n data = await this._extractData<T>(recipe);\n }\n\n this.metrics.latency_ms = Date.now() - startTime;\n\n return {\n success: errors.length === 0,\n data,\n errors,\n metrics: { ...this.metrics },\n };\n } catch (error) {\n return {\n success: false,\n data: null,\n errors: [{\n code: 'EXECUTION_ERROR',\n message: error instanceof Error ? error.message : 'Unknown error',\n }],\n metrics: { ...this.metrics },\n };\n }\n }\n\n private async _executeStep(\n step: RecipeStep,\n params: Record<string, unknown>,\n recipe: Recipe\n ): Promise<{ error?: { code: string; message: string } }> {\n try {\n switch (step.type) {\n case 'navigate':\n if (step.url) {\n const url = this._interpolate(step.url, params);\n this.context.window.location.href = url;\n }\n break;\n\n case 'wait':\n if (step.selector) {\n const selectorSet = recipe.selectors[step.selector];\n if (selectorSet) {\n await this._waitForSelector(selectorSet);\n }\n } else {\n await this._sleep(1000);\n }\n break;\n\n case 'click':\n if (step.selector) {\n const element = this._resolveSelector(recipe.selectors[step.selector]);\n if (element) {\n element.click();\n } else {\n return { error: { code: 'CLICK_FAILED', message: `Selector not found: ${step.selector}` } };\n }\n }\n break;\n\n case 'type':\n if (step.selector && step.value) {\n const element = this._resolveSelector(recipe.selectors[step.selector]) as HTMLInputElement | null;\n if (element) {\n const value = this._interpolate(step.value, params);\n element.value = value;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n return { error: { code: 'TYPE_FAILED', message: `Selector not found: ${step.selector}` } };\n }\n }\n break;\n\n case 'scroll':\n const amount = step.amount || 500;\n this.context.window.scrollBy(0, amount);\n break;\n\n case 'extract_list':\n case 'extract_one':\n // Extraction happens after all steps\n break;\n }\n\n return {};\n } catch (error) {\n return {\n error: {\n code: 'STEP_ERROR',\n message: error instanceof Error ? error.message : 'Unknown step error',\n },\n };\n }\n }\n\n private async _extractData<T>(recipe: Recipe): Promise<T | null> {\n const extraction = recipe.extraction;\n if (!extraction) return null;\n\n const containerSet = recipe.selectors[extraction.container];\n if (!containerSet) return null;\n\n const container = this._resolveSelector(containerSet);\n if (!container) return null;\n\n const items = extraction.mode === 'list' \n ? Array.from(container.children)\n : [container];\n\n const results: Array<Record<string, unknown>> = [];\n\n for (const item of items) {\n const record: Record<string, unknown> = {};\n\n for (const field of extraction.fields) {\n const fieldSet = recipe.selectors[field.selector];\n if (fieldSet) {\n const fieldElement = this._resolveSelectorWithin(item as HTMLElement, fieldSet);\n if (fieldElement) {\n let value = fieldElement.textContent || '';\n\n // Apply transform\n if (field.transform) {\n value = String(this._applyTransform(value, field.transform));\n }\n\n record[field.name] = value;\n } else {\n record[field.name] = null;\n }\n }\n }\n\n results.push(record);\n }\n\n return (extraction.mode === 'one' ? results[0] : results) as T;\n }\n\n private _resolveSelector(selectorSet: SelectorSet): HTMLElement | null {\n for (const selector of selectorSet.selectors) {\n const element = this._trySelector(selector.type, selector.value);\n if (element) {\n this.metrics.selectors_used.push(selectorSet.name);\n return element;\n }\n this.metrics.fallback_count++;\n }\n return null;\n }\n\n private _resolveSelectorWithin(parent: HTMLElement, selectorSet: SelectorSet): HTMLElement | null {\n for (const selector of selectorSet.selectors) {\n try {\n const element = parent.querySelector(selector.value) as HTMLElement | null;\n if (element) {\n this.metrics.selectors_used.push(selectorSet.name);\n return element;\n }\n } catch {\n // Invalid selector, try next\n }\n }\n return null;\n }\n\n private _trySelector(type: string, value: string): HTMLElement | null {\n try {\n switch (type) {\n case 'css':\n return this.context.document.querySelector(value) as HTMLElement | null;\n case 'semantic':\n // Try data-testid\n return this.context.document.querySelector(`[data-testid=\"${value}\"]`) as HTMLElement | null;\n case 'text':\n // XPath or text content search\n const xpath = `//*[contains(text(), \"${value}\")]`;\n const result = this.context.document.evaluate(\n xpath,\n this.context.document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n return result.singleNodeValue as HTMLElement | null;\n case 'attribute':\n return this.context.document.querySelector(`[${value}]`) as HTMLElement | null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }\n\n private async _waitForSelector(selectorSet: SelectorSet, timeout: number = 10000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeout) {\n if (this._resolveSelector(selectorSet)) {\n return;\n }\n await this._sleep(100);\n }\n throw new Error(`Timeout waiting for selector: ${selectorSet.name}`);\n }\n\n private _interpolate(template: string, params: Record<string, unknown>): string {\n return template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n private _applyTransform(value: string, transform: string): string | number {\n switch (transform) {\n case 'strip':\n return value.trim();\n case 'strip_currency':\n return value.replace(/[$€,\\s]/g, '').trim();\n case 'number':\n const digits = value.replace(/[^0-9.]/g, '');\n return digits.includes('.') ? parseFloat(digits) : parseInt(digits, 10);\n case 'lower':\n return value.toLowerCase();\n case 'upper':\n return value.toUpperCase();\n default:\n return value;\n }\n }\n\n private _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\nexport default AdvisoryExecutor;\n","import * as cheerio from 'cheerio';\nimport type {\n AXIRCompilationResult, AXIRNode, AXIREdge, AXIRWorkflow,\n AXIRIntentMapping, AXIRField, SelectorCandidate,\n} from './types';\n\nexport interface CompileOptions {\n intent: string;\n params?: Record<string, unknown>;\n domain?: string;\n}\n\nexport class AXIRCompiler {\n private $: cheerio.CheerioAPI;\n private intent: string;\n private params: Record<string, unknown>;\n private domain: string;\n\n constructor(html: string, options: CompileOptions) {\n this.$ = cheerio.load(html);\n this.intent = options.intent;\n this.params = options.params || {};\n this.domain = options.domain || 'unknown';\n }\n\n compile(): AXIRCompilationResult {\n const start = Date.now();\n this.simplifyDOM();\n const regions = this.identifyRegions();\n const target = this.routeIntent(regions);\n return {\n workflow: this.buildWorkflow(target, regions),\n intents: this.mapIntents(),\n selectors: this.generateSelectors(target),\n fields: this.generateFields(target),\n container: target.container,\n model_used: 'axir-deterministic-v1',\n tokens_used: 0,\n compilation_time_ms: Date.now() - start,\n };\n }\n\n private simplifyDOM(): void {\n this.$('script, style, svg, noscript, iframe, canvas, video, audio').remove();\n for (const el of this.$('div, span').toArray()) {\n const $el = this.$(el);\n if ($el.children().length === 0 && $el.text().trim() === '') $el.remove();\n }\n this.$('[style*=\"display:none\"], [style*=\"display: none\"], [hidden], [aria-hidden=\"true\"]').remove();\n }\n\n private identifyRegions(): SemanticRegion[] {\n const regions: SemanticRegion[] = [];\n for (const el of this.$('form, [role=\"search\"], input[type=\"search\"]').toArray()) {\n const r = this.analyzeSearchRegion(this.$(el));\n if (r) regions.push(r);\n }\n for (const el of this.$('nav, [role=\"navigation\"], header, .nav, .navbar, .menu').toArray()) {\n regions.push({ type: 'navigation', element: this.$(el), confidence: 0.9 });\n }\n for (const el of this.$('ul, ol, [role=\"list\"], .list, .results, .items, table, [role=\"grid\"]').toArray()) {\n const $el = this.$(el);\n if ($el.find('li, tr, .item, [role=\"listitem\"]').length > 1) {\n regions.push({ type: 'listing', element: $el, confidence: 0.85 });\n }\n }\n for (const el of this.$('form').toArray()) {\n const $el = this.$(el);\n if (!regions.some(r => r.element.is!($el))) regions.push({ type: 'form', element: $el, confidence: 0.9 });\n }\n for (const el of this.$('.pagination, .pager, .pages').toArray()) {\n if (this.isPagination(this.$(el))) regions.push({ type: 'pagination', element: this.$(el), confidence: 0.8 });\n }\n for (const el of this.$('article, [role=\"article\"], .content, .main, main, .detail').toArray()) {\n regions.push({ type: 'detail', element: this.$(el), confidence: 0.75 });\n }\n return regions;\n }\n\n private analyzeSearchRegion($el: cheerio.Cheerio<any>): SemanticRegion | null {\n const hasInput = $el.find('input[type=\"text\"], input[type=\"search\"], input:not([type])').length > 0;\n const hasButton = $el.find('button, input[type=\"submit\"]').length > 0;\n if (hasInput || hasButton) return { type: 'search', element: $el, confidence: hasInput && hasButton ? 0.95 : 0.7 };\n return null;\n }\n\n private isPagination($el: cheerio.Cheerio<any>): boolean {\n const text = $el.text().toLowerCase();\n return /\\d+/.test(text) && (/next|>|\\u203a|\\u2192|\\u00bb/.test(text) || /prev|previous|<|\\u2039|\\u2190|\\u00ab/.test(text));\n }\n\n private routeIntent(regions: SemanticRegion[]): TargetRegion {\n const intentMap: Record<string, string[]> = {\n search: ['search', 'form'],\n search_jobs: ['search', 'listing', 'form'],\n extract_list: ['listing', 'search', 'detail'],\n extract_detail: ['detail', 'listing'],\n fill_form: ['form', 'search'],\n navigate: ['navigation', 'listing'],\n login: ['form'],\n filter: ['search', 'listing'],\n sort: ['listing', 'search'],\n scrape: ['listing', 'detail', 'search'],\n };\n const targetTypes = intentMap[this.intent.toLowerCase()] || ['search', 'listing', 'form'];\n let best: SemanticRegion | null = null;\n let bestScore = 0;\n for (const r of regions) {\n const match = targetTypes.indexOf(r.type);\n const score = match >= 0 ? (targetTypes.length - match) * r.confidence : 0;\n if (score > bestScore) { bestScore = score; best = r; }\n }\n if (!best) best = this.findLargestRegion(regions);\n return { region: best, container: this.generateContainerSelector(best.element) };\n }\n\n private findLargestRegion(regions: SemanticRegion[]): SemanticRegion {\n if (regions.length === 0) return { type: 'unknown', element: this.$('body'), confidence: 0.5 };\n return regions.reduce((l, c) => c.element.find('*').length > l.element.find('*').length ? c : l);\n }\n\n private buildWorkflow(_target: TargetRegion, all: SemanticRegion[]): AXIRWorkflow {\n const nodes: Record<string, AXIRNode> = {};\n const edges: AXIREdge[] = [];\n const entry: string[] = [];\n const exit: string[] = [];\n all.forEach((r, i) => {\n const id = `${r.type}_${i}`;\n const raw = r.element[0] as any;\n nodes[id] = {\n node_id: id,\n element_type: this.mapType(r.type),\n semantic_role: r.type,\n intent: this.intent,\n tag: raw?.tagName?.toLowerCase(),\n selector_candidates: this.buildCandidates(r.element),\n confidence: r.confidence,\n };\n if (r.type === 'navigation') entry.push(id);\n if (r.type === 'listing' || r.type === 'detail') exit.push(id);\n });\n all.forEach((f, fi) => all.forEach((t, ti) => {\n if (fi !== ti) {\n const e = this.inferEdge(f, t, fi, ti);\n if (e) edges.push(e);\n }\n }));\n if (entry.length === 0 && Object.keys(nodes).length > 0) entry.push(Object.keys(nodes)[0]);\n return { nodes, edges, entry_points: entry, exit_points: exit, domain: this.domain, page_type: this.inferPageType(all) };\n }\n\n private mapType(t: string): AXIRNode['element_type'] {\n const m: Record<string, AXIRNode['element_type']> = {\n search: 'search', navigation: 'navigation', listing: 'list',\n form: 'form', pagination: 'pagination', detail: 'container',\n };\n return m[t] || 'unknown';\n }\n\n private inferEdge(f: SemanticRegion, t: SemanticRegion, fi: number, ti: number): AXIREdge | null {\n if (f.type === 'search' && t.type === 'listing') return { from_node: `search_${fi}`, to_node: `listing_${ti}`, action: 'submit_search', probability: 0.9 };\n if (f.type === 'navigation' && t.type === 'search') return { from_node: `navigation_${fi}`, to_node: `search_${ti}`, action: 'navigate_to_search', probability: 0.7 };\n if (f.type === 'listing' && t.type === 'pagination') return { from_node: `listing_${fi}`, to_node: `pagination_${ti}`, action: 'next_page', probability: 0.8 };\n if (f.type === 'pagination' && t.type === 'listing') return { from_node: `pagination_${fi}`, to_node: `listing_${ti}`, action: 'load_results', probability: 0.95 };\n return null;\n }\n\n private inferPageType(regions: SemanticRegion[]): AXIRWorkflow['page_type'] {\n const t = regions.map(r => r.type);\n if (t.includes('search') && t.includes('listing')) return 'search';\n if (t.includes('listing')) return 'listing';\n if (t.includes('form')) return 'form';\n if (t.includes('search')) return 'search';\n if (t.includes('navigation')) return 'landing';\n return 'unknown';\n }\n\n private generateSelectors(target: TargetRegion): Record<string, SelectorCandidate[]> {\n const s: Record<string, SelectorCandidate[]> = {};\n const $el = target.region.element;\n s.container = this.buildCandidates($el);\n for (const el of $el.find('input, textarea, select').toArray()) {\n const n = this.inferFieldName(this.$(el));\n if (n) s[n] = this.buildCandidates(this.$(el));\n }\n for (const el of $el.find('button, input[type=\"submit\"], input[type=\"button\"]').toArray()) {\n const $btn = this.$(el);\n const label = $btn.text().trim() || String($btn.val() || 'button');\n s[`btn_${this.slugify(label)}`] = this.buildCandidates($btn);\n }\n for (const el of $el.find('a').toArray()) {\n const $a = this.$(el);\n const t = $a.text().trim();\n if (t && t.length < 50) s[`link_${this.slugify(t)}`] = this.buildCandidates($a);\n }\n return s;\n }\n\n private buildCandidates($el: cheerio.Cheerio<any>): SelectorCandidate[] {\n const c: SelectorCandidate[] = [];\n const el = $el[0];\n if (!el) return c;\n const id = $el.attr('id');\n if (id && !id.match(/^\\d/)) c.push({ type: 'css', value: `#${this.escape(id)}`, priority: 1, confidence: 0.99 });\n const classes = ($el.attr('class') || '').split(/\\s+/).filter((x: string) => x && !x.match(/^js-|^ng-|^vue-|^data-/));\n if (classes.length) c.push({ type: 'css', value: `.${classes.map((x: string) => this.escape(x)).join('.')}`, priority: 2, confidence: 0.85 });\n const raw = el as any;\n const tag = raw.tagName?.toLowerCase() || '';\n const name = $el.attr('name');\n const type = $el.attr('type');\n const placeholder = $el.attr('placeholder');\n if (name) c.push({ type: 'css', value: `${tag}[name=\"${this.q(name)}\"]`, priority: 3, confidence: 0.9 });\n if (type) c.push({ type: 'css', value: `${tag}[type=\"${type}\"]`, priority: 4, confidence: 0.8 });\n if (placeholder) c.push({ type: 'css', value: `${tag}[placeholder=\"${this.q(placeholder)}\"]`, priority: 5, confidence: 0.75 });\n const role = $el.attr('role');\n if (role) c.push({ type: 'semantic', value: `[role=\"${role}\"]`, priority: 6, confidence: 0.9 });\n const al = $el.attr('aria-label');\n if (al) c.push({ type: 'semantic', value: `[aria-label=\"${this.q(al)}\"]`, priority: 7, confidence: 0.85 });\n const text = $el.text().trim();\n if (text && text.length < 100) c.push({ type: 'text', value: text, priority: 8, confidence: 0.7 });\n return c;\n }\n\n private generateFields(target: TargetRegion): AXIRField[] {\n const f: AXIRField[] = [];\n for (const el of target.region.element.find('input, textarea, select').toArray()) {\n const $el = this.$(el);\n const name = this.inferFieldName($el);\n if (!name) continue;\n f.push({\n name,\n selector: this.bestSelector($el),\n transform: this.inferTransform($el),\n required: $el.attr('required') !== undefined,\n });\n }\n return f;\n }\n\n private inferFieldName($el: cheerio.Cheerio<any>): string | null {\n const id = $el.attr('id');\n if (id) {\n const $l = this.$(`label[for=\"${id}\"]`);\n if ($l.length) return this.slugify($l.text());\n }\n const ph = $el.attr('placeholder');\n if (ph) return this.slugify(ph);\n const al = $el.attr('aria-label');\n if (al) return this.slugify(al);\n const n = $el.attr('name');\n if (n) return this.slugify(n);\n return null;\n }\n\n private inferTransform($el: cheerio.Cheerio<any>): string | undefined {\n const t = $el.attr('type');\n if (t === 'number') return 'number';\n if (t === 'email') return 'email';\n if (t === 'date') return 'date';\n if (t === 'checkbox') return 'boolean';\n if ($el.is('select')) return 'select';\n return undefined;\n }\n\n private bestSelector($el: cheerio.Cheerio<any>): string {\n const c = this.buildCandidates($el);\n if (c.length) return c[0].value;\n const raw = $el[0] as any;\n return raw?.tagName?.toLowerCase() || '*';\n }\n\n private generateContainerSelector($el: cheerio.Cheerio<any>): string {\n const c = this.buildCandidates($el);\n return c.length ? c[0].value : 'body';\n }\n\n private mapIntents(): AXIRIntentMapping[] {\n const m: Record<string, AXIRIntentMapping> = {\n search: { intent: 'search', action: 'fill_and_submit', parameters: ['query', 'location', 'filters'], context: 'Enter search terms and submit form' },\n search_jobs: { intent: 'search_jobs', action: 'fill_and_submit', parameters: ['query', 'location', 'experience_level', 'job_type'], context: 'Search for job listings with optional filters' },\n extract_list: { intent: 'extract_list', action: 'extract_fields', parameters: ['items', 'title', 'url', 'metadata'], context: 'Extract structured data from list items' },\n extract_detail: { intent: 'extract_detail', action: 'extract_fields', parameters: ['title', 'description', 'metadata', 'links'], context: 'Extract structured data from detail page' },\n fill_form: { intent: 'fill_form', action: 'fill_and_submit', parameters: Object.keys(this.params), context: 'Fill form fields with provided parameters' },\n navigate: { intent: 'navigate', action: 'click', parameters: ['target_url', 'link_text'], context: 'Click navigation link to target page' },\n login: { intent: 'login', action: 'fill_and_submit', parameters: ['username', 'password'], context: 'Enter credentials and submit login form' },\n scrape: { intent: 'scrape', action: 'extract_fields', parameters: ['all_visible_text', 'links', 'images', 'structured_data'], context: 'Extract all visible content from the page' },\n };\n const mapped = m[this.intent.toLowerCase()];\n if (mapped) return [mapped];\n return [{ intent: this.intent, action: 'interact', parameters: Object.keys(this.params), context: `Perform ${this.intent} on the page` }];\n }\n\n private slugify(t: string): string {\n return t.toLowerCase().replace(/[^\\w\\s-]/g, '').replace(/[\\s_-]+/g, '_').replace(/^_|_$/g, '').substring(0, 50);\n }\n\n private escape(s: string): string {\n return s.replace(/([:.])/g, '\\\\$1');\n }\n\n private q(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n }\n}\n\ninterface SemanticRegion { type: string; element: cheerio.Cheerio<any>; confidence: number; }\ninterface TargetRegion { region: SemanticRegion; container: string; }\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as https from 'https';\nimport * as http from 'http';\nimport { URL } from 'url';\n\nimport type {\n AXIRCompilationResult,\n AXIRHealingResult,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// ESM-compatible lazy loading of node-llama-cpp\n// node-llama-cpp v3+ is ESM-only with top-level await.\n// We use dynamic import() instead of require() to avoid\n// ERR_REQUIRE_ASYNC_MODULE in both CJS and ESM builds.\n// ---------------------------------------------------------------------------\nlet nativeAvailable = false;\nlet getLlama: any;\nlet LlamaModel: any;\nlet LlamaContext: any;\nlet LlamaGrammar: any;\n\nconst llamaPromise = import('node-llama-cpp').then((m) => {\n nativeAvailable = true;\n getLlama = m.getLlama;\n LlamaModel = m.LlamaModel;\n LlamaContext = m.LlamaContext;\n LlamaGrammar = m.LlamaGrammar;\n return m;\n}).catch((err) => {\n nativeAvailable = false;\n if (process.env.AWI_DEBUG) {\n console.error('[AWI] node-llama-cpp load error:', err.message);\n }\n return null;\n});\n\n// ---------------------------------------------------------------------------\n// Default model -- Phi-3-mini-128k-instruct Q4_K_M (~2.7 GB)\n// Hosted on GitHub Releases (no auth required, permanent URL)\n// ---------------------------------------------------------------------------\nconst DEFAULT_MODEL_URL =\n 'https://github.com/RayAKaan/AWI/releases/download/v0.0.0-models/Phi-3-mini-128k-instruct-Q4_K_M.gguf';\n\nconst DEFAULT_MODEL_FILENAME = 'phi3-128k-q4.gguf';\n\nexport interface LocalAXIRCompilerOptions {\n modelPath?: string;\n modelUrl?: string;\n contextSize?: number;\n gpuLayers?: number;\n onDownloadProgress?: (downloaded: number, total: number) => void;\n onStatus?: (message: string) => void;\n}\n\nexport class LocalAXIRCompiler {\n private modelPath: string;\n private modelUrl: string;\n private contextSize: number;\n private gpuLayers: number | undefined;\n private onDownloadProgress?: (downloaded: number, total: number) => void;\n private onStatus?: (message: string) => void;\n\n private model: any = null;\n private context: any = null;\n private grammar: any = null;\n private ready = false;\n\n constructor(options: LocalAXIRCompilerOptions = {}) {\n if (!nativeAvailable) {\n throw new Error(\n 'Local AXIR compilation requires node-llama-cpp.\\n' +\n 'Install it: npm install node-llama-cpp\\n' +\n 'Note: this package contains native C++ bindings and needs build tools.\\n' +\n ' * macOS: Xcode Command Line Tools (xcode-select --install)\\n' +\n ' * Linux: build-essential / gcc-c++ / python3\\n' +\n ' * Windows: Visual Studio Build Tools or windows-build-tools npm package\\n' +\n 'Docs: https://github.com/withcatai/node-llama-cpp#installation'\n );\n }\n\n const cacheDir = path.join(os.homedir(), '.awi', 'models');\n this.modelPath =\n options.modelPath || path.join(cacheDir, DEFAULT_MODEL_FILENAME);\n this.modelUrl = options.modelUrl || DEFAULT_MODEL_URL;\n this.contextSize = options.contextSize || 32768;\n this.gpuLayers = options.gpuLayers;\n this.onDownloadProgress = options.onDownloadProgress;\n this.onStatus = options.onStatus;\n }\n\n async compile(\n domHTML: string,\n a11yTree: string | undefined,\n intent: string,\n params?: Record<string, unknown>\n ): Promise<AXIRCompilationResult> {\n await this._ensureModel();\n await this._ensureGrammar();\n\n const prompt = this._buildCompilePrompt(domHTML, a11yTree, intent, params);\n const start = Date.now();\n\n this._status('Compiling AXIR locally...');\n const resultText = await this._complete(prompt, 4096, 0.3);\n const parsed = JSON.parse(resultText) as AXIRCompilationResult;\n\n parsed.model_used = 'phi-3-mini-128k-q4-local';\n parsed.tokens_used = this._estimateTokens(prompt, resultText);\n parsed.compilation_time_ms = Date.now() - start;\n\n this._status(`AXIR compiled in ${parsed.compilation_time_ms}ms`);\n return parsed;\n }\n\n async heal(\n domHTML: string,\n brokenSelector: string,\n semanticIntent: string\n ): Promise<AXIRHealingResult> {\n await this._ensureModel();\n\n const prompt = this._buildHealPrompt(domHTML, brokenSelector, semanticIntent);\n const start = Date.now();\n\n this._status('Healing selector locally...');\n const resultText = await this._complete(prompt, 256, 0.1);\n\n let selector: string;\n let confidence = 0.85;\n let reasoning: string | undefined;\n\n try {\n const parsed = JSON.parse(resultText);\n selector = parsed.selector ?? parsed;\n confidence = parsed.confidence ?? 0.85;\n reasoning = parsed.reasoning;\n } catch {\n selector = resultText.trim().replace(/^[\"']|[\"']$/g, '');\n }\n\n this._status(`Selector healed in ${Date.now() - start}ms`);\n return { selector, confidence, reasoning };\n }\n\n isModelCached(): boolean {\n return fs.existsSync(this.modelPath);\n }\n\n clearCache(): void {\n if (fs.existsSync(this.modelPath)) {\n fs.unlinkSync(this.modelPath);\n this.model = null;\n this.context = null;\n this.grammar = null;\n this.ready = false;\n }\n }\n\n private async _ensureModel(): Promise<void> {\n if (this.ready) return;\n\n await llamaPromise;\n\n if (!getLlama) {\n throw new Error('node-llama-cpp failed to load. Is it installed?');\n }\n\n if (!fs.existsSync(this.modelPath)) {\n await this._downloadModel();\n }\n\n this._status('Loading local model...');\n const llama = await getLlama();\n\n const gpuLayers = this.gpuLayers ?? this._autoDetectGPULayers();\n this.model = new LlamaModel({\n llama,\n modelPath: this.modelPath,\n gpuLayers,\n });\n\n this.context = new LlamaContext({\n llama,\n model: this.model,\n contextSize: this.contextSize,\n });\n\n this.ready = true;\n this._status('Local model ready.');\n }\n\n private async _ensureGrammar(): Promise<void> {\n if (this.grammar) return;\n const grammarPath = path.join(__dirname, 'grammar', 'axir-schema.gbnf');\n this.grammar = new LlamaGrammar({\n llama: await getLlama(),\n grammar: fs.readFileSync(grammarPath, 'utf-8'),\n });\n }\n\n private _autoDetectGPULayers(): number {\n if (process.env.AWI_GPU_LAYERS) {\n return parseInt(process.env.AWI_GPU_LAYERS, 10);\n }\n return 0;\n }\n\n private async _downloadModel(): Promise<void> {\n const dir = path.dirname(this.modelPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const tempPath = `${this.modelPath}.tmp`;\n const url = new URL(this.modelUrl);\n const protocol = url.protocol === 'https:' ? https : http;\n\n let startByte = 0;\n if (fs.existsSync(tempPath)) {\n startByte = fs.statSync(tempPath).size;\n this._status(`Resuming download from ${startByte} bytes...`);\n } else {\n this._status('Downloading local compiler model (2.7GB, one-time)...');\n }\n\n return new Promise((resolve, reject) => {\n const headers: http.OutgoingHttpHeaders = {\n 'User-Agent': 'AWI-SDK/1.0',\n };\n if (startByte > 0) {\n headers['Range'] = `bytes=${startByte}-`;\n }\n\n const request = protocol.get(\n url,\n { headers },\n (response) => {\n if (response.statusCode === 302 || response.statusCode === 301) {\n if (response.headers.location) {\n this.modelUrl = response.headers.location;\n return this._downloadModel().then(resolve).catch(reject);\n }\n }\n\n if (response.statusCode !== 200 && response.statusCode !== 206) {\n return reject(\n new Error(`Download failed: HTTP ${response.statusCode}`)\n );\n }\n\n const total = parseInt(\n response.headers['content-length'] || '0',\n 10\n );\n const append = startByte > 0 && response.statusCode === 206;\n const file = fs.createWriteStream(tempPath, { flags: append ? 'a' : 'w' });\n let downloaded = startByte;\n\n response.on('data', (chunk: Buffer) => {\n downloaded += chunk.length;\n this.onDownloadProgress?.(downloaded, total + startByte);\n });\n\n response.pipe(file);\n file.on('finish', () => {\n file.close();\n fs.renameSync(tempPath, this.modelPath);\n this._status('Model download complete.');\n resolve();\n });\n\n file.on('error', (err) => {\n fs.unlinkSync(tempPath);\n reject(err);\n });\n }\n );\n\n request.on('error', reject);\n request.setTimeout(300_000, () => {\n request.destroy();\n reject(new Error('Model download timed out after 5 minutes'));\n });\n });\n }\n\n private async _complete(\n prompt: string,\n maxTokens: number,\n temperature: number\n ): Promise<string> {\n if (!this.context) throw new Error('Model not loaded');\n\n const sequence = this.context.getSequence();\n await sequence.evaluate(prompt);\n\n const result = await sequence.generateResponse(maxTokens, {\n temperature,\n grammar: this.grammar,\n });\n\n let text = '';\n for await (const token of result) {\n text += token;\n }\n return text;\n }\n\n private _buildCompilePrompt(\n domHTML: string,\n a11yTree: string | undefined,\n intent: string,\n params?: Record<string, unknown>\n ): string {\n const paramsJson = params ? JSON.stringify(params, null, 2) : '{}';\n const a11y = a11yTree || 'No accessibility tree available.';\n\n return `|<|system|>\\n` +\n`You are an expert web-scraping analyst. Your job is to read a simplified DOM and accessibility tree, then output a structured JSON object describing the page layout, interactive elements, and data extraction plan.\\n` +\n`\\n` +\n`Output MUST be valid JSON matching this schema:\\n` +\n`- workflow.nodes: map of node_id -> {element_type, semantic_role, intent, tag, selector_candidates[], parent_id?, children_ids?, aria_label?, aria_role?, text_content?, confidence, reasoning?}\\n` +\n`- workflow.edges: list of {from_node, to_node, action, condition?, probability}\\n` +\n`- workflow.entry_points: list of starting node_ids\\n` +\n`- workflow.exit_points: list of terminal node_ids\\n` +\n`- workflow.domain: the domain name\\n` +\n`- workflow.page_type: one of landing|search|listing|detail|form|checkout|dashboard|unknown\\n` +\n`- intents: list of {intent, action, parameters[], context}\\n` +\n`- selectors: map of selector_name -> list of {type, value, priority}\\n` +\n`- fields: list of {name, selector, transform?, required}\\n` +\n`- container?: string (optional container selector name)\\n` +\n`\\n` +\n`Element types: button, link, input, form, navigation, search, filter, sort, pagination, container, list, item, heading, text, image, unknown.\\n` +\n`Selector types: css, semantic, text, attribute.\\n` +\n`|<|user|>\\n` +\n`Intent: ${intent}\\n` +\n`Parameters: ${paramsJson}\\n` +\n`\\n` +\n`Simplified DOM:\\n` +\n`${this._truncate(domHTML, 40_000)}\\n` +\n`\\n` +\n`Accessibility Tree:\\n` +\n`${this._truncate(a11y, 8_000)}\\n` +\n`\\n` +\n`Compile AXIR:\\n` +\n`|<|assistant|>\\n`;\n }\n\n private _buildHealPrompt(\n domHTML: string,\n brokenSelector: string,\n semanticIntent: string\n ): string {\n return `|<|system|>\\n` +\n`You are a CSS selector repair tool. Given a broken selector and the current DOM, output the new CSS selector that targets the same semantic element.\\n` +\n`\\n` +\n`Output JSON: {\\\"selector\\\": \\\"...\\\", \\\"confidence\\\": 0.0-1.0, \\\"reasoning\\\": \\\"...\\\"}\\n` +\n`|<|user|>\\n` +\n`Broken selector: ${brokenSelector}\\n` +\n`Semantic intent: ${semanticIntent}\\n` +\n`\\n` +\n`Current DOM (truncated):\\n` +\n`${this._truncate(domHTML, 20_000)}\\n` +\n`\\n` +\n`New selector:\\n` +\n`|<|assistant|>\\n`;\n }\n\n private _truncate(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text;\n return text.slice(0, maxChars) + '\\n[...truncated...]';\n }\n\n private _estimateTokens(prompt: string, response: string): number {\n return Math.ceil((prompt.length + response.length) / 4);\n }\n\n private _status(message: string): void {\n this.onStatus?.(message);\n }\n}\n"],"mappings":"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","names":["fetch","path"]}