From b485c1acce4b091c58847b2a6021b3d8678f3bf8 Mon Sep 17 00:00:00 2001 From: SentienceDEV Date: Tue, 24 Feb 2026 17:32:42 -0800 Subject: [PATCH 1/4] changed demo to login form --- README.md | 231 ++++- demo/localLlamaLand_demo.png | Bin 0 -> 55134 bytes demo/login-demo.ts | 779 +++++++++++++++ package-lock.json | 1714 ++-------------------------------- package.json | 3 +- 5 files changed, 1029 insertions(+), 1698 deletions(-) create mode 100644 demo/localLlamaLand_demo.png create mode 100644 demo/login-demo.ts diff --git a/README.md b/README.md index c10d3f1..34ac7e9 100644 --- a/README.md +++ b/README.md @@ -246,9 +246,25 @@ news.ycombinator.com (REAL) Monthly Savings: $11,557.63 ``` -### Run LLM Action Demo +### Run Login Demo (Multi-Step Workflow) -Test that Predicate snapshots work for real browser automation with an LLM. +This demo demonstrates real-world browser automation with a **6-step login workflow**: + +1. Navigate to login page and wait for delayed hydration +2. Fill username field (LLM selects element + human-like typing) +3. Fill password field (button state: disabled → enabled) +4. Click login button +5. Navigate to profile page +6. Extract username from profile card + +![Local Llama Land Login Form with Predicate Overlay](demo/localLlamaLand_demo.png) + +*The Predicate overlay shows ML-ranked element IDs (green borders) that the LLM uses to select form fields.* + +Target site: `https://www.localllamaland.com/login` - a test site with intentional challenges: +- **Delayed hydration**: Form loads after ~600ms (SPA pattern) +- **State transitions**: Login button disabled until both fields filled +- **Late-loading content**: Profile card loads after 800-1200ms **Setup:** @@ -266,36 +282,63 @@ OPENAI_API_KEY=sk-your-openai-api-key-here PREDICATE_API_KEY=sk-your-predicate-api-key-here ``` -3. Run the demo: +3. Run the demo with visible browser and element overlay: ```bash -npm run demo:llm - -# With visible browser and element overlay (for debugging) -npm run demo:llm -- --headed --overlay +npm run demo:login -- --headed --overlay ``` **Alternative LLM providers:** ```bash # Anthropic Claude -ANTHROPIC_API_KEY=sk-... npm run demo:llm +ANTHROPIC_API_KEY=sk-... npm run demo:login -- --headed --overlay # Local LLM (Ollama) -SENTIENCE_LOCAL_LLM_BASE_URL=http://localhost:11434/v1 npm run demo:llm +SENTIENCE_LOCAL_LLM_BASE_URL=http://localhost:11434/v1 npm run demo:login -- --headed --overlay + +# Headless mode (no browser window) +npm run demo:login ``` **Flags:** - `--headed` - Run browser in visible window (not headless) - `--overlay` - Show green borders around captured elements (requires `--headed`) -This demo compares: -- **Tokens**: A11y tree vs Predicate snapshot input size -- **Latency**: Total time including LLM response -- **Success**: Whether the LLM correctly identifies the target element +This demo compares A11y Tree vs Predicate Snapshot across **all 6 steps**, measuring: +- **Tokens per step**: Input size for each LLM call +- **Latency**: Time per step including form interactions +- **Success rate**: Step completion across the workflow + +#### Key Observations + +| Metric | A11y Tree | Predicate Snapshot | Delta | +|--------|-----------|-------------------|-------| +| **Steps Completed** | 3/6 (failed at step 4) | **6/6** | Predicate wins | +| **Token Savings** | baseline | **70-74% per step** | Significant | +| **SPA Hydration** | No built-in wait | **`check().eventually()` handles it** | More reliable | + +**Why A11y Tree Failed at Step 4:** + +The A11y (accessibility tree) approach failed to click the login button because: + +1. **Element ID mismatch**: The A11y tree assigns sequential IDs based on DOM traversal order, which can change between snapshots as the SPA re-renders. The LLM selected element 47 ("Sign in"), but that ID no longer pointed to the button after form state changed. + +2. **No stable identifiers**: Unlike Predicate's `data-predicate-id` attributes (injected by the browser extension), A11y IDs are ephemeral and not anchored to the actual DOM elements. + +3. **SPA state changes**: After filling both form fields, the button transitioned from disabled → enabled. This state change can cause the A11y tree to re-order elements, invalidating the LLM's element selection. + +**Predicate Snapshot succeeded because:** +- `data-predicate-id` attributes are stable across re-renders +- ML-ranking surfaces the most relevant elements (button with "Sign in" text) +- `runtime.check().eventually()` properly waits for SPA hydration + +#### Raw Demo Logs + +
+Click to expand full demo output -**Example output:** ``` ====================================================================== - LLM Browser Navigation COMPARISON: A11y Tree vs. Predicate Snapshot + LOGIN + PROFILE CHECK: A11y Tree vs. Predicate Snapshot ====================================================================== Using OpenAI provider Model: gpt-4o-mini @@ -304,51 +347,114 @@ Overlay enabled: elements will be highlighted with green borders Predicate snapshots: REAL (ML-ranked) ====================================================================== -Task: Click first news link on HN +====================================================================== + Running with A11Y approach +====================================================================== - [A11y Tree] Click first news link on HN - Chose element: 48 - Tokens: 35191, Latency: 3932ms - [Predicate] Click first news link on HN - Chose element: 48 - Tokens: 864, Latency: 2477ms +[2026-02-25 01:14:50] Step 1: Wait for login form hydration + Waiting for form to hydrate using runtime.check().eventually()... + Button initially disabled: false + PASS (11822ms) | Found 19 elements -Task: Click More link on HN +[2026-02-25 01:15:02] Step 2: Fill username field + Snapshot: 45 elements, 1241 tokens + LLM chose element 37: "Username" + PASS (6771ms) | Typed "testuser" + Tokens: prompt=1241 total=1251 - [A11y Tree] Click More link on HN - Chose element: 1199 - Tokens: 35179, Latency: 2366ms - [Predicate] Click More link on HN - Chose element: 11 - Tokens: 861, Latency: 1979ms +[2026-02-25 01:15:08] Step 3: Fill password field + LLM chose element 42: "Password" + Waiting for login button to become enabled... + PASS (12465ms) | Button enabled: true + Tokens: prompt=1295 total=1305 -Task: Click search on Example.com +[2026-02-25 01:15:21] Step 4: Click login button + LLM chose element 47: "Sign in" + FAIL (7801ms) | Navigated to https://www.localllamaland.com/login + Tokens: prompt=1367 total=1377 + +====================================================================== + Running with PREDICATE approach +====================================================================== - [A11y Tree] Click search on Example.com - Chose element: 7 - Tokens: 272, Latency: 492ms - [Predicate] Click search on Example.com - Chose element: 6 - Tokens: 44, Latency: 6255ms +[2026-02-25 01:15:29] Step 1: Wait for login form hydration + Waiting for form to hydrate using runtime.check().eventually()... + Button initially disabled: false + PASS (10586ms) | Found 19 elements + +[2026-02-25 01:15:40] Step 2: Fill username field + Snapshot: 19 elements, 351 tokens + LLM chose element 23: "username" + PASS (12877ms) | Typed "testuser" + Tokens: prompt=351 total=361 + +[2026-02-25 01:15:53] Step 3: Fill password field + LLM chose element 25: "Password" + Waiting for login button to become enabled... + PASS (17886ms) | Button enabled: true + Tokens: prompt=352 total=362 + +[2026-02-25 01:16:10] Step 4: Click login button + LLM chose element 29: "Sign in" + PASS (12690ms) | Navigated to https://www.localllamaland.com/profile + Tokens: prompt=346 total=356 + +[2026-02-25 01:16:23] Step 5: Navigate to profile page + PASS (1ms) | Already on profile page + +[2026-02-25 01:16:23] Step 6: Extract username from profile + Waiting for profile card to load... + Found username: testuser@localllama.land + Found email: Profile testuser testuser@localllama.lan + PASS (20760ms) | username=testuser@localllama.land + Tokens: prompt=480 total=480 ====================================================================== RESULTS SUMMARY ====================================================================== -┌─────────────────────────────────────────────────────────────────────┐ -│ Metric │ A11y Tree │ Predicate │ Δ │ -├─────────────────────────────────────────────────────────────────────┤ -│ Total Tokens │ 70642 │ 1769 │ -97% │ -│ Avg Tokens/Task │ 23547 │ 590 │ │ -│ Total Latency (ms) │ 6790 │ 10711 │ -58% │ -│ Success Rate │ 3/3 │ 3/3 │ │ -└─────────────────────────────────────────────────────────────────────┘ - -Key Insight: Predicate snapshots use ~97% fewer tokens -while achieving the same task success rate. ++-----------------------------------------------------------------------+ +| Metric | A11y Tree | Predicate | Delta | ++-----------------------------------------------------------------------+ +| Total Tokens | 3933 | 1559 | -60% | +| Total Latency (ms) | 38859 | 74800 | +92% | +| Steps Passed | 3/6 | 6/6 | | ++-----------------------------------------------------------------------+ + +Key Insight: Predicate snapshots use 60% fewer tokens +for a multi-step login workflow with form filling. + +Step-by-step breakdown: +---------------------------------------------------------------------- +Step 1: Wait for login form hydration + A11y: 0 tokens, 11822ms, PASS + Pred: 0 tokens, 10586ms, PASS (0% savings) +Step 2: Fill username field + A11y: 1251 tokens, 6771ms, PASS + Pred: 361 tokens, 12877ms, PASS (71% savings) +Step 3: Fill password field + A11y: 1305 tokens, 12465ms, PASS + Pred: 362 tokens, 17886ms, PASS (72% savings) +Step 4: Click login button + A11y: 1377 tokens, 7801ms, FAIL + Pred: 356 tokens, 12690ms, PASS (74% savings) ``` -> **Note:** Latency includes network time for ML ranking via the Predicate gateway. Token savings translate directly to cost savings—97% fewer tokens = 97% lower LLM costs. +
+ +#### Summary + +| Step | A11y Tree | Predicate Snapshot | Token Savings | +|------|-----------|-------------------|---------------| +| Step 1: Navigate to localllamaland.com/login | PASS | PASS | - | +| Step 2: Fill username | 1,251 tokens, PASS | 361 tokens, PASS | **71%** | +| Step 3: Fill password | 1,305 tokens, PASS | 362 tokens, PASS | **72%** | +| Step 4: Click login | 1,377 tokens, **FAIL** | 356 tokens, PASS | **74%** | +| Step 5: Navigate to profile | (not reached) | PASS | - | +| Step 6: Extract username | (not reached) | 480 tokens, PASS | - | +| **Total** | **3,933 tokens, 3/6 steps** | **1,559 tokens, 6/6 steps** | **60%** | + +> **Key Insight:** Predicate Snapshot not only reduces tokens by 70%+ per step, but also **improves automation reliability** on SPAs with automatic wait for hydration via `runtime.check().eventually()`. The stable element IDs survive React/Next.js re-renders that break A11y tree-based approaches. ### Build @@ -372,7 +478,8 @@ predicate-snapshot-skill/ │ └── act.ts # PredicateActTool implementation ├── demo/ │ ├── compare.ts # Token comparison demo -│ └── llm-action.ts # LLM action comparison demo +│ ├── llm-action.ts # Simple LLM action demo (single clicks) +│ └── login-demo.ts # Multi-step login workflow demo ├── SKILL.md # OpenClaw skill manifest └── package.json ``` @@ -390,3 +497,29 @@ predicate-snapshot-skill/ - Documentation: [predicatesystems.ai/docs](https://predicatesystems.ai/docs) - Issues: [GitHub Issues](https://github.com/PredicateSystems/openclaw-predicate-skill/issues) + +## Why Predicate Snapshot Over Accessibility Tree? + +OpenClaw and similar browser automation frameworks default to the **Accessibility Tree (A11y)** for navigating websites. While A11y works for simple cases, it has fundamental limitations that make it unreliable for production LLM-driven automation: + +### A11y Tree Limitations + +| Problem | Description | Impact on LLM Agents | +|---------|-------------|----------------------| +| **Optimized for Consumption, Not Action** | A11y is designed for assistive technology (screen readers), not action verification or layout reasoning | Lacks precise semantic geometry and ordinality (e.g., "the first item in a list") that agents need for reliable reasoning | +| **Hydration Lag & Structural Inconsistency** | In JS-heavy SPAs, A11y often lags behind hydration or misrepresents dynamic overlays and grouping | Snapshots miss interactive nodes or incorrectly label states (e.g., confusing `focused` with `active`) | +| **Shadow DOM & Iframe Blind Spots** | A11y struggles to maintain global order across Shadow DOM and iframe boundaries | Cross-shadow ARIA delegation is inconsistent; iframe contents are often missing or lose spatial context | +| **Token Inefficiency** | Extracting the entire A11y tree for small actions wastes context window and compute | Superfluous nodes (like `genericContainer`) consume tokens without helping the agent | +| **Missing Visual/Layout Bugs** | A11y trees miss rendering-time issues like overlapping buttons or z-index conflicts | Agent reports elements as "correct" but cannot detect visual collisions | + +### Predicate Snapshot Advantages + +| Capability | How Predicate Solves It | +|------------|------------------------| +| **Post-Rendered Geometry** | Layers in actual bounding boxes and grouping missing from standard A11y representations | +| **Live DOM Synchronization** | Anchors on the live, post-rendered DOM ensuring perfect sync with actual page state | +| **Unified Cross-Boundary Grounding** | Rust/WASM engine prunes and ranks elements across Shadow DOM and iframes, maintaining unified element ordering | +| **Token-Efficient Pruning** | Specifically prunes uninformative branches while preserving all interactive elements, enabling 3B parameter models to perform at larger model levels | +| **Deterministic Verification** | Binds intent to deterministic outcomes via snapshot diff, providing an auditable "truth" layer rather than just a structural "report" | + +> **Bottom Line:** A11y trees tell you what *should* be there. Predicate Snapshots tell you what *is* there—and prove it. diff --git a/demo/localLlamaLand_demo.png b/demo/localLlamaLand_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..e56f547c10e91df56b799a92d5f4073fcf362e7a GIT binary patch literal 55134 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 R?-=msu9DUrgo1VO{{si2opAsF literal 0 HcmV?d00001 diff --git a/demo/login-demo.ts b/demo/login-demo.ts new file mode 100644 index 0000000..6ce72ed --- /dev/null +++ b/demo/login-demo.ts @@ -0,0 +1,779 @@ +/** + * Login + Profile Check Demo + * + * Ported from Python: sentience-sdk-playground/login_profile_check/main.py + * + * Demonstrates multi-step browser automation with: + * - Delayed hydration handling using AgentRuntime.check().eventually() + * - State-aware assertions (isEnabled, isDisabled) + * - Form filling with LLM element selection + * - Human-like typing with random delays + * - A11y Tree vs Predicate Snapshot comparison + * + * Target site: https://www.localllamaland.com/login + * Site characteristics (intentional challenges): + * - DELAYED HYDRATION: Login form loads after ~600ms + * - BUTTON DISABLED→ENABLED: Login button becomes enabled after both fields filled + * - PROFILE PAGE LATE-LOAD: Profile card content loads after 800-1200ms + * + * Run: npm run demo:login -- --headed --overlay + * + * Options: + * --headed Run browser in headed mode (visible window) + * --overlay Show green overlay on captured elements (requires --headed) + */ + +import * as dotenv from 'dotenv'; +dotenv.config(); + +const args = process.argv.slice(2); +const HEADED = args.includes('--headed'); +const SHOW_OVERLAY = args.includes('--overlay'); + +import { + PredicateBrowser, + SentienceBrowser, + Snapshot, + LLMProvider, + LocalLLMProvider, + OpenAIProvider, + AnthropicProvider, + AgentRuntime, + Tracer, + JsonlTraceSink, + exists, + isEnabled, + isDisabled, + urlContains, +} from '@predicatesystems/runtime'; +import { encode } from 'gpt-tokenizer'; +import * as crypto from 'crypto'; +import * as path from 'path'; +import * as os from 'os'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Page = any; +type Browser = InstanceType; + +// Test credentials for the fake site +const TEST_USERNAME = 'testuser'; +const TEST_PASSWORD = 'password123'; + +interface A11yNode { + nodeId?: string; + role?: string; + name?: string; + description?: string; + value?: string; + children?: A11yNode[]; + [key: string]: unknown; +} + +interface StepTokenUsage { + promptTokens: number; + completionTokens: number; + totalTokens: number; +} + +interface StepResult { + success: boolean; + usage: StepTokenUsage | null; + note?: string; +} + +interface StepStats { + stepIndex: number; + goal: string; + success: boolean; + durationMs: number; + tokenUsage: StepTokenUsage | null; + url: string; + note?: string; + approach: 'a11y' | 'predicate'; +} + +interface ParsedElement { + id: number; + role: string; + text: string; + disabled?: boolean; +} + +// ============ Utility Functions ============ + +function nowIso(): string { + return new Date().toISOString().replace('T', ' ').substring(0, 19); +} + +function parseClickId(text: string): number | null { + const m = text.match(/CLICK\s*\(\s*(\d+)\s*\)/i); + return m ? parseInt(m[1], 10) : null; +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +function randomDelay(minMs: number, maxMs: number): number { + return Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs; +} + +// ============ Browser Adapter ============ + +/** + * Adapter to make SentienceBrowser compatible with AgentRuntime's BrowserLike interface. + * AgentRuntime expects snapshot(page, options) but SentienceBrowser has snapshot(options). + */ +function createBrowserAdapter(browser: Browser) { + return { + snapshot: async (_page: Page, options?: Record): Promise => { + return await browser.snapshot(options); + }, + }; +} + +// ============ Accessibility Tree Functions ============ + +async function getAccessibilityTree(page: Page): Promise { + const client = await page.context().newCDPSession(page); + + try { + const { nodes } = await client.send('Accessibility.getFullAXTree'); + + const nodeMap = new Map(); + let root: A11yNode | null = null; + + for (const node of nodes) { + const a11yNode: A11yNode = { + nodeId: node.nodeId, + role: node.role?.value, + name: node.name?.value, + description: node.description?.value, + value: node.value?.value, + children: [], + }; + nodeMap.set(node.nodeId, a11yNode); + + if (!node.parentId) { + root = a11yNode; + } + } + + for (const node of nodes) { + if (node.parentId && nodeMap.has(node.parentId)) { + const parent = nodeMap.get(node.parentId)!; + const child = nodeMap.get(node.nodeId); + if (child && parent.children) { + parent.children.push(child); + } + } + } + + return root; + } finally { + await client.detach(); + } +} + +function formatA11yForLLM(tree: A11yNode | null): { formatted: string; elements: ParsedElement[] } { + if (!tree) return { formatted: '[]', elements: [] }; + + const elements: ParsedElement[] = []; + let id = 1; + + function extract(node: A11yNode): void { + if (node.role && node.name) { + elements.push({ + id: id++, + role: node.role, + text: node.name.slice(0, 100), + }); + } + if (node.children) { + for (const child of node.children) { + extract(child); + } + } + } + + extract(tree); + const formatted = JSON.stringify(elements.map(e => ({ id: e.id, role: e.role, name: e.text })), null, 2); + return { formatted, elements }; +} + +// ============ Predicate Snapshot Functions ============ + +function formatPredicateForLLM(snap: Snapshot): { formatted: string; elements: ParsedElement[] } { + const lines: string[] = ['ID|role|text|importance|is_primary|disabled']; + const elements: ParsedElement[] = []; + + for (const el of snap.elements.slice(0, 50)) { + const id = el.id ?? 0; + const role = el.role ?? ''; + const text = String(el.text ?? '').slice(0, 40).replace(/\|/g, ' ').replace(/\n/g, ' '); + const imp = el.importance?.toFixed(2) ?? '0'; + const isPrimary = el.visual_cues?.is_primary ? 'yes' : 'no'; + const disabled = el.disabled ? 'yes' : 'no'; + + lines.push(`${id}|${role}|${text}|${imp}|${isPrimary}|${disabled}`); + elements.push({ id, role, text, disabled: el.disabled ?? false }); + } + + return { formatted: lines.join('\n'), elements }; +} + +function getElementText(elements: ParsedElement[], id: number): string { + const el = elements.find(e => e.id === id); + if (!el) return '(not found)'; + const text = el.text.slice(0, 50); + return text || `[${el.role}]`; +} + +// ============ LLM Functions ============ + +function buildLLMPrompt(task: string, elements: string, format: 'a11y' | 'predicate'): string { + const formatExplanation = format === 'a11y' + ? 'The elements are in JSON format with id, role, and name fields.' + : `The elements are in pipe-delimited format: ID|role|text|importance|is_primary|disabled +- disabled=yes means the element cannot be interacted with`; + + return `You are a browser automation agent controlling a login form. + +You must respond with exactly ONE action in this format: +- CLICK() - to click an element +- TYPE(, "") - to type text into an input field + +${formatExplanation} + +TASK: ${task} + +ELEMENTS: +${elements} + +Respond with ONLY the action (CLICK or TYPE), nothing else.`; +} + +function initLLMProvider(): LLMProvider { + if (process.env.OPENAI_API_KEY) { + console.log('Using OpenAI provider'); + return new OpenAIProvider(process.env.OPENAI_API_KEY, 'gpt-4o-mini'); + } + + if (process.env.ANTHROPIC_API_KEY) { + console.log('Using Anthropic provider'); + return new AnthropicProvider(process.env.ANTHROPIC_API_KEY, 'claude-3-haiku-20240307'); + } + + if (process.env.SENTIENCE_LOCAL_LLM_BASE_URL || process.env.OLLAMA_BASE_URL) { + console.log('Using local LLM provider'); + return new LocalLLMProvider({ + baseUrl: process.env.SENTIENCE_LOCAL_LLM_BASE_URL || process.env.OLLAMA_BASE_URL, + model: process.env.SENTIENCE_LOCAL_LLM_MODEL || 'llama3.2', + }); + } + + throw new Error( + 'No LLM provider configured. Set one of:\n' + + ' - OPENAI_API_KEY\n' + + ' - ANTHROPIC_API_KEY\n' + + ' - SENTIENCE_LOCAL_LLM_BASE_URL (for Ollama/LM Studio)' + ); +} + +// ============ Human-like Typing ============ + +async function typeHumanLike(page: Page, text: string): Promise { + for (const char of text) { + await page.keyboard.type(char); + await sleep(randomDelay(50, 120)); + // Occasional longer pause (8% chance) + if (Math.random() < 0.08) { + await sleep(randomDelay(180, 400)); + } + } +} + +// ============ Main Demo ============ + +async function runLoginDemo(): Promise { + console.log('='.repeat(70)); + console.log(' LOGIN + PROFILE CHECK: A11y Tree vs. Predicate Snapshot'); + console.log('='.repeat(70)); + + const llm = initLLMProvider(); + console.log(`Model: ${llm.modelName}`); + + if (HEADED) { + console.log('Running in headed mode (visible browser window)'); + if (SHOW_OVERLAY) { + console.log('Overlay enabled: elements will be highlighted with green borders'); + } + } + + // Initialize browser + const apiKey = process.env.PREDICATE_API_KEY; + const headless = !HEADED; + let browser: Browser; + let useRealPredicate = false; + + try { + browser = new PredicateBrowser(apiKey, undefined, headless); + await browser.start(); + useRealPredicate = !!apiKey; + console.log(`Predicate snapshots: ${useRealPredicate ? 'REAL (ML-ranked)' : 'extension-based'}`); + } catch { + console.log('Falling back to plain Playwright (extension not available)'); + const { chromium } = await import('playwright'); + const playwrightBrowser = await chromium.launch({ headless }); + const context = await playwrightBrowser.newContext(); + const page = await context.newPage(); + + browser = { + goto: async (url: string) => { await page.goto(url, { waitUntil: 'networkidle' }); }, + getPage: () => page, + snapshot: async () => { throw new Error('Extension not available'); }, + close: async () => { await playwrightBrowser.close(); }, + } as unknown as Browser; + } + + console.log('='.repeat(70)); + + const page = browser.getPage()!; + + // Create tracer and runtime for SDK-based verification + const runId = crypto.randomUUID(); + const traceFile = path.join(os.tmpdir(), `login-demo-${runId}.jsonl`); + const sink = new JsonlTraceSink(traceFile); + const tracer = new Tracer(runId, sink); + const browserAdapter = createBrowserAdapter(browser); + const runtime = new AgentRuntime(browserAdapter, page, tracer); + + console.log(`Trace file: ${traceFile}`); + + // Run workflow with both approaches + const approaches: Array<'a11y' | 'predicate'> = ['a11y', 'predicate']; + const allStats: Map = new Map(); + + for (const approach of approaches) { + console.log(`\n${'='.repeat(70)}`); + console.log(` Running with ${approach.toUpperCase()} approach`); + console.log('='.repeat(70)); + + const stats: StepStats[] = []; + let totalTokens: StepTokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 }; + + // Helper to run a step + const runStep = async ( + stepIndex: number, + goal: string, + fn: () => Promise + ): Promise => { + const startTime = Date.now(); + console.log(`\n[${nowIso()}] Step ${stepIndex}: ${goal}`); + + // Use SDK's step tracking + runtime.beginStep(goal, stepIndex - 1); + + let result: StepResult; + try { + result = await fn(); + } catch (e) { + console.log(` ERROR: ${e instanceof Error ? e.message : e}`); + result = { success: false, usage: null, note: String(e) }; + } + + const durationMs = Date.now() - startTime; + + if (result.usage) { + totalTokens = { + promptTokens: totalTokens.promptTokens + result.usage.promptTokens, + completionTokens: totalTokens.completionTokens + result.usage.completionTokens, + totalTokens: totalTokens.totalTokens + result.usage.totalTokens, + }; + } + + stats.push({ + stepIndex, + goal, + success: result.success, + durationMs, + tokenUsage: result.usage, + url: page.url(), + note: result.note, + approach, + }); + + const noteStr = result.note ? ` | ${result.note}` : ''; + console.log(` ${result.success ? 'PASS' : 'FAIL'} (${durationMs}ms)${noteStr}`); + if (result.usage) { + console.log(` Tokens: prompt=${result.usage.promptTokens} total=${result.usage.totalTokens}`); + } + + return result.success; + }; + + // Helper to get snapshot based on approach + const getSnapshot = async (): Promise<{ formatted: string; elements: ParsedElement[]; tokens: number }> => { + if (approach === 'a11y') { + const tree = await getAccessibilityTree(page); + const { formatted, elements } = formatA11yForLLM(tree); + return { formatted, elements, tokens: encode(formatted).length }; + } else { + const snap = await browser.snapshot({ limit: 50, show_overlay: SHOW_OVERLAY, goal: 'Find form elements' }); + const { formatted, elements } = formatPredicateForLLM(snap); + return { formatted, elements, tokens: encode(formatted).length }; + } + }; + + // Navigate to login page + await browser.goto('https://www.localllamaland.com/login'); + await page.waitForLoadState('domcontentloaded'); + + // ======== Step 1: Wait for login form hydration ======== + const step1Ok = await runStep(1, 'Wait for login form hydration', async () => { + console.log(' Waiting for form to hydrate using runtime.check().eventually()...'); + + // Use SDK's check().eventually() pattern - same as Python SDK + const formLoaded = await runtime.check( + exists('role=textbox'), + 'login_form_hydrated', + true // required + ).eventually({ + timeoutMs: 15000, + pollMs: 500, + }); + + if (!formLoaded) { + return { success: false, usage: null, note: 'Form did not hydrate' }; + } + + // Verify button is initially disabled using SDK predicates + const buttonDisabled = runtime.assert( + isDisabled('role=button'), + 'login_button_disabled_initially', + false // not required + ); + console.log(` Button initially disabled: ${buttonDisabled}`); + + // Get element count from last snapshot + const snap = await runtime.snapshot(); + return { success: true, usage: null, note: `Found ${snap.elements.length} elements` }; + }); + + if (!step1Ok) { + console.log(' Step 1 failed, skipping remaining steps'); + allStats.set(approach, stats); + continue; + } + + // ======== Step 2: Fill username field ======== + const step2Ok = await runStep(2, 'Fill username field', async () => { + const { formatted, elements, tokens } = await getSnapshot(); + console.log(` Snapshot: ${elements.length} elements, ${tokens} tokens`); + + const task = 'Find the username input field (the FIRST textbox on the page) and click it to focus.'; + const prompt = buildLLMPrompt(task, formatted, approach); + + const response = await llm.generate('', prompt, { temperature: 0, max_tokens: 50 }); + const clickId = parseClickId(response.content); + + if (clickId === null) { + return { + success: false, + usage: { promptTokens: tokens, completionTokens: 0, totalTokens: tokens }, + note: `LLM returned: ${response.content}`, + }; + } + + console.log(` LLM chose element ${clickId}: "${getElementText(elements, clickId)}"`); + + // Click and type - try Predicate ID first, then fallback + try { + await page.click(`[data-predicate-id="${clickId}"]`, { timeout: 5000 }); + } catch { + // Fallback: click first textbox/input + await page.locator('input[type="text"], input:not([type]), [role="textbox"]').first().click({ timeout: 3000 }); + } + await sleep(200); + await typeHumanLike(page, TEST_USERNAME); + + return { + success: true, + usage: { promptTokens: tokens, completionTokens: 10, totalTokens: tokens + 10 }, + note: `Typed "${TEST_USERNAME}"`, + }; + }); + + if (!step2Ok) { + allStats.set(approach, stats); + continue; + } + + // ======== Step 3: Fill password field ======== + const step3Ok = await runStep(3, 'Fill password field', async () => { + const { formatted, elements, tokens } = await getSnapshot(); + + const task = 'Find the password input field (look for a field with "password" in text/placeholder) and click it.'; + const prompt = buildLLMPrompt(task, formatted, approach); + + const response = await llm.generate('', prompt, { temperature: 0, max_tokens: 50 }); + const clickId = parseClickId(response.content); + + if (clickId === null) { + return { + success: false, + usage: { promptTokens: tokens, completionTokens: 0, totalTokens: tokens }, + note: `LLM returned: ${response.content}`, + }; + } + + console.log(` LLM chose element ${clickId}: "${getElementText(elements, clickId)}"`); + + // Click and type password - try Predicate ID first, then fallback to password input + try { + await page.click(`[data-predicate-id="${clickId}"]`, { timeout: 5000 }); + } catch { + // Fallback: try common password field selectors + try { + await page.locator('input[type="password"]').first().click({ timeout: 3000 }); + } catch { + // Last resort: click the second textbox + await page.locator('[role="textbox"]').nth(1).click({ timeout: 3000 }); + } + } + await sleep(200); + await typeHumanLike(page, TEST_PASSWORD); + + // Wait for button to become enabled using SDK's check().eventually() + console.log(' Waiting for login button to become enabled...'); + const buttonEnabled = await runtime.check( + isEnabled('role=button'), + 'login_button_enabled_after_fill', + true // required + ).eventually({ + timeoutMs: 5000, + pollMs: 300, + }); + + return { + success: true, + usage: { promptTokens: tokens, completionTokens: 10, totalTokens: tokens + 10 }, + note: `Button enabled: ${buttonEnabled}`, + }; + }); + + if (!step3Ok) { + allStats.set(approach, stats); + continue; + } + + // ======== Step 4: Click login button ======== + const step4Ok = await runStep(4, 'Click login button', async () => { + await sleep(300); + const { formatted, elements, tokens } = await getSnapshot(); + + // Verify button is enabled before clicking + const buttonReady = runtime.assert( + isEnabled('role=button'), + 'login_button_enabled_before_click', + false + ); + if (!buttonReady) { + console.log(' Warning: Button may not be enabled, proceeding anyway'); + } + + const task = 'Find and click the login/submit button (role="button" with text containing "Login" or "Sign in").'; + const prompt = buildLLMPrompt(task, formatted, approach); + + const response = await llm.generate('', prompt, { temperature: 0, max_tokens: 50 }); + const clickId = parseClickId(response.content); + + if (clickId === null) { + return { + success: false, + usage: { promptTokens: tokens, completionTokens: 0, totalTokens: tokens }, + note: `LLM returned: ${response.content}`, + }; + } + + console.log(` LLM chose element ${clickId}: "${getElementText(elements, clickId)}"`); + + // Click login button + const preUrl = page.url(); + try { + await page.click(`[data-predicate-id="${clickId}"]`, { timeout: 5000 }); + } catch { + // Fallback: click button with Login/Sign text + await page.locator('button:has-text("Sign"), button:has-text("Login"), [role="button"]').first().click({ timeout: 3000 }); + } + + // Wait for navigation + await sleep(1500); + await page.waitForLoadState('domcontentloaded').catch(() => {}); + + const postUrl = page.url(); + const navigated = postUrl !== preUrl || postUrl.includes('profile'); + + return { + success: navigated, + usage: { promptTokens: tokens, completionTokens: 10, totalTokens: tokens + 10 }, + note: `Navigated to ${postUrl}`, + }; + }); + + if (!step4Ok) { + allStats.set(approach, stats); + continue; + } + + // ======== Step 5: Navigate to profile page ======== + const step5Ok = await runStep(5, 'Navigate to profile page', async () => { + const currentUrl = page.url(); + + if (!currentUrl.includes('profile')) { + const { formatted, elements, tokens } = await getSnapshot(); + + const task = 'Find and click the Profile link in the navigation (role="link" with text "Profile").'; + const prompt = buildLLMPrompt(task, formatted, approach); + + const response = await llm.generate('', prompt, { temperature: 0, max_tokens: 50 }); + const clickId = parseClickId(response.content); + + if (clickId !== null) { + console.log(` LLM chose element ${clickId}: "${getElementText(elements, clickId)}"`); + try { + await page.click(`[data-predicate-id="${clickId}"]`, { timeout: 5000 }); + } catch { + // Fallback: click profile link + await page.locator('a[href*="profile"], a:has-text("Profile"), [role="link"]:has-text("Profile")').first().click({ timeout: 3000 }); + } + await page.waitForLoadState('domcontentloaded').catch(() => {}); + } + + // Verify we're on profile page using SDK predicate + const onProfile = runtime.assert( + urlContains('profile'), + 'on_profile_page', + true + ); + + return { + success: onProfile, + usage: { promptTokens: tokens, completionTokens: 10, totalTokens: tokens + 10 }, + note: `URL: ${page.url()}`, + }; + } + + return { success: true, usage: null, note: 'Already on profile page' }; + }); + + if (!step5Ok) { + allStats.set(approach, stats); + continue; + } + + // ======== Step 6: Extract username from profile ======== + await runStep(6, 'Extract username from profile', async () => { + // Wait for profile content to load using SDK's check().eventually() + console.log(' Waiting for profile card to load...'); + const profileLoaded = await runtime.check( + exists("text~'Profile'"), + 'profile_card_loaded', + true + ).eventually({ + timeoutMs: 10000, + pollMs: 500, + }); + + if (!profileLoaded) { + return { success: false, usage: null, note: 'Profile card did not load' }; + } + + const { elements, tokens } = await getSnapshot(); + + // Look for username in elements + let foundUsername = ''; + let foundEmail = ''; + + for (const el of elements) { + const text = el.text.toLowerCase(); + if (text.includes('@') && !foundEmail) { + foundEmail = el.text; + } else if (text.includes(TEST_USERNAME.toLowerCase())) { + foundUsername = el.text; + } + } + + console.log(` Found username: ${foundUsername || '(not found)'}`); + console.log(` Found email: ${foundEmail || '(not found)'}`); + + return { + success: !!(foundUsername || foundEmail), + usage: { promptTokens: tokens, completionTokens: 0, totalTokens: tokens }, + note: foundUsername ? `username=${foundUsername}` : foundEmail ? `email=${foundEmail}` : 'not found', + }; + }); + + allStats.set(approach, stats); + } + + // ======== Print Summary ======== + console.log('\n' + '='.repeat(70)); + console.log(' RESULTS SUMMARY'); + console.log('='.repeat(70)); + + const a11yStats = allStats.get('a11y') || []; + const predicateStats = allStats.get('predicate') || []; + + const sumTokens = (stats: StepStats[]) => + stats.reduce((sum, s) => sum + (s.tokenUsage?.totalTokens || 0), 0); + const sumLatency = (stats: StepStats[]) => + stats.reduce((sum, s) => sum + s.durationMs, 0); + const countSuccess = (stats: StepStats[]) => + stats.filter(s => s.success).length; + + const a11yTokens = sumTokens(a11yStats); + const predicateTokens = sumTokens(predicateStats); + const a11yLatency = sumLatency(a11yStats); + const predicateLatency = sumLatency(predicateStats); + const a11ySuccess = countSuccess(a11yStats); + const predicateSuccess = countSuccess(predicateStats); + const totalSteps = Math.max(a11yStats.length, predicateStats.length); + + const tokenSavings = a11yTokens > 0 ? Math.round((1 - predicateTokens / a11yTokens) * 100) : 0; + const latencySavings = a11yLatency > 0 ? Math.round((1 - predicateLatency / a11yLatency) * 100) : 0; + + console.log(` ++-----------------------------------------------------------------------+ +| Metric | A11y Tree | Predicate | Delta | ++-----------------------------------------------------------------------+ +| Total Tokens | ${String(a11yTokens).padStart(16)} | ${String(predicateTokens).padStart(16)} | -${tokenSavings}% | +| Total Latency (ms) | ${String(a11yLatency).padStart(16)} | ${String(predicateLatency).padStart(16)} | ${latencySavings > 0 ? '-' : '+'}${Math.abs(latencySavings)}% | +| Steps Passed | ${String(a11ySuccess + '/' + totalSteps).padStart(16)} | ${String(predicateSuccess + '/' + totalSteps).padStart(16)} | | ++-----------------------------------------------------------------------+ +`); + + console.log(`Key Insight: Predicate snapshots use ${tokenSavings}% fewer tokens`); + console.log('for a multi-step login workflow with form filling.\n'); + + // Per-step breakdown + console.log('Step-by-step breakdown:'); + console.log('-'.repeat(70)); + for (let i = 0; i < totalSteps; i++) { + const a11y = a11yStats[i]; + const pred = predicateStats[i]; + if (a11y && pred) { + const a11yT = a11y.tokenUsage?.totalTokens || 0; + const predT = pred.tokenUsage?.totalTokens || 0; + const savings = a11yT > 0 ? Math.round((1 - predT / a11yT) * 100) : 0; + console.log(`Step ${i + 1}: ${a11y.goal}`); + console.log(` A11y: ${a11yT} tokens, ${a11y.durationMs}ms, ${a11y.success ? 'PASS' : 'FAIL'}`); + console.log(` Pred: ${predT} tokens, ${pred.durationMs}ms, ${pred.success ? 'PASS' : 'FAIL'} (${savings}% savings)`); + } + } + + await browser.close(); +} + +// Run +runLoginDemo().catch(console.error); diff --git a/package-lock.json b/package-lock.json index 542b583..79fcee5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "license": "(MIT OR Apache-2.0)", "dependencies": { - "@predicatesystems/runtime": "^1.1.2" + "@predicatesystems/runtime": "file:../sdk-ts" }, "bin": { "predicate-snapshot": "dist/index.js" @@ -28,46 +28,56 @@ "typescript": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "playwright": "^1.40.0" } }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.20.9", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.20.9.tgz", - "integrity": "sha512-Lq74+DhiEQO6F9/gdVOLmHx57pX45ebK2Q/zH14xYe1157a7QeUVknRqIp0Jz5gQI01o7NKbuv9Dag2uQsLjDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "optional": true, + "../sdk-ts": { + "name": "@predicatesystems/runtime", + "version": "1.1.2", + "license": "(MIT OR Apache-2.0)", "dependencies": { - "undici-types": "~5.26.4" + "canvas": "^3.2.1", + "playwright": "^1.40.0", + "sharp": "^0.34.5", + "turndown": "^7.2.2", + "uuid": "^9.0.0", + "zod": "^3.22.0" + }, + "bin": { + "predicate": "dist/cli.js" + }, + "devDependencies": { + "@eslint/js": "^9.39.2", + "@types/jest": "^29.5.14", + "@types/node": "^20.0.0", + "@types/turndown": "^5.0.3", + "@types/uuid": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^8.51.0", + "@typescript-eslint/parser": "^8.51.0", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "husky": "^9.1.7", + "jest": "^29.0.0", + "lint-staged": "^16.2.7", + "prettier": "^3.7.4", + "ts-jest": "^29.0.0", + "ts-node": "^10.9.0", + "typescript": "^5.0.0", + "typescript-eslint": "^8.51.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "optionalDependencies": { + "@anthropic-ai/sdk": "^0.20.0", + "openai": "^4.0.0", + "zhipuai-sdk-nodejs-v4": "^0.1.12" } }, - "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT", - "optional": true - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -608,16 +618,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -767,471 +767,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1691,12 +1226,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mixmark-io/domino": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", - "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", - "license": "BSD-2-Clause" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1736,29 +1265,8 @@ } }, "node_modules/@predicatesystems/runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@predicatesystems/runtime/-/runtime-1.1.2.tgz", - "integrity": "sha512-mjvh5XMCJj++F3FyV7w4eLb87uD/8HiHQ9IcgRHxiq7PkK40rGdMCbL/0fyxZFlMCTbS64DjNToRvPcooasA4g==", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "canvas": "^3.2.1", - "playwright": "^1.40.0", - "sharp": "^0.34.5", - "turndown": "^7.2.2", - "uuid": "^9.0.0", - "zod": "^3.22.0" - }, - "bin": { - "predicate": "dist/cli.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "optionalDependencies": { - "@anthropic-ai/sdk": "^0.20.0", - "openai": "^4.0.0", - "zhipuai-sdk-nodejs-v4": "^0.1.12" - } + "resolved": "../sdk-ts", + "link": true }, "node_modules/@sinclair/typebox": { "version": "0.27.10", @@ -1908,23 +1416,12 @@ "version": "20.19.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, "node_modules/@types/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", @@ -2161,19 +1658,6 @@ "dev": true, "license": "ISC" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -2210,19 +1694,6 @@ "node": ">=0.4.0" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -2333,25 +1804,6 @@ "node": ">=8" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "optional": true - }, - "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2485,26 +1937,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", @@ -2518,17 +1950,6 @@ "node": ">=6.0.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -2609,37 +2030,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause", - "optional": true - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2647,20 +2037,6 @@ "dev": true, "license": "MIT" }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2702,20 +2078,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canvas": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.1.tgz", - "integrity": "sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.3" - }, - "engines": { - "node": "^18.12.0 || >= 20.9.0" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2743,12 +2105,6 @@ "node": ">=10" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -2825,19 +2181,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2914,21 +2257,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", @@ -2944,15 +2272,6 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2965,28 +2284,9 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/detect-newline": { @@ -3058,31 +2358,6 @@ "url": "https://dotenvx.com" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.302", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", @@ -3110,15 +2385,6 @@ "dev": true, "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -3129,55 +2395,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "optional": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "optional": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3390,16 +2607,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -3433,15 +2640,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -3595,81 +2793,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT", - "optional": true - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3696,7 +2819,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3722,31 +2845,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3757,20 +2855,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "optional": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -3784,12 +2868,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3886,19 +2964,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gpt-tokenizer": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-2.9.0.tgz", @@ -3952,40 +3017,11 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "optional": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4011,36 +3047,6 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4114,12 +3120,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, "license": "ISC" }, "node_modules/is-arrayish": { @@ -4956,52 +3957,6 @@ "node": ">=6" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "optional": true, - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "optional": true, - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5069,48 +4024,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT", - "optional": true - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -5125,13 +4038,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT", - "optional": true - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5175,16 +4081,6 @@ "tmpl": "1.0.5" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5204,39 +4100,16 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "mime-db": "1.52.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8.6" } }, "node_modules/mimic-fn": { @@ -5249,18 +4122,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -5281,28 +4142,17 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, "license": "MIT" }, "node_modules/natural-compare": { @@ -5319,66 +4169,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5420,6 +4210,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -5441,54 +4232,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openai": { - "version": "4.104.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", - "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "optional": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/openai/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT", - "optional": true - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5731,6 +4474,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.58.2" @@ -5749,6 +4493,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -5761,6 +4506,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -5771,33 +4517,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5850,23 +4569,6 @@ "node": ">= 6" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "optional": true - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5915,30 +4617,6 @@ ], "license": "MIT" }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -5946,20 +4624,6 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6086,30 +4750,11 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6118,50 +4763,6 @@ "node": ">=10" } }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6192,51 +4793,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -6305,15 +4861,6 @@ "node": ">=8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -6415,34 +4962,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -6509,13 +5028,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT", - "optional": true - }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -6639,34 +5151,6 @@ } } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/turndown": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", - "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==", - "license": "MIT", - "dependencies": { - "@mixmark-io/domino": "^2.2.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6735,7 +5219,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/update-browserslist-db": { @@ -6779,25 +5263,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -6830,34 +5295,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause", - "optional": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6913,6 +5350,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -6997,26 +5435,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zhipuai-sdk-nodejs-v4": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/zhipuai-sdk-nodejs-v4/-/zhipuai-sdk-nodejs-v4-0.1.12.tgz", - "integrity": "sha512-UaxTvhIZiJOhwHjCx8WwZjkiQzQvSE/yq7uEEeM8zjZ1D1lX+SIDsTnRhnhVqsvpTnFdD9AcwY15mvjtmRy1ug==", - "license": "MIT", - "optional": true, - "dependencies": { - "axios": "^1.6.7", - "jsonwebtoken": "^9.0.2" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/package.json b/package.json index 052b698..f1cd49c 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "lint": "eslint src --ext .ts", "demo": "ts-node demo/compare.ts", "demo:llm": "ts-node demo/llm-action.ts", + "demo:login": "ts-node demo/login-demo.ts", "prepublishOnly": "npm run build" }, "bin": { @@ -33,7 +34,7 @@ }, "homepage": "https://predicate.systems/skills/snapshot", "dependencies": { - "@predicatesystems/runtime": "^1.1.2" + "@predicatesystems/runtime": "file:../sdk-ts" }, "peerDependencies": { "playwright": "^1.40.0" From 4f5336c5a8a1cc3491414d70866bad19f754b800 Mon Sep 17 00:00:00 2001 From: SentienceDEV Date: Tue, 24 Feb 2026 17:39:40 -0800 Subject: [PATCH 2/4] fix tests --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79fcee5..c461161 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "license": "(MIT OR Apache-2.0)", "dependencies": { - "@predicatesystems/runtime": "file:../sdk-ts" + "@predicatesystems/runtime": "^1.1.2" }, "bin": { "predicate-snapshot": "dist/index.js" diff --git a/package.json b/package.json index f1cd49c..b8a93aa 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ }, "homepage": "https://predicate.systems/skills/snapshot", "dependencies": { - "@predicatesystems/runtime": "file:../sdk-ts" + "@predicatesystems/runtime": "^1.1.2" }, "peerDependencies": { "playwright": "^1.40.0" From 6b194f9cc3b732d5276765dc3db904b7cfb309d0 Mon Sep 17 00:00:00 2001 From: SentienceDEV Date: Tue, 24 Feb 2026 17:44:54 -0800 Subject: [PATCH 3/4] fix: regenerate package-lock.json with npm registry reference The previous package-lock.json still contained a local symlink reference ("resolved": "../sdk-ts", "link": true) even though package.json was updated. This caused npm ci to fail in GitHub Actions as the local path doesn't exist in CI. Regenerated lock file now properly references the npm registry. Co-Authored-By: Claude Opus 4.5 --- package-lock.json | 1732 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1657 insertions(+), 75 deletions(-) diff --git a/package-lock.json b/package-lock.json index c461161..a39ede7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,50 +34,40 @@ "playwright": "^1.40.0" } }, - "../sdk-ts": { - "name": "@predicatesystems/runtime", - "version": "1.1.2", - "license": "(MIT OR Apache-2.0)", + "node_modules/@anthropic-ai/sdk": { + "version": "0.20.9", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.20.9.tgz", + "integrity": "sha512-Lq74+DhiEQO6F9/gdVOLmHx57pX45ebK2Q/zH14xYe1157a7QeUVknRqIp0Jz5gQI01o7NKbuv9Dag2uQsLjDg==", + "license": "MIT", + "optional": true, "dependencies": { - "canvas": "^3.2.1", - "playwright": "^1.40.0", - "sharp": "^0.34.5", - "turndown": "^7.2.2", - "uuid": "^9.0.0", - "zod": "^3.22.0" - }, - "bin": { - "predicate": "dist/cli.js" - }, - "devDependencies": { - "@eslint/js": "^9.39.2", - "@types/jest": "^29.5.14", - "@types/node": "^20.0.0", - "@types/turndown": "^5.0.3", - "@types/uuid": "^9.0.0", - "@typescript-eslint/eslint-plugin": "^8.51.0", - "@typescript-eslint/parser": "^8.51.0", - "eslint": "^9.39.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.4", - "husky": "^9.1.7", - "jest": "^29.0.0", - "lint-staged": "^16.2.7", - "prettier": "^3.7.4", - "ts-jest": "^29.0.0", - "ts-node": "^10.9.0", - "typescript": "^5.0.0", - "typescript-eslint": "^8.51.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "optionalDependencies": { - "@anthropic-ai/sdk": "^0.20.0", - "openai": "^4.0.0", - "zhipuai-sdk-nodejs-v4": "^0.1.12" + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" } }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT", + "optional": true + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -618,6 +608,16 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -683,9 +683,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -733,9 +733,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -767,6 +767,471 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1226,6 +1691,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", + "license": "BSD-2-Clause" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1265,8 +1736,29 @@ } }, "node_modules/@predicatesystems/runtime": { - "resolved": "../sdk-ts", - "link": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@predicatesystems/runtime/-/runtime-1.1.2.tgz", + "integrity": "sha512-mjvh5XMCJj++F3FyV7w4eLb87uD/8HiHQ9IcgRHxiq7PkK40rGdMCbL/0fyxZFlMCTbS64DjNToRvPcooasA4g==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "canvas": "^3.2.1", + "playwright": "^1.40.0", + "sharp": "^0.34.5", + "turndown": "^7.2.2", + "uuid": "^9.0.0", + "zod": "^3.22.0" + }, + "bin": { + "predicate": "dist/cli.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "optionalDependencies": { + "@anthropic-ai/sdk": "^0.20.0", + "openai": "^4.0.0", + "zhipuai-sdk-nodejs-v4": "^0.1.12" + } }, "node_modules/@sinclair/typebox": { "version": "0.27.10", @@ -1416,12 +1908,23 @@ "version": "20.19.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, "node_modules/@types/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", @@ -1658,6 +2161,19 @@ "dev": true, "license": "ISC" }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "optional": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -1694,6 +2210,19 @@ "node": ">=0.4.0" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -1804,6 +2333,25 @@ "node": ">=8" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT", + "optional": true + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -1937,6 +2485,26 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", @@ -1950,6 +2518,17 @@ "node": ">=6.0.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -2030,6 +2609,37 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2037,6 +2647,20 @@ "dev": true, "license": "MIT" }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2078,6 +2702,20 @@ ], "license": "CC-BY-4.0" }, + "node_modules/canvas": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.1.tgz", + "integrity": "sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.3" + }, + "engines": { + "node": "^18.12.0 || >= 20.9.0" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2105,6 +2743,12 @@ "node": ">=10" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -2181,6 +2825,19 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2257,6 +2914,21 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", @@ -2272,6 +2944,15 @@ } } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2286,7 +2967,26 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" } }, "node_modules/detect-newline": { @@ -2358,6 +3058,31 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "optional": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.302", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", @@ -2385,6 +3110,15 @@ "dev": true, "license": "MIT" }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -2395,6 +3129,55 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2517,9 +3300,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -2607,6 +3390,16 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2640,6 +3433,15 @@ "node": ">= 0.8.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -2793,6 +3595,81 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT", + "optional": true + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2819,7 +3696,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2845,6 +3722,31 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -2855,6 +3757,20 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "optional": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -2868,6 +3784,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2915,9 +3837,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -2964,6 +3886,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gpt-tokenizer": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-2.9.0.tgz", @@ -3017,11 +3952,40 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "optional": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3047,6 +4011,36 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3120,7 +4114,12 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/is-arrayish": { @@ -3957,6 +4956,52 @@ "node": ">=6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "optional": true, + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "optional": true, + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4024,6 +5069,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT", + "optional": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4038,6 +5125,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT", + "optional": true + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4081,6 +5175,16 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4105,11 +5209,34 @@ "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" }, "engines": { - "node": ">=8.6" + "node": ">= 0.6" } }, "node_modules/mimic-fn": { @@ -4122,6 +5249,18 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -4142,17 +5281,28 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, + "devOptional": true, + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT" }, "node_modules/natural-compare": { @@ -4169,6 +5319,66 @@ "dev": true, "license": "MIT" }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4210,7 +5420,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -4232,6 +5441,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.104.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", + "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT", + "optional": true + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -4474,7 +5731,6 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", - "dev": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.58.2" @@ -4493,7 +5749,6 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", - "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -4506,7 +5761,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4517,6 +5771,33 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4569,6 +5850,23 @@ "node": ">= 6" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT", + "optional": true + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4617,6 +5915,30 @@ ], "license": "MIT" }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -4624,6 +5946,20 @@ "dev": true, "license": "MIT" }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4750,11 +6086,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4763,6 +6118,50 @@ "node": ">=10" } }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4793,6 +6192,51 @@ "dev": true, "license": "ISC" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -4861,6 +6305,15 @@ "node": ">=8" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -4962,6 +6415,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -4989,9 +6470,9 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -5028,6 +6509,13 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT", + "optional": true + }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -5151,6 +6639,34 @@ } } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/turndown": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", + "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==", + "license": "MIT", + "dependencies": { + "@mixmark-io/domino": "^2.2.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5219,7 +6735,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/update-browserslist-db": { @@ -5263,6 +6779,25 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -5295,6 +6830,34 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5350,7 +6913,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -5435,6 +6997,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zhipuai-sdk-nodejs-v4": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/zhipuai-sdk-nodejs-v4/-/zhipuai-sdk-nodejs-v4-0.1.12.tgz", + "integrity": "sha512-UaxTvhIZiJOhwHjCx8WwZjkiQzQvSE/yq7uEEeM8zjZ1D1lX+SIDsTnRhnhVqsvpTnFdD9AcwY15mvjtmRy1ug==", + "license": "MIT", + "optional": true, + "dependencies": { + "axios": "^1.6.7", + "jsonwebtoken": "^9.0.2" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } From 017c9f318592a0a1a2990f95a81ab7040a7a940c Mon Sep 17 00:00:00 2001 From: SentienceDEV Date: Tue, 24 Feb 2026 17:49:21 -0800 Subject: [PATCH 4/4] updated skill --- SKILL.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SKILL.md b/SKILL.md index d06cfdf..dd6c204 100644 --- a/SKILL.md +++ b/SKILL.md @@ -24,7 +24,10 @@ Reduces prompt token usage by **95%** while preserving actionable elements. ## Requirements - Node.js 18+ -- `PREDICATE_API_KEY` environment variable +- `PREDICATE_API_KEY` environment variable (optional) + +**Without API key:** Local heuristic-based pruning (~80% token reduction) +**With API key:** ML-powered ranking for cleaner output (~95% token reduction, less noise) Get your free API key at [predicate.systems/keys](https://predicate.systems/keys) @@ -43,7 +46,7 @@ cd ~/.openclaw/skills/predicate-snapshot && npm install && npm run build ## Configuration -Set your API key: +For enhanced ML-powered ranking, set your API key: ```bash export PREDICATE_API_KEY="sk-..."