diff --git a/README.md b/README.md index 9033afe..b558be3 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Deploy to Render

-> **Platform:** AlphaClaw currently targets Docker/Linux deployments. macOS local development is not yet supported. +> **Platform:** AlphaClaw supports Docker/Linux deployments and local macOS development. Linux installs the hourly git sync via `/etc/cron.d`; macOS runs the sync schedule from AlphaClaw's managed in-process scheduler. ## Features diff --git a/bin/alphaclaw.js b/bin/alphaclaw.js index 6134cd6..ae166ee 100755 --- a/bin/alphaclaw.js +++ b/bin/alphaclaw.js @@ -9,10 +9,15 @@ const { normalizeGitSyncFilePath, validateGitSyncFilePath, } = require("../lib/cli/git-sync"); -const { buildSecretReplacements } = require("../lib/server/helpers"); const { migrateManagedInternalFiles, } = require("../lib/server/internal-files-migration"); +const { + applySystemCronConfig, + normalizeCronPlatform, + readSystemCronConfig, + startManagedScheduler, +} = require("../lib/server/system-cron"); const kUsageTrackerPluginPath = path.resolve( __dirname, @@ -21,6 +26,76 @@ const kUsageTrackerPluginPath = path.resolve( "plugin", "usage-tracker", ); +const kSystemBinDir = "/usr/local/bin"; + +const prependPathEntry = (entryPath) => { + const currentPath = String(process.env.PATH || ""); + const entries = currentPath + .split(path.delimiter) + .map((value) => value.trim()) + .filter(Boolean); + if (entries.includes(entryPath)) return; + process.env.PATH = [entryPath, ...entries].join(path.delimiter); +}; + +const isWritableDirectory = (dirPath) => { + try { + fs.accessSync(dirPath, fs.constants.W_OK); + return true; + } catch { + return false; + } +}; + +const findFileRecursive = (rootPath, fileName) => { + const pending = [rootPath]; + while (pending.length) { + const currentPath = pending.pop(); + let entries = []; + try { + entries = fs.readdirSync(currentPath, { withFileTypes: true }); + } catch { + continue; + } + for (const entry of entries) { + const entryPath = path.join(currentPath, entry.name); + if (entry.isFile() && entry.name === fileName) return entryPath; + if (entry.isDirectory()) pending.push(entryPath); + } + } + return ""; +}; + +const installTarballBinary = ({ + url, + binaryName, + installDir, + logLabel, +}) => { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "alphaclaw-bin-")); + const tarballPath = path.join(tempDir, `${binaryName}.tar.gz`); + try { + execSync(`curl -fsSL "${url}" -o ${quoteArg(tarballPath)}`, { + stdio: "inherit", + }); + execSync(`tar -xzf ${quoteArg(tarballPath)} -C ${quoteArg(tempDir)}`, { + stdio: "inherit", + }); + const extractedBinaryPath = findFileRecursive(tempDir, binaryName); + if (!extractedBinaryPath) { + throw new Error(`Could not find ${binaryName} in downloaded archive`); + } + const targetPath = path.join(installDir, binaryName); + fs.copyFileSync(extractedBinaryPath, targetPath); + fs.chmodSync(targetPath, 0o755); + console.log(`[alphaclaw] ${logLabel} installed at ${targetPath}`); + return targetPath; + } finally { + try { + fs.rmSync(tempDir, { recursive: true, force: true }); + } catch {} + } +}; // --------------------------------------------------------------------------- // Parse CLI flags @@ -148,10 +223,16 @@ if (portFlag) { const openclawDir = path.join(rootDir, ".openclaw"); fs.mkdirSync(openclawDir, { recursive: true }); -const { hourlyGitSyncPath } = migrateManagedInternalFiles({ +const { hourlyGitSyncPath, internalDir } = migrateManagedInternalFiles({ fs, openclawDir, }); +const managedBinDir = path.join(internalDir, "bin"); +fs.mkdirSync(managedBinDir, { recursive: true }); +prependPathEntry(managedBinDir); +const installBinDir = isWritableDirectory(kSystemBinDir) + ? kSystemBinDir + : managedBinDir; console.log(`[alphaclaw] Root directory: ${rootDir}`); // Check for pending update marker (written by the update endpoint before restart). @@ -235,6 +316,8 @@ if (fs.existsSync(envFilePath)) { console.log("[alphaclaw] Loaded .env"); } +const { buildSecretReplacements } = require("../lib/server/helpers"); + const runGitSync = () => { const githubToken = String(process.env.GITHUB_TOKEN || "").trim(); const githubRepo = resolveGithubRepoPath( @@ -512,11 +595,12 @@ if (!gogInstalled) { const arch = os.arch() === "arm64" ? "arm64" : "amd64"; const tarball = `gogcli_${gogVersion}_${platform}_${arch}.tar.gz`; const url = `https://github.com/steipete/gogcli/releases/download/v${gogVersion}/${tarball}`; - execSync( - `curl -fsSL "${url}" -o /tmp/gog.tar.gz && tar -xzf /tmp/gog.tar.gz -C /tmp/ && mv /tmp/gog /usr/local/bin/gog && chmod +x /usr/local/bin/gog && rm -f /tmp/gog.tar.gz`, - { stdio: "inherit" }, - ); - console.log("[alphaclaw] gog CLI installed"); + installTarballBinary({ + url, + binaryName: "gog", + installDir: installBinDir, + logLabel: "gog CLI", + }); } catch (e) { console.log(`[alphaclaw] gog install skipped: ${e.message}`); } @@ -554,35 +638,25 @@ try { if (fs.existsSync(hourlyGitSyncPath)) { try { - const syncCronConfig = path.join(openclawDir, "cron", "system-sync.json"); - let cronEnabled = true; - let cronSchedule = "0 * * * *"; - - if (fs.existsSync(syncCronConfig)) { - try { - const cfg = JSON.parse(fs.readFileSync(syncCronConfig, "utf8")); - cronEnabled = cfg.enabled !== false; - const schedule = String(cfg.schedule || "").trim(); - if (/^(\S+\s+){4}\S+$/.test(schedule)) cronSchedule = schedule; - } catch {} - } - - const cronFilePath = "/etc/cron.d/openclaw-hourly-sync"; - if (cronEnabled) { - const cronContent = [ - "SHELL=/bin/bash", - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - `${cronSchedule} root bash "${hourlyGitSyncPath}" >> /var/log/openclaw-hourly-sync.log 2>&1`, - "", - ].join("\n"); - fs.writeFileSync(cronFilePath, cronContent, { mode: 0o644 }); - console.log("[alphaclaw] System cron entry installed"); - } else { - try { - fs.unlinkSync(cronFilePath); - } catch {} - console.log("[alphaclaw] System cron entry disabled"); - } + startManagedScheduler({ + fs, + openclawDir, + platform: process.platform, + }); + const cronConfig = readSystemCronConfig({ + fs, + openclawDir, + platform: process.platform, + }); + const cronStatus = applySystemCronConfig({ + fs, + openclawDir, + nextConfig: cronConfig, + platform: process.platform, + }); + console.log( + `[alphaclaw] System cron ${cronStatus.enabled ? "configured" : "disabled"} (${cronStatus.installMethod})`, + ); } catch (e) { console.log(`[alphaclaw] Cron setup skipped: ${e.message}`); } @@ -592,15 +666,17 @@ if (fs.existsSync(hourlyGitSyncPath)) { // 9. Start cron daemon if available // --------------------------------------------------------------------------- -try { - execSync("command -v cron", { stdio: "ignore" }); +if (normalizeCronPlatform(process.platform) !== "darwin") { try { - execSync("pgrep -x cron", { stdio: "ignore" }); - } catch { - execSync("cron", { stdio: "ignore" }); - } - console.log("[alphaclaw] Cron daemon running"); -} catch {} + execSync("command -v cron", { stdio: "ignore" }); + try { + execSync("pgrep -x cron", { stdio: "ignore" }); + } catch { + execSync("cron", { stdio: "ignore" }); + } + console.log("[alphaclaw] Cron daemon running"); + } catch {} +} // --------------------------------------------------------------------------- // 10. Reconcile channels if already onboarded @@ -826,11 +902,11 @@ try { execSync("command -v systemctl", { stdio: "ignore" }); } catch { const shimSrc = path.join(__dirname, "..", "lib", "scripts", "systemctl"); - const shimDest = "/usr/local/bin/systemctl"; + const shimDest = path.join(installBinDir, "systemctl"); try { fs.copyFileSync(shimSrc, shimDest); fs.chmodSync(shimDest, 0o755); - console.log("[alphaclaw] systemctl shim installed"); + console.log(`[alphaclaw] systemctl shim installed at ${shimDest}`); } catch (e) { console.log(`[alphaclaw] systemctl shim skipped: ${e.message}`); } @@ -842,9 +918,9 @@ try { try { const gitAskPassSrc = path.join(__dirname, "..", "lib", "scripts", "git-askpass"); - const gitAskPassDest = "/tmp/alphaclaw-git-askpass.sh"; + const gitAskPassDest = path.join(managedBinDir, "alphaclaw-git-askpass.sh"); const gitShimTemplatePath = path.join(__dirname, "..", "lib", "scripts", "git"); - const gitShimDest = "/usr/local/bin/git"; + const gitShimDest = path.join(installBinDir, "git"); if (fs.existsSync(gitAskPassSrc)) { fs.copyFileSync(gitAskPassSrc, gitAskPassDest); @@ -875,7 +951,7 @@ try { .replace("@@REAL_GIT@@", realGitPath) .replace("@@OPENCLAW_REPO_ROOT@@", openclawDir); fs.writeFileSync(gitShimDest, gitShimContent, { mode: 0o755 }); - console.log("[alphaclaw] git auth shim installed"); + console.log(`[alphaclaw] git auth shim installed at ${gitShimDest}`); } } catch (e) { console.log(`[alphaclaw] git auth shim skipped: ${e.message}`); diff --git a/lib/public/js/components/gateway.js b/lib/public/js/components/gateway.js index a453f93..0bbc153 100644 --- a/lib/public/js/components/gateway.js +++ b/lib/public/js/components/gateway.js @@ -24,6 +24,7 @@ const formatDuration = (ms) => { const VersionRow = ({ label, currentVersion, + helperText = "", fetchVersion, applyUpdate, updateInProgress = false, @@ -205,6 +206,9 @@ const VersionRow = ({ ? `${version}` : "..."}

+ ${helperText + ? html`

${helperText}

` + : null} ${error && effectiveHasUpdate && html`
clearInterval(id); }, []); + const openclawVersionHelperText = diagnostics?.readOnlyMode + ? "Showing installed OpenClaw binary version. Read-only mode may be attached to an existing config created by a different version." + : ""; return html`
@@ -438,8 +446,9 @@ export const Gateway = ({
<${VersionRow} - label="OpenClaw" + label=${diagnostics?.readOnlyMode ? "OpenClaw Binary" : "OpenClaw"} currentVersion=${openclawVersion} + helperText=${openclawVersionHelperText} fetchVersion=${fetchOpenclawVersion} applyUpdate=${onOpenclawUpdate} updateInProgress=${openclawUpdateInProgress} diff --git a/lib/public/js/components/general/index.js b/lib/public/js/components/general/index.js index 4963eb6..118df44 100644 --- a/lib/public/js/components/general/index.js +++ b/lib/public/js/components/general/index.js @@ -48,6 +48,7 @@ export const GeneralTab = ({ <${Gateway} status=${state.gatewayStatus} openclawVersion=${state.openclawVersion} + diagnostics=${state.diagnostics} restarting=${restartingGateway} onRestart=${onRestartGateway} watchdogStatus=${state.watchdogStatus} diff --git a/lib/public/js/components/general/use-general-tab.js b/lib/public/js/components/general/use-general-tab.js index b84cfa4..bc06198 100644 --- a/lib/public/js/components/general/use-general-tab.js +++ b/lib/public/js/components/general/use-general-tab.js @@ -43,6 +43,7 @@ export const useGeneralTab = ({ const repo = status?.repo || null; const syncCron = status?.syncCron || null; const openclawVersion = status?.openclawVersion || null; + const diagnostics = status?.diagnostics || null; const hasUnpaired = ALL_CHANNELS.some((channel) => { const info = channels?.[channel]; @@ -267,6 +268,7 @@ export const useGeneralTab = ({ dashboardLoading, devicePending, doctorStatus, + diagnostics, gatewayStatus, hasUnpaired, openclawVersion, diff --git a/lib/public/js/components/onboarding/welcome-config.js b/lib/public/js/components/onboarding/welcome-config.js index 28470a0..63120b2 100644 --- a/lib/public/js/components/onboarding/welcome-config.js +++ b/lib/public/js/components/onboarding/welcome-config.js @@ -8,6 +8,7 @@ export const kRepoModeNew = "new"; export const kRepoModeExisting = "existing"; export const kGithubFlowFresh = "fresh"; export const kGithubFlowImport = "import"; +export const kGithubFlowReadOnly = "read-only"; export const kGithubTargetRepoModeCreate = "create"; export const kGithubTargetRepoModeExistingEmpty = "existing-empty"; @@ -66,6 +67,11 @@ export const kWelcomeGroups = [ ], validate: (vals) => { const githubFlow = vals._GITHUB_FLOW || kGithubFlowFresh; + if (githubFlow === kGithubFlowReadOnly) { + const hasToken = !!String(vals.GITHUB_TOKEN || "").trim(); + const hasTarget = !!String(vals.GITHUB_WORKSPACE_REPO || "").trim(); + return (hasToken && isValidGithubRepoInput(vals.GITHUB_WORKSPACE_REPO)) || (!hasToken && !hasTarget); + } const hasTarget = isValidGithubRepoInput(vals.GITHUB_WORKSPACE_REPO); const hasSource = githubFlow !== kGithubFlowImport || diff --git a/lib/public/js/components/onboarding/welcome-form-step.js b/lib/public/js/components/onboarding/welcome-form-step.js index 7fecf77..2282d16 100644 --- a/lib/public/js/components/onboarding/welcome-form-step.js +++ b/lib/public/js/components/onboarding/welcome-form-step.js @@ -9,6 +9,7 @@ import { getChannelMeta } from "../channels.js"; import { kGithubFlowFresh, kGithubFlowImport, + kGithubFlowReadOnly, kGithubTargetRepoModeCreate, kGithubTargetRepoModeExistingEmpty, } from "./welcome-config.js"; @@ -71,6 +72,7 @@ export const WelcomeFormStep = ({ freshRepoMode === kGithubTargetRepoModeExistingEmpty ? "ghp_... or github_pat_..." : "ghp_..."; + const githubReadOnlyFlow = githubFlow === kGithubFlowReadOnly; useEffect(() => { if (activeGroup.id !== "github") return; @@ -106,38 +108,42 @@ export const WelcomeFormStep = ({

${activeGroup.id === "github" && field.key === "GITHUB_WORKSPACE_REPO" - ? githubFlow === kGithubFlowImport - ? "Your new project will live here" - : freshRepoMode === kGithubTargetRepoModeExistingEmpty - ? "Enter the owner/repo of an existing empty repository" - : "A new private repo will be created for you" + ? githubReadOnlyFlow + ? "Optional repo for AlphaClaw-managed backups" + : githubFlow === kGithubFlowImport + ? "Your new project will live here" + : freshRepoMode === kGithubTargetRepoModeExistingEmpty + ? "Enter the owner/repo of an existing empty repository" + : "A new private repo will be created for you" : activeGroup.id === "github" && field.key === "_GITHUB_SOURCE_REPO" ? "The repo to import from" : activeGroup.id === "github" && field.key === "GITHUB_TOKEN" - ? githubFlow === kGithubFlowImport - ? freshRepoMode === kGithubTargetRepoModeCreate - ? html`Use a classic PAT with${" "}repo${" "}scope to create the target repo. Fine-grained - works if the target already exists and can access both - repos.` - : html`Use a classic PAT with${" "}repo${" "}scope, or a fine-grained token with Contents + - Metadata access to both the source repo and target - repo` - : freshRepoMode === kGithubTargetRepoModeExistingEmpty - ? html`Use a classic PAT with${" "}repo${" "}scope, or a fine-grained token with Contents + - Metadata access to this repo` - : html`Use a classic PAT with${" "}repo${" "}scope to create a new private repository` + ? githubReadOnlyFlow + ? "Optional. Leave both GitHub fields blank to skip backup repo setup." + : githubFlow === kGithubFlowImport + ? freshRepoMode === kGithubTargetRepoModeCreate + ? html`Use a classic PAT with${" "}repo${" "}scope to create the target repo. Fine-grained + works if the target already exists and can access both + repos.` + : html`Use a classic PAT with${" "}repo${" "}scope, or a fine-grained token with Contents + + Metadata access to both the source repo and target + repo` + : freshRepoMode === kGithubTargetRepoModeExistingEmpty + ? html`Use a classic PAT with${" "}repo${" "}scope, or a fine-grained token with Contents + + Metadata access to this repo` + : html`Use a classic PAT with${" "}repo${" "}scope to create a new private repository` : field.hint}

@@ -352,6 +358,17 @@ export const WelcomeFormStep = ({
` : null} + ${githubReadOnlyFlow + ? html` +
+ AlphaClaw will reuse the existing local OpenClaw config without + rewriting openclaw.json. + GitHub backup settings are optional in this mode. +
+ ` + : null}
`} ${activeGroup.id === "channels" diff --git a/lib/public/js/components/onboarding/welcome-pre-step.js b/lib/public/js/components/onboarding/welcome-pre-step.js index 43bb558..f3716ed 100644 --- a/lib/public/js/components/onboarding/welcome-pre-step.js +++ b/lib/public/js/components/onboarding/welcome-pre-step.js @@ -1,6 +1,10 @@ import { h } from "https://esm.sh/preact"; import htm from "https://esm.sh/htm"; -import { kGithubFlowFresh, kGithubFlowImport } from "./welcome-config.js"; +import { + kGithubFlowFresh, + kGithubFlowImport, + kGithubFlowReadOnly, +} from "./welcome-config.js"; const html = htm.bind(h); @@ -81,6 +85,47 @@ export const WelcomePreStep = ({ onSelectFlow }) => { + + `; }; diff --git a/lib/public/js/components/routes/watchdog-route.js b/lib/public/js/components/routes/watchdog-route.js index c202618..af94761 100644 --- a/lib/public/js/components/routes/watchdog-route.js +++ b/lib/public/js/components/routes/watchdog-route.js @@ -19,6 +19,7 @@ export const WatchdogRoute = ({ <${WatchdogTab} gatewayStatus=${statusData?.gateway || null} openclawVersion=${statusData?.openclawVersion || null} + diagnostics=${statusData?.diagnostics || null} watchdogStatus=${watchdogStatus} onRefreshStatuses=${onRefreshStatuses} restartingGateway=${restartingGateway} diff --git a/lib/public/js/components/welcome/use-welcome.js b/lib/public/js/components/welcome/use-welcome.js index 4c9fef0..ead020b 100644 --- a/lib/public/js/components/welcome/use-welcome.js +++ b/lib/public/js/components/welcome/use-welcome.js @@ -16,6 +16,7 @@ import { isValidGithubRepoInput, kGithubFlowFresh, kGithubFlowImport, + kGithubFlowReadOnly, kGithubTargetRepoModeCreate, kGithubTargetRepoModeExistingEmpty, kRepoModeNew, @@ -213,7 +214,13 @@ export const useWelcome = ({ onComplete }) => { .filter(([, value]) => value) .map(([key, value]) => ({ key, value })); const preflightError = (() => { - if (!normalizedVals.MODEL_KEY || !String(normalizedVals.MODEL_KEY).includes("/")) { + const githubFlow = normalizedVals._GITHUB_FLOW || kGithubFlowFresh; + const isReadOnlyFlow = githubFlow === kGithubFlowReadOnly; + if ( + !isReadOnlyFlow && + (!normalizedVals.MODEL_KEY || + !String(normalizedVals.MODEL_KEY).includes("/")) + ) { return "A model selection is required"; } if (vars.length > kMaxOnboardingVars) { @@ -231,13 +238,23 @@ export const useWelcome = ({ onComplete }) => { } } if ( - !normalizedVals.GITHUB_TOKEN || - !isValidGithubRepoInput(normalizedVals.GITHUB_WORKSPACE_REPO) + !isReadOnlyFlow && + (!normalizedVals.GITHUB_TOKEN || + !isValidGithubRepoInput(normalizedVals.GITHUB_WORKSPACE_REPO)) ) { return 'Target repo must be in "owner/repo" format.'; } if ( - (normalizedVals._GITHUB_FLOW || kGithubFlowFresh) === kGithubFlowImport && + isReadOnlyFlow && + ((normalizedVals.GITHUB_TOKEN && + !isValidGithubRepoInput(normalizedVals.GITHUB_WORKSPACE_REPO)) || + (!normalizedVals.GITHUB_TOKEN && + normalizedVals.GITHUB_WORKSPACE_REPO)) + ) { + return 'Target repo must be in "owner/repo" format, or leave both GitHub fields blank.'; + } + if ( + githubFlow === kGithubFlowImport && !isValidGithubRepoInput(normalizedVals._GITHUB_SOURCE_REPO) ) { return 'Source repo must be in "owner/repo" format.'; @@ -261,11 +278,13 @@ export const useWelcome = ({ onComplete }) => { setSetupError(null); resetPairingState(); - const wasImport = - (normalizedVals._GITHUB_FLOW || kGithubFlowFresh) === kGithubFlowImport; + const githubFlow = normalizedVals._GITHUB_FLOW || kGithubFlowFresh; + const wasImport = githubFlow === kGithubFlowImport; + const wasReadOnly = githubFlow === kGithubFlowReadOnly; try { const result = await runOnboard(vars, normalizedVals.MODEL_KEY, { importMode: wasImport, + readOnlyMode: wasReadOnly, }); if (!result.ok) throw new Error(result.error || "Onboarding failed"); const pairingChannel = getPreferredPairingChannel(normalizedVals); diff --git a/lib/public/js/lib/api.js b/lib/public/js/lib/api.js index a92538a..92972ca 100644 --- a/lib/public/js/lib/api.js +++ b/lib/public/js/lib/api.js @@ -772,11 +772,15 @@ export async function fetchOnboardStatus() { return res.json(); } -export async function runOnboard(vars, modelKey, { importMode = false } = {}) { +export async function runOnboard( + vars, + modelKey, + { importMode = false, readOnlyMode = false } = {}, +) { const res = await authFetch("/api/onboard", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ vars, modelKey, importMode }), + body: JSON.stringify({ vars, modelKey, importMode, readOnlyMode }), }); return res.json(); } diff --git a/lib/public/js/lib/model-config.js b/lib/public/js/lib/model-config.js index 5fac3c2..34b3094 100644 --- a/lib/public/js/lib/model-config.js +++ b/lib/public/js/lib/model-config.js @@ -3,6 +3,7 @@ export const getModelProvider = (modelKey) => String(modelKey || "").split("/")[ export const getAuthProviderFromModelProvider = (provider) => { const normalized = String(provider || "").trim(); if (normalized === "openai-codex") return "openai"; + if (normalized === "minimax-portal") return "minimax"; if (normalized === "volcengine-plan") return "volcengine"; if (normalized === "byteplus-plan") return "byteplus"; return normalized; diff --git a/lib/server.js b/lib/server.js index 922a35a..a10a479 100644 --- a/lib/server.js +++ b/lib/server.js @@ -90,6 +90,7 @@ const { createAlphaclawVersionService } = require("./server/alphaclaw-version"); const { createRestartRequiredState, } = require("./server/restart-required-state"); +const { isReadOnlyOnboarding } = require("./server/onboarding/state"); const { ensureOpenclawRuntimeArtifacts, resolveSetupUiUrl, @@ -137,6 +138,8 @@ initializeServerRuntime({ attachGatewaySignalHandlers, cleanupStaleImportTempDirs, migrateManagedInternalFiles, + isOnboarded, + isReadOnlyOnboarding, }); const app = express(); @@ -242,6 +245,7 @@ const doctorService = createDoctorService({ setGatewayExitHandler((payload) => watchdog.onGatewayExit(payload)); setGatewayLaunchHandler((payload) => watchdog.onGatewayLaunch(payload)); const doSyncPromptFiles = () => { + if (isReadOnlyOnboarding({ fsModule: fs })) return; const setupUiUrl = resolveSetupUrl(); ensureOpenclawRuntimeArtifacts({ fs, diff --git a/lib/server/gateway.js b/lib/server/gateway.js index f1965e7..537d8b2 100644 --- a/lib/server/gateway.js +++ b/lib/server/gateway.js @@ -3,14 +3,13 @@ const { spawn, execSync } = require("child_process"); const fs = require("fs"); const net = require("net"); const { - ALPHACLAW_DIR, OPENCLAW_DIR, GATEWAY_HOST, kDefaultGatewayPort, kChannelDefs, kOnboardingMarkerPath, - kRootDir, } = require("./constants"); +const { isReadOnlyOnboarding } = require("./onboarding/state"); let gatewayChild = null; let gatewayExitHandler = null; @@ -43,39 +42,12 @@ const setGatewayLaunchHandler = (handler) => { const gatewayEnv = () => ({ ...process.env, - OPENCLAW_HOME: kRootDir, + OPENCLAW_HOME: OPENCLAW_DIR, OPENCLAW_CONFIG_PATH: `${OPENCLAW_DIR}/openclaw.json`, XDG_CONFIG_HOME: OPENCLAW_DIR, }); -const writeOnboardingMarker = (reason) => { - fs.mkdirSync(ALPHACLAW_DIR, { recursive: true }); - fs.writeFileSync( - kOnboardingMarkerPath, - JSON.stringify( - { - onboarded: true, - reason, - markedAt: new Date().toISOString(), - }, - null, - 2, - ), - ); -}; - -// Legacy backfill: older deployments may only have the control-ui skill as -// proof of onboarding (before the dedicated marker file existed). -const kLegacyControlUiSkillPath = path.join(OPENCLAW_DIR, "skills", "control-ui", "SKILL.md"); - -const isOnboarded = () => { - if (fs.existsSync(kOnboardingMarkerPath)) return true; - if (fs.existsSync(kLegacyControlUiSkillPath)) { - writeOnboardingMarker("legacy_artifact_backfill"); - return true; - } - return false; -}; +const isOnboarded = () => fs.existsSync(kOnboardingMarkerPath); const getGatewayPort = () => { try { @@ -249,6 +221,7 @@ const attachGatewaySignalHandlers = () => { const ensureGatewayProxyConfig = (origin) => { if (!isOnboarded()) return false; + if (isReadOnlyOnboarding({ fsModule: fs })) return false; try { const configPath = `${OPENCLAW_DIR}/openclaw.json`; const cfg = JSON.parse(fs.readFileSync(configPath, "utf8")); @@ -287,6 +260,7 @@ const ensureGatewayProxyConfig = (origin) => { }; const syncChannelConfig = (savedVars, mode = "all") => { + if (isReadOnlyOnboarding({ fsModule: fs })) return; try { const configPath = `${OPENCLAW_DIR}/openclaw.json`; const cfg = JSON.parse(fs.readFileSync(configPath, "utf8")); diff --git a/lib/server/init/runtime-init.js b/lib/server/init/runtime-init.js index 6d253a6..4450c02 100644 --- a/lib/server/init/runtime-init.js +++ b/lib/server/init/runtime-init.js @@ -5,14 +5,18 @@ const initializeServerRuntime = ({ attachGatewaySignalHandlers, cleanupStaleImportTempDirs, migrateManagedInternalFiles, + isOnboarded, + isReadOnlyOnboarding, }) => { startEnvWatcher(); attachGatewaySignalHandlers(); cleanupStaleImportTempDirs(); - migrateManagedInternalFiles({ - fs, - openclawDir: constants.OPENCLAW_DIR, - }); + if (isOnboarded() && !isReadOnlyOnboarding({ fsModule: fs })) { + migrateManagedInternalFiles({ + fs, + openclawDir: constants.OPENCLAW_DIR, + }); + } }; const initializeServerDatabases = ({ diff --git a/lib/server/onboarding/cron.js b/lib/server/onboarding/cron.js index 235c3d9..24da4a8 100644 --- a/lib/server/onboarding/cron.js +++ b/lib/server/onboarding/cron.js @@ -1,20 +1,14 @@ +const os = require("os"); const path = require("path"); const { kSetupDir } = require("../constants"); const { buildManagedPaths } = require("../internal-files-migration"); +const { + applySystemCronConfig, + getSystemCronPaths, + kDefaultSystemCronSchedule, +} = require("../system-cron"); const kHourlyGitSyncTemplatePath = path.join(kSetupDir, "hourly-git-sync.sh"); -const kSystemCronPath = "/etc/cron.d/openclaw-hourly-sync"; -const kSystemCronConfigDir = "cron"; -const kSystemCronConfigFile = "system-sync.json"; -const kDefaultSystemCronSchedule = "0 * * * *"; - -const buildSystemCronFile = ({ schedule, scriptPath }) => - [ - "SHELL=/bin/bash", - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - `${schedule} root bash "${scriptPath}" >> /var/log/openclaw-hourly-sync.log 2>&1`, - "", - ].join("\n"); const installHourlyGitSyncScript = ({ fs, openclawDir }) => { try { @@ -28,22 +22,28 @@ const installHourlyGitSyncScript = ({ fs, openclawDir }) => { } }; -const installHourlyGitSyncCron = async ({ fs, openclawDir }) => { +const installHourlyGitSyncCron = async ({ + fs, + openclawDir, + platform = os.platform(), + execFileSyncImpl, +}) => { try { - const { hourlyGitSyncPath } = buildManagedPaths({ openclawDir }); - const configDir = `${openclawDir}/${kSystemCronConfigDir}`; - const configPath = `${configDir}/${kSystemCronConfigFile}`; - const config = { enabled: true, schedule: kDefaultSystemCronSchedule }; - fs.mkdirSync(configDir, { recursive: true }); - fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); - - const cronContent = buildSystemCronFile({ - schedule: config.schedule, - scriptPath: hourlyGitSyncPath, + const paths = getSystemCronPaths({ openclawDir, platform }); + const status = applySystemCronConfig({ + fs, + openclawDir, + nextConfig: { + enabled: true, + schedule: kDefaultSystemCronSchedule, + }, + platform, + execFileSyncImpl, }); - fs.writeFileSync(kSystemCronPath, cronContent, { mode: 0o644 }); - console.log(`[onboard] Installed system cron job at ${kSystemCronPath} (${configPath})`); - return true; + console.log( + `[onboard] Installed system cron job at ${paths.installPath} (${paths.configPath})`, + ); + return status.installed; } catch (e) { console.error("[onboard] System cron install error:", e.message); return false; diff --git a/lib/server/onboarding/index.js b/lib/server/onboarding/index.js index 03fa1e2..6c8e1c1 100644 --- a/lib/server/onboarding/index.js +++ b/lib/server/onboarding/index.js @@ -1,5 +1,5 @@ const path = require("path"); -const { kSetupDir, kRootDir } = require("../constants"); +const { kSetupDir } = require("../constants"); const { resolveConfigIncludes, resolveImportedConfigPaths, @@ -327,6 +327,8 @@ const createOnboardingService = ({ ensureGatewayProxyConfig, getBaseUrl, startGateway, + platform = process.platform, + execFileSyncImpl, }) => { const { OPENCLAW_DIR, WORKSPACE_DIR, kOnboardingMarkerPath } = constants; @@ -368,12 +370,14 @@ const createOnboardingService = ({ vars, modelKey, importMode = false, + readOnlyMode = false, }) => { const validation = validateOnboardingInput({ vars, modelKey, resolveModelProvider, hasCodexOauthProfile, + readOnlyMode, }); if (!validation.ok) { return { @@ -388,22 +392,36 @@ const createOnboardingService = ({ githubRepoInput, selectedProvider, hasCodexOauth, + readOnlyMode: validatedReadOnlyMode, } = validation.data; - const repoUrl = resolveGithubRepoUrl(githubRepoInput); - const remoteUrl = `https://github.com/${repoUrl}.git`; + const hasGithubRepo = !!githubRepoInput; + const repoUrl = hasGithubRepo ? resolveGithubRepoUrl(githubRepoInput) : ""; + const remoteUrl = repoUrl ? `https://github.com/${repoUrl}.git` : ""; + const configPath = `${OPENCLAW_DIR}/openclaw.json`; const existingConfigPresent = - importMode && fs.existsSync(`${OPENCLAW_DIR}/openclaw.json`); + (importMode || validatedReadOnlyMode) && fs.existsSync(configPath); + if (validatedReadOnlyMode && !existingConfigPresent) { + return { + status: 400, + body: { + ok: false, + error: "Read-only mode requires an existing OpenClaw config", + }, + }; + } const existingEnvVars = typeof readEnvFile === "function" ? readEnvFile() : []; const varsToSave = [...existingEnvVars]; applySubmittedEnvVars(varsToSave, vars); - upsertEnvVar(varsToSave, "GITHUB_WORKSPACE_REPO", repoUrl); + if (repoUrl) { + upsertEnvVar(varsToSave, "GITHUB_WORKSPACE_REPO", repoUrl); + } pruneConflictingProviderAuthVars(varsToSave, { selectedProvider, varMap, }); - if (importMode && existingConfigPresent) { + if (importMode && existingConfigPresent && !validatedReadOnlyMode) { const systemVars = constants.kSystemVars instanceof Set ? constants.kSystemVars @@ -421,50 +439,57 @@ const createOnboardingService = ({ } writeEnvFile(varsToSave); reloadEnv(); - syncApiKeyAuthProfilesFromEnvVars(authProfiles, varsToSave); + if (!validatedReadOnlyMode) { + syncApiKeyAuthProfilesFromEnvVars(authProfiles, varsToSave); + } - const [, repoName] = repoUrl.split("/"); - const repoCheck = await ensureGithubRepoAccessible({ - repoUrl, - repoName, - githubToken, - }); - if (!repoCheck.ok) { - return { - status: repoCheck.status, - body: { ok: false, error: repoCheck.error }, - }; + if (repoUrl) { + const [, repoName] = repoUrl.split("/"); + const repoCheck = await ensureGithubRepoAccessible({ + repoUrl, + repoName, + githubToken, + }); + if (!repoCheck.ok) { + return { + status: repoCheck.status, + body: { ok: false, error: repoCheck.error }, + }; + } } fs.mkdirSync(OPENCLAW_DIR, { recursive: true }); - fs.mkdirSync(WORKSPACE_DIR, { recursive: true }); - migrateManagedInternalFiles({ - fs, - openclawDir: OPENCLAW_DIR, - }); - syncBootstrapPromptFiles({ - fs, - workspaceDir: WORKSPACE_DIR, - baseUrl: getBaseUrl(req), - }); - ensureOpenclawRuntimeArtifacts({ - fs, - openclawDir: OPENCLAW_DIR, - }); + if (!validatedReadOnlyMode) { + fs.mkdirSync(WORKSPACE_DIR, { recursive: true }); + migrateManagedInternalFiles({ + fs, + openclawDir: OPENCLAW_DIR, + }); + syncBootstrapPromptFiles({ + fs, + workspaceDir: WORKSPACE_DIR, + baseUrl: getBaseUrl(req), + }); + ensureOpenclawRuntimeArtifacts({ + fs, + openclawDir: OPENCLAW_DIR, + }); + } - const hadImportedGit = importMode && fs.existsSync(`${OPENCLAW_DIR}/.git`); + const hadImportedGit = + !validatedReadOnlyMode && importMode && fs.existsSync(`${OPENCLAW_DIR}/.git`); if (hadImportedGit) { try { fs.rmSync(`${OPENCLAW_DIR}/.git`, { recursive: true, force: true }); } catch {} } - if (hadImportedGit || !fs.existsSync(`${OPENCLAW_DIR}/.git`)) { + if (!validatedReadOnlyMode && remoteUrl && (hadImportedGit || !fs.existsSync(`${OPENCLAW_DIR}/.git`))) { await shellCmd( `cd ${OPENCLAW_DIR} && git init -b main && git remote add origin "${remoteUrl}" && git config user.email "agent@alphaclaw.md" && git config user.name "AlphaClaw Agent"`, ); console.log("[onboard] Git initialized"); - } else if (importMode) { + } else if (!validatedReadOnlyMode && importMode && remoteUrl) { // Ensure remote points to the correct URL for imported repos try { await shellCmd( @@ -473,14 +498,14 @@ const createOnboardingService = ({ } catch {} } - if (!fs.existsSync(`${OPENCLAW_DIR}/.gitignore`)) { + if (!validatedReadOnlyMode && !fs.existsSync(`${OPENCLAW_DIR}/.gitignore`)) { fs.copyFileSync( path.join(kSetupDir, "gitignore"), `${OPENCLAW_DIR}/.gitignore`, ); } - if (!existingConfigPresent) { + if (!validatedReadOnlyMode && !existingConfigPresent) { const onboardArgs = buildOnboardArgs({ varMap, selectedProvider, @@ -492,8 +517,9 @@ const createOnboardingService = ({ { env: { ...process.env, - OPENCLAW_HOME: kRootDir, + OPENCLAW_HOME: OPENCLAW_DIR, OPENCLAW_CONFIG_PATH: `${OPENCLAW_DIR}/openclaw.json`, + XDG_CONFIG_HOME: OPENCLAW_DIR, }, timeout: 120000, }, @@ -505,43 +531,55 @@ const createOnboardingService = ({ ); } - await shellCmd(`openclaw models set "${modelKey}"`, { - env: gatewayEnv(), - timeout: 30000, - }).catch((e) => { - console.error("[onboard] Failed to set model:", e.message); - throw new Error( - `Onboarding completed but failed to set model "${modelKey}"`, - ); - }); + if (!validatedReadOnlyMode) { + await shellCmd(`openclaw models set "${modelKey}"`, { + env: gatewayEnv(), + timeout: 30000, + }).catch((e) => { + console.error("[onboard] Failed to set model:", e.message); + throw new Error( + `Onboarding completed but failed to set model "${modelKey}"`, + ); + }); - try { - fs.rmSync(`${WORKSPACE_DIR}/.git`, { recursive: true, force: true }); - } catch {} + try { + fs.rmSync(`${WORKSPACE_DIR}/.git`, { recursive: true, force: true }); + } catch {} + + if (!existingConfigPresent) { + writeSanitizedOpenclawConfig({ fs, openclawDir: OPENCLAW_DIR, varMap }); + } else if (importMode) { + writeManagedImportOpenclawConfig({ + fs, + openclawDir: OPENCLAW_DIR, + varMap, + }); + } + authProfiles?.syncConfigAuthReferencesForAgent?.(); + ensureGatewayProxyConfig(getBaseUrl(req)); - if (!existingConfigPresent) { - writeSanitizedOpenclawConfig({ fs, openclawDir: OPENCLAW_DIR, varMap }); - } else if (importMode) { - writeManagedImportOpenclawConfig({ + installGogCliSkill({ fs, openclawDir: OPENCLAW_DIR }); + + installHourlyGitSyncScript({ fs, openclawDir: OPENCLAW_DIR }); + await installHourlyGitSyncCron({ fs, openclawDir: OPENCLAW_DIR, - varMap, + platform, + execFileSyncImpl, }); } - authProfiles?.syncConfigAuthReferencesForAgent?.(); - ensureGatewayProxyConfig(getBaseUrl(req)); - - installGogCliSkill({ fs, openclawDir: OPENCLAW_DIR }); - - installHourlyGitSyncScript({ fs, openclawDir: OPENCLAW_DIR }); - await installHourlyGitSyncCron({ fs, openclawDir: OPENCLAW_DIR }); fs.mkdirSync(path.dirname(kOnboardingMarkerPath), { recursive: true }); fs.writeFileSync( kOnboardingMarkerPath, JSON.stringify( { onboarded: true, - reason: importMode ? "import_complete" : "onboarding_complete", + reason: validatedReadOnlyMode + ? "read_only_complete" + : importMode + ? "import_complete" + : "onboarding_complete", + readOnly: validatedReadOnlyMode, markedAt: new Date().toISOString(), }, null, @@ -549,20 +587,22 @@ const createOnboardingService = ({ ), ); - try { - const commitMsg = importMode - ? "imported existing setup via AlphaClaw" - : "initial setup"; - await shellCmd(`alphaclaw git-sync -m "${commitMsg}"`, { - timeout: 30000, - env: { - ...process.env, - GITHUB_TOKEN: githubToken, - }, - }); - console.log("[onboard] Initial state committed and pushed"); - } catch (e) { - console.error("[onboard] Git push error:", e.message); + if (!validatedReadOnlyMode && githubToken && repoUrl) { + try { + const commitMsg = importMode + ? "imported existing setup via AlphaClaw" + : "initial setup"; + await shellCmd(`alphaclaw git-sync -m "${commitMsg}"`, { + timeout: 30000, + env: { + ...process.env, + GITHUB_TOKEN: githubToken, + }, + }); + console.log("[onboard] Initial state committed and pushed"); + } catch (e) { + console.error("[onboard] Git push error:", e.message); + } } startGateway(); diff --git a/lib/server/onboarding/state.js b/lib/server/onboarding/state.js new file mode 100644 index 0000000..b2aa8b7 --- /dev/null +++ b/lib/server/onboarding/state.js @@ -0,0 +1,24 @@ +const fs = require("fs"); +const { kOnboardingMarkerPath } = require("../constants"); + +const readOnboardingMarker = ({ + fsModule = fs, + markerPath = kOnboardingMarkerPath, +} = {}) => { + try { + if (!fsModule.existsSync(markerPath)) return null; + const raw = fsModule.readFileSync(markerPath, "utf8"); + const parsed = JSON.parse(raw); + return parsed && typeof parsed === "object" ? parsed : null; + } catch { + return null; + } +}; + +const isReadOnlyOnboarding = (options = {}) => + !!readOnboardingMarker(options)?.readOnly; + +module.exports = { + readOnboardingMarker, + isReadOnlyOnboarding, +}; diff --git a/lib/server/onboarding/validation.js b/lib/server/onboarding/validation.js index 9b1ccbd..17161e1 100644 --- a/lib/server/onboarding/validation.js +++ b/lib/server/onboarding/validation.js @@ -24,7 +24,13 @@ const validateAnthropicCredentialShape = (varMap) => { return { ok: true }; }; -const validateOnboardingInput = ({ vars, modelKey, resolveModelProvider, hasCodexOauthProfile }) => { +const validateOnboardingInput = ({ + vars, + modelKey, + resolveModelProvider, + hasCodexOauthProfile, + readOnlyMode = false, +}) => { const kMaxOnboardingVars = 64; const kMaxEnvKeyLength = 128; const kMaxEnvValueLength = 4096; @@ -38,7 +44,10 @@ const validateOnboardingInput = ({ vars, modelKey, resolveModelProvider, hasCode error: `Too many environment variables (max ${kMaxOnboardingVars})`, }; } - if (!modelKey || typeof modelKey !== "string" || !modelKey.includes("/")) { + if ( + !readOnlyMode && + (!modelKey || typeof modelKey !== "string" || !modelKey.includes("/")) + ) { return { ok: false, status: 400, error: "A model selection is required" }; } @@ -69,7 +78,8 @@ const validateOnboardingInput = ({ vars, modelKey, resolveModelProvider, hasCode if (!anthropicValidation.ok) return anthropicValidation; const githubToken = String(varMap.GITHUB_TOKEN || ""); const githubRepoInput = String(varMap.GITHUB_WORKSPACE_REPO || "").trim(); - const selectedProvider = resolveModelProvider(modelKey); + const selectedProvider = + modelKey && typeof modelKey === "string" ? resolveModelProvider(modelKey) : ""; const hasCodexOauth = hasCodexOauthProfile(); const hasAiByProvider = { anthropic: !!(varMap.ANTHROPIC_API_KEY || varMap.ANTHROPIC_TOKEN), @@ -91,7 +101,7 @@ const validateOnboardingInput = ({ vars, modelKey, resolveModelProvider, hasCode const hasGithub = !!(githubToken && githubRepoInput); const hasChannel = !!(varMap.TELEGRAM_BOT_TOKEN || varMap.DISCORD_BOT_TOKEN || (varMap.SLACK_BOT_TOKEN && varMap.SLACK_APP_TOKEN)); - if (!hasAi) { + if (!readOnlyMode && !hasAi) { if (selectedProvider === "openai-codex") { return { ok: false, @@ -105,14 +115,24 @@ const validateOnboardingInput = ({ vars, modelKey, resolveModelProvider, hasCode error: `Missing credentials for selected provider "${selectedProvider}"`, }; } - if (!hasGithub) { + if (!readOnlyMode && !hasGithub) { return { ok: false, status: 400, error: "GitHub token and workspace repo are required", }; } - if (!hasChannel) { + if ( + readOnlyMode && + ((githubToken && !githubRepoInput) || (!githubToken && githubRepoInput)) + ) { + return { + ok: false, + status: 400, + error: "Provide both GitHub token and workspace repo, or leave both blank", + }; + } + if (!readOnlyMode && !hasChannel) { return { ok: false, status: 400, @@ -128,6 +148,7 @@ const validateOnboardingInput = ({ vars, modelKey, resolveModelProvider, hasCode githubRepoInput, selectedProvider, hasCodexOauth, + readOnlyMode, }, }; }; diff --git a/lib/server/routes/google.js b/lib/server/routes/google.js index 1df2479..cd09752 100644 --- a/lib/server/routes/google.js +++ b/lib/server/routes/google.js @@ -12,6 +12,7 @@ const { } = require("../google-state"); const { syncBootstrapPromptFiles } = require("../onboarding/workspace"); const { installGogCliSkill } = require("../gog-skill"); +const { isReadOnlyOnboarding } = require("../onboarding/state"); const { parseJsonSafe } = require("../utils/json"); const { quoteShellArg } = require("../utils/shell"); @@ -48,6 +49,7 @@ const registerGoogleRoutes = ({ const readState = () => readGoogleState({ fs, statePath: GOG_STATE_PATH }); const saveState = (state) => writeGoogleState({ fs, statePath: GOG_STATE_PATH, state }); const syncBootstrapTools = (req) => { + if (isReadOnlyOnboarding({ fsModule: fs })) return; try { syncBootstrapPromptFiles({ fs, diff --git a/lib/server/routes/onboarding.js b/lib/server/routes/onboarding.js index e414fb5..3855f43 100644 --- a/lib/server/routes/onboarding.js +++ b/lib/server/routes/onboarding.js @@ -1,3 +1,4 @@ +const { execFileSync } = require("child_process"); const { createOnboardingService, getImportedPlaceholderReview, @@ -94,6 +95,8 @@ const registerOnboardingRoutes = ({ ensureGatewayProxyConfig, getBaseUrl, startGateway, + platform = process.platform, + execFileSyncImpl = execFileSync, }) => { // Keep mutating onboarding routes marker-gated so in-progress imports // can promote files before the final completion marker is written. @@ -115,6 +118,8 @@ const registerOnboardingRoutes = ({ ensureGatewayProxyConfig, getBaseUrl, startGateway, + platform, + execFileSyncImpl, }); const kEnvVarNamePattern = /^[A-Z_][A-Z0-9_]*$/; @@ -162,12 +167,13 @@ const registerOnboardingRoutes = ({ return res.json({ ok: false, error: "Already onboarded" }); try { - const { vars, modelKey, importMode } = req.body; + const { vars, modelKey, importMode, readOnlyMode } = req.body; const result = await onboardingService.completeOnboarding({ req, vars, modelKey, importMode: !!importMode, + readOnlyMode: !!readOnlyMode, }); res.status(result.status).json(result.body); } catch (err) { diff --git a/lib/server/routes/system.js b/lib/server/routes/system.js index ec709bd..51a5763 100644 --- a/lib/server/routes/system.js +++ b/lib/server/routes/system.js @@ -1,7 +1,15 @@ +const { execFileSync } = require("child_process"); +const path = require("path"); +const https = require("https"); const { buildManagedPaths } = require("../internal-files-migration"); const { readOpenclawConfig } = require("../openclaw-config"); const { hasScopedBindingFields } = require("../utils/channels"); -const https = require("https"); +const { + applySystemCronConfig, + getSystemCronStatus, + isValidCronSchedule, +} = require("../system-cron"); +const { readOnboardingMarker } = require("../onboarding/state"); const registerSystemRoutes = ({ app, @@ -22,9 +30,13 @@ const registerSystemRoutes = ({ clawCmd, restartGateway, OPENCLAW_DIR, + kOnboardingMarkerPath = "", + kControlUiSkillPath = "", restartRequiredState, topicRegistry, authProfiles, + platform = process.platform, + execFileSyncImpl = execFileSync, }) => { let envRestartPending = false; const kManagedChannelTokenPattern = @@ -44,21 +56,6 @@ const registerSystemRoutes = ({ kManagedChannelTokenPattern.test(String(key || "").trim().toUpperCase()); const isReservedUserEnvVar = (key) => kSystemVars.has(key) || kEnvVarsReservedForUserInput.has(key); - const kSystemCronPath = "/etc/cron.d/openclaw-hourly-sync"; - const kSystemCronConfigPath = `${OPENCLAW_DIR}/cron/system-sync.json`; - const { hourlyGitSyncPath: kSystemCronScriptPath } = buildManagedPaths({ - openclawDir: OPENCLAW_DIR, - }); - const kDefaultSystemCronSchedule = "0 * * * *"; - const isValidCronSchedule = (value) => - typeof value === "string" && /^(\S+\s+){4}\S+$/.test(value.trim()); - const buildSystemCronContent = (schedule) => - [ - "SHELL=/bin/bash", - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - `${schedule} root bash "${kSystemCronScriptPath}" >> /var/log/openclaw-hourly-sync.log 2>&1`, - "", - ].join("\n"); const shellEscapeArg = (value) => { const safeValue = String(value || ""); return `'${safeValue.replace(/'/g, `'\\''`)}'`; @@ -77,6 +74,30 @@ const registerSystemRoutes = ({ } return null; }; + const safeRealpath = (targetPath) => { + try { + if (!targetPath || !fs.existsSync(targetPath)) return ""; + return fs.realpathSync(targetPath); + } catch { + return ""; + } + }; + const readSymlinkTarget = (targetPath) => { + try { + if (!targetPath || !fs.existsSync(targetPath)) return ""; + return fs.readlinkSync(targetPath); + } catch { + return ""; + } + }; + const isSymlink = (targetPath) => { + try { + if (!targetPath || !fs.existsSync(targetPath)) return false; + return !!fs.lstatSync(targetPath)?.isSymbolicLink?.(); + } catch { + return false; + } + }; const toTitleWords = (value) => String(value || "") .trim() @@ -249,47 +270,21 @@ const registerSystemRoutes = ({ }) .sort((a, b) => b.updatedAt - a.updatedAt); }; - const readSystemCronConfig = () => { - try { - const raw = fs.readFileSync(kSystemCronConfigPath, "utf8"); - const parsed = JSON.parse(raw); - const enabled = parsed.enabled !== false; - const schedule = isValidCronSchedule(parsed.schedule) - ? parsed.schedule.trim() - : kDefaultSystemCronSchedule; - return { enabled, schedule }; - } catch { - return { enabled: true, schedule: kDefaultSystemCronSchedule }; - } - }; - const getSystemCronStatus = () => { - const config = readSystemCronConfig(); - return { - enabled: config.enabled, - schedule: config.schedule, - installed: fs.existsSync(kSystemCronPath), - scriptExists: fs.existsSync(kSystemCronScriptPath), - }; - }; - const applySystemCronConfig = (nextConfig) => { - fs.mkdirSync(`${OPENCLAW_DIR}/cron`, { recursive: true }); - fs.writeFileSync( - kSystemCronConfigPath, - JSON.stringify(nextConfig, null, 2), - ); - if (nextConfig.enabled) { - fs.writeFileSync( - kSystemCronPath, - buildSystemCronContent(nextConfig.schedule), - { - mode: 0o644, - }, - ); - } else { - fs.rmSync(kSystemCronPath, { force: true }); - } - return getSystemCronStatus(); - }; + const readSystemCronConfig = () => + getSystemCronStatus({ + fs, + openclawDir: OPENCLAW_DIR, + platform, + execFileSyncImpl, + }); + const applyManagedCronConfig = (nextConfig) => + applySystemCronConfig({ + fs, + openclawDir: OPENCLAW_DIR, + nextConfig, + platform, + execFileSyncImpl, + }); const isVisibleInEnvars = (def) => def?.visibleInEnvars !== false; const kReleaseNotesCacheTtlMs = 5 * 60 * 1000; let kReleaseNotesCache = { @@ -466,10 +461,18 @@ const registerSystemRoutes = ({ }); app.get("/api/status", async (req, res) => { - const configExists = fs.existsSync(`${OPENCLAW_DIR}/openclaw.json`); + const configPath = `${OPENCLAW_DIR}/openclaw.json`; + const configExists = fs.existsSync(configPath); const running = await isGatewayRunning(); const repo = process.env.GITHUB_WORKSPACE_REPO || ""; const openclawVersion = openclawVersionService.readOpenclawVersion(); + const onboardingMarker = + kOnboardingMarkerPath + ? readOnboardingMarker({ + fsModule: fs, + markerPath: kOnboardingMarkerPath, + }) + : null; res.json({ gateway: running ? "running" @@ -480,12 +483,37 @@ const registerSystemRoutes = ({ channels: getChannelStatus(), repo, openclawVersion, - syncCron: getSystemCronStatus(), + syncCron: readSystemCronConfig(), + diagnostics: { + readOnlyMode: !!onboardingMarker?.readOnly, + onboardingReason: String(onboardingMarker?.reason || ""), + onboardingMarkerPath: kOnboardingMarkerPath || "", + onboardingMarkerExists: !!( + kOnboardingMarkerPath && fs.existsSync(kOnboardingMarkerPath) + ), + openclawDir: OPENCLAW_DIR, + openclawDirIsSymlink: isSymlink(OPENCLAW_DIR), + openclawDirLinkTarget: readSymlinkTarget(OPENCLAW_DIR), + resolvedOpenclawDir: safeRealpath(OPENCLAW_DIR), + configPath, + resolvedConfigPath: safeRealpath(configPath), + controlUiSkillPath: kControlUiSkillPath || "", + controlUiSkillExists: !!( + kControlUiSkillPath && fs.existsSync(kControlUiSkillPath) + ), + resolvedControlUiSkillPath: safeRealpath(kControlUiSkillPath), + cwd: process.cwd(), + openclawVersionSource: "openclaw --version", + openclawHomeEnv: String(process.env.OPENCLAW_HOME || ""), + openclawConfigPathEnv: String(process.env.OPENCLAW_CONFIG_PATH || ""), + xdgConfigHomeEnv: String(process.env.XDG_CONFIG_HOME || ""), + rootPathBasename: path.basename(OPENCLAW_DIR), + }, }); }); app.get("/api/sync-cron", (req, res) => { - res.json({ ok: true, ...getSystemCronStatus() }); + res.json({ ok: true, ...readSystemCronConfig() }); }); app.put("/api/sync-cron", (req, res) => { @@ -508,7 +536,7 @@ const registerSystemRoutes = ({ ? schedule.trim() : current.schedule, }; - const status = applySystemCronConfig(nextConfig); + const status = applyManagedCronConfig(nextConfig); res.json({ ok: true, syncCron: status }); }); diff --git a/lib/server/system-cron.js b/lib/server/system-cron.js new file mode 100644 index 0000000..02c43a7 --- /dev/null +++ b/lib/server/system-cron.js @@ -0,0 +1,333 @@ +"use strict"; + +const os = require("os"); +const path = require("path"); +const { spawn } = require("child_process"); +const { buildManagedPaths } = require("./internal-files-migration"); + +const kSystemCronPath = "/etc/cron.d/openclaw-hourly-sync"; +const kSystemCronConfigDir = "cron"; +const kSystemCronConfigFile = "system-sync.json"; +const kDefaultSystemCronSchedule = "0 * * * *"; + +const kSchedulerState = { + active: false, + lastRunKey: "", + timer: null, +}; + +const normalizeCronPlatform = (platform = os.platform()) => + platform === "darwin" ? "darwin" : "linux"; + +const isValidCronSchedule = (value) => + typeof value === "string" && /^(\S+\s+){4}\S+$/.test(value.trim()); + +const getSystemCronPaths = ({ + openclawDir, + platform = os.platform(), + pathModule = path, +}) => { + const normalizedPlatform = normalizeCronPlatform(platform); + const managedPaths = buildManagedPaths({ openclawDir, pathModule }); + const configDir = pathModule.join(openclawDir, kSystemCronConfigDir); + return { + platform: normalizedPlatform, + configDir, + configPath: pathModule.join(configDir, kSystemCronConfigFile), + scriptPath: managedPaths.hourlyGitSyncPath, + logPath: + normalizedPlatform === "darwin" + ? pathModule.join(managedPaths.internalDir, "hourly-git-sync.log") + : "/var/log/openclaw-hourly-sync.log", + installPath: + normalizedPlatform === "darwin" ? "managed scheduler" : kSystemCronPath, + }; +}; + +const buildManagedCronContent = ({ + schedule, + scriptPath, + logPath, + platform = os.platform(), +}) => { + const normalizedPlatform = normalizeCronPlatform(platform); + if (normalizedPlatform === "darwin") { + return [ + "SHELL=/bin/bash", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + `${schedule} bash "${scriptPath}" >> "${logPath}" 2>&1`, + "", + ].join("\n"); + } + return [ + "SHELL=/bin/bash", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + `${schedule} root bash "${scriptPath}" >> ${logPath} 2>&1`, + "", + ].join("\n"); +}; + +const readSystemCronConfig = ({ + fs, + openclawDir, + platform = os.platform(), +}) => { + const { configPath } = getSystemCronPaths({ openclawDir, platform }); + try { + const raw = fs.readFileSync(configPath, "utf8"); + const parsed = JSON.parse(raw); + return { + enabled: parsed.enabled !== false, + schedule: isValidCronSchedule(parsed.schedule) + ? parsed.schedule.trim() + : kDefaultSystemCronSchedule, + }; + } catch { + return { + enabled: true, + schedule: kDefaultSystemCronSchedule, + }; + } +}; + +const normalizeCronValue = (value, fieldName) => { + if (fieldName === "dayOfWeek" && value === 7) return 0; + return value; +}; + +const matchCronToken = ({ token, value, min, max, fieldName }) => { + const normalizedToken = String(token || "").trim(); + if (!normalizedToken) return false; + if (normalizedToken === "*") return true; + + const [base, stepRaw] = normalizedToken.split("/"); + const step = stepRaw ? Number.parseInt(stepRaw, 10) : null; + if (stepRaw && (!Number.isFinite(step) || step <= 0)) return false; + + let rangeStart = min; + let rangeEnd = max; + if (base && base !== "*") { + if (base.includes("-")) { + const [startRaw, endRaw] = base.split("-", 2); + rangeStart = normalizeCronValue(Number.parseInt(startRaw, 10), fieldName); + rangeEnd = normalizeCronValue(Number.parseInt(endRaw, 10), fieldName); + } else { + rangeStart = normalizeCronValue(Number.parseInt(base, 10), fieldName); + rangeEnd = rangeStart; + } + } + if ( + !Number.isFinite(rangeStart) || + !Number.isFinite(rangeEnd) || + rangeStart < min || + rangeEnd > max || + rangeStart > rangeEnd + ) { + return false; + } + if (value < rangeStart || value > rangeEnd) return false; + if (!step) return true; + return (value - rangeStart) % step === 0; +}; + +const matchCronField = ({ expression, value, min, max, fieldName }) => + String(expression || "") + .split(",") + .some((token) => matchCronToken({ token, value, min, max, fieldName })); + +const cronMatchesDate = (schedule, date) => { + if (!isValidCronSchedule(schedule)) return false; + const [minuteExpr, hourExpr, dayExpr, monthExpr, weekExpr] = + schedule.trim().split(/\s+/); + const minute = date.getMinutes(); + const hour = date.getHours(); + const dayOfMonth = date.getDate(); + const month = date.getMonth() + 1; + const dayOfWeek = date.getDay(); + + if ( + !matchCronField({ + expression: minuteExpr, + value: minute, + min: 0, + max: 59, + fieldName: "minute", + }) || + !matchCronField({ + expression: hourExpr, + value: hour, + min: 0, + max: 23, + fieldName: "hour", + }) || + !matchCronField({ + expression: monthExpr, + value: month, + min: 1, + max: 12, + fieldName: "month", + }) + ) { + return false; + } + + const dayMatches = matchCronField({ + expression: dayExpr, + value: dayOfMonth, + min: 1, + max: 31, + fieldName: "dayOfMonth", + }); + const weekMatches = matchCronField({ + expression: weekExpr, + value: dayOfWeek, + min: 0, + max: 7, + fieldName: "dayOfWeek", + }); + + const dayRestricted = dayExpr !== "*"; + const weekRestricted = weekExpr !== "*"; + if (dayRestricted && weekRestricted) return dayMatches || weekMatches; + return dayMatches && weekMatches; +}; + +const runManagedSchedulerTick = ({ fs, openclawDir, logger = console }) => { + const config = readSystemCronConfig({ fs, openclawDir, platform: "darwin" }); + if (!config.enabled) return; + const now = new Date(); + if (!cronMatchesDate(config.schedule, now)) return; + const runKey = [ + now.getFullYear(), + now.getMonth(), + now.getDate(), + now.getHours(), + now.getMinutes(), + ].join(":"); + if (kSchedulerState.lastRunKey === runKey) return; + kSchedulerState.lastRunKey = runKey; + + const { scriptPath, logPath } = getSystemCronPaths({ + openclawDir, + platform: "darwin", + }); + const child = spawn("bash", [scriptPath], { + detached: true, + stdio: ["ignore", "ignore", "ignore"], + env: { + ...process.env, + ALPHACLAW_SYNC_LOG_PATH: logPath, + }, + }); + child.unref(); + logger.log?.(`[alphaclaw] Managed scheduler triggered (${config.schedule})`); +}; + +const startManagedScheduler = ({ + fs, + openclawDir, + platform = os.platform(), + logger = console, +}) => { + if (normalizeCronPlatform(platform) !== "darwin") return false; + if (kSchedulerState.timer) return true; + kSchedulerState.active = true; + + const scheduleNextTick = () => { + const now = new Date(); + const delayMs = + (60 - now.getSeconds()) * 1000 - now.getMilliseconds() + 50; + kSchedulerState.timer = setTimeout(() => { + runManagedSchedulerTick({ fs, openclawDir, logger }); + scheduleNextTick(); + }, Math.max(delayMs, 250)); + if (typeof kSchedulerState.timer.unref === "function") { + kSchedulerState.timer.unref(); + } + }; + + scheduleNextTick(); + return true; +}; + +const stopManagedScheduler = () => { + kSchedulerState.active = false; + kSchedulerState.lastRunKey = ""; + if (kSchedulerState.timer) { + clearTimeout(kSchedulerState.timer); + kSchedulerState.timer = null; + } +}; + +const getSystemCronStatus = ({ + fs, + openclawDir, + platform = os.platform(), +}) => { + const paths = getSystemCronPaths({ openclawDir, platform }); + const config = readSystemCronConfig({ fs, openclawDir, platform }); + return { + enabled: config.enabled, + schedule: config.schedule, + installed: + paths.platform === "darwin" + ? kSchedulerState.active + : fs.existsSync(kSystemCronPath), + scriptExists: fs.existsSync(paths.scriptPath), + platform: paths.platform, + installMethod: + paths.platform === "darwin" ? "managed_scheduler" : "system_cron", + }; +}; + +const applySystemCronConfig = ({ + fs, + openclawDir, + nextConfig, + platform = os.platform(), +}) => { + const paths = getSystemCronPaths({ openclawDir, platform }); + const normalizedConfig = { + enabled: nextConfig.enabled !== false, + schedule: isValidCronSchedule(nextConfig.schedule) + ? nextConfig.schedule.trim() + : kDefaultSystemCronSchedule, + }; + fs.mkdirSync(paths.configDir, { recursive: true }); + fs.writeFileSync(paths.configPath, JSON.stringify(normalizedConfig, null, 2)); + if (paths.platform === "darwin") { + if (!normalizedConfig.enabled) kSchedulerState.lastRunKey = ""; + } else if (normalizedConfig.enabled) { + fs.writeFileSync( + kSystemCronPath, + buildManagedCronContent({ + schedule: normalizedConfig.schedule, + scriptPath: paths.scriptPath, + logPath: paths.logPath, + platform: paths.platform, + }), + { mode: 0o644 }, + ); + } else { + fs.rmSync(kSystemCronPath, { force: true }); + } + return getSystemCronStatus({ + fs, + openclawDir, + platform: paths.platform, + }); +}; + +module.exports = { + applySystemCronConfig, + buildManagedCronContent, + getSystemCronPaths, + getSystemCronStatus, + isValidCronSchedule, + kDefaultSystemCronSchedule, + kSystemCronPath, + normalizeCronPlatform, + readSystemCronConfig, + startManagedScheduler, + stopManagedScheduler, +}; diff --git a/package-lock.json b/package-lock.json index 9473837..e4626ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.8.0", "license": "MIT", "dependencies": { + "@chrysb/alphaclaw": "^0.7.0", "express": "^4.21.0", "http-proxy": "^1.18.1", "openclaw": "2026.3.13", @@ -943,245 +944,36 @@ "keyv": "^5.6.0" } }, - "node_modules/@clack/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.1.0.tgz", - "integrity": "sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==", - "license": "MIT", - "dependencies": { - "sisteransi": "^1.0.5" - } - }, - "node_modules/@clack/prompts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.1.0.tgz", - "integrity": "sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==", - "license": "MIT", - "dependencies": { - "@clack/core": "1.1.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@cloudflare/workers-types": { - "version": "4.20260120.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260120.0.tgz", - "integrity": "sha512-B8pueG+a5S+mdK3z8oKu1ShcxloZ7qWb68IEyLLaepvdryIbNC7JVPcY0bWsjS56UQVKc5fnyRge3yZIwc9bxw==", - "license": "MIT OR Apache-2.0", - "optional": true - }, - "node_modules/@discordjs/node-pre-gyp": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", - "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/@chrysb/alphaclaw": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@chrysb/alphaclaw/-/alphaclaw-0.7.1.tgz", + "integrity": "sha512-Ov8y+kCwtDrxL12Madbg1F1siChZzYQT5Sa99It5zAgVVCUX/2sBXN3IeqY5+BBEdntMVhL2abk2AAZRH8QpFQ==", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" + "express": "^4.21.0", + "http-proxy": "^1.18.1", + "openclaw": "2026.3.11", + "ws": "^8.19.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "optional": true, - "peer": true, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@discordjs/node-pre-gyp/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==", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/@discordjs/node-pre-gyp/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@discordjs/opus": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.10.0.tgz", - "integrity": "sha512-HHEnSNrSPmFEyndRdQBJN2YE6egyXS9JUnJWyP6jficK0Y+qKMEZXyYTgmzpjrxXP1exM/hKaNP7BRBUEWkU5w==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.5", - "node-addon-api": "^8.1.0" + "alphaclaw": "bin/alphaclaw.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=22.12.0" } }, - "node_modules/@discordjs/voice": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.19.0.tgz", - "integrity": "sha512-UyX6rGEXzVyPzb1yvjHtPfTlnLvB5jX/stAMdiytHhfoydX+98hfympdOwsnTktzr+IRvphxTbdErgYDJkEsvw==", + "node_modules/@chrysb/alphaclaw/node_modules/@discordjs/voice": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.19.1.tgz", + "integrity": "sha512-XYbFVyUBB7zhRvrjREfiWDwio24nEp/vFaVe6u9aBIC5UYuT7HvoMt8LgNfZ5hOyaCW0flFr72pkhUGz+gWw4Q==", "license": "Apache-2.0", - "optional": true, "dependencies": { + "@snazzah/davey": "^0.1.9", "@types/ws": "^8.18.1", - "discord-api-types": "^0.38.16", + "discord-api-types": "^0.38.41", "prism-media": "^1.3.5", "tslib": "^2.8.1", - "ws": "^8.18.3" + "ws": "^8.19.0" }, "engines": { "node": ">=22.12.0" @@ -1190,7 +982,7 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/voice/node_modules/opusscript": { + "node_modules/@chrysb/alphaclaw/node_modules/@discordjs/voice/node_modules/opusscript": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz", "integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==", @@ -1198,12 +990,11 @@ "optional": true, "peer": true }, - "node_modules/@discordjs/voice/node_modules/prism-media": { + "node_modules/@chrysb/alphaclaw/node_modules/@discordjs/voice/node_modules/prism-media": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.5.tgz", "integrity": "sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==", "license": "Apache-2.0", - "optional": true, "peerDependencies": { "@discordjs/opus": ">=0.8.0 <1.0.0", "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", @@ -1225,573 +1016,636 @@ } } }, - "node_modules/@emnapi/core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", - "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "node_modules/@chrysb/alphaclaw/node_modules/@mariozechner/pi-agent-core": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-agent-core/-/pi-agent-core-0.57.1.tgz", + "integrity": "sha512-WXsBbkNWOObFGHkhixaT8GXJpHDd3+fn8QntYF+4R8Sa9WB90ENXWidO6b7vcKX+JX0jjO5dIsQxmzosARJKlg==", "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "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" + "@mariozechner/pi-ai": "^0.57.1" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "node_modules/@chrysb/alphaclaw/node_modules/@mariozechner/pi-ai": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-ai/-/pi-ai-0.57.1.tgz", + "integrity": "sha512-Bd/J4a3YpdzJVyHLih0vDSdB0QPL4ti0XsAwtHOK/8eVhB0fHM1CpcgIrcBFJ23TMcKXMi0qamz18ERfp8tmgg==", "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "@anthropic-ai/sdk": "^0.73.0", + "@aws-sdk/client-bedrock-runtime": "^3.983.0", + "@google/genai": "^1.40.0", + "@mistralai/mistralai": "1.14.1", + "@sinclair/typebox": "^0.34.41", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "chalk": "^5.6.2", + "openai": "6.26.0", + "partial-json": "^0.1.7", + "proxy-agent": "^6.5.0", + "undici": "^7.19.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "pi-ai": "dist/cli.js" + }, "engines": { - "node": ">=18" + "node": ">=20.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/@mariozechner/pi-coding-agent": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-coding-agent/-/pi-coding-agent-0.57.1.tgz", + "integrity": "sha512-u5MQEduj68rwVIsRsqrWkJYiJCyPph/a6bMoJAQKo1sb+Pc17Y/ojwa+wGssnUMjEB38AQKofWTVe8NFEpSWNw==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@mariozechner/jiti": "^2.6.2", + "@mariozechner/pi-agent-core": "^0.57.1", + "@mariozechner/pi-ai": "^0.57.1", + "@mariozechner/pi-tui": "^0.57.1", + "@silvia-odwyer/photon-node": "^0.3.4", + "chalk": "^5.5.0", + "cli-highlight": "^2.1.11", + "diff": "^8.0.2", + "extract-zip": "^2.0.1", + "file-type": "^21.1.1", + "glob": "^13.0.1", + "hosted-git-info": "^9.0.2", + "ignore": "^7.0.5", + "marked": "^15.0.12", + "minimatch": "^10.2.3", + "proper-lockfile": "^4.1.2", + "strip-ansi": "^7.1.0", + "undici": "^7.19.1", + "yaml": "^2.8.2" + }, + "bin": { + "pi": "dist/cli.js" + }, "engines": { - "node": ">=18" + "node": ">=20.6.0" + }, + "optionalDependencies": { + "@mariozechner/clipboard": "^0.3.2" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/@mariozechner/pi-tui": { + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@mariozechner/pi-tui/-/pi-tui-0.57.1.tgz", + "integrity": "sha512-cjoRghLbeAHV0tTJeHgZXaryUi5zzBZofeZ7uJun1gztnckLLRjoVeaPTujNlc5BIfyKvFqhh1QWCZng/MXlpg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@types/mime-types": "^2.1.4", + "chalk": "^5.5.0", + "get-east-asian-width": "^1.3.0", + "marked": "^15.0.12", + "mime-types": "^3.0.1" + }, "engines": { - "node": ">=18" + "node": ">=20.0.0" + }, + "optionalDependencies": { + "koffi": "^2.9.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/agent-base": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-8.0.0.tgz", + "integrity": "sha512-QT8i0hCz6C/KQ+KTAbSNwCHDGdmUJl2tp2ZpNlGSWCfhUNVbYG2WLE3MdZGBAgXPV4GAvjGMxo+C1hroyxmZEg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": ">= 14" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@chrysb/alphaclaw/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.6.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=18" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 0.8" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/https-proxy-agent": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-8.0.0.tgz", + "integrity": "sha512-YYeW+iCnAS3xhvj2dvVoWgsbca3RfQy/IlaNHHOtDmU0jMqPI9euIq3Y9BJETdxk16h9NHHCKqp/KB9nIMStCQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "agent-base": "8.0.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=18" + "node": ">= 14" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=18" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "minipass": "^7.1.2" + }, "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/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==", + "license": "MIT" + }, + "node_modules/@chrysb/alphaclaw/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/openclaw": { + "version": "2026.3.11", + "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.3.11.tgz", + "integrity": "sha512-bxwiBmHPakwfpY5tqC9lrV5TCu5PKf0c1bHNc3nhrb+pqKcPEWV4zOjDVFLQUHr98ihgWA+3pacy4b3LQ8wduQ==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "dependencies": { + "@agentclientprotocol/sdk": "0.16.1", + "@aws-sdk/client-bedrock": "^3.1007.0", + "@buape/carbon": "0.0.0-beta-20260216184201", + "@clack/prompts": "^1.1.0", + "@discordjs/voice": "^0.19.1", + "@grammyjs/runner": "^2.0.3", + "@grammyjs/transformer-throttler": "^1.2.1", + "@homebridge/ciao": "^1.3.5", + "@larksuiteoapi/node-sdk": "^1.59.0", + "@line/bot-sdk": "^10.6.0", + "@lydell/node-pty": "1.2.0-beta.3", + "@mariozechner/pi-agent-core": "0.57.1", + "@mariozechner/pi-ai": "0.57.1", + "@mariozechner/pi-coding-agent": "0.57.1", + "@mariozechner/pi-tui": "0.57.1", + "@mozilla/readability": "^0.6.0", + "@sinclair/typebox": "0.34.48", + "@slack/bolt": "^4.6.0", + "@slack/web-api": "^7.14.1", + "@whiskeysockets/baileys": "7.0.0-rc.9", + "ajv": "^8.18.0", + "chalk": "^5.6.2", + "chokidar": "^5.0.0", + "cli-highlight": "^2.1.11", + "commander": "^14.0.3", + "croner": "^10.0.1", + "discord-api-types": "^0.38.42", + "dotenv": "^17.3.1", + "express": "^5.2.1", + "file-type": "^21.3.1", + "grammy": "^1.41.1", + "hono": "4.12.7", + "https-proxy-agent": "^8.0.0", + "ipaddr.js": "^2.3.0", + "jiti": "^2.6.1", + "json5": "^2.2.3", + "jszip": "^3.10.1", + "linkedom": "^0.18.12", + "long": "^5.3.2", + "markdown-it": "^14.1.1", + "node-edge-tts": "^1.2.10", + "opusscript": "^0.1.1", + "osc-progress": "^0.3.0", + "pdfjs-dist": "^5.5.207", + "playwright-core": "1.58.2", + "qrcode-terminal": "^0.12.0", + "sharp": "^0.34.5", + "sqlite-vec": "0.1.7-alpha.2", + "tar": "7.5.11", + "tslog": "^4.10.2", + "undici": "^7.22.0", + "ws": "^8.19.0", + "yaml": "^2.8.2", + "zod": "^4.3.6" + }, + "bin": { + "openclaw": "openclaw.mjs" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" + }, + "peerDependencies": { + "@napi-rs/canvas": "^0.1.89", + "node-llama-cpp": "3.16.2" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/openclaw/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.10" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@chrysb/alphaclaw/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@google/genai": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.45.0.tgz", - "integrity": "sha512-+sNRWhKiRibVgc4OKi7aBJJ0A7RcoVD8tGG+eFkqxAWRjASDW+ktS9lLwTDnAxZICzCVoeAdu8dYLJVTX60N9w==", - "license": "Apache-2.0", + "node_modules/@chrysb/alphaclaw/node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "google-auth-library": "^10.3.0", - "p-retry": "^4.6.2", - "protobufjs": "^7.5.4", - "ws": "^8.18.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.25.2" - }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@grammyjs/runner": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@grammyjs/runner/-/runner-2.0.3.tgz", - "integrity": "sha512-nckmTs1dPWfVQteK9cxqxzE+0m1VRvluLWB8UgFzsjg62w3qthPJt0TYtJBEdG7OedvfQq4vnFAyE6iaMkR42A==", + "node_modules/@chrysb/alphaclaw/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { - "node": ">=12.20.0 || >=14.13.1" - }, - "peerDependencies": { - "grammy": "^1.13.1" + "node": ">= 0.6" } }, - "node_modules/@grammyjs/transformer-throttler": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@grammyjs/transformer-throttler/-/transformer-throttler-1.2.1.tgz", - "integrity": "sha512-CpWB0F3rJdUiKsq7826QhQsxbZi4wqfz1ccKX+fr+AOC+o8K7ZvS+wqX0suSu1QCsyUq2MDpNiKhyL2ZOJUS4w==", + "node_modules/@chrysb/alphaclaw/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.1.0.tgz", + "integrity": "sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==", "license": "MIT", "dependencies": { - "bottleneck": "^2.0.0" - }, - "engines": { - "node": "^12.20.0 || >=14.13.1" - }, - "peerDependencies": { - "grammy": "^1.0.0" + "sisteransi": "^1.0.5" } }, - "node_modules/@grammyjs/types": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.25.0.tgz", - "integrity": "sha512-iN9i5p+8ZOu9OMxWNcguojQfz4K/PDyMPOnL7PPCON+SoA/F8OKMH3uR7CVUkYfdNe0GCz8QOzAWrnqusQYFOg==", - "license": "MIT" + "node_modules/@clack/prompts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.1.0.tgz", + "integrity": "sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.1.0", + "sisteransi": "^1.0.5" + } }, - "node_modules/@hapi/boom": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", - "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "node_modules/@cloudflare/workers-types": { + "version": "4.20260120.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260120.0.tgz", + "integrity": "sha512-B8pueG+a5S+mdK3z8oKu1ShcxloZ7qWb68IEyLLaepvdryIbNC7JVPcY0bWsjS56UQVKc5fnyRge3yZIwc9bxw==", + "license": "MIT OR Apache-2.0", + "optional": true + }, + "node_modules/@discordjs/node-pre-gyp": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", + "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { - "@hapi/hoek": "9.x.x" + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" + "node_modules/@discordjs/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } }, - "node_modules/@homebridge/ciao": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.3.5.tgz", - "integrity": "sha512-f7MAw7YuoEYgJEQ1VyRcLHGuVmCpmXi65GVR8CAtPWPqIZf/HFr4vHzVpOfQMpEQw9Pt5uh07guuLt5HE8ruog==", + "node_modules/@discordjs/node-pre-gyp/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "debug": "^4.4.3", - "fast-deep-equal": "^3.1.3", - "source-map-support": "^0.5.21", - "tslib": "^2.8.1" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, - "bin": { - "ciao-bcs": "lib/bonjour-conformance-testing.js" + "engines": { + "node": ">=10" } }, - "node_modules/@homebridge/ciao/node_modules/debug": { + "node_modules/@discordjs/node-pre-gyp/node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -1804,496 +1658,374 @@ } } }, - "node_modules/@homebridge/ciao/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==", - "license": "MIT" - }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.5.tgz", - "integrity": "sha512-xRlzazC+QZwr6z4ixEqYHo9fgwhTZ3xNSdljlKfUFGZSdlvt166DljRELFUfFytlYOYvo3vTisA/AFOuOAzFQQ==", - "license": "MIT", + "node_modules/@discordjs/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "optional": true, "peer": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "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==", + "node_modules/@discordjs/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "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" + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "engines": { + "node": ">= 6" } }, - "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", + "node_modules/@discordjs/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], + "peer": true, + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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", + "node_modules/@discordjs/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "peer": true, + "bin": { + "semver": "bin/semver.js" } }, - "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", + "node_modules/@discordjs/node-pre-gyp/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==", + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "peer": true }, - "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", + "node_modules/@discordjs/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "peer": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, - "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", + "node_modules/@discordjs/node-pre-gyp/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "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", + "node_modules/@discordjs/opus": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.10.0.tgz", + "integrity": "sha512-HHEnSNrSPmFEyndRdQBJN2YE6egyXS9JUnJWyP6jficK0Y+qKMEZXyYTgmzpjrxXP1exM/hKaNP7BRBUEWkU5w==", + "hasInstallScript": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "peer": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.4.5", + "node-addon-api": "^8.1.0" + }, + "engines": { + "node": ">=12.0.0" } }, - "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", + "node_modules/@discordjs/voice": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.19.0.tgz", + "integrity": "sha512-UyX6rGEXzVyPzb1yvjHtPfTlnLvB5jX/stAMdiytHhfoydX+98hfympdOwsnTktzr+IRvphxTbdErgYDJkEsvw==", + "license": "Apache-2.0", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@types/ws": "^8.18.1", + "discord-api-types": "^0.38.16", + "prism-media": "^1.3.5", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=22.12.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "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", + "node_modules/@discordjs/voice/node_modules/opusscript": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz", + "integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "peer": true }, - "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", + "node_modules/@discordjs/voice/node_modules/prism-media": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.5.tgz", + "integrity": "sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==", + "license": "Apache-2.0", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@discordjs/opus": ">=0.8.0 <1.0.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } } }, - "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==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "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", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "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" - ], + "node_modules/@google/genai": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.45.0.tgz", + "integrity": "sha512-+sNRWhKiRibVgc4OKi7aBJJ0A7RcoVD8tGG+eFkqxAWRjASDW+ktS9lLwTDnAxZICzCVoeAdu8dYLJVTX60N9w==", "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "google-auth-library": "^10.3.0", + "p-retry": "^4.6.2", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } } }, - "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" + "node_modules/@grammyjs/runner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@grammyjs/runner/-/runner-2.0.3.tgz", + "integrity": "sha512-nckmTs1dPWfVQteK9cxqxzE+0m1VRvluLWB8UgFzsjg62w3qthPJt0TYtJBEdG7OedvfQq4vnFAyE6iaMkR42A==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=12.20.0 || >=14.13.1" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "peerDependencies": { + "grammy": "^1.13.1" } }, - "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" + "node_modules/@grammyjs/transformer-throttler": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@grammyjs/transformer-throttler/-/transformer-throttler-1.2.1.tgz", + "integrity": "sha512-CpWB0F3rJdUiKsq7826QhQsxbZi4wqfz1ccKX+fr+AOC+o8K7ZvS+wqX0suSu1QCsyUq2MDpNiKhyL2ZOJUS4w==", + "license": "MIT", + "dependencies": { + "bottleneck": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": "^12.20.0 || >=14.13.1" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" + "peerDependencies": { + "grammy": "^1.0.0" } }, - "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/@grammyjs/types": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.25.0.tgz", + "integrity": "sha512-iN9i5p+8ZOu9OMxWNcguojQfz4K/PDyMPOnL7PPCON+SoA/F8OKMH3uR7CVUkYfdNe0GCz8QOzAWrnqusQYFOg==", + "license": "MIT" + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "9.x.x" } }, - "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" + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@homebridge/ciao": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.3.5.tgz", + "integrity": "sha512-f7MAw7YuoEYgJEQ1VyRcLHGuVmCpmXi65GVR8CAtPWPqIZf/HFr4vHzVpOfQMpEQw9Pt5uh07guuLt5HE8ruog==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "fast-deep-equal": "^3.1.3", + "source-map-support": "^0.5.21", + "tslib": "^2.8.1" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "bin": { + "ciao-bcs": "lib/bonjour-conformance-testing.js" } }, - "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" + "node_modules/@homebridge/ciao/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=6.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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" - ], + "node_modules/@homebridge/ciao/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==", + "license": "MIT" + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=18.14.1" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "peerDependencies": { + "hono": "^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" - ], + "node_modules/@huggingface/jinja": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.5.tgz", + "integrity": "sha512-xRlzazC+QZwr6z4ixEqYHo9fgwhTZ3xNSdljlKfUFGZSdlvt166DljRELFUfFytlYOYvo3vTisA/AFOuOAzFQQ==", + "license": "MIT", + "peer": true, "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": ">=18" } }, - "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" - }, + "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.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=18" } }, - "node_modules/@img/sharp-win32-arm64": { + "node_modules/@img/sharp-darwin-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==", + "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 AND LGPL-3.0-or-later", + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "darwin" ], "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" + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "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==", + "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": [ - "x64" + "arm64" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "win32" + "darwin" ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, "funding": { "url": "https://opencollective.com/libvips" } @@ -2422,7 +2154,6 @@ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "debug": "^4.1.1" @@ -2433,7 +2164,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "ms": "^2.1.3" @@ -2452,7 +2182,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/@kwsites/promise-deferred": { @@ -2460,7 +2189,6 @@ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/@larksuiteoapi/node-sdk": { @@ -2535,71 +2263,6 @@ "darwin" ] }, - "node_modules/@lydell/node-pty-darwin-x64": { - "version": "1.2.0-beta.3", - "resolved": "https://registry.npmjs.org/@lydell/node-pty-darwin-x64/-/node-pty-darwin-x64-1.2.0-beta.3.tgz", - "integrity": "sha512-k38O+UviWrWdxtqZBBc/D8NJU11Rey8Y2YMwSWNxLv3eXZZdF5IVpbBkI/2RmLsV5nCcciqLPbukxeZnEfPlwA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lydell/node-pty-linux-arm64": { - "version": "1.2.0-beta.3", - "resolved": "https://registry.npmjs.org/@lydell/node-pty-linux-arm64/-/node-pty-linux-arm64-1.2.0-beta.3.tgz", - "integrity": "sha512-HUwRpGu3O+4sv9DAQFKnyW5LYhyYu2SDUa/bdFO/t4dIFCM4uDJEq47wfRM7+aYtJTi1b3lakN8SlWeuFQqJQQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lydell/node-pty-linux-x64": { - "version": "1.2.0-beta.3", - "resolved": "https://registry.npmjs.org/@lydell/node-pty-linux-x64/-/node-pty-linux-x64-1.2.0-beta.3.tgz", - "integrity": "sha512-+RRY0PoCUeQaCvPR7/UnkGbxulwbFtoTWJfe+o4T1RcNtngrgaI55I9nl8CD8uqhGrB3smKuyvPM5UtwGhASUw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lydell/node-pty-win32-arm64": { - "version": "1.2.0-beta.3", - "resolved": "https://registry.npmjs.org/@lydell/node-pty-win32-arm64/-/node-pty-win32-arm64-1.2.0-beta.3.tgz", - "integrity": "sha512-UEDd9ASp2M3iIYpIzfmfBlpyn4+K1G4CAjYcHWStptCkefoSVXWTiUBIa1KjBjZi3/xmsHIDpBEYTkGWuvLt2Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lydell/node-pty-win32-x64": { - "version": "1.2.0-beta.3", - "resolved": "https://registry.npmjs.org/@lydell/node-pty-win32-x64/-/node-pty-win32-x64-1.2.0-beta.3.tgz", - "integrity": "sha512-TpdqSFYx7/Rj+68tuP6F/lkRYrHCYAIJgaS1bx3SctTkb5QAQCFwOKHd4xlsivmEOMT2LdhkJggPxwX9PAO5pQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@mariozechner/clipboard": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@mariozechner/clipboard/-/clipboard-0.3.2.tgz", @@ -2651,134 +2314,6 @@ "node": ">= 10" } }, - "node_modules/@mariozechner/clipboard-darwin-x64": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-x64/-/clipboard-darwin-x64-0.3.2.tgz", - "integrity": "sha512-U1BcVEoidvwIp95+HJswSW+xr28EQiHR7rZjH6pn8Sja5yO4Yoe3yCN0Zm8Lo72BbSOK/fTSq0je7CJpaPCspg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-linux-arm64-gnu": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-arm64-gnu/-/clipboard-linux-arm64-gnu-0.3.2.tgz", - "integrity": "sha512-BsinwG3yWTIjdgNCxsFlip7LkfwPk+ruw/aFCXHUg/fb5XC/Ksp+YMQ7u0LUtiKzIv/7LMXgZInJQH6gxbAaqQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-linux-arm64-musl": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-arm64-musl/-/clipboard-linux-arm64-musl-0.3.2.tgz", - "integrity": "sha512-0/Gi5Xq2V6goXBop19ePoHvXsmJD9SzFlO3S+d6+T2b+BlPcpOu3Oa0wTjl+cZrLAAEzA86aPNBI+VVAFDFPKw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-linux-riscv64-gnu": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-riscv64-gnu/-/clipboard-linux-riscv64-gnu-0.3.2.tgz", - "integrity": "sha512-2AFFiXB24qf0zOZsxI1GJGb9wQGlOJyN6UwoXqmKS3dpQi/l6ix30IzDDA4c4ZcCcx4D+9HLYXhC1w7Sov8pXA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-linux-x64-gnu": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-x64-gnu/-/clipboard-linux-x64-gnu-0.3.2.tgz", - "integrity": "sha512-v6fVnsn7WMGg73Dab8QMwyFce7tzGfgEixKgzLP8f1GJqkJZi5zO4k4FOHzSgUufgLil63gnxvMpjWkgfeQN7A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-linux-x64-musl": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-x64-musl/-/clipboard-linux-x64-musl-0.3.2.tgz", - "integrity": "sha512-xVUtnoMQ8v2JVyfJLKKXACA6avdnchdbBkTsZs8BgJQo29qwCp5NIHAUO8gbJ40iaEGToW5RlmVk2M9V0HsHEw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-win32-arm64-msvc": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-win32-arm64-msvc/-/clipboard-win32-arm64-msvc-0.3.2.tgz", - "integrity": "sha512-AEgg95TNi8TGgak2wSXZkXKCvAUTjWoU1Pqb0ON7JHrX78p616XUFNTJohtIon3e0w6k0pYPZeCuqRCza/Tqeg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mariozechner/clipboard-win32-x64-msvc": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-win32-x64-msvc/-/clipboard-win32-x64-msvc-0.3.2.tgz", - "integrity": "sha512-tGRuYpZwDOD7HBrCpyRuhGnHHSCknELvqwKKUG4JSfSB7JIU7LKRh6zx6fMUOQd8uISK35TjFg5UcNih+vJhFA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@mariozechner/jiti": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@mariozechner/jiti/-/jiti-2.6.5.tgz", @@ -3290,26 +2825,6 @@ "@napi-rs/canvas-win32-x64-msvc": "0.1.95" } }, - "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.95.tgz", - "integrity": "sha512-SqTh0wsYbetckMXEvHqmR7HKRJujVf1sYv1xdlhkifg6TlCSysz1opa49LlS3+xWuazcQcfRfmhA07HxxxGsAA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, "node_modules/@napi-rs/canvas-darwin-arm64": { "version": "0.1.95", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.95.tgz", @@ -3330,840 +2845,412 @@ "url": "https://github.com/sponsors/Brooooooklyn" } }, - "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.95.tgz", - "integrity": "sha512-54eb2Ho15RDjYGXO/harjRznBrAvu+j5nQ85Z4Qd6Qg3slR8/Ja+Yvvy9G4yo7rdX6NR9GPkZeSTf2UcKXwaXw==", - "cpu": [ - "x64" - ], + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": "^14.21.3 || >=16" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.95.tgz", - "integrity": "sha512-hYaLCSLx5bmbnclzQc3ado3PgZ66blJWzjXp0wJmdwpr/kH+Mwhj6vuytJIomgksyJoCdIqIa4N6aiqBGJtJ5Q==", + "node_modules/@node-llama-cpp/mac-arm64-metal": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-arm64-metal/-/mac-arm64-metal-3.16.2.tgz", + "integrity": "sha512-nEZ74qB0lUohF88yR741YUrUqz/qD+FJFzUTHj0FwxAynSZCjvwtzEDtavRlh3qd3yLD/0ChNn00/RQ54ISImw==", "cpu": [ - "arm" + "arm64", + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], + "peer": true, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "node": ">=20.0.0" } }, - "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.95.tgz", - "integrity": "sha512-J7VipONahKsmScPZsipHVQBqpbZx4favaD8/enWzzlGcjiwycOoymL7f4tNeqdjK0su19bDOUt6mjp9gsPWYlw==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/app": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", + "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "peer": true, + "dependencies": { + "@octokit/auth-app": "^8.1.2", + "@octokit/auth-unauthenticated": "^7.0.3", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "engines": { + "node": ">= 20" } }, - "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.95.tgz", - "integrity": "sha512-PXy0UT1J/8MPG8UAkWp6Fd51ZtIZINFzIjGH909JjQrtCuJf3X6nanHYdz1A+Wq9o4aoPAw1YEUpFS1lelsVlg==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/auth-app": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.2.0.tgz", + "integrity": "sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "peer": true, + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "toad-cache": "^3.7.0", + "universal-github-app-jwt": "^2.2.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "engines": { + "node": ">= 20" } }, - "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.95.tgz", - "integrity": "sha512-2IzCkW2RHRdcgF9W5/plHvYFpc6uikyjMb5SxjqmNxfyDFz9/HB89yhi8YQo0SNqrGRI7yBVDec7Pt+uMyRWsg==", - "cpu": [ - "riscv64" - ], + "node_modules/@octokit/auth-oauth-app": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", + "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "peer": true, + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.95.tgz", - "integrity": "sha512-OV/ol/OtcUr4qDhQg8G7SdViZX8XyQeKpPsVv/j3+7U178FGoU4M+yIocdVo1ih/A8GQ63+LjF4jDoEjaVU8Pw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "node": ">= 20" } }, - "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.95.tgz", - "integrity": "sha512-Z5KzqBK/XzPz5+SFHKz7yKqClEQ8pOiEDdgk5SlphBLVNb8JFIJkxhtJKSvnJyHh2rjVgiFmvtJzMF0gNwwKyQ==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/auth-oauth-device": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", + "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "peer": true, + "dependencies": { + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "engines": { + "node": ">= 20" } }, - "node_modules/@napi-rs/canvas-win32-arm64-msvc": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.95.tgz", - "integrity": "sha512-aj0YbRpe8qVJ4OzMsK7NfNQePgcf9zkGFzNZ9mSuaxXzhpLHmlF2GivNdCdNOg8WzA/NxV6IU4c5XkXadUMLeA==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/auth-oauth-user": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", + "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "peer": true, + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "engines": { + "node": ">= 20" } }, - "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.95", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.95.tgz", - "integrity": "sha512-GA8leTTCfdjuHi8reICTIxU0081PhXvl3lzIniLUjeLACx9GubUiyzkwFb+oyeKLS5IAGZFLKnzAf4wm2epRlA==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "peer": true, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "node": ">= 20" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "node_modules/@octokit/auth-unauthenticated": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", + "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "engines": { + "node": ">= 20" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" + "peer": true, + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">= 20" } }, - "node_modules/@node-llama-cpp/linux-arm64": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-arm64/-/linux-arm64-3.16.2.tgz", - "integrity": "sha512-CxzgPsS84wL3W5sZRgxP3c9iJKEW+USrak1SmX6EAJxW/v9QGzehvT6W/aR1FyfidiIyQtOp3ga0Gg/9xfJPGw==", - "cpu": [ - "arm64", - "x64" - ], + "node_modules/@octokit/endpoint": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, + "dependencies": { + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" + }, "engines": { - "node": ">=20.0.0" + "node": ">= 20" } }, - "node_modules/@node-llama-cpp/linux-armv7l": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-armv7l/-/linux-armv7l-3.16.2.tgz", - "integrity": "sha512-9G6W/MkQ/DLwGmpcj143NQ50QJg5gQZfzVf5RYx77VczBqhgwkgYHILekYrOs4xanOeqeJ8jnOnQQSp1YaJZUg==", - "cpu": [ - "arm", - "x64" - ], + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, + "dependencies": { + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, "engines": { - "node": ">=20.0.0" + "node": ">= 20" } }, - "node_modules/@node-llama-cpp/linux-x64": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64/-/linux-x64-3.16.2.tgz", - "integrity": "sha512-OXYf8rVfoDyvN+YrfKk8F9An9a5GOxVIM8OcR1U911tc0oRNf8yfJrQ8KrM75R26gwq0Y6YZwVTP0vRCInwWOw==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/oauth-app": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", + "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.2", + "@octokit/auth-oauth-user": "^6.0.1", + "@octokit/auth-unauthenticated": "^7.0.2", + "@octokit/core": "^7.0.5", + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/oauth-methods": "^6.0.1", + "@types/aws-lambda": "^8.10.83", + "universal-user-agent": "^7.0.0" + }, "engines": { - "node": ">=20.0.0" + "node": ">= 20" } }, - "node_modules/@node-llama-cpp/linux-x64-cuda": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-cuda/-/linux-x64-cuda-3.16.2.tgz", - "integrity": "sha512-LTBQFqjin7tyrLNJz0XWTB5QAHDsZV71/qiiRRjXdBKSZHVVaPLfdgxypGu7ggPeBNsv+MckRXdlH5C7yMtE4A==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/oauth-authorization-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", + "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, "engines": { - "node": ">=20.0.0" + "node": ">= 20" } }, - "node_modules/@node-llama-cpp/linux-x64-cuda-ext": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-cuda-ext/-/linux-x64-cuda-ext-3.16.2.tgz", - "integrity": "sha512-47d9myCJauZyzAlN7IK1eIt/4CcBMslF+yHy4q+yJotD/RV/S6qRpK2kGn+ybtdVjkPGNCoPkHKcyla9iIVjbw==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/oauth-methods": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", + "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, + "dependencies": { + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, "engines": { - "node": ">=20.0.0" + "node": ">= 20" } }, - "node_modules/@node-llama-cpp/linux-x64-vulkan": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-vulkan/-/linux-x64-vulkan-3.16.2.tgz", - "integrity": "sha512-HDLAw4ZhwJuhKuF6n4x520yZXAQZahUOXtCGvPubjfpmIOElKrfDvCVlRsthAP0JwcwINzIQlVys3boMIXfBgw==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/openapi-webhooks-types": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", + "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/plugin-paginate-graphql": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz", + "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, "engines": { - "node": ">=20.0.0" + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/@node-llama-cpp/mac-arm64-metal": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-arm64-metal/-/mac-arm64-metal-3.16.2.tgz", - "integrity": "sha512-nEZ74qB0lUohF88yR741YUrUqz/qD+FJFzUTHj0FwxAynSZCjvwtzEDtavRlh3qd3yLD/0ChNn00/RQ54ISImw==", - "cpu": [ - "arm64", - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/mac-x64": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-x64/-/mac-x64-3.16.2.tgz", - "integrity": "sha512-BjA+DgeDt+kRxVMV6kChb9XVXm7U5b90jUif7Z/s6ZXtOOnV6exrTM2W09kbSqAiNhZmctcVY83h2dwNTZ/yIw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-arm64": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-arm64/-/win-arm64-3.16.2.tgz", - "integrity": "sha512-XHNFQzUjYODtkZjIn4NbQVrBtGB9RI9TpisiALryqfrIqagQmjBh6dmxZWlt5uduKAfT7M2/2vrABGR490FACA==", - "cpu": [ - "arm64", - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64/-/win-x64-3.16.2.tgz", - "integrity": "sha512-etrivzbyLNVhZlUosFW8JSL0OSiuKQf9qcI3dNdehD907sHquQbBJrG7lXcdL6IecvXySp3oAwCkM87VJ0b3Fg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64-cuda": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-cuda/-/win-x64-cuda-3.16.2.tgz", - "integrity": "sha512-jStDELHrU3rKQMOk5Hs5bWEazyjE2hzHwpNf6SblOpaGkajM/HJtxEZoL0mLHJx5qeXs4oOVkr7AzuLy0WPpNA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64-cuda-ext": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-cuda-ext/-/win-x64-cuda-ext-3.16.2.tgz", - "integrity": "sha512-sdv4Kzn9bOQWNBRvw6B/zcn8dQRfZhjIHv5AfDBIOfRlSCgjebFpBeYUoU4wZPpjr3ISwcqO5MEWsw+AbUdV3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64-vulkan": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-vulkan/-/win-x64-vulkan-3.16.2.tgz", - "integrity": "sha512-9xuHFCOhCQjZgQSFrk79EuSKn9nGWt/SAq/3wujQSQLtgp8jGdtZgwcmuDUoemInf10en2dcOmEt7t8dQdC3XA==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "peer": true, + "dependencies": { + "@octokit/types": "^16.0.0" + }, "engines": { - "node": ">=20.0.0" + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/@octokit/app": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", - "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { - "@octokit/auth-app": "^8.1.2", - "@octokit/auth-unauthenticated": "^7.0.3", - "@octokit/core": "^7.0.6", - "@octokit/oauth-app": "^8.0.3", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/types": "^16.0.0", - "@octokit/webhooks": "^14.0.0" + "@octokit/types": "^16.0.0" }, "engines": { "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/@octokit/auth-app": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.2.0.tgz", - "integrity": "sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==", + "node_modules/@octokit/plugin-retry": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", + "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { - "@octokit/auth-oauth-app": "^9.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", - "toad-cache": "^3.7.0", - "universal-github-app-jwt": "^2.2.0", - "universal-user-agent": "^7.0.0" + "bottleneck": "^2.15.3" }, "engines": { "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=7" } }, - "node_modules/@octokit/auth-oauth-app": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", - "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", + "node_modules/@octokit/plugin-throttling": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" + "bottleneck": "^2.15.3" }, "engines": { "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": "^7.0.0" } }, - "node_modules/@octokit/auth-oauth-device": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", - "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", + "node_modules/@octokit/request": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", + "@octokit/endpoint": "^11.0.3", + "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" + "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", + "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 20" } }, - "node_modules/@octokit/auth-oauth-user": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", - "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" + "@octokit/types": "^16.0.0" }, "engines": { "node": ">= 20" } }, - "node_modules/@octokit/auth-token": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "license": "MIT", - "optional": true, "peer": true, - "engines": { - "node": ">= 20" + "dependencies": { + "@octokit/openapi-types": "^27.0.0" } }, - "node_modules/@octokit/auth-unauthenticated": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", - "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", + "node_modules/@octokit/webhooks": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.2.0.tgz", + "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" + "@octokit/openapi-webhooks-types": "12.1.0", + "@octokit/request-error": "^7.0.0", + "@octokit/webhooks-methods": "^6.0.0" }, "engines": { "node": ">= 20" } }, - "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "node_modules/@octokit/webhooks-methods": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", + "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", "license": "MIT", - "optional": true, "peer": true, - "dependencies": { - "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "before-after-hook": "^4.0.0", - "universal-user-agent": "^7.0.0" - }, "engines": { "node": ">= 20" } }, - "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/oauth-app": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", - "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/auth-oauth-app": "^9.0.2", - "@octokit/auth-oauth-user": "^6.0.1", - "@octokit/auth-unauthenticated": "^7.0.2", - "@octokit/core": "^7.0.5", - "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/oauth-methods": "^6.0.1", - "@types/aws-lambda": "^8.10.83", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/oauth-authorization-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", - "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/oauth-methods": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", - "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@octokit/openapi-webhooks-types": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", - "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@octokit/plugin-paginate-graphql": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz", - "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", - "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", - "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", - "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=7" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/types": "^16.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": "^7.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", - "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "fast-content-type-parse": "^3.0.0", - "json-with-bigint": "^3.5.3", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^27.0.0" - } - }, - "node_modules/@octokit/webhooks": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.2.0.tgz", - "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@octokit/openapi-webhooks-types": "12.1.0", - "@octokit/request-error": "^7.0.0", - "@octokit/webhooks-methods": "^6.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/webhooks-methods": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", - "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" + "@noble/hashes": "^1.1.5" } }, "node_modules/@pinojs/redact": { @@ -4243,514 +3330,59 @@ "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@reflink/reflink": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink/-/reflink-0.1.19.tgz", - "integrity": "sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@reflink/reflink-darwin-arm64": "0.1.19", - "@reflink/reflink-darwin-x64": "0.1.19", - "@reflink/reflink-linux-arm64-gnu": "0.1.19", - "@reflink/reflink-linux-arm64-musl": "0.1.19", - "@reflink/reflink-linux-x64-gnu": "0.1.19", - "@reflink/reflink-linux-x64-musl": "0.1.19", - "@reflink/reflink-win32-arm64-msvc": "0.1.19", - "@reflink/reflink-win32-x64-msvc": "0.1.19" - } - }, - "node_modules/@reflink/reflink-darwin-arm64": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-arm64/-/reflink-darwin-arm64-0.1.19.tgz", - "integrity": "sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-darwin-x64": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-x64/-/reflink-darwin-x64-0.1.19.tgz", - "integrity": "sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-arm64-gnu": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-arm64-gnu/-/reflink-linux-arm64-gnu-0.1.19.tgz", - "integrity": "sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-arm64-musl": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-arm64-musl/-/reflink-linux-arm64-musl-0.1.19.tgz", - "integrity": "sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-x64-gnu": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-x64-gnu/-/reflink-linux-x64-gnu-0.1.19.tgz", - "integrity": "sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-x64-musl": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-x64-musl/-/reflink-linux-x64-musl-0.1.19.tgz", - "integrity": "sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-win32-arm64-msvc": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-win32-arm64-msvc/-/reflink-win32-arm64-msvc-0.1.19.tgz", - "integrity": "sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-win32-x64-msvc": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-win32-x64-msvc/-/reflink-win32-x64-msvc-0.1.19.tgz", - "integrity": "sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@reflink/reflink": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink/-/reflink-0.1.19.tgz", + "integrity": "sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==", "license": "MIT", "optional": true, - "os": [ - "openharmony" - ] + "peer": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@reflink/reflink-darwin-arm64": "0.1.19", + "@reflink/reflink-darwin-x64": "0.1.19", + "@reflink/reflink-linux-arm64-gnu": "0.1.19", + "@reflink/reflink-linux-arm64-musl": "0.1.19", + "@reflink/reflink-linux-x64-gnu": "0.1.19", + "@reflink/reflink-linux-x64-musl": "0.1.19", + "@reflink/reflink-win32-arm64-msvc": "0.1.19", + "@reflink/reflink-win32-x64-msvc": "0.1.19" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "node_modules/@reflink/reflink-darwin-arm64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-arm64/-/reflink-darwin-arm64-0.1.19.tgz", + "integrity": "sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==", "cpu": [ "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" + "darwin" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true, + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, "node_modules/@silvia-odwyer/photon-node": { @@ -5754,335 +4386,127 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", - "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", - "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.5.19", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", - "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.4.16", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@snazzah/davey": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey/-/davey-0.1.10.tgz", - "integrity": "sha512-J5f7vV5/tnj0xGnqufFRd6qiWn3FcR3iXjpjpEmO2Ok+Io0AASkMaZ3I39TsL45as0Qo5bq9wWuamFQ77PjJ+g==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "funding": { - "url": "https://github.com/sponsors/Snazzah" - }, - "optionalDependencies": { - "@snazzah/davey-android-arm-eabi": "0.1.10", - "@snazzah/davey-android-arm64": "0.1.10", - "@snazzah/davey-darwin-arm64": "0.1.10", - "@snazzah/davey-darwin-x64": "0.1.10", - "@snazzah/davey-freebsd-x64": "0.1.10", - "@snazzah/davey-linux-arm-gnueabihf": "0.1.10", - "@snazzah/davey-linux-arm64-gnu": "0.1.10", - "@snazzah/davey-linux-arm64-musl": "0.1.10", - "@snazzah/davey-linux-x64-gnu": "0.1.10", - "@snazzah/davey-linux-x64-musl": "0.1.10", - "@snazzah/davey-wasm32-wasi": "0.1.10", - "@snazzah/davey-win32-arm64-msvc": "0.1.10", - "@snazzah/davey-win32-ia32-msvc": "0.1.10", - "@snazzah/davey-win32-x64-msvc": "0.1.10" - } - }, - "node_modules/@snazzah/davey-android-arm-eabi": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-android-arm-eabi/-/davey-android-arm-eabi-0.1.10.tgz", - "integrity": "sha512-7bwHxSNEI2wVXOT6xnmpnO9SHb2xwAnf9oEdL45dlfVHTgU1Okg5rwGwRvZ2aLVFFbTyecfC8EVZyhpyTkjLSw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@snazzah/davey-android-arm64": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-android-arm64/-/davey-android-arm64-0.1.10.tgz", - "integrity": "sha512-68WUf2LQwQTP9MgPcCqTWwJztJSIk0keGfF2Y/b+MihSDh29fYJl7C0rbz69aUrVCvCC2lYkB/46P8X1kBz7yg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@snazzah/davey-darwin-arm64": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-darwin-arm64/-/davey-darwin-arm64-0.1.10.tgz", - "integrity": "sha512-nYC+DWCGUC1jUGEenCNQE/jJpL/02m0ebY/NvTCQbul5ktI/ShVzgA3kzssEhZvhf6jbH048Rs39wDhp/b24Jg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@snazzah/davey-darwin-x64": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-darwin-x64/-/davey-darwin-x64-0.1.10.tgz", - "integrity": "sha512-0q5Rrcs+O9sSSnPX+A3R3djEQs2nTAtMe5N3lApO6lZas/QNMl6wkEWCvTbDc2cfAYBMSk2jgc1awlRXi4LX3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@snazzah/davey-freebsd-x64": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-freebsd-x64/-/davey-freebsd-x64-0.1.10.tgz", - "integrity": "sha512-/Gq5YDD6Oz8iBqVJLswUnetCv9JCRo1quYX5ujzpAG8zPCNItZo4g4h5p9C+h4Yoay2quWBYhoaVqQKT96bm8g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@snazzah/davey-linux-arm-gnueabihf": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-linux-arm-gnueabihf/-/davey-linux-arm-gnueabihf-0.1.10.tgz", - "integrity": "sha512-0Z7Vrt0WIbgxws9CeHB9qlueYJlvltI44rUuZmysdi70UcHGxlr7nE3MnzYCr9nRWRegohn8EQPWHMKMDJH2GA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@snazzah/davey-linux-arm64-gnu": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-linux-arm64-gnu/-/davey-linux-arm64-gnu-0.1.10.tgz", - "integrity": "sha512-xhZQycn4QB+qXhqm/QmZ+kb9MHMXcbjjoPfvcIL4WMQXFG/zUWHW8EiBk7ZTEGMOpeab3F9D1+MlgumglYByUQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@snazzah/davey-linux-arm64-musl": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-linux-arm64-musl/-/davey-linux-arm64-musl-0.1.10.tgz", - "integrity": "sha512-pudzQCP9rZItwW4qHHvciMwtNd9kWH4l73g6Id1LRpe6sc8jiFBV7W+YXITj2PZbI0by6XPfkRP6Dk5IkGOuAw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@smithy/util-retry": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@snazzah/davey-linux-x64-gnu": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-linux-x64-gnu/-/davey-linux-x64-gnu-0.1.10.tgz", - "integrity": "sha512-DC8qRmk+xJEFNqjxKB46cETKeDQqgUqE5p39KXS2k6Vl/XTi8pw8pXOxrPfYte5neoqlWAVQzbxuLnwpyRJVEQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@smithy/util-stream": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", + "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@snazzah/davey-linux-x64-musl": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-linux-x64-musl/-/davey-linux-x64-musl-0.1.10.tgz", - "integrity": "sha512-wPR5/2QmsF7sR0WUaCwbk4XI3TLcxK9PVK8mhgcAYyuRpbhcVgNGWXs8ulcyMSXve5pFRJAFAuMTGCEb014peg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@snazzah/davey-wasm32-wasi": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-wasm32-wasi/-/davey-wasm32-wasi-0.1.10.tgz", - "integrity": "sha512-SfQavU+eKTDbRmPeLRodrVSfsWq25PYTmH1nIZW3B27L6IkijzjXZZuxiU1ZG1gdI5fB7mwXrOTtx34t+vAG7Q==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, + "node_modules/@smithy/util-utf8": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "license": "Apache-2.0", "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" + "@smithy/util-buffer-from": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@snazzah/davey-win32-arm64-msvc": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-win32-arm64-msvc/-/davey-win32-arm64-msvc-0.1.10.tgz", - "integrity": "sha512-Raafk53smYs67wZCY9bQXHXzbaiRMS5QCdjTdin3D9fF5A06T/0Zv1z7/YnaN+O3GSL/Ou3RvynF7SziToYiFQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@snazzah/davey-win32-ia32-msvc": { + "node_modules/@snazzah/davey": { "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-win32-ia32-msvc/-/davey-win32-ia32-msvc-0.1.10.tgz", - "integrity": "sha512-pAs43l/DiZ+icqBwxIwNePzuYxFM1ZblVuf7t6vwwSLxvova7vnREnU7qDVjbc5/YTUHOsqYy3S6TpZMzDo2lw==", - "cpu": [ - "ia32" - ], + "resolved": "https://registry.npmjs.org/@snazzah/davey/-/davey-0.1.10.tgz", + "integrity": "sha512-J5f7vV5/tnj0xGnqufFRd6qiWn3FcR3iXjpjpEmO2Ok+Io0AASkMaZ3I39TsL45as0Qo5bq9wWuamFQ77PjJ+g==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { "node": ">= 10" + }, + "funding": { + "url": "https://github.com/sponsors/Snazzah" + }, + "optionalDependencies": { + "@snazzah/davey-android-arm-eabi": "0.1.10", + "@snazzah/davey-android-arm64": "0.1.10", + "@snazzah/davey-darwin-arm64": "0.1.10", + "@snazzah/davey-darwin-x64": "0.1.10", + "@snazzah/davey-freebsd-x64": "0.1.10", + "@snazzah/davey-linux-arm-gnueabihf": "0.1.10", + "@snazzah/davey-linux-arm64-gnu": "0.1.10", + "@snazzah/davey-linux-arm64-musl": "0.1.10", + "@snazzah/davey-linux-x64-gnu": "0.1.10", + "@snazzah/davey-linux-x64-musl": "0.1.10", + "@snazzah/davey-wasm32-wasi": "0.1.10", + "@snazzah/davey-win32-arm64-msvc": "0.1.10", + "@snazzah/davey-win32-ia32-msvc": "0.1.10", + "@snazzah/davey-win32-x64-msvc": "0.1.10" } }, - "node_modules/@snazzah/davey-win32-x64-msvc": { + "node_modules/@snazzah/davey-darwin-arm64": { "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@snazzah/davey-win32-x64-msvc/-/davey-win32-x64-msvc-0.1.10.tgz", - "integrity": "sha512-kr6148VVBoUT4CtD+5hYshTFRny7R/xQZxXFhFc0fYjtmdMVM8Px9M91olg1JFNxuNzdfMfTufR58Q3wfBocug==", + "resolved": "https://registry.npmjs.org/@snazzah/davey-darwin-arm64/-/davey-darwin-arm64-0.1.10.tgz", + "integrity": "sha512-nYC+DWCGUC1jUGEenCNQE/jJpL/02m0ebY/NvTCQbul5ktI/ShVzgA3kzssEhZvhf6jbH048Rs39wDhp/b24Jg==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">= 10" @@ -6100,7 +4524,6 @@ "resolved": "https://registry.npmjs.org/@tinyhttp/content-disposition/-/content-disposition-2.2.4.tgz", "integrity": "sha512-5Kc5CM2Ysn3vTTArBs2vESUt0AQiWZA86yc1TI3B+lxXmtEq133C1nxXNOgnzhrivdPZIh3zLj5gDnZjoLL5GA==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=12.17.0" @@ -6162,22 +4585,11 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/aws-lambda": { "version": "8.10.161", "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/@types/body-parser": { @@ -6660,7 +5072,6 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=14.16" @@ -6774,7 +5185,6 @@ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "retry": "0.13.1" @@ -6849,7 +5259,6 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "license": "Apache-2.0", - "optional": true, "peer": true }, "node_modules/bignumber.js": { @@ -7024,7 +5433,6 @@ "resolved": "https://registry.npmjs.org/chmodrp/-/chmodrp-1.0.2.tgz", "integrity": "sha512-TdngOlFV1FLTzU0o1w8MB6/BFywhtLC0SzRTGJU7T9lmdjlCWeMRt1iVo0Ki+ldwNk0BqNiKoc8xpLZEQ8mY1w==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/chokidar": { @@ -7064,7 +5472,6 @@ } ], "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=8" @@ -7075,7 +5482,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "restore-cursor": "^5.0.0" @@ -7203,7 +5609,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=6" @@ -7252,7 +5657,6 @@ "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-8.0.0.tgz", "integrity": "sha512-YbUP88RDwCvoQkZhRtGURYm9RIpWdtvZuhT87fKNoLjk8kIFIFeARpKfuZQGdwfH99GZpUmqSfcDrK62X7lTgg==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "debug": "^4.4.3", @@ -7277,7 +5681,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "license": "BlueOak-1.0.0", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -7288,7 +5691,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "ms": "^2.1.3" @@ -7307,7 +5709,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "minipass": "^7.1.2" @@ -7321,7 +5722,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/cmake-js/node_modules/tar": { @@ -7329,7 +5729,6 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.10.tgz", "integrity": "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw==", "license": "BlueOak-1.0.0", - "optional": true, "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -7347,7 +5746,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "license": "BlueOak-1.0.0", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -7399,7 +5797,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=14" @@ -7614,7 +6011,6 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=4.0.0" @@ -7851,7 +6247,6 @@ "resolved": "https://registry.npmjs.org/env-var/-/env-var-7.5.0.tgz", "integrity": "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=10" @@ -8211,7 +6606,6 @@ } ], "license": "MIT", - "optional": true, "peer": true }, "node_modules/fast-deep-equal": { @@ -8350,7 +6744,6 @@ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -8364,7 +6757,6 @@ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-6.0.0.tgz", "integrity": "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "filename-reserved-regex": "^3.0.0" @@ -8511,7 +6903,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -9254,7 +7645,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC", - "optional": true, "peer": true }, "node_modules/ip-address": { @@ -9280,7 +7670,6 @@ "resolved": "https://registry.npmjs.org/ipull/-/ipull-3.9.5.tgz", "integrity": "sha512-5w/yZB5lXmTfsvNawmvkCjYo4SJNuKQz/av8TC1UiOyfOHyaM+DReqbpU2XpWYfmY+NIUbRRH8PUAWsxaS+IfA==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "@tinyhttp/content-disposition": "^2.2.0", @@ -9322,7 +7711,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/ipull/node_modules/lifecycle-utils": { @@ -9330,7 +7718,6 @@ "resolved": "https://registry.npmjs.org/lifecycle-utils/-/lifecycle-utils-2.1.0.tgz", "integrity": "sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/ipull/node_modules/parse-ms": { @@ -9338,7 +7725,6 @@ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=12" @@ -9352,7 +7738,6 @@ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "parse-ms": "^3.0.0" @@ -9369,7 +7754,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "ansi-styles": "^6.2.1", @@ -9393,7 +7777,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "get-east-asian-width": "^1.3.1" @@ -9410,7 +7793,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=12" @@ -9442,7 +7824,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -9462,7 +7843,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "license": "BlueOak-1.0.0", - "optional": true, "peer": true, "engines": { "node": ">=20" @@ -9586,7 +7966,6 @@ "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.7.tgz", "integrity": "sha512-7ei3MdAI5+fJPVnKlW77TKNKwQ5ppSzWvhPuSuINT/GYW9ZOC1eRKOuhV9yHG5aEsUPj9BBx5JIekkmoLHxZOw==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/json5": { @@ -9606,7 +7985,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "universalify": "^2.0.0" @@ -9788,7 +8166,6 @@ "resolved": "https://registry.npmjs.org/lifecycle-utils/-/lifecycle-utils-3.1.1.tgz", "integrity": "sha512-gNd3OvhFNjHykJE3uGntz7UuPzWlK9phrIdXxU9Adis0+ExkwnZibfxCJWiWWZ+a6VbKiZrb+9D9hCQWd4vjTg==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/linkedom": { @@ -9835,7 +8212,6 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/lodash.identity": { @@ -9903,7 +8279,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "is-unicode-supported": "^2.0.0", @@ -9927,7 +8302,6 @@ "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "steno": "^4.0.2" @@ -10095,7 +8469,6 @@ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -10124,7 +8497,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", - "optional": true, "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10264,7 +8636,6 @@ } ], "license": "MIT", - "optional": true, "peer": true, "bin": { "nanoid": "bin/nanoid.js" @@ -10296,7 +8667,6 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": "^18 || ^20 || >= 21" @@ -10307,7 +8677,6 @@ "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.8.0.tgz", "integrity": "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/node-domexception": { @@ -10370,7 +8739,6 @@ "integrity": "sha512-ovhuTaXSWfcoyfI8ljWxO2Rg63mNxqQQAbDGkXRhlgsL7UjPqm2Nsy1bTNa0ZaQRg3vezG4agnCJTImrICY/0A==", "hasInstallScript": true, "license": "MIT", - "optional": true, "peer": true, "dependencies": { "@huggingface/jinja": "^0.5.5", @@ -10511,7 +8879,6 @@ "resolved": "https://registry.npmjs.org/octokit/-/octokit-5.0.5.tgz", "integrity": "sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "@octokit/app": "^16.1.2", @@ -10565,7 +8932,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "mimic-function": "^5.0.0" @@ -11109,7 +9475,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "chalk": "^5.6.2", @@ -11133,7 +9498,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=18.20" @@ -11147,7 +9511,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "get-east-asian-width": "^1.5.0", @@ -11291,7 +9654,6 @@ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -11550,7 +9912,6 @@ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": "^14.13.1 || >=16.0.0" @@ -11564,7 +9925,6 @@ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "parse-ms": "^4.0.0" @@ -11810,7 +10170,6 @@ "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)", - "optional": true, "peer": true, "dependencies": { "deep-extend": "^0.6.0", @@ -11889,7 +10248,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "onetime": "^7.0.0", @@ -11907,7 +10265,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", - "optional": true, "peer": true, "engines": { "node": ">=14" @@ -12361,7 +10718,6 @@ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.32.3.tgz", "integrity": "sha512-56a5oxFdWlsGygOXHWrG+xjj5w9ZIt2uQbzqiIGdR/6i5iococ7WQ/bNPzWxCJdEUGUCmyMH0t9zMpRJTaKxmw==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "@kwsites/file-exists": "^1.1.1", @@ -12378,7 +10734,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "ms": "^2.1.3" @@ -12397,7 +10752,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/sisteransi": { @@ -12411,7 +10765,6 @@ "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz", "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/slice-ansi": { @@ -12419,7 +10772,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "ansi-styles": "^6.2.3", @@ -12566,58 +10918,6 @@ "darwin" ] }, - "node_modules/sqlite-vec-darwin-x64": { - "version": "0.1.7-alpha.2", - "resolved": "https://registry.npmjs.org/sqlite-vec-darwin-x64/-/sqlite-vec-darwin-x64-0.1.7-alpha.2.tgz", - "integrity": "sha512-jeZEELsQjjRsVojsvU5iKxOvkaVuE+JYC8Y4Ma8U45aAERrDYmqZoHvgSG7cg1PXL3bMlumFTAmHynf1y4pOzA==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/sqlite-vec-linux-arm64": { - "version": "0.1.7-alpha.2", - "resolved": "https://registry.npmjs.org/sqlite-vec-linux-arm64/-/sqlite-vec-linux-arm64-0.1.7-alpha.2.tgz", - "integrity": "sha512-6Spj4Nfi7tG13jsUG+W7jnT0bCTWbyPImu2M8nWp20fNrd1SZ4g3CSlDAK8GBdavX7wRlbBHCZ+BDa++rbDewA==", - "cpu": [ - "arm64" - ], - "license": "MIT OR Apache", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/sqlite-vec-linux-x64": { - "version": "0.1.7-alpha.2", - "resolved": "https://registry.npmjs.org/sqlite-vec-linux-x64/-/sqlite-vec-linux-x64-0.1.7-alpha.2.tgz", - "integrity": "sha512-IcgrbHaDccTVhXDf8Orwdc2+hgDLAFORl6OBUhcvlmwswwBP1hqBTSEhovClG4NItwTOBNgpwOoQ7Qp3VDPWLg==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/sqlite-vec-windows-x64": { - "version": "0.1.7-alpha.2", - "resolved": "https://registry.npmjs.org/sqlite-vec-windows-x64/-/sqlite-vec-windows-x64-0.1.7-alpha.2.tgz", - "integrity": "sha512-TRP6hTjAcwvQ6xpCZvjP00pdlda8J38ArFy1lMYhtQWXiIBmWnhMaMbq4kaeCYwvTTddfidatRS+TJrwIKB/oQ==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -12645,7 +10945,6 @@ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.1.tgz", "integrity": "sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -12659,7 +10958,6 @@ "resolved": "https://registry.npmjs.org/stdout-update/-/stdout-update-4.0.1.tgz", "integrity": "sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "ansi-escapes": "^6.2.0", @@ -12676,7 +10974,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/stdout-update/node_modules/string-width": { @@ -12684,7 +10981,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "optional": true, "peer": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -12703,7 +10999,6 @@ "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=18" @@ -12854,7 +11149,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=0.10.0" @@ -13094,7 +11388,6 @@ "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">=12" @@ -13232,7 +11525,6 @@ "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz", "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/universal-user-agent": { @@ -13240,7 +11532,6 @@ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "license": "ISC", - "optional": true, "peer": true }, "node_modules/universalify": { @@ -13248,7 +11539,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", - "optional": true, "peer": true, "engines": { "node": ">= 10.0.0" @@ -13268,7 +11558,6 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "license": "MIT", - "optional": true, "peer": true }, "node_modules/util-deprecate": { @@ -13291,7 +11580,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "license": "ISC", - "optional": true, "peer": true, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -13489,7 +11777,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "license": "ISC", - "optional": true, "peer": true, "dependencies": { "isexe": "^4.0.0" diff --git a/package.json b/package.json index f75e553..21c7aa2 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "test:coverage": "vitest run --coverage" }, "dependencies": { + "@chrysb/alphaclaw": "^0.7.0", "express": "^4.21.0", "http-proxy": "^1.18.1", "openclaw": "2026.3.13", diff --git a/tests/frontend/model-config.test.js b/tests/frontend/model-config.test.js index 2160a91..1715e85 100644 --- a/tests/frontend/model-config.test.js +++ b/tests/frontend/model-config.test.js @@ -5,6 +5,9 @@ describe("frontend/model-config", () => { it("maps openai-codex auth provider to openai", async () => { const modelConfig = await loadModelConfig(); expect(modelConfig.getAuthProviderFromModelProvider("openai-codex")).toBe("openai"); + expect(modelConfig.getAuthProviderFromModelProvider("minimax-portal")).toBe( + "minimax", + ); expect(modelConfig.getAuthProviderFromModelProvider("volcengine-plan")).toBe( "volcengine", ); diff --git a/tests/server/gateway.test.js b/tests/server/gateway.test.js index 5c412ce..7b8ca4f 100644 --- a/tests/server/gateway.test.js +++ b/tests/server/gateway.test.js @@ -172,6 +172,37 @@ describe("server/gateway restart behavior", () => { ); }); + it("launches the gateway with OPENCLAW_HOME pointed at the managed dir", async () => { + const spawnMock = vi.fn(() => createChild()); + childProcess.spawn = spawnMock; + fs.existsSync = vi.fn(() => true); + net.createConnection = vi.fn(() => createSocket(false)); + delete require.cache[modulePath]; + const gateway = require(modulePath); + fs.readFileSync = vi.fn(() => + JSON.stringify({ + agents: { + defaults: { + model: { + primary: "openai/gpt-5.1-codex", + }, + }, + }, + }), + ); + + await gateway.startGateway(); + + expect(spawnMock).toHaveBeenCalledWith("openclaw", ["gateway", "run"], { + env: expect.objectContaining({ + OPENCLAW_HOME: OPENCLAW_DIR, + OPENCLAW_CONFIG_PATH: `${OPENCLAW_DIR}/openclaw.json`, + XDG_CONFIG_HOME: OPENCLAW_DIR, + }), + stdio: ["pipe", "pipe", "pipe"], + }); + }); + it("does not treat auth-only openclaw config as onboarded", () => { fs.existsSync = vi.fn((targetPath) => targetPath === `${OPENCLAW_DIR}/openclaw.json`); delete require.cache[modulePath]; @@ -237,18 +268,62 @@ describe("server/gateway restart behavior", () => { expect(fs.writeFileSync).not.toHaveBeenCalled(); }); - it("backfills onboarding marker from legacy onboarding artifact", () => { + it("does not backfill onboarding marker from legacy onboarding artifact", () => { fs.existsSync = vi.fn((targetPath) => targetPath === kLegacyControlUiSkillPath); fs.mkdirSync = vi.fn(); fs.writeFileSync = vi.fn(); delete require.cache[modulePath]; const gateway = require(modulePath); - expect(gateway.isOnboarded()).toBe(true); - expect(fs.writeFileSync).toHaveBeenCalledWith( - kOnboardingMarkerPath, - expect.stringContaining('"reason": "legacy_artifact_backfill"'), + expect(gateway.isOnboarded()).toBe(false); + expect(fs.writeFileSync).not.toHaveBeenCalled(); + }); + + it("skips proxy config writes in read-only mode", () => { + fs.existsSync = vi.fn( + (targetPath) => + targetPath === kOnboardingMarkerPath || + targetPath === `${OPENCLAW_DIR}/openclaw.json`, ); + fs.readFileSync = vi.fn((targetPath) => { + if (targetPath === kOnboardingMarkerPath) { + return JSON.stringify({ onboarded: true, readOnly: true }); + } + if (targetPath === `${OPENCLAW_DIR}/openclaw.json`) { + return JSON.stringify({ gateway: {} }); + } + return originalReadFileSync(targetPath, "utf8"); + }); + fs.writeFileSync = vi.fn(); + delete require.cache[modulePath]; + const gateway = require(modulePath); + + expect(gateway.ensureGatewayProxyConfig("https://example.com")).toBe(false); + expect(fs.writeFileSync).not.toHaveBeenCalled(); + }); + + it("skips channel sync writes in read-only mode", () => { + const execSyncMock = vi.fn(() => ""); + childProcess.execSync = execSyncMock; + fs.existsSync = vi.fn( + (targetPath) => + targetPath === kOnboardingMarkerPath || + targetPath === `${OPENCLAW_DIR}/openclaw.json`, + ); + fs.readFileSync = vi.fn((targetPath) => { + if (targetPath === kOnboardingMarkerPath) { + return JSON.stringify({ onboarded: true, readOnly: true }); + } + if (targetPath === `${OPENCLAW_DIR}/openclaw.json`) { + return JSON.stringify({ channels: { telegram: { enabled: false } } }); + } + return originalReadFileSync(targetPath, "utf8"); + }); + delete require.cache[modulePath]; + const gateway = require(modulePath); + + gateway.syncChannelConfig([{ key: "TELEGRAM_BOT_TOKEN", value: "telegram-token" }]); + expect(execSyncMock).not.toHaveBeenCalled(); }); it("adds the setup origin to gateway control UI config", () => { diff --git a/tests/server/routes-onboarding.test.js b/tests/server/routes-onboarding.test.js index d3c8b5a..d69ac86 100644 --- a/tests/server/routes-onboarding.test.js +++ b/tests/server/routes-onboarding.test.js @@ -62,6 +62,8 @@ const createBaseDeps = ({ onboarded = false, hasCodexOauth = false } = {}) => { ensureGatewayProxyConfig: vi.fn(), getBaseUrl: vi.fn(() => "https://example.com"), startGateway: vi.fn(), + platform: "linux", + execFileSyncImpl: vi.fn(() => ""), }; }; @@ -380,6 +382,21 @@ describe("server/routes/onboarding", () => { expect(gitInitCall).toBeTruthy(); expect(gitInitCall[0]).not.toContain("ghp_test_123456789"); + const onboardCall = deps.shellCmd.mock.calls.find(([cmd]) => + cmd.startsWith("openclaw onboard "), + ); + expect(onboardCall).toBeTruthy(); + expect(onboardCall[1]).toEqual( + expect.objectContaining({ + env: expect.objectContaining({ + OPENCLAW_HOME: "/tmp/openclaw", + OPENCLAW_CONFIG_PATH: "/tmp/openclaw/openclaw.json", + XDG_CONFIG_HOME: "/tmp/openclaw", + }), + timeout: 120000, + }), + ); + const openclawWriteCall = deps.fs.writeFileSync.mock.calls.find( ([path]) => path === "/tmp/openclaw/openclaw.json", ); @@ -392,6 +409,83 @@ describe("server/routes/onboarding", () => { }); }); + it("supports read-only onboarding without rewriting the existing config", async () => { + const deps = createBaseDeps(); + deps.fs.existsSync.mockImplementation( + (targetPath) => targetPath === "/tmp/openclaw/openclaw.json", + ); + deps.fs.readFileSync.mockImplementation((p) => { + if (p === "/tmp/openclaw/openclaw.json") { + return JSON.stringify({ + agents: { defaults: { model: { primary: "openai/gpt-5.1-codex" } } }, + channels: { telegram: { enabled: true } }, + }); + } + return "{}"; + }); + const app = createApp(deps); + + const res = await request(app).post("/api/onboard").send({ + modelKey: "openai/gpt-5.1-codex", + readOnlyMode: true, + vars: [ + { key: "OPENAI_API_KEY", value: "sk-test-123456789" }, + { key: "TELEGRAM_BOT_TOKEN", value: "telegram_123456789" }, + ], + }); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ ok: true }); + expect(deps.startGateway).toHaveBeenCalledTimes(1); + expect(deps.ensureGatewayProxyConfig).not.toHaveBeenCalled(); + expect(deps.authProfiles.upsertApiKeyProfileForEnvVar).not.toHaveBeenCalled(); + expect(deps.authProfiles.syncConfigAuthReferencesForAgent).not.toHaveBeenCalled(); + expect( + deps.shellCmd.mock.calls.some(([cmd]) => cmd.startsWith("openclaw onboard ")), + ).toBe(false); + expect( + deps.shellCmd.mock.calls.some(([cmd]) => cmd.startsWith("openclaw models set ")), + ).toBe(false); + expect( + deps.shellCmd.mock.calls.some(([cmd]) => cmd.startsWith("alphaclaw git-sync ")), + ).toBe(false); + expect( + deps.shellCmd.mock.calls.some(([cmd]) => cmd.includes("git init -b main")), + ).toBe(false); + expect( + deps.fs.writeFileSync.mock.calls.some( + ([pathValue]) => pathValue === "/tmp/openclaw/openclaw.json", + ), + ).toBe(false); + expect(deps.fs.writeFileSync).toHaveBeenCalledWith( + "/tmp/alphaclaw/onboarded.json", + expect.stringContaining('"readOnly": true'), + ); + }); + + it("installs deterministic hourly git sync config for the managed scheduler on macOS", async () => { + const deps = createBaseDeps(); + deps.platform = "darwin"; + deps.fs.readFileSync.mockImplementation((p) => { + if (p === "/tmp/openclaw/openclaw.json") return "{}"; + if (p === path.join(kSetupDir, "skills", "control-ui", "SKILL.md")) return "BASE={{BASE_URL}}"; + if (p === path.join(kSetupDir, "core-prompts", "TOOLS.md")) return "Setup: {{SETUP_UI_URL}}"; + if (p === path.join(kSetupDir, "hourly-git-sync.sh")) return "echo Auto-commit hourly sync"; + return "{}"; + }); + const app = createApp(deps); + mockGithubVerifyAndCreate(); + + const res = await request(app).post("/api/onboard").send(makeValidBody()); + + expect(res.status).toBe(200); + expect(deps.fs.writeFileSync).toHaveBeenCalledWith( + "/tmp/openclaw/cron/system-sync.json", + expect.stringContaining('"schedule": "0 * * * *"'), + ); + expect(deps.execFileSyncImpl).not.toHaveBeenCalled(); + }); + it("rejects onboarding when workspace repo already exists", async () => { const deps = createBaseDeps(); deps.fs.readFileSync.mockImplementation((p) => { diff --git a/tests/server/routes-system.test.js b/tests/server/routes-system.test.js index 9bda643..be23f38 100644 --- a/tests/server/routes-system.test.js +++ b/tests/server/routes-system.test.js @@ -7,6 +7,22 @@ const createSystemDeps = () => { const deps = { fs: { existsSync: vi.fn(() => true), + lstatSync: vi.fn((targetPath) => ({ + isSymbolicLink: () => targetPath === "/tmp/openclaw", + })), + readlinkSync: vi.fn((targetPath) => + targetPath === "/tmp/openclaw" ? "/Users/test/.openclaw" : "", + ), + realpathSync: vi.fn((targetPath) => { + if (targetPath === "/tmp/openclaw") return "/Users/test/.openclaw"; + if (targetPath === "/tmp/openclaw/openclaw.json") + return "/Users/test/.openclaw/openclaw.json"; + if (targetPath === "/tmp/openclaw/skills/control-ui/SKILL.md") + return "/Users/test/.openclaw/skills/control-ui/SKILL.md"; + if (targetPath === "/tmp/alphaclaw/onboarded.json") + return "/tmp/alphaclaw/onboarded.json"; + return targetPath; + }), readFileSync: vi.fn(() => { throw new Error("no config"); }), @@ -84,6 +100,10 @@ const createSystemDeps = () => { removeApiKeyProfileForEnvVar: vi.fn(), }, OPENCLAW_DIR: "/tmp/openclaw", + kOnboardingMarkerPath: "/tmp/alphaclaw/onboarded.json", + kControlUiSkillPath: "/tmp/openclaw/skills/control-ui/SKILL.md", + platform: "linux", + execFileSyncImpl: vi.fn(() => ""), }; return deps; }; @@ -329,6 +349,16 @@ describe("server/routes/system", () => { it("reports running gateway status on GET /api/status", async () => { const deps = createSystemDeps(); deps.fs.existsSync.mockReturnValue(true); + deps.fs.readFileSync.mockImplementation((targetPath) => { + if (targetPath === "/tmp/alphaclaw/onboarded.json") { + return JSON.stringify({ + onboarded: true, + readOnly: true, + reason: "read_only_complete", + }); + } + throw new Error("no config"); + }); deps.isGatewayRunning.mockResolvedValue(true); const app = createApp(deps); @@ -344,6 +374,20 @@ describe("server/routes/system", () => { enabled: true, schedule: "0 * * * *", }), + diagnostics: expect.objectContaining({ + readOnlyMode: true, + onboardingReason: "read_only_complete", + openclawDir: "/tmp/openclaw", + openclawDirIsSymlink: true, + openclawDirLinkTarget: "/Users/test/.openclaw", + resolvedOpenclawDir: "/Users/test/.openclaw", + configPath: "/tmp/openclaw/openclaw.json", + resolvedConfigPath: "/Users/test/.openclaw/openclaw.json", + controlUiSkillExists: true, + resolvedControlUiSkillPath: + "/Users/test/.openclaw/skills/control-ui/SKILL.md", + openclawVersionSource: "openclaw --version", + }), }), ); }); @@ -395,6 +439,36 @@ describe("server/routes/system", () => { expect(res.body.ok).toBe(true); }); + it("updates sync cron config for the managed scheduler on macOS", async () => { + const deps = createSystemDeps(); + deps.platform = "darwin"; + deps.fs.readFileSync + .mockReturnValueOnce(JSON.stringify({ enabled: true, schedule: "0 * * * *" })) + .mockReturnValueOnce(JSON.stringify({ enabled: true, schedule: "*/20 * * * *" })); + const app = createApp(deps); + + const res = await request(app).put("/api/sync-cron").send({ + enabled: true, + schedule: "*/20 * * * *", + }); + + expect(res.status).toBe(200); + expect(deps.fs.writeFileSync).toHaveBeenCalledWith( + "/tmp/openclaw/cron/system-sync.json", + expect.stringContaining('"schedule": "*/20 * * * *"'), + ); + expect(deps.execFileSyncImpl).not.toHaveBeenCalled(); + expect(res.body.syncCron).toEqual( + expect.objectContaining({ + enabled: true, + schedule: "*/20 * * * *", + installed: false, + platform: "darwin", + installMethod: "managed_scheduler", + }), + ); + }); + it("returns alphaclaw version status on GET /api/alphaclaw/version", async () => { const deps = createSystemDeps(); const app = createApp(deps);