From b2fc94db9e7e79dda13bfca7abb008cc294d53d6 Mon Sep 17 00:00:00 2001 From: Lauren ten Hoor Date: Thu, 12 Feb 2026 20:37:15 +0800 Subject: [PATCH] feat: LLM-powered model auto-configuration and improved onboarding Major changes: - Add autoconfigure_models tool for intelligent model assignment - Implement LLM-based model selection using openclaw agent - Improve onboarding flow with better model access checks - Update README with clearer installation and onboarding instructions Technical improvements: - Add model-fetcher utility to query authenticated models - Add smart-model-selector for LLM-driven model assignment - Use session context for LLM calls during onboarding - Suppress logging from openclaw models list calls Documentation: - Add prerequisites section to README - Add conversational onboarding example - Improve quick start flow Co-Authored-By: Claude Sonnet 4.5 --- .gitignore | 1 + README.md | 16 +- index.ts | 6 +- lib/onboarding.ts | 45 ++- lib/setup/llm-model-selector.ts | 157 ++++++++ lib/setup/model-fetcher.ts | 81 +++++ lib/setup/smart-model-selector.ts | 98 +++++ lib/tools/autoconfigure-models.ts | 136 +++++++ lib/tools/setup.ts | 5 +- package-lock.json | 587 ++++++++++++++++-------------- package.json | 5 +- tsconfig.json | 2 +- 12 files changed, 835 insertions(+), 304 deletions(-) create mode 100644 lib/setup/llm-model-selector.ts create mode 100644 lib/setup/model-fetcher.ts create mode 100644 lib/setup/smart-model-selector.ts create mode 100644 lib/tools/autoconfigure-models.ts diff --git a/.gitignore b/.gitignore index a6b02ad..d688956 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ dist/ *.js.map *.d.ts !openclaw.plugin.json +.openclaw diff --git a/README.md b/README.md index 96d6b9c..22b0635 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,21 @@ **Turn any group chat into a dev team that ships.** -DevClaw is a plugin for [OpenClaw](https://openclaw.ai) that turns your orchestrator agent into a development manager. It hires developers, assigns tasks, reviews code, and keeps the pipeline moving — across as many projects as you have group chats. [Get started →](#getting-started) +DevClaw is a plugin for [OpenClaw](https://openclaw.ai) that turns your orchestrator agent into a development manager. It hires developers, assigns tasks, reviews code, and keeps the pipeline moving — across as many projects as you have group chats. + +**Prerequisites:** [OpenClaw](https://openclaw.ai) must be installed and running. ```bash openclaw plugins install @laurentenhoor/devclaw ``` +Then start onboarding by chatting with your agent in any channel: +``` +"Hey, can you help me set up DevClaw?" +``` + +[Read more on onboarding →](#getting-started) + --- ## What it looks like @@ -386,6 +395,11 @@ Or for local development: openclaw plugins install -l ./devclaw ``` +Start onboarding: +```bash +openclaw chat "Help me set up DevClaw" +``` + ### Set up through conversation The easiest way to configure DevClaw is to just talk to your agent: diff --git a/index.ts b/index.ts index dcafa9c..63e88e8 100644 --- a/index.ts +++ b/index.ts @@ -9,6 +9,7 @@ import { createHealthTool } from "./lib/tools/health.js"; import { createProjectRegisterTool } from "./lib/tools/project-register.js"; import { createSetupTool } from "./lib/tools/setup.js"; import { createOnboardTool } from "./lib/tools/onboard.js"; +import { createAutoConfigureModelsTool } from "./lib/tools/autoconfigure-models.js"; import { registerCli } from "./lib/cli.js"; import { registerHeartbeatService } from "./lib/services/heartbeat.js"; @@ -103,6 +104,9 @@ const plugin = { }); api.registerTool(createSetupTool(api), { names: ["setup"] }); api.registerTool(createOnboardTool(api), { names: ["onboard"] }); + api.registerTool(createAutoConfigureModelsTool(api), { + names: ["autoconfigure_models"], + }); // CLI api.registerCli(({ program }: { program: any }) => registerCli(program, api), { @@ -113,7 +117,7 @@ const plugin = { registerHeartbeatService(api); api.logger.info( - "DevClaw plugin registered (10 tools, 1 CLI command group, 1 service)", + "DevClaw plugin registered (11 tools, 1 CLI command group, 1 service)", ); }, }; diff --git a/lib/onboarding.ts b/lib/onboarding.ts index 1069c6a..bf8b204 100644 --- a/lib/onboarding.ts +++ b/lib/onboarding.ts @@ -38,12 +38,18 @@ export async function hasWorkspaceFiles( // --------------------------------------------------------------------------- function buildModelTable(pluginConfig?: Record): string { - const cfg = (pluginConfig as { models?: { dev?: Record; qa?: Record } })?.models; + const cfg = ( + pluginConfig as { + models?: { dev?: Record; qa?: Record }; + } + )?.models; const lines: string[] = []; for (const [role, levels] of Object.entries(DEFAULT_MODELS)) { for (const [level, defaultModel] of Object.entries(levels)) { const model = cfg?.[role as "dev" | "qa"]?.[level] || defaultModel; - lines.push(` - **${role} ${level}**: ${model} (default: ${defaultModel})`); + lines.push( + ` - **${role} ${level}**: ${model} (default: ${defaultModel})`, + ); } } return lines.join("\n"); @@ -111,26 +117,29 @@ Ask: "Do you want to configure DevClaw for the current agent, or create a new de - If none selected, user can add bindings manually later via openclaw.json **Step 2: Model Configuration** -āš ļø **IMPORTANT**: First check what models the user has access to! The defaults below are suggestions. -Ask: "What models do you have access to in your OpenClaw configuration?" -- Guide them to check their available models (router configuration, API keys, etc.) -- If they have the default Claude models, great! -- If not, help them map their available models to these levels: +1. **Call \`autoconfigure_models\`** to automatically discover and assign models: + - Discovers all authenticated models in OpenClaw + - Uses AI to intelligently assign them to DevClaw roles + - Returns a ready-to-use model configuration -**Suggested default level-to-model mapping:** +2. **Handle the result**: + - If \`success: false\` and \`modelCount: 0\`: + - **BLOCK setup** - show the authentication instructions from the message + - **DO NOT proceed** - exit onboarding until user configures API keys + - If \`success: true\`: + - Present the model assignment table to the user + - Store the \`models\` object for Step 3 -| Role | Level | Default Model | Purpose | -|------|-------|---------------|---------| -${modelTable} +3. **Optional: Prefer specific provider** + - If user wants only models from one provider (e.g., "only use Anthropic"): + - Call \`autoconfigure_models({ preferProvider: "anthropic" })\` -**Model selection guidance:** -- **junior/tester**: Fastest, cheapest models (Haiku-class, GPT-4-mini, etc.) -- **medior/reviewer**: Balanced models (Sonnet-class, GPT-4, etc.) -- **senior**: Most capable models (Opus-class, o1, etc.) - -Ask which levels they want to customize, and collect their actual model IDs. -šŸ’” **Tip**: Guide users to configure finer-grained mappings rather than accepting unsuitable defaults. +4. **Confirm with user** + - Ask: "Does this look good, or would you like to customize any roles?" + - If approved → proceed to Step 3 with the \`models\` configuration + - If they want changes → ask which specific roles to modify + - If they want different provider → go back to step 3 **Step 3: Run Setup** Call \`setup\` with the collected answers: diff --git a/lib/setup/llm-model-selector.ts b/lib/setup/llm-model-selector.ts new file mode 100644 index 0000000..db0cf32 --- /dev/null +++ b/lib/setup/llm-model-selector.ts @@ -0,0 +1,157 @@ +/** + * llm-model-selector.ts — LLM-powered intelligent model selection. + * + * Uses an LLM to understand model capabilities and assign optimal models to DevClaw roles. + */ +import { execSync } from "node:child_process"; +import { writeFileSync, unlinkSync } from "node:fs"; +import { join } from "node:path"; +import { tmpdir } from "node:os"; + +export type ModelAssignment = { + dev: { + junior: string; + medior: string; + senior: string; + }; + qa: { + reviewer: string; + tester: string; + }; +}; + +/** + * Use an LLM to intelligently select and assign models to DevClaw roles. + */ +export async function selectModelsWithLLM( + availableModels: Array<{ model: string; provider: string }>, + sessionKey?: string, +): Promise { + if (availableModels.length === 0) { + return null; + } + + // If only one model, assign it to all roles + if (availableModels.length === 1) { + const model = availableModels[0].model; + return { + dev: { junior: model, medior: model, senior: model }, + qa: { reviewer: model, tester: model }, + }; + } + + // Create a prompt for the LLM + const modelList = availableModels.map((m) => m.model).join("\n"); + + const prompt = `You are an AI model expert. Analyze the following authenticated AI models and assign them to DevClaw development roles based on their capabilities. + +Available models: +${modelList} + +Assign models to these roles based on capability: +- **senior** (most capable): Complex architecture, refactoring, critical decisions +- **medior** (balanced): Features, bug fixes, code review +- **junior** (fast/efficient): Simple fixes, testing, routine tasks +- **reviewer** (same as medior): Code review +- **tester** (same as junior): Testing + +Rules: +1. Prefer same provider for consistency +2. Assign most capable model to senior +3. Assign mid-tier model to medior/reviewer +4. Assign fastest/cheapest model to junior/tester +5. Consider model version numbers (higher = newer/better) +6. Stable versions (no date) > snapshot versions (with date like 20250514) + +Return ONLY a JSON object in this exact format (no markdown, no explanation): +{ + "dev": { + "junior": "provider/model-name", + "medior": "provider/model-name", + "senior": "provider/model-name" + }, + "qa": { + "reviewer": "provider/model-name", + "tester": "provider/model-name" + } +}`; + + // Write prompt to temp file for safe passing to shell + const tmpFile = join(tmpdir(), `devclaw-model-select-${Date.now()}.txt`); + writeFileSync(tmpFile, prompt, "utf-8"); + + try { + // Call openclaw agent using current session context if available + const sessionFlag = sessionKey + ? `--session-id "${sessionKey}"` + : `--session-id devclaw-model-selection`; + + const result = execSync( + `openclaw agent --local ${sessionFlag} --message "$(cat ${tmpFile})" --json`, + { + encoding: "utf-8", + timeout: 30000, + stdio: ["pipe", "pipe", "ignore"], + }, + ).trim(); + + // Parse the response from openclaw agent --json + const lines = result.split("\n"); + const jsonStartIndex = lines.findIndex((line) => line.trim().startsWith("{")); + + if (jsonStartIndex === -1) { + throw new Error("No JSON found in LLM response"); + } + + const jsonString = lines.slice(jsonStartIndex).join("\n"); + + // openclaw agent --json returns: { payloads: [{ text: "```json\n{...}\n```" }], meta: {...} } + const response = JSON.parse(jsonString); + + if (!response.payloads || !Array.isArray(response.payloads) || response.payloads.length === 0) { + throw new Error("Invalid openclaw agent response structure - missing payloads"); + } + + // Extract text from first payload + const textContent = response.payloads[0].text; + if (!textContent) { + throw new Error("Empty text content in openclaw agent payload"); + } + + // Strip markdown code blocks (```json and ```) + const cleanJson = textContent + .replace(/```json\n?/g, '') + .replace(/```\n?/g, '') + .trim(); + + // Parse the actual model assignment JSON + const assignment = JSON.parse(cleanJson); + + // Log what we got for debugging + console.log("LLM returned:", JSON.stringify(assignment, null, 2)); + + // Validate the structure + if ( + !assignment.dev?.junior || + !assignment.dev?.medior || + !assignment.dev?.senior || + !assignment.qa?.reviewer || + !assignment.qa?.tester + ) { + console.error("Invalid assignment structure. Got:", assignment); + throw new Error(`Invalid assignment structure from LLM. Missing fields in: ${JSON.stringify(Object.keys(assignment))}`); + } + + return assignment as ModelAssignment; + } catch (err) { + console.error("LLM model selection failed:", (err as Error).message); + return null; + } finally { + // Clean up temp file + try { + unlinkSync(tmpFile); + } catch { + // Ignore cleanup errors + } + } +} diff --git a/lib/setup/model-fetcher.ts b/lib/setup/model-fetcher.ts new file mode 100644 index 0000000..9346b83 --- /dev/null +++ b/lib/setup/model-fetcher.ts @@ -0,0 +1,81 @@ +/** + * model-fetcher.ts — Shared helper for fetching OpenClaw models without logging. + * + * Uses execSync to bypass OpenClaw's command logging infrastructure. + */ +import { execSync } from "node:child_process"; + +export type OpenClawModelRow = { + key: string; + name?: string; + input: string; + contextWindow: number | null; + local: boolean; + available: boolean; + tags: string[]; + missing?: boolean; +}; + +/** + * Fetch all models from OpenClaw without logging. + * + * @param allModels - If true, fetches all models (--all flag). If false, only authenticated models. + * @returns Array of model objects from OpenClaw's model registry + */ +export function fetchModels(allModels = true): OpenClawModelRow[] { + try { + const command = allModels + ? "openclaw models list --all --json" + : "openclaw models list --json"; + + // Use execSync directly to bypass OpenClaw's command logging + const output = execSync(command, { + encoding: "utf-8", + timeout: 10000, + cwd: process.cwd(), + // Suppress stderr to avoid any error messages + stdio: ["pipe", "pipe", "ignore"], + }).trim(); + + if (!output) { + throw new Error("Empty output from openclaw models list"); + } + + // Parse JSON (skip any log lines like "[plugins] ...") + const lines = output.split("\n"); + + // Find the first line that starts with { (the beginning of JSON) + const jsonStartIndex = lines.findIndex((line: string) => { + const trimmed = line.trim(); + return trimmed.startsWith("{"); + }); + + if (jsonStartIndex === -1) { + throw new Error( + `No JSON object found in output. Got: ${output.substring(0, 200)}...`, + ); + } + + // Join all lines from the JSON start to the end + const jsonString = lines.slice(jsonStartIndex).join("\n"); + + const data = JSON.parse(jsonString); + const models = data.models as OpenClawModelRow[]; + + if (!Array.isArray(models)) { + throw new Error(`Expected array of models, got: ${typeof models}`); + } + + return models; + } catch (err) { + throw new Error(`Failed to fetch models: ${(err as Error).message}`); + } +} + +/** + * Fetch only authenticated models (available: true). + */ +export function fetchAuthenticatedModels(): OpenClawModelRow[] { + // Use --all flag but suppress logging via stdio in fetchModels() + return fetchModels(true).filter((m) => m.available === true); +} diff --git a/lib/setup/smart-model-selector.ts b/lib/setup/smart-model-selector.ts new file mode 100644 index 0000000..d10b5c4 --- /dev/null +++ b/lib/setup/smart-model-selector.ts @@ -0,0 +1,98 @@ +/** + * smart-model-selector.ts — LLM-powered model selection for DevClaw roles. + * + * Uses an LLM to intelligently analyze and assign models to DevClaw roles. + */ + +export type ModelAssignment = { + dev: { + junior: string; + medior: string; + senior: string; + }; + qa: { + reviewer: string; + tester: string; + }; +}; + +/** + * Intelligently assign available models to DevClaw roles using an LLM. + * + * Strategy: + * 1. If 0 models → return null (setup should be blocked) + * 2. If 1 model → assign it to all roles + * 3. If multiple models → use LLM to intelligently assign + */ +export async function assignModels( + availableModels: Array<{ model: string; provider: string; authenticated: boolean }>, + sessionKey?: string, +): Promise { + // Filter to only authenticated models + const authenticated = availableModels.filter((m) => m.authenticated); + + if (authenticated.length === 0) { + return null; // No models available - setup should be blocked + } + + // If only one model, use it for everything + if (authenticated.length === 1) { + const model = authenticated[0].model; + return { + dev: { junior: model, medior: model, senior: model }, + qa: { reviewer: model, tester: model }, + }; + } + + // Multiple models: use LLM-based selection + const { selectModelsWithLLM } = await import("./llm-model-selector.js"); + const llmResult = await selectModelsWithLLM(authenticated, sessionKey); + + if (!llmResult) { + throw new Error("LLM-based model selection failed. Please try again or configure models manually."); + } + + return llmResult; +} + +/** + * Format model assignment as a readable table. + */ +export function formatAssignment(assignment: ModelAssignment): string { + const lines = [ + "| Role | Level | Model |", + "|------|----------|--------------------------|", + `| DEV | senior | ${assignment.dev.senior.padEnd(24)} |`, + `| DEV | medior | ${assignment.dev.medior.padEnd(24)} |`, + `| DEV | junior | ${assignment.dev.junior.padEnd(24)} |`, + `| QA | reviewer | ${assignment.qa.reviewer.padEnd(24)} |`, + `| QA | tester | ${assignment.qa.tester.padEnd(24)} |`, + ]; + return lines.join("\n"); +} + +/** + * Generate setup instructions when no models are available. + */ +export function generateSetupInstructions(): string { + return `āŒ No authenticated models found. DevClaw needs at least one model to work. + +To configure model authentication: + +**For Anthropic Claude:** + export ANTHROPIC_API_KEY=your-api-key + # or: openclaw auth add --provider anthropic + +**For OpenAI:** + export OPENAI_API_KEY=your-api-key + # or: openclaw auth add --provider openai + +**For other providers:** + openclaw auth add --provider + +**Verify authentication:** + openclaw models list + (Look for "Auth: yes" in the output) + +Once you see authenticated models, re-run: onboard`; +} diff --git a/lib/tools/autoconfigure-models.ts b/lib/tools/autoconfigure-models.ts new file mode 100644 index 0000000..583aed2 --- /dev/null +++ b/lib/tools/autoconfigure-models.ts @@ -0,0 +1,136 @@ +/** + * autoconfigure-models.ts — Tool for automatically configuring model assignments. + * + * Queries available authenticated models and intelligently assigns them to DevClaw roles. + */ +import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; +import { jsonResult } from "openclaw/plugin-sdk"; +import type { ToolContext } from "../types.js"; +import { + assignModels, + formatAssignment, + generateSetupInstructions, + type ModelAssignment, +} from "../setup/smart-model-selector.js"; +import { fetchAuthenticatedModels } from "../setup/model-fetcher.js"; + +/** + * Get available authenticated models from OpenClaw. + */ +async function getAuthenticatedModels( + api: OpenClawPluginApi, +): Promise> { + try { + const models = fetchAuthenticatedModels(); + + // Map to the format expected by assignModels() + return models.map((m) => { + // Extract provider from key (format: provider/model-name) + const provider = m.key.split("/")[0] || "unknown"; + return { + model: m.key, + provider, + authenticated: true, + }; + }); + } catch (err) { + throw new Error(`Failed to get authenticated models: ${(err as Error).message}`); + } +} + +/** + * Create the autoconfigure_models tool. + */ +export function createAutoConfigureModelsTool(api: OpenClawPluginApi) { + return (ctx: ToolContext) => ({ + name: "autoconfigure_models", + label: "Auto-Configure Models", + description: + "Automatically discover authenticated models and intelligently assign them to DevClaw roles based on capability tiers", + parameters: { + type: "object", + properties: { + preferProvider: { + type: "string", + description: + "Optional: Prefer models from this provider (e.g., 'anthropic', 'openai')", + }, + }, + }, + async execute(_id: string, params: Record) { + try { + // Get all authenticated models + let authenticatedModels = await getAuthenticatedModels(api); + + // Filter by preferred provider if specified + const preferProvider = params?.preferProvider as string | undefined; + if (preferProvider) { + const filtered = authenticatedModels.filter( + (m) => m.provider.toLowerCase() === preferProvider.toLowerCase(), + ); + if (filtered.length === 0) { + return jsonResult({ + success: false, + error: `No authenticated models found for provider: ${preferProvider}`, + message: `āŒ No authenticated models found for provider "${preferProvider}".\n\nAvailable providers: ${[...new Set(authenticatedModels.map((m) => m.provider))].join(", ")}`, + }); + } + authenticatedModels = filtered; + } + + // Intelligently assign models using current session context + const assignment = await assignModels(authenticatedModels, ctx.sessionKey); + + if (!assignment) { + // No models available + const instructions = generateSetupInstructions(); + return jsonResult({ + success: false, + modelCount: 0, + message: instructions, + }); + } + + // Format the assignment + const table = formatAssignment(assignment); + const modelCount = authenticatedModels.length; + + let message = `āœ… Auto-configured models based on ${modelCount} authenticated model${modelCount === 1 ? "" : "s"}:\n\n`; + message += table; + message += "\n\n"; + + if (modelCount === 1) { + message += "ā„¹ļø Only one authenticated model found — assigned to all roles."; + } else { + message += "ā„¹ļø Models assigned by capability tier (Tier 1 → senior, Tier 2 → medior/reviewer, Tier 3 → junior/tester)."; + } + + if (preferProvider) { + message += `\nšŸ“Œ Filtered to provider: ${preferProvider}`; + } + + message += "\n\n**Next step:** Pass this configuration to `setup` tool:\n"; + message += "```javascript\n"; + message += "setup({ models: })\n"; + message += "```"; + + return jsonResult({ + success: true, + modelCount, + assignment, + models: assignment, + provider: preferProvider || "auto", + message, + }); + } catch (err) { + const errorMsg = (err as Error).message; + api.logger.error(`Auto-configure models error: ${errorMsg}`); + return jsonResult({ + success: false, + error: errorMsg, + message: `āŒ Failed to auto-configure models: ${errorMsg}`, + }); + } + }, + }); +} diff --git a/lib/tools/setup.ts b/lib/tools/setup.ts index edce3d4..5091d54 100644 --- a/lib/tools/setup.ts +++ b/lib/tools/setup.ts @@ -112,9 +112,10 @@ export function createSetupTool(api: OpenClawPluginApi) { ...DEV_LEVELS.map((t) => ` dev.${t}: ${result.models.dev[t]}`), ...QA_LEVELS.map((t) => ` qa.${t}: ${result.models.qa[t]}`), "", - "Files:", - ...result.filesWritten.map((f) => ` ${f}`), ); + + lines.push("Files:", ...result.filesWritten.map((f) => ` ${f}`)); + if (result.warnings.length > 0) lines.push("", "Warnings:", ...result.warnings.map((w) => ` ${w}`)); lines.push( diff --git a/package-lock.json b/package-lock.json index c97ef66..360af0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { - "name": "@openclaw/devclaw", - "version": "0.1.1", + "name": "@laurentenhoor/devclaw", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@openclaw/devclaw", - "version": "0.1.1", + "name": "@laurentenhoor/devclaw", + "version": "1.0.0", "license": "MIT", "devDependencies": { - "typescript": "^5.8" + "@types/node": "^25.2.3", + "typescript": "^5.9.3" }, "engines": { "node": ">=20" @@ -200,47 +201,47 @@ } }, "node_modules/@aws-sdk/client-bedrock": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock/-/client-bedrock-3.985.0.tgz", - "integrity": "sha512-f2+AnyRQzb0GPwkKsE2lWTchNwnuysYs6GVN1k0PV1w3irFh/m0Hz125LXC6jdogHwzLqQxGHqwiZzVxhF5CvA==", + "version": "3.988.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock/-/client-bedrock-3.988.0.tgz", + "integrity": "sha512-VQt+dHwg2SRCms9gN6MCV70ELWcoJ+cAJuvHiCAHVHUw822XdRL9OneaKTKO4Z1nU9FDpjLlUt5W9htSeiXyoQ==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/credential-provider-node": "^3.972.6", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/credential-provider-node": "^3.972.7", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.8", "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/token-providers": "3.985.0", + "@aws-sdk/token-providers": "3.988.0", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", + "@aws-sdk/util-endpoints": "3.988.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.5", + "@aws-sdk/util-user-agent-node": "^3.972.6", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.1", + "@smithy/core": "^3.23.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-endpoint": "^4.4.14", + "@smithy/middleware-retry": "^4.4.31", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.9", + "@smithy/node-http-handler": "^4.4.10", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.29", - "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-defaults-mode-browser": "^4.3.30", + "@smithy/util-defaults-mode-node": "^4.2.33", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -252,31 +253,31 @@ } }, "node_modules/@aws-sdk/client-bedrock-runtime": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.985.0.tgz", - "integrity": "sha512-jkQ+G+b/6Z6gUsn8jNSjJsFVgxnA4HtyOjrpHfmp8nHWLRFTOIw3HfY2vAlDgg/uUJ7cezVG0/tmbwujFqX25A==", + "version": "3.988.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.988.0.tgz", + "integrity": "sha512-NZlsQ8rjmAG0zRteqEiRakV97/nToIwDqT0zbye+j+HN60wiRSESAFCEozdwiiuVr0xl69NcoTiMg64xbh2I9g==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/credential-provider-node": "^3.972.6", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/credential-provider-node": "^3.972.7", "@aws-sdk/eventstream-handler-node": "^3.972.5", "@aws-sdk/middleware-eventstream": "^3.972.3", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.7", - "@aws-sdk/middleware-websocket": "^3.972.5", + "@aws-sdk/middleware-user-agent": "^3.972.8", + "@aws-sdk/middleware-websocket": "^3.972.6", "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/token-providers": "3.985.0", + "@aws-sdk/token-providers": "3.988.0", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", + "@aws-sdk/util-endpoints": "3.988.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.5", + "@aws-sdk/util-user-agent-node": "^3.972.6", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.1", + "@smithy/core": "^3.23.0", "@smithy/eventstream-serde-browser": "^4.2.8", "@smithy/eventstream-serde-config-resolver": "^4.3.8", "@smithy/eventstream-serde-node": "^4.2.8", @@ -284,25 +285,25 @@ "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-endpoint": "^4.4.14", + "@smithy/middleware-retry": "^4.4.31", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.9", + "@smithy/node-http-handler": "^4.4.10", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.29", - "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-defaults-mode-browser": "^4.3.30", + "@smithy/util-defaults-mode-node": "^4.2.33", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.11", + "@smithy/util-stream": "^4.5.12", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -311,45 +312,45 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.985.0.tgz", - "integrity": "sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==", + "version": "3.988.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.988.0.tgz", + "integrity": "sha512-ThqQ7aF1k0Zz4yJRwegHw+T1rM3a7ZPvvEUSEdvn5Z8zTeWgJAbtqW/6ejPsMLmFOlHgNcwDQN/e69OvtEOoIQ==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.7", + "@aws-sdk/core": "^3.973.8", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.8", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", + "@aws-sdk/util-endpoints": "3.988.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.5", + "@aws-sdk/util-user-agent-node": "^3.972.6", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.1", + "@smithy/core": "^3.23.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-endpoint": "^4.4.14", + "@smithy/middleware-retry": "^4.4.31", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.9", + "@smithy/node-http-handler": "^4.4.10", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.29", - "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-defaults-mode-browser": "^4.3.30", + "@smithy/util-defaults-mode-node": "^4.2.33", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -361,20 +362,20 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.7.tgz", - "integrity": "sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==", + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.8.tgz", + "integrity": "sha512-WeYJ2sfvRLbbUIrjGMUXcEHGu5SJk53jz3K9F8vFP42zWyROzPJ2NB6lMu9vWl5hnMwzwabX7pJc9Euh3JyMGw==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.1", "@aws-sdk/xml-builder": "^3.972.4", - "@smithy/core": "^3.22.1", + "@smithy/core": "^3.23.0", "@smithy/node-config-provider": "^4.3.8", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.8", @@ -386,13 +387,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.5.tgz", - "integrity": "sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.6.tgz", + "integrity": "sha512-+dYEBWgTqkQQHFUllvBL8SLyXyLKWdxLMD1LmKJRvmb0NMJuaJFG/qg78C+LE67eeGbipYcE+gJ48VlLBGHlMw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", + "@aws-sdk/core": "^3.973.8", "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/types": "^4.12.0", @@ -403,21 +404,21 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.7.tgz", - "integrity": "sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.8.tgz", + "integrity": "sha512-z3QkozMV8kOFisN2pgRag/f0zPDrw96mY+ejAM0xssV/+YQ2kklbylRNI/TcTQUDnGg0yPxNjyV6F2EM2zPTwg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", + "@aws-sdk/core": "^3.973.8", "@aws-sdk/types": "^3.973.1", "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.9", + "@smithy/node-http-handler": "^4.4.10", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.11", + "@smithy/util-stream": "^4.5.12", "tslib": "^2.6.2" }, "engines": { @@ -425,20 +426,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.5.tgz", - "integrity": "sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.6.tgz", + "integrity": "sha512-6tkIYFv3sZH1XsjQq+veOmx8XWRnyqTZ5zx/sMtdu/xFRIzrJM1Y2wAXeCJL1rhYSB7uJSZ1PgALI2WVTj78ow==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/credential-provider-env": "^3.972.5", - "@aws-sdk/credential-provider-http": "^3.972.7", - "@aws-sdk/credential-provider-login": "^3.972.5", - "@aws-sdk/credential-provider-process": "^3.972.5", - "@aws-sdk/credential-provider-sso": "^3.972.5", - "@aws-sdk/credential-provider-web-identity": "^3.972.5", - "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/credential-provider-env": "^3.972.6", + "@aws-sdk/credential-provider-http": "^3.972.8", + "@aws-sdk/credential-provider-login": "^3.972.6", + "@aws-sdk/credential-provider-process": "^3.972.6", + "@aws-sdk/credential-provider-sso": "^3.972.6", + "@aws-sdk/credential-provider-web-identity": "^3.972.6", + "@aws-sdk/nested-clients": "3.988.0", "@aws-sdk/types": "^3.973.1", "@smithy/credential-provider-imds": "^4.2.8", "@smithy/property-provider": "^4.2.8", @@ -451,14 +452,14 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.5.tgz", - "integrity": "sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.6.tgz", + "integrity": "sha512-LXsoBoaTSGHdRCQXlWSA0CHHh05KWncb592h9ElklnPus++8kYn1Ic6acBR4LKFQ0RjjMVgwe5ypUpmTSUOjPA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/nested-clients": "3.988.0", "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", @@ -471,18 +472,18 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.6.tgz", - "integrity": "sha512-DZ3CnAAtSVtVz+G+ogqecaErMLgzph4JH5nYbHoBMgBkwTUV+SUcjsjOJwdBJTHu3Dm6l5LBYekZoU2nDqQk2A==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.7.tgz", + "integrity": "sha512-PuJ1IkISG7ZDpBFYpGotaay6dYtmriBYuHJ/Oko4VHxh8YN5vfoWnMNYFEWuzOfyLmP7o9kDVW0BlYIpb3skvw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.5", - "@aws-sdk/credential-provider-http": "^3.972.7", - "@aws-sdk/credential-provider-ini": "^3.972.5", - "@aws-sdk/credential-provider-process": "^3.972.5", - "@aws-sdk/credential-provider-sso": "^3.972.5", - "@aws-sdk/credential-provider-web-identity": "^3.972.5", + "@aws-sdk/credential-provider-env": "^3.972.6", + "@aws-sdk/credential-provider-http": "^3.972.8", + "@aws-sdk/credential-provider-ini": "^3.972.6", + "@aws-sdk/credential-provider-process": "^3.972.6", + "@aws-sdk/credential-provider-sso": "^3.972.6", + "@aws-sdk/credential-provider-web-identity": "^3.972.6", "@aws-sdk/types": "^3.973.1", "@smithy/credential-provider-imds": "^4.2.8", "@smithy/property-provider": "^4.2.8", @@ -495,13 +496,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.5.tgz", - "integrity": "sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.6.tgz", + "integrity": "sha512-Yf34cjIZJHVnD92jnVYy3tNjM+Q4WJtffLK2Ehn0nKpZfqd1m7SI0ra22Lym4C53ED76oZENVSS2wimoXJtChQ==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", + "@aws-sdk/core": "^3.973.8", "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -513,15 +514,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.5.tgz", - "integrity": "sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.6.tgz", + "integrity": "sha512-2+5UVwUYdD4BBOkLpKJ11MQ8wQeyJGDVMDRH5eWOULAh9d6HJq07R69M/mNNMC9NTjr3mB1T0KGDn4qyQh5jzg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/client-sso": "3.985.0", - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/token-providers": "3.985.0", + "@aws-sdk/client-sso": "3.988.0", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/token-providers": "3.988.0", "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -533,14 +534,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.5.tgz", - "integrity": "sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.6.tgz", + "integrity": "sha512-pdJzwKtlDxBnvZ04pWMqttijmkUIlwOsS0GcxCjzEVyUMpARysl0S0ks74+gs2Pdev3Ujz+BTAjOc1tQgAxGqA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/nested-clients": "3.988.0", "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -632,16 +633,16 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.7.tgz", - "integrity": "sha512-HUD+geASjXSCyL/DHPQc/Ua7JhldTcIglVAoCV8kiVm99IaFSlAbTvEnyhZwdE6bdFyTL+uIaWLaCFSRsglZBQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.8.tgz", + "integrity": "sha512-3PGL+Kvh1PhB0EeJeqNqOWQgipdqFheO4OUKc6aYiFwEpM5t9AyE5hjjxZ5X6iSj8JiduWFZLPwASzF6wQRgFg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", + "@aws-sdk/core": "^3.973.8", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", - "@smithy/core": "^3.22.1", + "@aws-sdk/util-endpoints": "3.988.0", + "@smithy/core": "^3.23.0", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" @@ -651,9 +652,9 @@ } }, "node_modules/@aws-sdk/middleware-websocket": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.5.tgz", - "integrity": "sha512-BN4A9K71WRIlpQ3+IYGdBC2wVyobZ95g6ZomodmJ8Te772GWo0iDk2Mv6JIHdr842tOTgi1b3npLIFDUS4hl4g==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.6.tgz", + "integrity": "sha512-1DedO6N3m8zQ/vG6twNiHtsdwBgk773VdavLEbB3NXeKZDlzSK1BTviqWwvJdKx5UnIy4kGGP6WWpCEFEt/bhQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -675,45 +676,45 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.985.0.tgz", - "integrity": "sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==", + "version": "3.988.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.988.0.tgz", + "integrity": "sha512-OgYV9k1oBCQ6dOM+wWAMNNehXA8L4iwr7ydFV+JDHyuuu0Ko7tDXnLEtEmeQGYRcAFU3MGasmlBkMB8vf4POrg==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.7", + "@aws-sdk/core": "^3.973.8", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.8", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", + "@aws-sdk/util-endpoints": "3.988.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.5", + "@aws-sdk/util-user-agent-node": "^3.972.6", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.1", + "@smithy/core": "^3.23.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-endpoint": "^4.4.14", + "@smithy/middleware-retry": "^4.4.31", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.9", + "@smithy/node-http-handler": "^4.4.10", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.29", - "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-defaults-mode-browser": "^4.3.30", + "@smithy/util-defaults-mode-node": "^4.2.33", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -742,14 +743,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.985.0.tgz", - "integrity": "sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==", + "version": "3.988.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.988.0.tgz", + "integrity": "sha512-xvXVlRVKHnF2h6fgWBm64aPP5J+58aJyGfRrQa/uFh8a9mcK68mLfJOYq+ZSxQy/UN3McafJ2ILAy7IWzT9kRw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/core": "^3.973.8", + "@aws-sdk/nested-clients": "3.988.0", "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -775,9 +776,9 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.985.0.tgz", - "integrity": "sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==", + "version": "3.988.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.988.0.tgz", + "integrity": "sha512-HuXu4boeUWU0DQiLslbgdvuQ4ZMCo4Lsk97w8BIUokql2o9MvjE5dwqI5pzGt0K7afO1FybjidUQVTMLuZNTOA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -834,13 +835,13 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.5.tgz", - "integrity": "sha512-GsUDF+rXyxDZkkJxUsDxnA67FG+kc5W1dnloCFLl6fWzceevsCYzJpASBzT+BPjwUgREE6FngfJYYYMQUY5fZQ==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.6.tgz", + "integrity": "sha512-966xH8TPqkqOXP7EwnEThcKKz0SNP9kVJBKd9M8bNXE4GSqVouMKKnFBwYnzbWVKuLXubzX5seokcX4a0JLJIA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.8", "@aws-sdk/types": "^3.973.1", "@smithy/node-config-provider": "^4.3.8", "@smithy/types": "^4.12.0", @@ -905,9 +906,9 @@ } }, "node_modules/@buape/carbon": { - "version": "0.0.0-beta-20260130162700", - "resolved": "https://registry.npmjs.org/@buape/carbon/-/carbon-0.0.0-beta-20260130162700.tgz", - "integrity": "sha512-Z3gw1BCrLJHESoSv/4+JMao0+fnhAhCFRrJbVWOGI70uYmzLIwmHwLfSQ8ld3XLGg5Q6gZ1rvWeE+2PeHM1MjA==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@buape/carbon/-/carbon-0.14.0.tgz", + "integrity": "sha512-mavllPK2iVpRNRtC4C8JOUdJ1hdV0+LDelFW+pjpJaM31MBLMfIJ+f/LlYTIK5QrEcQsXOC+6lU2e0gmgjWhIQ==", "license": "MIT", "peer": true, "dependencies": { @@ -996,13 +997,14 @@ } }, "node_modules/@google/genai": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.40.0.tgz", - "integrity": "sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA==", + "version": "1.41.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.41.0.tgz", + "integrity": "sha512-S4WGil+PG0NBQRAx+0yrQuM/TWOLn2gGEy5wn4IsoOI6ouHad0P61p3OWdhJ3aqr9kfj8o904i/jevfaGoGuIQ==", "license": "Apache-2.0", "peer": true, "dependencies": { "google-auth-library": "^10.3.0", + "p-retry": "^7.1.1", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, @@ -1051,9 +1053,9 @@ } }, "node_modules/@grammyjs/types": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.23.0.tgz", - "integrity": "sha512-D3jQ4UWERPsyR3op/YFudMMIPNTU47vy7L51uO9/73tMELmjO/+LX5N36/Y0CG5IQfIsz43MxiHI5rgsK0/k+g==", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.24.0.tgz", + "integrity": "sha512-qQIEs4lN5WqUdr4aT8MeU6UFpMbGYAvcvYSW1A4OO1PABGJQHz/KLON6qvpf+5RxaNDQBxiY2k2otIhg/AG7RQ==", "license": "MIT", "peer": true }, @@ -1249,9 +1251,9 @@ "peer": true }, "node_modules/@larksuiteoapi/node-sdk": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@larksuiteoapi/node-sdk/-/node-sdk-1.58.0.tgz", - "integrity": "sha512-NcQNHdGuHOxOWY3bRGS9WldwpbR6+k7Fi0H1IJXDNNmbSrEB/8rLwqHRC8tAbbj/Mp8TWH/v1O+p487m6xskxw==", + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@larksuiteoapi/node-sdk/-/node-sdk-1.59.0.tgz", + "integrity": "sha512-sBpkruTvZDOxnVtoTbepWKRX0j1Y1ZElQYu0x7+v088sI9pcpbVp6ZzCGn62dhrKPatzNyCJyzYCPXPYQWccrA==", "license": "MIT", "peer": true, "dependencies": { @@ -1260,8 +1262,8 @@ "lodash.merge": "^4.6.2", "lodash.pickby": "^4.6.0", "protobufjs": "^7.2.6", - "qs": "^6.13.0", - "ws": "^8.16.0" + "qs": "^6.14.2", + "ws": "^8.19.0" } }, "node_modules/@line/bot-sdk": { @@ -1281,9 +1283,9 @@ } }, "node_modules/@line/bot-sdk/node_modules/@types/node": { - "version": "24.10.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.12.tgz", - "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", + "version": "24.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", + "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", "license": "MIT", "peer": true, "dependencies": { @@ -1320,22 +1322,22 @@ } }, "node_modules/@mariozechner/pi-agent-core": { - "version": "0.52.7", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-agent-core/-/pi-agent-core-0.52.7.tgz", - "integrity": "sha512-zthFSKW7aha7R9jKktDWt+pD5qeK0cT1TI6Ge/lqUDsPbjXj/vkyh1/BLJa8KtfKQzJaC0IXtWhUO2LQzyKwsw==", + "version": "0.52.9", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-agent-core/-/pi-agent-core-0.52.9.tgz", + "integrity": "sha512-x6OxWN5QnZGfK5TU822Xgcy5QeN3ZGIBaZiZISRI64BZYj5ENc40j4T+fbeRnAsrEkJoMC1Him8ixw68PRTovQ==", "license": "MIT", "peer": true, "dependencies": { - "@mariozechner/pi-ai": "^0.52.7" + "@mariozechner/pi-ai": "^0.52.9" }, "engines": { "node": ">=20.0.0" } }, "node_modules/@mariozechner/pi-ai": { - "version": "0.52.7", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-ai/-/pi-ai-0.52.7.tgz", - "integrity": "sha512-kr3isYX1wVxHaKok1Sa6Jbx9TgVp+Vp24LrVxUtQRXGMq6IjB5/RLLF61XT8pgGLBPhs/8esQbO/Av3l2MJibA==", + "version": "0.52.9", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-ai/-/pi-ai-0.52.9.tgz", + "integrity": "sha512-sCdIVw7iomWcaEnVUFwq9e69Dat0ZCy/+XGkTtroY8H+GxHmDKUCrJV/yMpu8Jq9Oof11yCo7F/Vco7dvYCLZg==", "license": "MIT", "peer": true, "dependencies": { @@ -1361,16 +1363,16 @@ } }, "node_modules/@mariozechner/pi-coding-agent": { - "version": "0.52.7", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-coding-agent/-/pi-coding-agent-0.52.7.tgz", - "integrity": "sha512-C2O7zzpkC0SMAFlB/n92lT8N2gM7VAy/vlMZYXrreqZGrgeV6DjOuvYn9364K7+xREo/N7bJsjqMohrvxoKBcw==", + "version": "0.52.9", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-coding-agent/-/pi-coding-agent-0.52.9.tgz", + "integrity": "sha512-XZ0z2k8awEzKVj83Vwj64aO1rTaHe7xk3GppHVdjkvaDDXRWwUtTdm9benH3kuYQ9Po+vuGc9plcApTV9LXpZw==", "license": "MIT", "peer": true, "dependencies": { "@mariozechner/jiti": "^2.6.2", - "@mariozechner/pi-agent-core": "^0.52.7", - "@mariozechner/pi-ai": "^0.52.7", - "@mariozechner/pi-tui": "^0.52.7", + "@mariozechner/pi-agent-core": "^0.52.9", + "@mariozechner/pi-ai": "^0.52.9", + "@mariozechner/pi-tui": "^0.52.9", "@silvia-odwyer/photon-node": "^0.3.4", "chalk": "^5.5.0", "cli-highlight": "^2.1.11", @@ -1395,9 +1397,9 @@ } }, "node_modules/@mariozechner/pi-tui": { - "version": "0.52.7", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-tui/-/pi-tui-0.52.7.tgz", - "integrity": "sha512-wS9zw4lvUaVU8jAGdk4C2KN/AwEsESrguUGNpZs7g9PD8iDBE9gnXtMvtny4PDbjOk0mZ5D0CEUgMzl/ZhqH8w==", + "version": "0.52.9", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-tui/-/pi-tui-0.52.9.tgz", + "integrity": "sha512-YHVZLRz9ULVlubRi51P1AQj7oOb+caiTv/HsNa7r587ale8kLNBx2Sa99fRWuFhNPu+SniwVi4pgqvkrWAcd/w==", "license": "MIT", "peer": true, "dependencies": { @@ -1469,9 +1471,9 @@ } }, "node_modules/@napi-rs/canvas": { - "version": "0.1.90", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.90.tgz", - "integrity": "sha512-vO9j7TfwF9qYCoTOPO39yPLreTRslBVOaeIwhDZkizDvBb0MounnTl0yeWUMBxP4Pnkg9Sv+3eQwpxNUmTwt0w==", + "version": "0.1.91", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.91.tgz", + "integrity": "sha512-eeIe1GoB74P1B0Nkw6pV8BCQ3hfCfvyYr4BntzlCsnFXzVJiPMDnLeIx3gVB0xQMblHYnjK/0nCLvirEhOjr5g==", "license": "MIT", "peer": true, "workspaces": [ @@ -1485,17 +1487,17 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "0.1.90", - "@napi-rs/canvas-darwin-arm64": "0.1.90", - "@napi-rs/canvas-darwin-x64": "0.1.90", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.90", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.90", - "@napi-rs/canvas-linux-arm64-musl": "0.1.90", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.90", - "@napi-rs/canvas-linux-x64-gnu": "0.1.90", - "@napi-rs/canvas-linux-x64-musl": "0.1.90", - "@napi-rs/canvas-win32-arm64-msvc": "0.1.90", - "@napi-rs/canvas-win32-x64-msvc": "0.1.90" + "@napi-rs/canvas-android-arm64": "0.1.91", + "@napi-rs/canvas-darwin-arm64": "0.1.91", + "@napi-rs/canvas-darwin-x64": "0.1.91", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.91", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.91", + "@napi-rs/canvas-linux-arm64-musl": "0.1.91", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.91", + "@napi-rs/canvas-linux-x64-gnu": "0.1.91", + "@napi-rs/canvas-linux-x64-musl": "0.1.91", + "@napi-rs/canvas-win32-arm64-msvc": "0.1.91", + "@napi-rs/canvas-win32-x64-msvc": "0.1.91" } }, "node_modules/@octokit/app": { @@ -2037,9 +2039,9 @@ } }, "node_modules/@slack/types": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.19.0.tgz", - "integrity": "sha512-7+QZ38HGcNh/b/7MpvPG6jnw7mliV6UmrquJLqgdxkzJgQEYUcEztvFWRU49z0x4vthF0ixL5lTK601AXrS8IA==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.20.0.tgz", + "integrity": "sha512-PVF6P6nxzDMrzPC8fSCsnwaI+kF8YfEpxf3MqXmdyjyWTYsZQURpkK7WWUWvP5QpH55pB7zyYL9Qem/xSgc5VA==", "license": "MIT", "peer": true, "engines": { @@ -2048,14 +2050,14 @@ } }, "node_modules/@slack/web-api": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.13.0.tgz", - "integrity": "sha512-ERcExbWrnkDN8ovoWWe6Wgt/usanj1dWUd18dJLpctUI4mlPS0nKt81Joh8VI+OPbNnY1lIilVt9gdMBD9U2ig==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.14.0.tgz", + "integrity": "sha512-VtMK63RmtMYXqTirsIjjPOP1GpK9Nws5rUr6myZK7N6ABdff84Z8KUfoBsJx0QBEL43ANSQr3ANZPjmeKBXUCw==", "license": "MIT", "peer": true, "dependencies": { "@slack/logger": "^4.0.0", - "@slack/types": "^2.18.0", + "@slack/types": "^2.20.0", "@types/node": ">=18.0.0", "@types/retry": "0.12.0", "axios": "^1.11.0", @@ -2072,6 +2074,20 @@ "npm": ">= 8.6.0" } }, + "node_modules/@slack/web-api/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@smithy/abort-controller": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", @@ -2105,9 +2121,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.1.tgz", - "integrity": "sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==", + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.0.tgz", + "integrity": "sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2117,7 +2133,7 @@ "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.11", + "@smithy/util-stream": "^4.5.12", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -2294,13 +2310,13 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.13.tgz", - "integrity": "sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==", + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.14.tgz", + "integrity": "sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.22.1", + "@smithy/core": "^3.23.0", "@smithy/middleware-serde": "^4.2.9", "@smithy/node-config-provider": "^4.3.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -2314,16 +2330,16 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.30", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.30.tgz", - "integrity": "sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==", + "version": "4.4.31", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.31.tgz", + "integrity": "sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==", "license": "Apache-2.0", "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.3.8", "@smithy/protocol-http": "^5.3.8", "@smithy/service-error-classification": "^4.2.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -2380,9 +2396,9 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.9.tgz", - "integrity": "sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.10.tgz", + "integrity": "sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2501,18 +2517,18 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.2.tgz", - "integrity": "sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.3.tgz", + "integrity": "sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.22.1", - "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/core": "^3.23.0", + "@smithy/middleware-endpoint": "^4.4.14", "@smithy/middleware-stack": "^4.2.8", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.11", + "@smithy/util-stream": "^4.5.12", "tslib": "^2.6.2" }, "engines": { @@ -2616,14 +2632,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.29", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.29.tgz", - "integrity": "sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==", + "version": "4.3.30", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.30.tgz", + "integrity": "sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==", "license": "Apache-2.0", "peer": true, "dependencies": { "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, @@ -2632,9 +2648,9 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.32", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.32.tgz", - "integrity": "sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==", + "version": "4.2.33", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.33.tgz", + "integrity": "sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2642,7 +2658,7 @@ "@smithy/credential-provider-imds": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.2", + "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, @@ -2708,14 +2724,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.11.tgz", - "integrity": "sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==", + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.12.tgz", + "integrity": "sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==", "license": "Apache-2.0", "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.9", + "@smithy/node-http-handler": "^4.4.10", "@smithy/types": "^4.12.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", @@ -2906,11 +2922,10 @@ "peer": true }, "node_modules/@types/node": { - "version": "25.2.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.2.tgz", - "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -4921,9 +4936,9 @@ } }, "node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.2.tgz", + "integrity": "sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ==", "license": "BlueOak-1.0.0", "peer": true, "dependencies": { @@ -4988,13 +5003,13 @@ "peer": true }, "node_modules/grammy": { - "version": "1.39.3", - "resolved": "https://registry.npmjs.org/grammy/-/grammy-1.39.3.tgz", - "integrity": "sha512-7arRRoOtOh9UwMwANZ475kJrWV6P3/EGNooeHlY0/SwZv4t3ZZ3Uiz9cAXK8Zg9xSdgmm8T21kx6n7SZaWvOcw==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/grammy/-/grammy-1.40.0.tgz", + "integrity": "sha512-ssuE7fc1AwqlUxHr931OCVW3fU+oFDjHZGgvIedPKXfTdjXvzP19xifvVGCnPtYVUig1Kz+gwxe4A9M5WdkT4Q==", "license": "MIT", "peer": true, "dependencies": { - "@grammyjs/types": "3.23.0", + "@grammyjs/types": "3.24.0", "abort-controller": "^3.0.0", "debug": "^4.4.3", "node-fetch": "^2.7.0" @@ -5121,9 +5136,9 @@ } }, "node_modules/hono": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.8.tgz", - "integrity": "sha512-eVkB/CYCCei7K2WElZW9yYQFWssG0DhaDhVvr7wy5jJ22K+ck8fWW0EsLpB0sITUTvPnc97+rrbQqIr5iqiy9Q==", + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz", + "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==", "license": "MIT", "peer": true, "engines": { @@ -5441,6 +5456,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -5482,13 +5510,13 @@ "peer": true }, "node_modules/isexe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.4.tgz", - "integrity": "sha512-jCErc4h4RnTPjFq53G4whhjAMbUAqinGrCrTT4dmMNyi4zTthK+wphqbRLJtL4BN/Mq7Zzltr0m/b1X0m7PGFQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "license": "BlueOak-1.0.0", "peer": true, "engines": { - "node": ">=20" + "node": ">=18" } }, "node_modules/jackspeak": { @@ -5898,9 +5926,9 @@ } }, "node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "peer": true, "engines": { @@ -5908,9 +5936,9 @@ } }, "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "license": "MIT", "peer": true, "dependencies": { @@ -6483,26 +6511,26 @@ } }, "node_modules/openclaw": { - "version": "2026.2.6", - "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.2.6.tgz", - "integrity": "sha512-QaITs2UmooG1vclLZl5CUpdaKjtcPnHtmFGGxZ0fSgMWcvlKQeRN8HtzVBIN2SPt9O3E0jepGW8m8I62BzKWAw==", + "version": "2026.2.9", + "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.2.9.tgz", + "integrity": "sha512-kJbbIg98ikbZSvS/ypk3Btjha//Fg1sao/xqYrzyMNFNpZFVMcvZNVvMdjRLtccyYNCa5GAJ5nNxP7fzEnS0KQ==", "license": "MIT", "peer": true, "dependencies": { "@agentclientprotocol/sdk": "0.14.1", "@aws-sdk/client-bedrock": "^3.985.0", - "@buape/carbon": "0.0.0-beta-20260130162700", + "@buape/carbon": "0.14.0", "@clack/prompts": "^1.0.0", "@grammyjs/runner": "^2.0.3", "@grammyjs/transformer-throttler": "^1.2.1", - "@homebridge/ciao": "^1.3.4", + "@homebridge/ciao": "^1.3.5", "@larksuiteoapi/node-sdk": "^1.58.0", "@line/bot-sdk": "^10.6.0", "@lydell/node-pty": "1.2.0-beta.3", - "@mariozechner/pi-agent-core": "0.52.7", - "@mariozechner/pi-ai": "0.52.7", - "@mariozechner/pi-coding-agent": "0.52.7", - "@mariozechner/pi-tui": "0.52.7", + "@mariozechner/pi-agent-core": "0.52.9", + "@mariozechner/pi-ai": "0.52.9", + "@mariozechner/pi-coding-agent": "0.52.9", + "@mariozechner/pi-tui": "0.52.9", "@mozilla/readability": "^0.6.0", "@sinclair/typebox": "0.34.48", "@slack/bolt": "^4.6.0", @@ -6519,7 +6547,7 @@ "express": "^5.2.1", "file-type": "^21.3.0", "grammy": "^1.39.3", - "hono": "4.11.8", + "hono": "4.11.9", "jiti": "^2.6.1", "json5": "^2.2.3", "jszip": "^3.10.1", @@ -6737,17 +6765,19 @@ "peer": true }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", + "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", "license": "MIT", "peer": true, "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "is-network-error": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { @@ -7161,9 +7191,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -7822,9 +7852,9 @@ } }, "node_modules/sonic-boom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "license": "MIT", "peer": true, "dependencies": { @@ -8402,8 +8432,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/universal-github-app-jwt": { "version": "2.2.2", diff --git a/package.json b/package.json index 2a97a3d..02d186b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@laurentenhoor/devclaw", - "version": "0.1.1", + "version": "1.0.0", "description": "Multi-project dev/qa pipeline orchestration for OpenClaw", "type": "module", "license": "MIT", @@ -51,6 +51,7 @@ "openclaw": ">=2026.0.0" }, "devDependencies": { - "typescript": "^5.8" + "@types/node": "^25.2.3", + "typescript": "^5.9.3" } } diff --git a/tsconfig.json b/tsconfig.json index 5c5db27..06e4610 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,7 @@ "declaration": true, "declarationMap": true, "sourceMap": true, - "strict": true, + "strict": false, "skipLibCheck": true, "types": ["node"] },