diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..259a0a5 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,13 @@ +# Changesets + +Release flow (single-branch, adapted from anchorage's two-branch setup): + +1. Every PR that changes a published package (`@understudy/protocol`, + `@understudy/connector`) adds a changeset: `pnpm changeset`. +2. On push to `master`, `.github/workflows/release.yml` either opens/updates + the standing "Version Packages" PR (when changesets are pending) or + publishes any package whose version is not yet on npm (when none are). +3. Merging the Version Packages PR is the release trigger. + +The apps (`apps/backend`, `apps/extension`) are `private: true` and never +publish. Docs: https://github.com/changesets/changesets diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..e8fc32b --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "master", + "updateInternalDependencies": "patch", + "ignore": [], + "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { + "onlyUpdatePeerDependentsWhenOutOfRange": true + } +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9ecb432 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + ci: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + + # Reads the pnpm version from package.json "packageManager". + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - name: Install (frozen lockfile) + run: pnpm install --frozen-lockfile + + # dist/ is gitignored and @understudy/protocol resolves via dist (the + # npm-publish-correct layout), so the workspace libs must be built + # before anything that imports them typechecks or runs. Topological: + # protocol builds before connector. + - name: Build packages + run: pnpm --filter "./packages/*" build + + - name: Typecheck + run: pnpm -r typecheck + + - name: Test + run: pnpm -r test + + - name: Build + run: pnpm -r build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..22b4bca --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,66 @@ +name: Release + +# Single-branch changesets flow (adapted from anchorage's two-branch +# version.yml + release.yml — understudy has no dev/main split, so one +# workflow does both halves). On every push to master the changesets action +# either: +# (a) opens/updates the standing "Version Packages" PR when changesets are +# pending (version bumps + CHANGELOG entries + changeset deletion), or +# (b) publishes any public package whose package.json version is not yet on +# npm, creates git tags, and creates GitHub releases. +# A push with nothing pending and nothing unpublished is a clean no-op. +# +# Requires the NPM_TOKEN repo secret: an npm automation token with publish +# rights on the @understudy scope (the org must exist on npm first). Without +# it the publish step fails loudly with ENEEDAUTH — nothing partial happens. +# apps/* are private and never publish. Provenance: id-token: write + +# NPM_CONFIG_PROVENANCE below. + +on: + push: + branches: [master] + +concurrency: release-${{ github.ref }} + +permissions: + contents: write + pull-requests: write + id-token: write + +jobs: + release: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + with: + # Changesets reads history to decide what changed since the last tag. + fetch-depth: 0 + + # Reads the pnpm version from package.json "packageManager". + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + registry-url: https://registry.npmjs.org + + - name: Install (frozen lockfile) + run: pnpm install --frozen-lockfile + + # prepublishOnly builds each package again at publish time; this build + # front-loads failures so a broken build never reaches the registry. + - name: Build publishable packages + run: pnpm --filter "./packages/*" build + + - name: Version PR or publish + uses: changesets/action@v1 + with: + publish: pnpm changeset publish + title: 'release: version packages' + commit: 'release: version packages' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_CONFIG_PROVENANCE: 'true' diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2fa48bd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ProofOfTechOrg and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 1feafdf..9242169 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,23 @@ # understudy -An LLM-driven system that puppets a user's *already-logged-in* browser via a Chromium -extension, coordinated by a Cloudflare-hosted backend brain. The backend never touches a -browser — it sends *intents* over a WebSocket; the extension executes them in the user's -real tab via CDP and reports back. +A governed **browser-execution service** that puppets a user's *already-logged-in* browser +via a Chromium extension. The Cloudflare-hosted service holds the live sessions and exposes +`POST /v1/sessions/:sessionId/commands`; the extension executes each command in the user's +real tab via CDP and reports back. understudy runs **no LLM** — the agent brain and all +governance (approvals, RBAC, audit via breakwater/flowsafe) live in the consumer apps that +drive it over HTTP (Topology 1). **Full design + build plan: [`docs/technical-plan.md`](docs/technical-plan.md).** Read it first. -## Layout (current scaffold — milestones M0 + M1 + M2 + M3) +## Layout (current scaffold — milestones M0–M4) - **`packages/protocol`** — the shared command/event protocol (TypeScript + zod 4, published - `@understudy/protocol`). The stable contract between backend and extension; the core IP. + `@understudy/protocol`). The stable contract between the service, the extension, and + consumer connectors; the core IP. +- **`packages/connector`** — **M4** the reference `@proofoftech/breakwater` connectors + (`@understudy/connector`): `observe` / `act` / `fill_credential`, approval-gated via + flowsafe grants, egress-pinned to the service host. What consumer apps import to turn + browser actions into governed Mastra tools. See its README. - **`apps/cdp-spike`** — **M0** throwaway harness: a buildless MV3 extension that verifies the `chrome.debugger` CDP command surface (the plan's one gating technical risk). See its README. - **`apps/extension`** — **M2** the real extension: a WXT + React MV3 extension that puppets a @@ -21,22 +28,35 @@ real tab via CDP and reports back. no LLM and embeds no agent framework — the brain and governance (breakwater/flowsafe) live in the consumers. See its README. -Coming next per the plan: **M4** — consumer integration + published contract -(`@understudy/protocol` plus a reference `@understudy/connector`); the agent loop and -governance (breakwater/flowsafe) stay consumer-side, per Topology 1. +M4 status: both packages are publish-ready (`@understudy/protocol` 0.3.0, +`@understudy/connector` 0.1.0 — MIT, `files`-scoped tarballs, `publishConfig.access: +public`) and the CI release flow is in place (see Release below); publishing waits only on +the npm `understudy` org + `NPM_TOKEN` secret. The cross-repo consumer e2e (a metamind / +smart-compliance Mastra agent + flowsafe approvals driving understudy) is the remaining +M4 step. The agent loop and governance stay consumer-side, per Topology 1. ## Develop ```sh pnpm install -pnpm test # protocol round-trip / validation tests +pnpm build # first on a fresh clone: @understudy/* resolve via gitignored dist/ pnpm typecheck -pnpm build +pnpm test ``` Requires Node ≥22 and pnpm ≥10.16 (see `package.json`). Dependencies are quarantined for 7 days via `minimumReleaseAge` in `pnpm-workspace.yaml` (supply-chain guard against -freshly-published malicious versions). +freshly-published malicious versions; first-party `@proofoftech/*` packages are exempt). + +## Release (npm) + +Changesets + GitHub Actions, single-branch (see `.changeset/README.md`): a PR touching a +published package adds a changeset (`pnpm changeset`); on push to `master`, +`.github/workflows/release.yml` opens/updates the "Version Packages" PR — or, when nothing +is pending, publishes any package version not yet on npm (tags + GitHub releases, with +provenance). Requires the `NPM_TOKEN` repo secret with publish rights on the `@understudy` +scope. The first publish (`@understudy/protocol` 0.3.0, `@understudy/connector` 0.1.0) +needs no changeset — those versions are already set and unpublished. The M0 harness needs no build — load `apps/cdp-spike` unpacked in a Chromium browser (`apps/cdp-spike/README.md`). diff --git a/docs/technical-plan.md b/docs/technical-plan.md index 396d131..e73309e 100644 --- a/docs/technical-plan.md +++ b/docs/technical-plan.md @@ -125,6 +125,8 @@ understudy/ packages/ protocol/ # PUBLISHED @understudy/protocol (zod 4): Command/Event unions + schemas. src/index.ts # The shared contract consumers import. Add fill_secret here. + connector/ # PUBLISHED @understudy/connector (M4): reference breakwater connectors + src/index.ts # (observe/act/fill_credential) consumers import as Mastra tools. apps/ backend/ # Cloudflare Worker — the browser-execution SERVICE (M3) src/index.ts # Hono app: POST /v1/sessions/:id/commands, session mgmt, auth, health @@ -139,9 +141,10 @@ understudy/ src/driver/cdp.ts # CDP executors: snapshot/click/type/navigate/... (+ dry-run seam) wxt.config.ts # apps/backend-node/ # FUTURE self-host of the SERVICE: reuses protocol + SessionCoordinator - # The agent loop, Claude client, tool defs, and breakwater connectors are CONSUMER code - # (metamind / smart-compliance), NOT here. understudy MAY publish a reference connector - # (@understudy/connector) as an example, but does not run it. + # The agent loop, Claude client, and tool wiring are CONSUMER code (metamind / + # smart-compliance), NOT here. understudy PUBLISHES the reference connector + # (packages/connector -> @understudy/connector) for consumers to import, but does not + # run it - no breakwater/flowsafe/Mastra code executes in this repo's apps. ``` ## The command protocol (`packages/protocol`) — the core contract @@ -279,7 +282,10 @@ if cross-frame targeting is needed — the single-frame path is proven. ## Consumer integration — the governed connector (breakwater + flowsafe) This is CONSUMER code (in metamind / smart-compliance), documented here because it defines understudy's -outward contract. Reference: `smart-compliance/docs/examples/understudy-browser-connector.ts`. +outward contract. Canonical reference: **`packages/connector` (`@understudy/connector`, M4)** — tested +against the shipped M3 service contract (bearer caller auth, protocol v0.3.0). The historical sketch it +grew from, `smart-compliance/docs/examples/understudy-browser-connector.ts`, predates M3 (no caller +auth, local `fill_secret` shim) and carries stale pre-Topology-1 prose; prefer the package. - A browser action is wrapped as a **breakwater `createConnector()`** (three connectors: `observe` = read/no-approval, `act` = write/discriminated-union, `fill_credential` = write/vaulted). @@ -396,7 +402,14 @@ outward contract. Reference: `smart-compliance/docs/examples/understudy-browser- reference breakwater connector (`@understudy/connector`, mirroring the smart-compliance example). A real consumer (metamind / smart-compliance) drives understudy end-to-end with a Mastra agent + flowsafe approvals. *Cross-repo; understudy's deliverable is the published contract + reference connector, not - the agent.* + the agent.* **Status (2026-07-16): `packages/connector` BUILT** — observe (snapshot/get_tabs/wait) / + act (click/type/navigate/key/scroll/switch_tab, grant-gated) / fill_credential (vaulted), egress-pinned + `runtime.fetch`, caller bearer auth, 15 tests against the real breakwater wrapper (fail-closed grant, + idempotent replay, per-hop egress denial, dry-run). Both packages are publish-ready (MIT, + `files`-scoped tarballs, `publishConfig.access: public`) and the changesets + GitHub Actions release + flow is wired (`.github/workflows/release.yml`, single-branch master — first push publishes 0.3.0 / + 0.1.0 with no changeset needed); publishing waits on the npm `understudy` org + `NPM_TOKEN` secret. + The consumer-side Mastra+flowsafe e2e remains open. - **M5 — Substrate hardening.** Session/tenant isolation verified with two tenants; credential vault + D-SEC audit invariant; dialog handling; error/timeout paths on every command; session/GIF logging for audit. (Approval/RBAC/policy live in the consumer, not here.) diff --git a/package.json b/package.json index 1b005f3..94fb0e0 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "understudy", "version": "0.0.0", "private": true, + "license": "MIT", "type": "module", "packageManager": "pnpm@11.5.2", "engines": { @@ -11,6 +12,10 @@ "scripts": { "typecheck": "pnpm -r typecheck", "test": "pnpm -r test", - "build": "pnpm -r build" + "build": "pnpm -r build", + "changeset": "changeset" + }, + "devDependencies": { + "@changesets/cli": "^2.27.0" } } diff --git a/packages/connector/LICENSE b/packages/connector/LICENSE new file mode 100644 index 0000000..2fa48bd --- /dev/null +++ b/packages/connector/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ProofOfTechOrg and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/connector/README.md b/packages/connector/README.md new file mode 100644 index 0000000..c2a1cd7 --- /dev/null +++ b/packages/connector/README.md @@ -0,0 +1,169 @@ +# @understudy/connector + +Reference [`@proofoftech/breakwater`](https://github.com/ProofOfTechOrg/anchorage/tree/main/packages/breakwater) +connectors for the [understudy](https://github.com/ProofOfTechOrg/understudy) +browser-execution service. + +understudy is a **model-free substrate** (Topology 1): it holds live, +logged-in browser sessions behind `POST /v1/sessions/:sessionId/commands` and +runs no LLM and no governance of its own. The Mastra agent, the approval flow, +RBAC, and the audit trail live in the **consumer** app — and this package is +the bridge: it wraps understudy's browser commands as breakwater connectors so +every browser write flows through the *same* governance path as any API +connector (approval grants, egress pinning, idempotent replay, dry-run, rate +limits, audit). + +## The three connectors + +| connector | id | class | protocol commands | +|---|---|---|---| +| `observe` | `browser.observe` | read — no approval | `snapshot` (a11y/dom/screenshot), `get_tabs`, `wait` | +| `act` | `browser.act` | write — approval-gated | `click`, `type`, `navigate`, `key`, `scroll`, `switch_tab` | +| `fillCredential` | `browser.fill_credential` | vaulted write — approval-gated | `fill_secret` | + +`scroll` and `switch_tab` are non-writes in the protocol's own +`isWriteCommand` classification, but this package deliberately routes them +through the gated `act` connector: both change what the user's real browser +shows, and the conservative direction is to gate them. + +The protocol's `resolve_ref` command is deliberately unreachable from here — +it is an internal service↔extension probe. Dry-run intent is expressed via the +service API's `dryRun` flag, which the `dryRunExecute` paths set. + +## Install + +```sh +pnpm add @understudy/connector @understudy/protocol @proofoftech/breakwater @mastra/core zod +``` + +`@proofoftech/breakwater` and `@mastra/core` are peer dependencies — the +connectors must share the consumer's Mastra runtime. + +## Quick start + +```ts +import { + BROWSER_WRITE_CONNECTOR_IDS, + callBrowserDryRun, + callBrowserWrite, + createBrowserConnectors, + durableStores, +} from "@understudy/connector"; + +// D1-backed stores are load-bearing on Cloudflare: breakwater's in-memory +// defaults are per-isolate, which under flowsafe's DO-per-run routing means +// per-RUN — a Worker restart mid-step would double-submit a form. +const stores = durableStores(env.DB); +const { observe, act, fillCredential } = createBrowserConnectors( + { UNDERSTUDY_URL: env.UNDERSTUDY_URL, UNDERSTUDY_TOKEN: env.UNDERSTUDY_TOKEN }, + stores, +); +``` + +Register the three connectors as tools on your Mastra agent (they *are* +Mastra tools — `createConnector()` wraps `createTool()`), or call them from +workflow steps via the helpers: + +```ts +// 1. Simulate before asking for approval — no side effect, no grant needed. +const preview = await callBrowserDryRun(act, { + sessionId, + action: { type: "click", ref }, +}); + +// 2. Suspend at a flowsafe approval gate, minting grants for the STATIC ids +// (never ids derived from model output — the grant is a capability token): +await suspend({ reason: "...", connectors: [...BROWSER_WRITE_CONNECTOR_IDS] }); + +// 3. On resume, flowsafe's approvalGrantProvider re-derives +// requestContext['breakwater.approvedConnectors'] from the APPROVED record; +// the write executes at-most-once under a business-meaningful key. +await callBrowserWrite(act, { sessionId, action: { type: "click", ref } }, + requestContext, `${caseId}:${step}:click`); +``` + +An unapproved (or forged-resume) call fails **closed** with +`ConnectorPolicyError` before any bytes leave the Worker. + +## Environment + +| var | meaning | +|---|---| +| `UNDERSTUDY_URL` | Base URL of the understudy service. Its host becomes the connector egress declaration — `runtime.fetch` is pinned to it, redirect hops included. | +| `UNDERSTUDY_TOKEN` | Caller bearer token for the service's `/v1` API. The service maps it to a tenant and refuses cross-tenant `sessionId`s with 404. | + +Both are secrets-adjacent config: provision them via Wrangler secrets, not +plain vars, in production. + +## Governance the consumer gets + +- **Approval (fail closed).** `act` and `fillCredential` declare + `requiresApproval`; breakwater denies the call unless the request context + carries a flowsafe-minted grant for the connector's static id. One approval + queue, one audit trail — understudy runs no second HITL stack. +- **Egress pinning.** Every `execute()` reaches understudy only through + breakwater's egress-guarded `runtime.fetch`; a redirect off the understudy + hostname is denied per hop (and recorded, once an audit logger is wired — + see below). Pinning is hostname-scoped, breakwater's egress model — not + origin-scoped, so it does not distinguish ports. +- **Idempotency.** Writes require a caller-supplied key + (`callBrowserWrite`'s last argument). Replays return the stored result + without re-executing, so DO hibernation/retry cannot double-submit after a + *known* outcome. The one inherent gap: if the service performed the write + but the response never parsed, the key stays retryable and a retry + re-executes — ack-based at-most-once, conservative in the retry direction. +- **Dry-run.** `callBrowserDryRun` runs the connector's simulation: + understudy checks the `ref` still resolves (a pure ref-map lookup — it never + re-mints refs, so outstanding refs survive the simulation) and returns a + simulated `action_result`. A simulated `ok` guarantees *resolvability*, not + executability; for ref-less actions (`navigate`, `switch_tab`) the service + answers `ok: true` without dispatching anything to the browser, so a + simulated `ok` is not a liveness signal. +- **Rate limits.** `act` 60/min, `fillCredential` 30/min, enforced against the + durable store. + +### Audit and org policies + +`createBrowserConnectors` takes an optional third argument passing org-level +breakwater policies through to all three connectors: + +```ts +import { AuditLogger } from "@proofoftech/breakwater/audit"; +import { tenantIsolation } from "@proofoftech/breakwater/policy-engine"; + +createBrowserConnectors(env, stores, { + audit: new AuditLogger({ sink: myAuditSink }), // every decision recorded + evaluators: [tenantIsolation()], // multi-tenant hosts +}); +``` + +Without an `audit` logger, breakwater-layer decisions are enforced but not +recorded — the durable case-level trail is the consumer's flowsafe layer +either way. + +## The credential invariant + +The model **never sees a secret**. `fillCredential` takes an opaque +`secretRef` (e.g. `vault://acme/portal-x/password`); the understudy *service* +resolves it and types the plaintext into the field over the trusted +service↔extension hop. The plaintext never enters the connector input, the +model context, the audit `detail`, or the flowsafe snapshot — and its dry-run +never touches the vault. Never route credentials through `act`'s `type.text`; +a breakwater `piiSecrets` policy at the agent boundary can additionally reject +high-entropy strings that leak into it. + +## Prompt-injection note + +Page content returned by `observe` (a11y text, DOM) is **untrusted input to +your LLM**. understudy reports it faithfully; the injection boundary — "page +text is data, not instructions", origin allowlists, breakwater policy — is +yours to enforce at the agent. + +## What this package is not + +- It does not run an agent, choose a model, or talk to an LLM. +- It does not implement approvals — it *demands* them (flowsafe mints the + grants). +- It does not mint sessions. Create one with + `POST {UNDERSTUDY_URL}/v1/sessions` (bearer `UNDERSTUDY_TOKEN`) during case + setup and pass the returned `sessionId` into every connector input. diff --git a/packages/connector/package.json b/packages/connector/package.json new file mode 100644 index 0000000..862a1be --- /dev/null +++ b/packages/connector/package.json @@ -0,0 +1,62 @@ +{ + "name": "@understudy/connector", + "version": "0.1.0", + "type": "module", + "description": "Reference @proofoftech/breakwater connectors for the understudy browser-execution service: observe / act / fill_credential, approval-gated via flowsafe grants", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "sideEffects": false, + "license": "MIT", + "engines": { + "node": ">=22" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ProofOfTechOrg/understudy.git", + "directory": "packages/connector" + }, + "homepage": "https://github.com/ProofOfTechOrg/understudy/tree/master/packages/connector#readme", + "bugs": "https://github.com/ProofOfTechOrg/understudy/issues", + "keywords": [ + "understudy", + "browser-automation", + "breakwater", + "mastra", + "ai-agents", + "connector" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsc -p tsconfig.build.json", + "typecheck": "tsc -p tsconfig.json", + "test": "vitest run", + "prepublishOnly": "pnpm run build" + }, + "dependencies": { + "@understudy/protocol": "workspace:^", + "zod": "^4" + }, + "peerDependencies": { + "@mastra/core": "^1.50.0", + "@proofoftech/breakwater": "^0.3.0" + }, + "devDependencies": { + "@mastra/core": "^1.50.0", + "@proofoftech/breakwater": "^0.3.0", + "typescript": "^5.6.0", + "vitest": "^2.1.0" + } +} diff --git a/packages/connector/src/index.test.ts b/packages/connector/src/index.test.ts new file mode 100644 index 0000000..acf356a --- /dev/null +++ b/packages/connector/src/index.test.ts @@ -0,0 +1,365 @@ +import { RequestContext } from "@mastra/core/request-context"; +import { AuditLogger } from "@proofoftech/breakwater/audit"; +import { + APPROVED_CONNECTORS_CONTEXT_KEY, + ConnectorPolicyError, + InMemoryIdempotencyStore, + InMemoryRateLimitStore, +} from "@proofoftech/breakwater/connector-sdk"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { + BROWSER_ACT_CONNECTOR, + BROWSER_FILL_CREDENTIAL_CONNECTOR, + BROWSER_WRITE_CONNECTOR_IDS, + type ActOutput, + type ConnectorStores, + type FillCredentialOutput, + type ObserveInput, + type ObserveOutput, + callBrowserDryRun, + callBrowserWrite, + callConnector, + createBrowserConnectors, +} from "./index"; + +const ENV = { + UNDERSTUDY_URL: "https://understudy.example.com", + UNDERSTUDY_TOKEN: "caller-token-1", +}; + +function stores(): ConnectorStores { + return { + idempotencyStore: new InMemoryIdempotencyStore(), + rateLimitStore: new InMemoryRateLimitStore(), + }; +} + +function grantFor(...ids: string[]): RequestContext { + return new RequestContext(Object.entries({ [APPROVED_CONNECTORS_CONTEXT_KEY]: ids })); +} + +function eventResponse(event: Record, status = 200): Response { + return new Response(JSON.stringify(event), { + status, + headers: { "content-type": "application/json" }, + }); +} + +// The egress guard passes (url, init) through to the base fetch on hop 0, so +// the spy sees exactly what callUnderstudy sent (plus redirect: 'manual'). +function sentRequest(spy: ReturnType, call = 0): { url: string; body: unknown; headers: Record } { + const args = spy.mock.calls[call]; + if (!args) throw new Error(`fetch call ${call} not recorded`); + const [url, init] = args as [string, { body: string; headers: Record }]; + return { url, body: JSON.parse(init.body), headers: init.headers }; +} + +const CLICK = { sessionId: "s-1", action: { type: "click", ref: "s1e2" } } as const; + +afterEach(() => { + vi.unstubAllGlobals(); +}); + +describe("grant gate (fail closed)", () => { + it("denies a write without the approval grant and never reaches the service", async () => { + const fetchSpy = vi.fn(); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + + await expect( + callBrowserWrite(act, CLICK, undefined, "case1:step1:click"), + ).rejects.toThrowError(ConnectorPolicyError); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("a grant for a DIFFERENT connector id does not authorize act", async () => { + const fetchSpy = vi.fn(); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + + await expect( + callBrowserWrite(act, CLICK, grantFor("browser.observe"), "case1:step1:click"), + ).rejects.toThrowError(ConnectorPolicyError); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("rejects invalid input with a throw before any request (Mastra sentinel normalized)", async () => { + const fetchSpy = vi.fn(); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + const missingSession = { action: { type: "click", ref: "s1e2" } } as unknown as typeof CLICK; + + await expect( + callBrowserWrite(act, missingSession, grantFor(BROWSER_ACT_CONNECTOR), "k1"), + ).rejects.toThrow(/input validation failed/); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("lists exactly the write connectors for grant minting", () => { + expect(BROWSER_WRITE_CONNECTOR_IDS).toContain(BROWSER_ACT_CONNECTOR); + expect(BROWSER_WRITE_CONNECTOR_IDS).toContain(BROWSER_FILL_CREDENTIAL_CONNECTOR); + expect(BROWSER_WRITE_CONNECTOR_IDS).toHaveLength(2); + }); +}); + +describe("act", () => { + it("executes with the grant: bearer auth, /v1 route, protocol command; replays on the same key", async () => { + const fetchSpy = vi.fn().mockResolvedValue( + eventResponse({ type: "action_result", commandId: "c1", ok: true, url: "https://portal.example/" }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + const grant = grantFor(BROWSER_ACT_CONNECTOR); + + const first = await callBrowserWrite(act, CLICK, grant, "case1:step1:click"); + const second = await callBrowserWrite(act, CLICK, grant, "case1:step1:click"); + + expect(first).toEqual({ ok: true, url: "https://portal.example/", error: undefined }); + expect(second).toEqual(first); // replayed, not re-executed + expect(fetchSpy).toHaveBeenCalledTimes(1); + + const { url, body, headers } = sentRequest(fetchSpy); + expect(url).toBe("https://understudy.example.com/v1/sessions/s-1/commands"); + expect(headers.authorization).toBe("Bearer caller-token-1"); + expect(body).toMatchObject({ + dryRun: false, + command: { type: "click", ref: "s1e2" }, + }); + expect((body as { command: { commandId: unknown } }).command.commandId).toBeTypeOf("string"); + }); + + it("dry-run needs no grant, sends dryRun:true, and marks the output simulated", async () => { + const fetchSpy = vi.fn().mockResolvedValue( + eventResponse({ type: "action_result", commandId: "c1", ok: true, simulated: true }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + + const preview = await callBrowserDryRun(act, CLICK); + + expect(preview.simulated).toBe(true); + expect(preview.ok).toBe(true); + const { body } = sentRequest(fetchSpy); + expect(body).toMatchObject({ dryRun: true, command: { type: "click" } }); + }); +}); + +describe("observe (read - no grant, no idempotency)", () => { + async function observeRead(read: ObserveInput["read"], event: Record): Promise { + vi.stubGlobal("fetch", vi.fn().mockResolvedValue(eventResponse(event))); + const { observe } = createBrowserConnectors(ENV, stores()); + return callConnector(observe, { sessionId: "s-1", read }, undefined); + } + + it("snapshot returns the a11y tree", async () => { + const tree = [{ ref: "s1e1", role: "button", name: "Go" }]; + const out = await observeRead( + { type: "snapshot", mode: "a11y" }, + { type: "snapshot_result", commandId: "c1", tree }, + ); + expect(out).toEqual({ tree }); + }); + + it("snapshot in screenshot mode returns the image artifact", async () => { + const out = await observeRead( + { type: "snapshot", mode: "screenshot" }, + { type: "screenshot_result", commandId: "c1", mime: "image/png", b64: "aGk=" }, + ); + expect(out).toEqual({ screenshot: { mime: "image/png", b64: "aGk=" } }); + }); + + it("get_tabs returns the tab list", async () => { + const tabs = [{ tabId: 7, url: "https://x/", title: "X", active: true }]; + const out = await observeRead({ type: "get_tabs" }, { type: "tabs_result", commandId: "c1", tabs }); + expect(out).toEqual({ tabs }); + }); + + it("wait returns the action outcome", async () => { + const out = await observeRead( + { type: "wait", for: "load" }, + { type: "action_result", commandId: "c1", ok: true }, + ); + expect(out).toEqual({ ok: true, error: undefined }); + }); + + it("wait surfaces a failed outcome with its error", async () => { + const out = await observeRead( + { type: "wait", for: "load" }, + { type: "action_result", commandId: "c1", ok: false, error: "timeout waiting for load" }, + ); + expect(out).toEqual({ ok: false, error: "timeout waiting for load" }); + }); + + it("throws on an event that does not answer the read", async () => { + await expect( + observeRead({ type: "get_tabs" }, { type: "action_result", commandId: "c1", ok: true }), + ).rejects.toThrow(/unexpected event 'action_result' for read 'get_tabs'/); + }); +}); + +describe("fill_credential (vaulted write)", () => { + const INPUT = { sessionId: "s-1", ref: "s1e9", secretRef: "vault://acme/portal/password" }; + + it("passes the opaque secretRef through - the wire carries no plaintext field", async () => { + const fetchSpy = vi.fn().mockResolvedValue( + eventResponse({ type: "action_result", commandId: "c1", ok: true }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { fillCredential } = createBrowserConnectors(ENV, stores()); + + const out = await callBrowserWrite( + fillCredential, + INPUT, + grantFor(BROWSER_FILL_CREDENTIAL_CONNECTOR), + "case1:login:fill", + ); + + expect(out).toEqual({ ok: true, filled: true, error: undefined }); + const { body } = sentRequest(fetchSpy); + expect(body).toMatchObject({ + command: { type: "fill_secret", ref: "s1e9", secretRef: "vault://acme/portal/password" }, + }); + expect(Object.keys((body as { command: Record }).command).sort()).toEqual([ + "commandId", + "ref", + "secretRef", + "type", + ]); + }); + + it("dry-run confirms the ref without filling: filled stays false, simulated true", async () => { + const fetchSpy = vi.fn().mockResolvedValue( + eventResponse({ type: "action_result", commandId: "c1", ok: true, simulated: true }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { fillCredential } = createBrowserConnectors(ENV, stores()); + + const preview = await callBrowserDryRun(fillCredential, INPUT); + + expect(preview).toEqual({ ok: true, filled: false, error: undefined, simulated: true }); + const { body } = sentRequest(fetchSpy); + expect(body).toMatchObject({ dryRun: true }); + }); +}); + +describe("service bridge hardening", () => { + it("denies a redirect off the understudy host (egress guard, per hop)", async () => { + const fetchSpy = vi.fn().mockResolvedValue( + new Response(null, { status: 302, headers: { location: "https://evil.example/exfil" } }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { observe } = createBrowserConnectors(ENV, stores()); + + await expect( + callConnector(observe, { sessionId: "s-1", read: { type: "get_tabs" } }, undefined), + ).rejects.toThrowError(ConnectorPolicyError); + expect(fetchSpy).toHaveBeenCalledTimes(1); // the hop was denied before a second request + }); + + it("throws status-only on an HTTP error - response bodies are never echoed", async () => { + vi.stubGlobal( + "fetch", + vi.fn().mockResolvedValue(eventResponse({ error: "unauthorized", detail: "S3CRET-DETAIL" }, 401)), + ); + const { observe } = createBrowserConnectors(ENV, stores()); + + const failure = callConnector(observe, { sessionId: "s-1", read: { type: "get_tabs" } }, undefined); + await expect(failure).rejects.toThrow(/understudy service 401 for session s-1/); + await expect(failure).rejects.not.toThrow(/S3CRET-DETAIL/); + }); + + it("rejects a payload that is not a protocol Event", async () => { + vi.stubGlobal("fetch", vi.fn().mockResolvedValue(eventResponse({ nope: true }))); + const { observe } = createBrowserConnectors(ENV, stores()); + + await expect( + callConnector(observe, { sessionId: "s-1", read: { type: "get_tabs" } }, undefined), + ).rejects.toThrow(); + }); + + it("denies the 61st act execution in a fixed rate window", async () => { + vi.useFakeTimers(); + vi.setSystemTime(60_000); // window start - all calls land in one fixed window + try { + const fetchSpy = vi.fn(async () => + eventResponse({ type: "action_result", commandId: "c1", ok: true }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + const grant = grantFor(BROWSER_ACT_CONNECTOR); + + for (let i = 0; i < 60; i++) { + await callBrowserWrite(act, CLICK, grant, `k${i}`); + } + await expect(callBrowserWrite(act, CLICK, grant, "k60")).rejects.toThrow( + /exceeded 60\/min/, + ); + expect(fetchSpy).toHaveBeenCalledTimes(60); + } finally { + vi.useRealTimers(); + } + }); + + it("a failed execute is not cached: the same key re-executes on retry", async () => { + const fetchSpy = vi + .fn() + .mockResolvedValueOnce(eventResponse({ error: "boom" }, 500)) + .mockResolvedValueOnce(eventResponse({ type: "action_result", commandId: "c1", ok: true })); + vi.stubGlobal("fetch", fetchSpy); + const { act } = createBrowserConnectors(ENV, stores()); + const grant = grantFor(BROWSER_ACT_CONNECTOR); + + await expect(callBrowserWrite(act, CLICK, grant, "retry-key")).rejects.toThrow( + /understudy service 500/, + ); + const retried = await callBrowserWrite(act, CLICK, grant, "retry-key"); + expect(retried.ok).toBe(true); + expect(fetchSpy).toHaveBeenCalledTimes(2); // reservation released, retry re-executed + }); + + it("accepts a ported dev URL - egress pins to the hostname, not host:port", async () => { + // .host would carry ':8787', which breakwater's egress allowlist rejects + // at construction - the wrangler-dev consumer loop depends on this. + const fetchSpy = vi.fn().mockResolvedValue( + eventResponse({ type: "tabs_result", commandId: "c1", tabs: [] }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { observe } = createBrowserConnectors( + { UNDERSTUDY_URL: "http://localhost:8787", UNDERSTUDY_TOKEN: "dev-caller-token" }, + stores(), + ); + + const out = await callConnector(observe, { sessionId: "s-1", read: { type: "get_tabs" } }, undefined); + expect(out).toEqual({ tabs: [] }); + expect(sentRequest(fetchSpy).url).toBe("http://localhost:8787/v1/sessions/s-1/commands"); + }); + + it("records decisions through the audit pass-through", async () => { + const events: Array<{ decision: string; resource: string }> = []; + const audit = new AuditLogger({ + sink: (event) => { + events.push({ decision: event.decision, resource: event.resource }); + }, + }); + vi.stubGlobal("fetch", vi.fn()); + const { act } = createBrowserConnectors(ENV, stores(), { audit }); + + await expect(callBrowserWrite(act, CLICK, undefined, "k1")).rejects.toThrowError( + ConnectorPolicyError, + ); + expect(events).toContainEqual({ decision: "denied", resource: BROWSER_ACT_CONNECTOR }); + }); + + it("URL-encodes the sessionId path segment", async () => { + const fetchSpy = vi.fn().mockResolvedValue( + eventResponse({ type: "tabs_result", commandId: "c1", tabs: [] }), + ); + vi.stubGlobal("fetch", fetchSpy); + const { observe } = createBrowserConnectors(ENV, stores()); + + await callConnector(observe, { sessionId: "s/../1", read: { type: "get_tabs" } }, undefined); + expect(sentRequest(fetchSpy).url).toBe( + "https://understudy.example.com/v1/sessions/s%2F..%2F1/commands", + ); + }); +}); diff --git a/packages/connector/src/index.ts b/packages/connector/src/index.ts new file mode 100644 index 0000000..7a1ba17 --- /dev/null +++ b/packages/connector/src/index.ts @@ -0,0 +1,463 @@ +/** + * Reference breakwater connectors for the understudy browser-execution + * service (Topology 1: understudy is a model-free substrate; the Mastra + * agent, approvals, RBAC, and audit live in the CONSUMER importing this). + * + * Three connectors, one governance class each: + * observe - read (snapshot / get_tabs / wait). No approval. + * act - write (click / type / navigate / key / scroll / + * switch_tab). Fails closed unless the request carries a + * flowsafe-minted grant in + * requestContext['breakwater.approvedConnectors']. + * fill_credential - vaulted write. The model passes an opaque secretRef; + * the understudy SERVICE resolves + types the plaintext, + * which never enters this Worker, the model context, the + * audit detail, or the flowsafe snapshot. + * + * Every execute() reaches understudy only through breakwater's egress-guarded + * runtime.fetch, pinned (redirect hops included) to the UNDERSTUDY_URL + * hostname. Mirrors metamind's shipped packages/worker/src/intake/connectors.ts. + */ + +import { RequestContext } from "@mastra/core/request-context"; +import type { ToolExecutionContext } from "@mastra/core/tools"; +import { + type ConnectorPolicies, + type ConnectorRuntime, + createConnector, + D1IdempotencyStore, + D1RateLimitStore, + DRY_RUN_CONTEXT_KEY, + IDEMPOTENCY_KEY_CONTEXT_KEY, + type IdempotencyStore, + type RateLimitStore, +} from "@proofoftech/breakwater/connector-sdk"; +import { + A11yNodeSchema, + type Command, + type Event, + parseCommand, + parseEvent, + SnapshotModeSchema, + TabInfoSchema, +} from "@understudy/protocol"; +import { z } from "zod"; + +// -- Env + durable stores ---------------------------------------------------- + +export interface BrowserConnectorEnv { + /** Base URL of the understudy service; its hostname is the egress target. */ + UNDERSTUDY_URL: string; + /** + * Caller bearer token for the service's /v1 API. Maps to a tenant in the + * service's CALLER_TOKENS; the service refuses cross-tenant sessionIds + * with 404 (no existence oracle). + */ + UNDERSTUDY_TOKEN: string; +} + +export interface ConnectorStores { + idempotencyStore: IdempotencyStore; + rateLimitStore: RateLimitStore; +} + +// Structural D1 seam borrowed from breakwater's own store constructors, so +// this package needs no Cloudflare type dependency (a real D1Database +// satisfies both). +type ConnectorDatabase = ConstructorParameters[0] & + ConstructorParameters[0]; + +/** + * D1-backed stores. breakwater's in-memory defaults are per-isolate - under + * flowsafe's DO-per-run routing that means per-RUN, so a Worker restart + * mid-step would re-dispatch a browser write and double-submit a form. D1 + * makes replay protection and rate budgets durable across isolates. + */ +export function durableStores(db: ConnectorDatabase): ConnectorStores { + return { + idempotencyStore: new D1IdempotencyStore(db), + rateLimitStore: new D1RateLimitStore(db), + }; +} + +// .hostname, never .host: breakwater's egress allowlist accepts bare +// hostnames only, so a ported URL (wrangler dev = localhost:8787) would throw +// at construction via .host. The runtime guard matches url.hostname per hop. +function understudyHost(env: BrowserConnectorEnv): string { + return new URL(env.UNDERSTUDY_URL).hostname; +} + +// -- Connector ids (grant-minting keys) --------------------------------------- +// A flowsafe suspension mints grants for these STATIC literals - never for +// ids derived from model output (the grant is a capability token). + +export const BROWSER_OBSERVE_CONNECTOR = "browser.observe"; +export const BROWSER_ACT_CONNECTOR = "browser.act"; +export const BROWSER_FILL_CREDENTIAL_CONNECTOR = "browser.fill_credential"; + +/** The write connectors an approval gate mints grants for (reads need none). */ +export const BROWSER_WRITE_CONNECTOR_IDS = [ + BROWSER_ACT_CONNECTOR, + BROWSER_FILL_CREDENTIAL_CONNECTOR, +] as const; + +// -- I/O schemas --------------------------------------------------------------- +// Command shapes mirror @understudy/protocol MINUS commandId (assigned per +// call below). The protocol's resolve_ref is deliberately absent: it is an +// internal service<->extension probe - consumers express dry-run intent via +// the service API's dryRun flag, which the act/fill_credential dryRunExecute +// paths set. + +export const observeInput = z.object({ + sessionId: z.string(), + read: z.discriminatedUnion("type", [ + z.object({ + type: z.literal("snapshot"), + mode: SnapshotModeSchema, // "a11y" | "dom" | "screenshot" + tabId: z.number().optional(), + }), + z.object({ type: z.literal("get_tabs") }), + z.object({ + type: z.literal("wait"), + for: z.enum(["load", "idle", "ms"]), + value: z.number().optional(), + }), + ]), +}); +export type ObserveInput = z.infer; + +export const observeOutput = z.object({ + /** Compact a11y tree the agent targets by opaque `ref` (never a selector). */ + tree: z.array(A11yNodeSchema).optional(), + /** Vision fallback (canvas / visual layout) - an evidence artifact. */ + screenshot: z.object({ mime: z.string(), b64: z.string() }).optional(), + tabs: z.array(TabInfoSchema).optional(), + /** wait outcome. */ + ok: z.boolean().optional(), + error: z.string().optional(), +}); +export type ObserveOutput = z.infer; + +// Write actions deliberately EXCLUDE secret entry: non-secret type.text (a +// search query, a name) is fine and auditable; secrets go through +// fill_credential's opaque secretRef. A breakwater piiSecrets policy at the +// agent boundary can additionally reject high-entropy strings leaking into +// type.text. +// +// Stricter than the protocol's isWriteCommand on purpose: scroll and +// switch_tab are protocol non-writes, but both change what the user's real +// browser shows, so they sit behind the approval gate here. Keep this union +// in sync with the protocol's WRITE_COMMANDS when it changes. +export const actInput = z.object({ + sessionId: z.string(), + action: z.discriminatedUnion("type", [ + z.object({ type: z.literal("click"), ref: z.string() }), + z.object({ + type: z.literal("type"), + ref: z.string(), + text: z.string(), + submit: z.boolean().optional(), + }), + z.object({ type: z.literal("navigate"), url: z.url(), tabId: z.number().optional() }), + z.object({ type: z.literal("key"), keys: z.string(), ref: z.string().optional() }), + z.object({ type: z.literal("scroll"), ref: z.string().optional(), dy: z.number() }), + z.object({ type: z.literal("switch_tab"), tabId: z.number() }), + ]), +}); +export type ActInput = z.infer; + +export const actOutput = z.object({ + ok: z.boolean(), + url: z.string().optional(), + error: z.string().optional(), + simulated: z.boolean().optional(), +}); +export type ActOutput = z.infer; + +export const fillCredentialInput = z.object({ + sessionId: z.string(), + ref: z.string(), + /** Opaque vault handle (e.g. "vault://tenant/portal/password") - NEVER the plaintext. */ + secretRef: z.string(), + submit: z.boolean().optional(), +}); +export type FillCredentialInput = z.infer; + +export const fillCredentialOutput = z.object({ + ok: z.boolean(), + filled: z.boolean(), + error: z.string().optional(), + simulated: z.boolean().optional(), +}); +export type FillCredentialOutput = z.infer; + +// -- Service bridge ------------------------------------------------------------ + +/** + * POST one command to the understudy service and return the correlated Event. + * Goes through the egress-guarded runtime.fetch, so the call is pinned to the + * understudy host (redirect hops included) or denied + audited. + */ +async function callUnderstudy( + runtime: ConnectorRuntime, + env: BrowserConnectorEnv, + sessionId: string, + command: Command, + opts: { dryRun?: boolean } = {}, +): Promise { + const base = env.UNDERSTUDY_URL.replace(/\/$/, ""); + const res = await runtime.fetch( + `${base}/v1/sessions/${encodeURIComponent(sessionId)}/commands`, + { + method: "POST", + headers: { + "content-type": "application/json", + authorization: `Bearer ${env.UNDERSTUDY_TOKEN}`, + }, + body: JSON.stringify({ command, dryRun: opts.dryRun ?? false }), + }, + ); + if (!res.ok) { + // Status + session only - request/response bodies can carry page content, + // evidence, or PII that must not reach a log sink. + throw new Error(`understudy service ${res.status} for session ${sessionId}`); + } + return parseEvent(await res.json()); +} + +// crypto.randomUUID() is non-deterministic, which is safe here: breakwater's +// idempotency layer replays a completed key WITHOUT re-running execute(), so +// a command is built at most once per logical action even across DO +// hibernation/retry. +function toCommand(fields: object): Command { + return parseCommand({ ...fields, commandId: crypto.randomUUID() }); +} + +// -- Connectors ------------------------------------------------------------------ + +/** + * Org-level breakwater policy pass-through: wire an AuditLogger to record + * every decision (grant denials, per-hop egress denials, allowed executes), + * evaluators such as tenantIsolation() for multi-tenant hosts, an org egress + * allowlist, or a base fetch (test/instrumentation seam). Stores stay a + * separate required argument because the write connectors cannot function + * without them. + */ +export type BrowserConnectorPolicies = Pick< + ConnectorPolicies, + "audit" | "evaluators" | "networkEgress" | "writePermissions" | "fetch" +>; + +export type BrowserConnectors = ReturnType; + +export function createBrowserConnectors( + env: BrowserConnectorEnv, + stores: ConnectorStores, + options: BrowserConnectorPolicies = {}, +) { + const policies = { + ...options, + idempotencyStore: stores.idempotencyStore, + rateLimitStore: stores.rateLimitStore, + }; + const egress = [understudyHost(env)]; + + // Read: observe the session. No approval, no idempotency - reads are free. + // Still egress-pinned + audited. + const observe = createConnector({ + id: BROWSER_OBSERVE_CONNECTOR, + description: + "Observe the browser session: a11y-tree/DOM/screenshot snapshot of the page (target elements by the returned refs), list open tabs, or wait for load/idle/ms. Read-only.", + inputSchema: observeInput, + outputSchema: observeOutput, + permissions: { sideEffect: "read", egress }, + policies: options, // reads need no stores, but audit/evaluators apply + + execute: async (input, _ctx, runtime): Promise => { + const read = input.read; + const ev = await callUnderstudy(runtime, env, input.sessionId, toCommand(read)); + switch (read.type) { + case "snapshot": + if (ev.type === "snapshot_result") return { tree: ev.tree }; + if (ev.type === "screenshot_result") { + return { screenshot: { mime: ev.mime, b64: ev.b64 } }; + } + break; + case "get_tabs": + if (ev.type === "tabs_result") return { tabs: ev.tabs }; + break; + case "wait": + if (ev.type === "action_result") return { ok: ev.ok, error: ev.error }; + break; + } + throw new Error(`observe: unexpected event '${ev.type}' for read '${read.type}'`); + }, + }); + + // Write: a state-changing browser action. Fails closed behind the grant, + // at-most-once across retries, dry-runnable, rate-limited. + const act = createConnector({ + id: BROWSER_ACT_CONNECTOR, + description: + "Perform a state-changing browser action (click/type/navigate/key/scroll/switch_tab) in the session. Requires approval. Do NOT put secrets in type.text - use fill_credential.", + inputSchema: actInput, + outputSchema: actOutput, + permissions: { + sideEffect: "write", + egress, + idempotencyKey: true, // caller supplies IDEMPOTENCY_KEY_CONTEXT_KEY (e.g. caseId:step:action) + requiresApproval: true, // unlocked only by a flowsafe-minted grant on resume + dryRun: true, + rateLimit: "60/min", + }, + execute: async (input, _ctx, runtime): Promise => { + const ev = await callUnderstudy(runtime, env, input.sessionId, toCommand(input.action)); + if (ev.type === "action_result") return { ok: ev.ok, url: ev.url, error: ev.error }; + throw new Error(`act: unexpected event '${ev.type}'`); + }, + // Simulation: the service checks the ref still resolves (via its internal + // resolve_ref probe - a pure ref-map lookup that never re-mints refs) and + // returns a simulated action_result without dispatching anything. A + // simulated ok guarantees RESOLVABILITY, not executability; ref-less + // actions (navigate/switch_tab/ref-less key/scroll) simulate ok with zero + // wire traffic, so a simulated ok is NOT a liveness signal. + dryRunExecute: async (input, _ctx, runtime): Promise => { + const ev = await callUnderstudy(runtime, env, input.sessionId, toCommand(input.action), { + dryRun: true, + }); + if (ev.type === "action_result") { + return { ok: ev.ok, url: ev.url, error: ev.error, simulated: true }; + } + throw new Error(`act(dryRun): unexpected event '${ev.type}'`); + }, + policies, + }); + + // Write: fill a field with a vaulted credential. The model passes an opaque + // secretRef; the SERVICE resolves + types the plaintext. The secret never + // touches this Worker, the model, or the audit log (D-SEC). + const fillCredential = createConnector({ + id: BROWSER_FILL_CREDENTIAL_CONNECTOR, + description: + "Fill a field with a vaulted secret referenced by secretRef (never the plaintext). Use for passwords/OTP logins into portals. Requires approval.", + inputSchema: fillCredentialInput, + outputSchema: fillCredentialOutput, + permissions: { + sideEffect: "write", + egress, + idempotencyKey: true, + requiresApproval: true, + dryRun: true, + rateLimit: "30/min", + }, + execute: async (input, _ctx, runtime): Promise => { + const command = toCommand({ + type: "fill_secret", + ref: input.ref, + secretRef: input.secretRef, // opaque handle; resolved service-side + ...(input.submit !== undefined ? { submit: input.submit } : {}), + }); + const ev = await callUnderstudy(runtime, env, input.sessionId, command); + if (ev.type === "action_result") return { ok: ev.ok, filled: ev.ok, error: ev.error }; + throw new Error(`fillCredential: unexpected event '${ev.type}'`); + }, + // Dry-run confirms the field's ref resolves WITHOUT resolving the secret + // or typing anything (the service never touches the vault on a dry run). + dryRunExecute: async (input, _ctx, runtime): Promise => { + const command = toCommand({ + type: "fill_secret", + ref: input.ref, + secretRef: input.secretRef, + }); + const ev = await callUnderstudy(runtime, env, input.sessionId, command, { dryRun: true }); + if (ev.type === "action_result") { + return { ok: ev.ok, filled: false, error: ev.error, simulated: true }; + } + throw new Error(`fillCredential(dryRun): unexpected event '${ev.type}'`); + }, + policies, + }); + + return { observe, act, fillCredential }; +} + +// -- Caller-side helpers (mirror metamind's intake/connectors.ts) ---------------- +// A connector's tool boundary is execute(inputData, context) - two args; +// breakwater manufactures the egress-guarded runtime (the third arg to the +// config executes above) internally. These helpers thread per-call +// requestContext keys without mutating the workflow's runtime-minted context. + +interface ConnectorLike { + execute?: (input: In, context: ToolExecutionContext) => Promise; +} + +function contextWith(base: unknown, extra: Record): RequestContext { + const source = base as { entries?: () => Iterable } | undefined; + const merged: Record = {}; + if (source?.entries) { + for (const [key, value] of source.entries()) merged[key] = value; + } + for (const [key, value] of Object.entries(extra)) merged[key] = value; + return new RequestContext(Object.entries(merged)); +} + +/** + * `requestContext` must be the runtime-minted RequestContext (or undefined) - + * contextWith merges via .entries(), so a plain object's keys (including a + * grant) would be dropped. That failure direction is closed (a lost grant + * denies), but don't hand-roll the context. + */ +export async function callConnector( + connector: ConnectorLike, + input: In, + requestContext: unknown, + extraKeys?: Record, +): Promise { + if (!connector.execute) throw new Error("connector has no execute"); + const context = extraKeys !== undefined ? contextWith(requestContext, extraKeys) : requestContext; + const result = await connector.execute(input, { + requestContext: context, + } as unknown as ToolExecutionContext); + // Mastra's Tool.execute RETURNS a validation-error sentinel (never throws) + // when inputSchema rejects. The agent tool-call path reads it, but a + // workflow caller destructuring the output would silently see undefined + // fields - normalize to a throw so every helper failure is catchable. + if ( + typeof result === "object" && + result !== null && + (result as { error?: unknown }).error === true && + "validationErrors" in result + ) { + const message = (result as { message?: unknown }).message; + throw new Error( + `connector input validation failed: ${typeof message === "string" ? message : "invalid input"}`, + ); + } + return result as Out; +} + +/** + * Real write - at-most-once under a business-meaningful idempotency key + * (e.g. `${caseId}:${step}:click`). The runtime-minted requestContext carries + * the flowsafe grant; this only adds the per-call key. + */ +export async function callBrowserWrite( + connector: ConnectorLike, + input: In, + requestContext: unknown, + idempotencyKey: string, +): Promise { + return callConnector(connector, input, requestContext, { + [IDEMPOTENCY_KEY_CONTEXT_KEY]: idempotencyKey, + }); +} + +/** Simulation - no grant, no idempotency spend, no rate budget. */ +export async function callBrowserDryRun( + connector: ConnectorLike, + input: In, +): Promise { + return callConnector(connector, input, undefined, { + [DRY_RUN_CONTEXT_KEY]: true, + }); +} diff --git a/packages/connector/tsconfig.build.json b/packages/connector/tsconfig.build.json new file mode 100644 index 0000000..9261c82 --- /dev/null +++ b/packages/connector/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist", + "rootDir": "src" + }, + "exclude": ["src/**/*.test.ts"] +} diff --git a/packages/connector/tsconfig.json b/packages/connector/tsconfig.json new file mode 100644 index 0000000..423b4c9 --- /dev/null +++ b/packages/connector/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true, + // WebWorker (not DOM) supplies the fetch/Response/crypto TYPES the service + // bridge and its tests reference without making browser-only globals + // (document/window) typecheck-clean in a package that must run on Workers. + // The runtime globals exist on Workers, Node >= 18, and browsers alike; no + // lib type leaks into the public dist surface (the exports are + // zod-inferred shapes + breakwater seam types). + "lib": ["ES2022", "WebWorker"] + }, + "include": ["src"] +} diff --git a/packages/protocol/LICENSE b/packages/protocol/LICENSE new file mode 100644 index 0000000..2fa48bd --- /dev/null +++ b/packages/protocol/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ProofOfTechOrg and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/protocol/README.md b/packages/protocol/README.md new file mode 100644 index 0000000..d2513e5 --- /dev/null +++ b/packages/protocol/README.md @@ -0,0 +1,100 @@ +# @understudy/protocol + +The command protocol for [understudy](https://github.com/ProofOfTechOrg/understudy), +a governed browser-execution service that puppets a user's *already-logged-in* +Chromium browser. This package is the shared contract between the three parties +that speak it: + +- the **understudy service** (Cloudflare Worker + per-session Durable Object), +- the **extension driver** (MV3, `chrome.debugger`/CDP), and +- **consumer connectors** (e.g. [`@understudy/connector`](https://github.com/ProofOfTechOrg/understudy/tree/master/packages/connector)) + that drive the service over `POST /v1/sessions/:sessionId/commands`. + +Every message is a zod-4 discriminated union tagged by `type`, carries a +`commandId` for request/response correlation, and is validated at every +boundary. Consumers nest these schemas inside their own zod-4 objects, so the +package requires zod 4. + +## Install + +```sh +pnpm add @understudy/protocol zod +``` + +## Exports + +```ts +import { + // schemas + CommandSchema, EventSchema, A11yNodeSchema, TabInfoSchema, SnapshotModeSchema, + // parsers + parseCommand, parseEvent, safeParseCommand, safeParseEvent, + // classification + isWriteCommand, + // types + type Command, type CommandType, type Event, + type A11yNode, type TabInfo, type SnapshotMode, +} from "@understudy/protocol"; +``` + +## Commands (consumer/service → extension) + +| type | fields | class | +|---|---|---| +| `snapshot` | `mode: "a11y" \| "dom" \| "screenshot"`, `tabId?` | read | +| `get_tabs` | — | read | +| `wait` | `for: "load" \| "idle" \| "ms"`, `value?` | read | +| `scroll` | `ref?`, `dy` | read | +| `resolve_ref` | `ref` | read (internal — see below) | +| `switch_tab` | `tabId` | read | +| `click` | `ref` | **write** | +| `type` | `ref`, `text`, `submit?` | **write** | +| `key` | `keys`, `ref?` | **write** | +| `navigate` | `url`, `tabId?` | **write** | +| `fill_secret` | `ref`, `secretRef`, `submit?` | **write** (vaulted) | + +`isWriteCommand` returns `true` for the write class. Two commands deserve a +warning: + +- **`fill_secret`** carries an opaque `secretRef` (e.g. `vault://…`), never a + plaintext secret. The understudy *service* resolves it against the vault and + types the plaintext over the trusted service↔extension hop — the secret never + enters the connector input, the model context, or any audit detail. Do **not** + route credentials through `type.text`. +- **`resolve_ref`** is an internal service↔extension probe (a pure lookup in the + extension's live ref map — no snapshot, no ref re-minting) that backs the + service API's `dryRun` flag. Consumers express dry-run intent via + `{ command, dryRun: true }` on the service API; they never send `resolve_ref` + themselves. + +## Events (extension → service → consumer) + +| type | fields | +|---|---| +| `hello` | `browser`, `extVersion`, `tabs` | +| `snapshot_result` | `commandId`, `tree: A11yNode[]` | +| `screenshot_result` | `commandId`, `mime`, `b64` | +| `tabs_result` | `commandId`, `tabs: TabInfo[]` | +| `action_result` | `commandId`, `ok`, `error?`, `url?`, `simulated?` | +| `page_event` | `kind: "navigated" \| "load"`, `tabId`, `url` | +| `pong` | — | + +`action_result.simulated` is set only on dry-run responses. A simulated +`ok: true` guarantees *resolvability* (the `ref` maps to a live node in the +current snapshot generation), not *executability*; ref-less commands simulate +`ok: true` without touching the browser at all. + +## Element targeting + +`A11yNode.ref` is the only element address a consumer's agent ever uses — +opaque, generation-namespaced (`s{gen}e{seq}`), resolved by the extension +against its CDP `backendNodeId` map. Refs are valid only for the snapshot +generation that produced them; a stale ref returns +`action_result{ ok: false }` and the consumer re-snapshots. + +## Versioning + +- **0.3.0** — adds the internal `resolve_ref` probe (fixes dry-run: a snapshot + probe re-mints refs and would invalidate the consumer's outstanding refs). +- **0.2.0** — adds `fill_secret` and the optional `action_result.simulated` + field; zod 4. diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 85b3f5e..178b910 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -2,6 +2,7 @@ "name": "@understudy/protocol", "version": "0.3.0", "type": "module", + "description": "The understudy browser-execution command protocol: zod-4 Command/Event discriminated unions shared by the service, the extension driver, and consumer connectors", "main": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { @@ -10,13 +11,35 @@ "default": "./dist/index.js" } }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "sideEffects": false, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/ProofOfTechOrg/understudy.git", + "directory": "packages/protocol" + }, + "homepage": "https://github.com/ProofOfTechOrg/understudy/tree/master/packages/protocol#readme", + "bugs": "https://github.com/ProofOfTechOrg/understudy/issues", + "keywords": [ + "understudy", + "browser-automation", + "cdp", + "protocol", + "zod" + ], "publishConfig": { "access": "public" }, "scripts": { "build": "tsc -p tsconfig.build.json", "typecheck": "tsc -p tsconfig.json", - "test": "vitest run" + "test": "vitest run", + "prepublishOnly": "pnpm run build" }, "dependencies": { "zod": "^4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c40ce57..e49bbe8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,11 @@ overrides: importers: - .: {} + .: + devDependencies: + '@changesets/cli': + specifier: ^2.27.0 + version: 2.31.0(@types/node@22.20.0) apps/backend: dependencies: @@ -18,7 +22,7 @@ importers: version: link:../../packages/protocol agents: specifier: ^0.17.3 - version: 0.17.3(@babel/core@8.0.1)(@babel/runtime@7.28.2)(@cloudflare/workers-types@5.20260707.1)(react@19.2.7)(rolldown@1.1.4)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(zod@4.4.3) + version: 0.17.3(@babel/core@8.0.1)(@babel/runtime@7.28.2)(@cloudflare/workers-types@5.20260707.1)(chat@4.33.0(zod@4.4.3))(react@19.2.7)(rolldown@1.1.4)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(zod@4.4.3) hono: specifier: ^4.12.27 version: 4.12.28 @@ -82,6 +86,28 @@ importers: specifier: ^0.20.27 version: 0.20.27(@types/node@22.20.0)(jiti@2.7.0)(rolldown@1.1.4)(rollup@4.62.2)(yaml@2.9.0) + packages/connector: + dependencies: + '@understudy/protocol': + specifier: workspace:^ + version: link:../protocol + zod: + specifier: ^4 + version: 4.4.3 + devDependencies: + '@mastra/core': + specifier: ^1.50.0 + version: 1.50.1(@cfworker/json-schema@4.1.1)(express@5.2.1)(zod@4.4.3) + '@proofoftech/breakwater': + specifier: ^0.3.0 + version: 0.3.1(@mastra/core@1.50.1(@cfworker/json-schema@4.1.1)(express@5.2.1)(zod@4.4.3)) + typescript: + specifier: ^5.6.0 + version: 5.9.3 + vitest: + specifier: ^2.1.0 + version: 2.1.9(@types/node@22.20.0)(lightningcss@1.32.0) + packages/protocol: dependencies: zod: @@ -100,6 +126,67 @@ packages: '@1natsu/wait-element@4.2.0': resolution: {integrity: sha512-Om0Q+WE9mNrpY4AwMTvkFiYHv8VM7TML3PvOqXy+w6kAjLjKhGYHYX+305+a6J8RVpds9s7IF2Z5aOPYwULFNw==} + '@a2a-js/sdk@0.3.14': + resolution: {integrity: sha512-F6Ew1AtPzCLhTn8h9yiqTe7DiDf6XVrSnq9V1YqSl9eWqPm6anMveTiKdCSb/76cW0YiJc24rNaUrVezFFHbqQ==} + engines: {node: '>=18'} + peerDependencies: + '@bufbuild/protobuf': ^2.10.2 + '@grpc/grpc-js': ^1.11.0 + express: ^4.21.2 || ^5.1.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + '@grpc/grpc-js': + optional: true + express: + optional: true + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider-utils@3.0.25': + resolution: {integrity: sha512-CvsRu+32Y8a167s+lrIBtsybvgTHp8j9y+6BeTvLeoW3Q+okw/b4CnNUFOLIXsRaKHQKAH+IHNJPYWywfpw0LA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.27': + resolution: {integrity: sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@5.0.0': + resolution: {integrity: sha512-zj66M02jc6ASYwIgWZowsooDUwaVngeNZQ3H10GwcPMZ+KR6gHMhcUuKl6tkai+JPXTKDyHY1pnszuxRtw2D4A==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/provider@2.0.3': + resolution: {integrity: sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==} + engines: {node: '>=18'} + + '@ai-sdk/provider@3.0.10': + resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} + engines: {node: '>=18'} + + '@ai-sdk/provider@4.0.0': + resolution: {integrity: sha512-fr9Gs89prDWiuox/T+kCA+i2cJkHpxU5S+tr4megjTzRC27ZsvFhwjU/+XrqqMbvBUlfmXxTOYWy8ng45dsjIg==} + engines: {node: '>=22'} + + '@ai-sdk/ui-utils@1.2.11': + resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@aklinker1/rollup-plugin-visualizer@5.12.0': resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==} engines: {node: '>=14'} @@ -245,6 +332,61 @@ packages: '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.31.0': + resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} + hasBin: true + + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@cloudflare/codemode@0.4.2': resolution: {integrity: sha512-6sLMZDRY2USbXirrI4tjmGSMYAYM+E/PJIaDQLLbMdvQjk1z1TmJNSLomrZwErO1zFPXvGX2kaqkkxvixkfV2w==} peerDependencies: @@ -950,6 +1092,19 @@ packages: cpu: [x64] os: [win32] + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/ttlcache@2.1.5': + resolution: {integrity: sha512-VwGZqqjAWPICTmxUZnbpEfO60LhPWzquik+bmyXGY7pYRn6diEvCI5i6Ca+J6o2y4vS73HrpuMTo2dOvUevH8w==} + engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -969,6 +1124,32 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/uuid@2.0.1': + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@mastra/core@1.50.1': + resolution: {integrity: sha512-8iFBnaR4LvWsvshFifuGMvo0bBKSxg6JXKtcr/BYhak13NjhLBumjwSoNdKt9SOci5uMp+e+/QUEeBgpFo65/w==} + engines: {node: '>=22.13.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + '@mastra/schema-compat@1.3.3': + resolution: {integrity: sha512-NqptophFxMB8Z3vXjnLAMbj2OMbspAA6Tqf3DQkxxNmlBH9RYhA4xqwK8/fum0lrgmYzVrsSkw7SwHrgVDcg6g==} + engines: {node: '>=22.13.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} engines: {node: '>=18'} @@ -985,6 +1166,18 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@oxc-project/types@0.138.0': resolution: {integrity: sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==} @@ -1009,6 +1202,18 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@posthog/core@1.40.1': + resolution: {integrity: sha512-jXuMtZCwA7AMpYlo1wjm6GlC58YBlz/ZxpDIsF9hroUfqYoPPDmQbsQb4iiZAS43+o/kwloxdKJIlE0IiwQ5HQ==} + + '@posthog/types@1.393.0': + resolution: {integrity: sha512-vzWeEJZ7ERQhFRoQYaP5jzN1JvIu46UJyHXsuv+dTGW2r3sMgREOhNxXLZjmFHwZ8/FOHQoyqqQmXTCXZSfMSg==} + + '@proofoftech/breakwater@0.3.1': + resolution: {integrity: sha512-I4qiBAhkcMB8MrGu8+nxLpIkZHEvzXsVHPYmjrYiOtLSrmGKy7w+bTX7SVJYJ9YD39jBN2zheIFhcIwE0yMnnQ==} + engines: {node: '>=22'} + peerDependencies: + '@mastra/core': ^1.50.0 + '@rolldown/binding-android-arm64@1.1.4': resolution: {integrity: sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1262,10 +1467,25 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@sindresorhus/slugify@2.2.1': + resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} + engines: {node: '>=12'} + + '@sindresorhus/transliterate@1.6.0': + resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} + engines: {node: '>=12'} + '@speed-highlight/core@1.2.17': resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} @@ -1278,6 +1498,9 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -1302,9 +1525,18 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@22.20.0': resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} @@ -1316,6 +1548,9 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webextension-polyfill@0.12.5': resolution: {integrity: sha512-uKSAv6LgcVdINmxXMKBuVIcg/2m5JZugoZO8x20g7j2bXJkPIl/lVGQcDlbV+aXAiTyXT2RA5U5mI4IGCDMQeg==} @@ -1399,6 +1634,12 @@ packages: '@webext-core/match-patterns@1.1.0': resolution: {integrity: sha512-vebVVbcOyva4jyvljIzRJwjFi/OKMLr96LIIxiPeXfA38gE4Z3+H6Y9DwRmn7pWErJGNNHU6XOhOb5ZwicGs7Q==} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + + '@workflow/serde@4.1.0-beta.2': + resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} + '@wxt-dev/browser@0.1.43': resolution: {integrity: sha512-RMB0zgfe7uuiTp18s9taLeKXoOCLBV418797dnEggiMWmM1JDJekiLtlvrNc6QeZg+amDBy2/KKYuQB2kh/K9A==} @@ -1473,6 +1714,10 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -1493,10 +1738,20 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-differ@4.0.0: resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + array-union@3.0.1: resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} engines: {node: '>=12'} @@ -1518,6 +1773,9 @@ packages: atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1526,6 +1784,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -1546,6 +1808,10 @@ packages: brace-expansion@1.1.15: resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + browserslist@4.28.5: resolution: {integrity: sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1596,6 +1862,9 @@ packages: caniuse-lite@1.0.30001803: resolution: {integrity: sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -1608,6 +1877,24 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + + chat@4.33.0: + resolution: {integrity: sha512-qaQyr6Nm7gLEPkYpfjlZzCxKKjvDyRe3GoVA5++RrzW9po5fe3ddH4l9JkGaFsTvSiRGAzuz12WJj/BB5+A6Hw==} + engines: {node: '>=20'} + peerDependencies: + ai: ^6.0.182 + zod: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + ai: + optional: true + zod: + optional: true + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} @@ -1731,6 +2018,10 @@ packages: resolution: {integrity: sha512-BoZaseYGXOo5j5HUwTaegIog3JJbuH4BbrY9A1ArLjXpy+RWb3mV28F/9Gv1dDA7E2L8kngWva4NWisnLTyfgQ==} engines: {node: '>=20'} + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1769,6 +2060,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1807,13 +2101,24 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devtools-protocol@0.0.1656784: resolution: {integrity: sha512-3jUemAFb1EvBZL2k5uiM7QWDbhReiLqwPn3zhVNVhR4mCyG1x6GrkmVJhh/0F/LSMhHfSI0Yi1HuKe/Kyu8dfQ==} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1870,6 +2175,10 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1943,6 +2252,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1964,6 +2278,10 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} @@ -1981,9 +2299,23 @@ packages: exsolve@1.1.0: resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-redact@3.5.0: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} @@ -1991,6 +2323,9 @@ packages: fast-uri@3.1.3: resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2000,14 +2335,26 @@ packages: picomatch: optional: true + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + filesize@11.0.19: resolution: {integrity: sha512-9Q2itINBvCHwFw9v5X7czZm855yAiFIYlnugrh7+8tYO4ITHZMzV91m35q2FngL9hoZwwjSTQACFF/W52OzJZQ==} engines: {node: '>= 10.8.0'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + firefox-profile@4.7.0: resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==} engines: {node: '>=18'} @@ -2033,6 +2380,14 @@ packages: resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} engines: {node: '>=14.14'} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2068,10 +2423,18 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + giget@3.3.0: resolution: {integrity: sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==} hasBin: true + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -2079,6 +2442,10 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2092,6 +2459,10 @@ packages: graceful-readlink@1.0.1: resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + growly@1.3.0: resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} @@ -2120,10 +2491,26 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + human-id@4.2.0: + resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} + hasBin: true + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + iconv-lite@0.7.3: resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -2169,6 +2556,14 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2177,6 +2572,10 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + is-in-ci@1.0.0: resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} engines: {node: '>=18'} @@ -2195,14 +2594,26 @@ packages: resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} engines: {node: '>=18'} + is-network-error@1.3.2: + resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} + engines: {node: '>=16'} + is-npm@6.1.0: resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -2221,6 +2632,22 @@ packages: resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} engines: {node: '>=0.10.0'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2249,6 +2676,9 @@ packages: jose@6.2.3: resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-base64@3.8.0: resolution: {integrity: sha512-65kvbemyZhj+ExQt1PEFyBEjL5vAHysu1lJdW1AwhhChkO8ZBPizYk/m9GVrpbS2Je1hF+UYZ+6KywqtZV8mHw==} @@ -2261,6 +2691,14 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.15.0: + resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + hasBin: true + + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2270,17 +2708,27 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-to-zod@2.8.1: + resolution: {integrity: sha512-fRr1mHgZ7hboLKBUdR428gd9dIHUFGivUqOeiDcSmyXkNZCtB1uGaZLvsjZ4GaN5pwBIs+TGIOf6s+Rp5/R/zA==} + hasBin: true + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-schema-typed@8.0.2: resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} @@ -2297,6 +2745,10 @@ packages: jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -2414,6 +2866,10 @@ packages: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2438,10 +2894,16 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -2462,6 +2924,9 @@ packages: resolution: {integrity: sha512-1DiZmDHPXMBgMRjeUtHy1q1VYmeJscHxhIAexX9z/zjRMP80+0ETuPfssi8z+kMY4DwUgsKuHqpjxgmeA9gBNA==} engines: {node: '>=18'} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marky@1.3.0: resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} @@ -2469,6 +2934,39 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -2477,6 +2975,98 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2514,6 +3104,10 @@ packages: mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2560,6 +3154,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -2613,16 +3211,54 @@ packages: resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} engines: {node: '>= 0.4.0'} - package-json@10.0.1: - resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} - engines: {node: '>=18'} + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@7.0.5: + resolution: {integrity: sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==} + engines: {node: '>=18'} + + p-retry@7.1.1: + resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} + engines: {node: '>=20'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -2641,16 +3277,28 @@ packages: react: optional: true + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -2675,6 +3323,10 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -2699,10 +3351,28 @@ packages: resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} + posthog-node@5.40.0: + resolution: {integrity: sha512-DrLfHuauO0W6qruF80iqr5JdmLysef74XzOB4eh36oRLRhxCySLraTqsi2Pj161LZnp9/JNdRDxwT8ei8VK2YA==} + engines: {node: ^20.20.0 || >=22.22.0} + peerDependencies: + rxjs: ^7.0.0 + peerDependenciesMeta: + rxjs: + optional: true + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2740,6 +3410,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -2767,6 +3440,10 @@ packages: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2786,6 +3463,18 @@ packages: resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} engines: {node: '>=12'} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remend@1.3.0: + resolution: {integrity: sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2794,10 +3483,18 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -2819,6 +3516,9 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -2842,6 +3542,13 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -2909,6 +3616,10 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -2938,6 +3649,9 @@ packages: spawn-sync@1.0.15: resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -2945,6 +3659,9 @@ packages: split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2981,10 +3698,22 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-bom@5.0.0: resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -3006,6 +3735,10 @@ packages: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + thread-stream@3.2.0: resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} @@ -3046,10 +3779,20 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tokenx@1.3.0: + resolution: {integrity: sha512-NLdXTEZkKiO0gZuLtMoZKjCXTREXeZZt8nnnNeyoXtNZAfG/GKGSbQtLU5STspc0rMSwcA+UJfWZkbNU01iKmQ==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3089,6 +3832,13 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unimport@6.3.0: resolution: {integrity: sha512-M+Dxk5W9WRd+8j56W9tp8lGW/dmMc7g5zj7BWQnEjKQhryBstqsi1V0izb0zHwSkEN8cSYV7K75/bykairV2tA==} engines: {node: '>=18.12.0'} @@ -3101,6 +3851,22 @@ packages: rolldown: optional: true + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3159,6 +3925,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -3168,6 +3938,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@2.1.9: resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3424,6 +4200,9 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3449,6 +4228,10 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} @@ -3458,6 +4241,12 @@ packages: zip-dir@2.0.0: resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} + zod-from-json-schema@0.0.5: + resolution: {integrity: sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ==} + + zod-from-json-schema@0.5.3: + resolution: {integrity: sha512-44YFiuq+WHw9YZQAo/Ad0F7o9c/im0Q6cnHI23BsXhEmZtkNn4cD0bljLMMjkfb/EidopPWdsmKI8EvLHX5ZyA==} + zod-to-json-schema@3.25.2: resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: @@ -3469,6 +4258,9 @@ packages: zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@1natsu/wait-element@4.2.0': @@ -3476,6 +4268,64 @@ snapshots: defu: 6.1.7 many-keys-map: 3.0.3 + '@a2a-js/sdk@0.3.14(express@5.2.1)': + dependencies: + uuid: 11.1.1 + optionalDependencies: + express: 5.2.1 + + '@ai-sdk/provider-utils@2.2.8(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.15 + secure-json-parse: 2.7.0 + zod: 4.4.3 + + '@ai-sdk/provider-utils@3.0.25(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 2.0.3 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.0 + zod: 4.4.3 + + '@ai-sdk/provider-utils@4.0.27(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 3.0.10 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.0 + zod: 4.4.3 + + '@ai-sdk/provider-utils@5.0.0(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 4.0.0 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.1.0 + zod: 4.4.3 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@2.0.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@3.0.10': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@4.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/ui-utils@1.2.11(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@4.4.3) + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) + '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.62.2)': dependencies: open: 8.4.2 @@ -3645,6 +4495,149 @@ snapshots: '@cfworker/json-schema@4.1.1': {} + '@changesets/apply-release-plan@7.1.1': + dependencies: + '@changesets/config': 3.1.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.8.5 + + '@changesets/assemble-release-plan@6.0.10': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.5 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.31.0(@types/node@22.20.0)': + dependencies: + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@22.20.0) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.8.5 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.8.5 + + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.3.0 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.2.0 + prettier: 2.8.8 + '@cloudflare/codemode@0.4.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(zod@4.4.3)': dependencies: '@types/json-schema': 7.0.15 @@ -4054,6 +5047,15 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/external-editor@1.0.3(@types/node@22.20.0)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 22.20.0 + + '@isaacs/ttlcache@2.1.5': {} + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4078,6 +5080,82 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lukeed/csprng@1.1.0': {} + + '@lukeed/uuid@2.0.1': + dependencies: + '@lukeed/csprng': 1.1.0 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.2 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.2 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@mastra/core@1.50.1(@cfworker/json-schema@4.1.1)(express@5.2.1)(zod@4.4.3)': + dependencies: + '@a2a-js/sdk': 0.3.14(express@5.2.1) + '@ai-sdk/provider-utils-v5': '@ai-sdk/provider-utils@3.0.25(zod@4.4.3)' + '@ai-sdk/provider-utils-v6': '@ai-sdk/provider-utils@4.0.27(zod@4.4.3)' + '@ai-sdk/provider-utils-v7': '@ai-sdk/provider-utils@5.0.0(zod@4.4.3)' + '@ai-sdk/provider-v5': '@ai-sdk/provider@2.0.3' + '@ai-sdk/provider-v6': '@ai-sdk/provider@3.0.10' + '@ai-sdk/provider-v7': '@ai-sdk/provider@4.0.0' + '@ai-sdk/ui-utils-v5': '@ai-sdk/ui-utils@1.2.11(zod@4.4.3)' + '@isaacs/ttlcache': 2.1.5 + '@lukeed/uuid': 2.0.1 + '@mastra/schema-compat': 1.3.3(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + '@sindresorhus/slugify': 2.2.1 + '@standard-schema/spec': 1.1.0 + ajv: 8.20.0 + chat: 4.33.0(zod@4.4.3) + croner: 10.0.1 + dotenv: 17.4.2 + execa: 9.6.1 + fastq: 1.20.1 + gray-matter: 4.0.3 + ignore: 7.0.5 + jpeg-js: 0.4.4 + json-schema: 0.4.0 + lru-cache: 11.5.1 + p-map: 7.0.5 + p-retry: 7.1.1 + picomatch: 4.0.5 + posthog-node: 5.40.0 + tokenx: 1.3.0 + ws: 8.21.0 + xxhash-wasm: 1.1.0 + zod: 4.4.3 + transitivePeerDependencies: + - '@bufbuild/protobuf' + - '@cfworker/json-schema' + - '@grpc/grpc-js' + - ai + - bufferutil + - express + - rxjs + - supports-color + - utf-8-validate + + '@mastra/schema-compat@1.3.3(zod@4.4.3)': + dependencies: + json-schema-to-zod: 2.8.1 + zod: 4.4.3 + zod-from-json-schema: 0.5.3 + zod-from-json-schema-v3: zod-from-json-schema@0.0.5 + zod-to-json-schema: 3.25.2(zod@4.4.3) + '@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.4.3)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.28) @@ -4109,6 +5187,18 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + '@oxc-project/types@0.138.0': {} '@pnpm/config.env-replace@1.1.0': {} @@ -4135,6 +5225,16 @@ snapshots: '@poppinss/exception@1.2.3': {} + '@posthog/core@1.40.1': + dependencies: + '@posthog/types': 1.393.0 + + '@posthog/types@1.393.0': {} + + '@proofoftech/breakwater@0.3.1(@mastra/core@1.50.1(@cfworker/json-schema@4.1.1)(express@5.2.1)(zod@4.4.3))': + dependencies: + '@mastra/core': 1.50.1(@cfworker/json-schema@4.1.1)(express@5.2.1)(zod@4.4.3) + '@rolldown/binding-android-arm64@1.1.4': optional: true @@ -4280,8 +5380,21 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true + '@sec-ant/readable-stream@0.4.1': {} + '@sindresorhus/is@7.2.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + + '@sindresorhus/slugify@2.2.1': + dependencies: + '@sindresorhus/transliterate': 1.6.0 + escape-string-regexp: 5.0.0 + + '@sindresorhus/transliterate@1.6.0': + dependencies: + escape-string-regexp: 5.0.0 + '@speed-highlight/core@1.2.17': {} '@standard-schema/spec@1.1.0': {} @@ -4296,6 +5409,10 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.9': {} @@ -4314,8 +5431,16 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/minimatch@3.0.5': {} + '@types/ms@2.1.0': {} + + '@types/node@12.20.55': {} + '@types/node@22.20.0': dependencies: undici-types: 6.21.0 @@ -4328,6 +5453,8 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/unist@3.0.3': {} + '@types/webextension-polyfill@0.12.5': {} '@vitejs/plugin-react@6.0.3(@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.28.2)(rolldown@1.1.4)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)))(vite@8.1.3(@types/node@22.20.0)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))': @@ -4429,6 +5556,10 @@ snapshots: '@webext-core/match-patterns@1.1.0': {} + '@workflow/serde@4.1.0': {} + + '@workflow/serde@4.1.0-beta.2': {} + '@wxt-dev/browser@0.1.43': dependencies: '@types/filesystem': 0.0.36 @@ -4463,7 +5594,7 @@ snapshots: adm-zip@0.5.18: {} - agents@0.17.3(@babel/core@8.0.1)(@babel/runtime@7.28.2)(@cloudflare/workers-types@5.20260707.1)(react@19.2.7)(rolldown@1.1.4)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(zod@4.4.3): + agents@0.17.3(@babel/core@8.0.1)(@babel/runtime@7.28.2)(@cloudflare/workers-types@5.20260707.1)(chat@4.33.0(zod@4.4.3))(react@19.2.7)(rolldown@1.1.4)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(zod@4.4.3): dependencies: '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.1) '@cfworker/json-schema': 4.1.1 @@ -4481,6 +5612,7 @@ snapshots: yargs: 18.0.0 zod: 4.4.3 optionalDependencies: + chat: 4.33.0(zod@4.4.3) vite: 8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - '@babel/core' @@ -4505,6 +5637,8 @@ snapshots: dependencies: string-width: 4.2.3 + ansi-colors@4.1.3: {} + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -4519,8 +5653,16 @@ snapshots: ansi-styles@6.2.3: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + array-differ@4.0.0: {} + array-union@2.1.0: {} + array-union@3.0.1: {} assertion-error@2.0.1: {} @@ -4538,10 +5680,16 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 + bail@2.0.2: {} + balanced-match@1.0.2: {} baseline-browser-mapping@2.10.42: {} + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + blake3-wasm@2.1.5: {} bluebird@3.7.2: {} @@ -4578,6 +5726,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + browserslist@4.28.5: dependencies: baseline-browser-mapping: 2.10.42 @@ -4631,6 +5783,8 @@ snapshots: caniuse-lite@1.0.30001803: {} + ccount@2.0.1: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -4643,6 +5797,24 @@ snapshots: chalk@5.6.2: {} + character-entities@2.0.2: {} + + chardet@2.2.0: {} + + chat@4.33.0(zod@4.4.3): + dependencies: + '@workflow/serde': 4.1.0-beta.2 + mdast-util-to-string: 4.0.0 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + remend: 1.3.0 + unified: 11.0.5 + optionalDependencies: + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + check-error@2.1.3: {} chokidar@5.0.0: @@ -4751,6 +5923,8 @@ snapshots: cron-schedule@6.0.0: {} + croner@10.0.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -4781,6 +5955,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -4804,10 +5982,20 @@ snapshots: destr@2.0.5: {} + detect-indent@6.1.0: {} + detect-libc@2.1.2: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + devtools-protocol@0.0.1656784: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -4860,6 +6048,11 @@ snapshots: encodeurl@2.0.0: {} + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + entities@4.5.0: {} entities@7.0.1: {} @@ -4980,6 +6173,8 @@ snapshots: escape-string-regexp@5.0.0: {} + esprima@4.0.1: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -4996,6 +6191,21 @@ snapshots: dependencies: eventsource-parser: 3.1.0 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + expect-type@1.4.0: {} express-rate-limit@8.5.2(express@5.2.1): @@ -5038,18 +6248,46 @@ snapshots: exsolve@1.1.0: {} + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extendable-error@0.1.7: {} + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-redact@3.5.0: {} fast-uri@3.1.3: {} + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + filesize@11.0.19: {} + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -5061,6 +6299,11 @@ snapshots: transitivePeerDependencies: - supports-color + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + firefox-profile@4.7.0: dependencies: adm-zip: 0.5.18 @@ -5083,6 +6326,18 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fsevents@2.3.3: optional: true @@ -5123,14 +6378,32 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + giget@3.3.0: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} global-directory@4.0.1: dependencies: ini: 4.1.1 + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + gopd@1.2.0: {} graceful-fs@4.2.10: {} @@ -5139,6 +6412,13 @@ snapshots: graceful-readlink@1.0.1: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.15.0 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + growly@1.3.0: {} has-symbols@1.1.0: {} @@ -5168,10 +6448,18 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + human-id@4.2.0: {} + + human-signals@8.0.1: {} + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 + ignore@5.3.2: {} + + ignore@7.0.5: {} + immediate@3.0.6: {} import-meta-resolve@4.2.0: {} @@ -5198,12 +6486,20 @@ snapshots: is-docker@3.0.0: {} + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@5.1.0: dependencies: get-east-asian-width: 1.6.0 + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + is-in-ci@1.0.0: {} is-in-ssh@1.0.0: {} @@ -5217,10 +6513,16 @@ snapshots: global-directory: 4.0.1 is-path-inside: 4.0.0 + is-network-error@1.3.2: {} + is-npm@6.1.0: {} + is-number@7.0.0: {} + is-path-inside@4.0.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -5233,6 +6535,16 @@ snapshots: is-relative@0.1.3: {} + is-stream@4.0.1: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-unicode-supported@2.1.0: {} + + is-windows@1.0.2: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -5253,6 +6565,8 @@ snapshots: jose@6.2.3: {} + jpeg-js@0.4.4: {} + js-base64@3.8.0: {} js-tokens@10.0.0: {} @@ -5261,16 +6575,33 @@ snapshots: js-tokens@9.0.1: {} + js-yaml@3.15.0: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + jsesc@3.1.0: {} json-parse-even-better-errors@3.0.2: {} + json-schema-to-zod@2.8.1: {} + json-schema-traverse@1.0.0: {} json-schema-typed@8.0.2: {} + json-schema@0.4.0: {} + json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonfile@6.2.1: dependencies: universalify: 2.0.1 @@ -5308,6 +6639,8 @@ snapshots: jwa: 2.0.1 safe-buffer: 5.2.1 + kind-of@6.0.3: {} + kleur@3.0.3: {} kleur@4.1.5: {} @@ -5402,6 +6735,10 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -5418,6 +6755,8 @@ snapshots: lodash.once@4.1.1: {} + lodash.startcase@4.4.0: {} + log-update@6.1.0: dependencies: ansi-escapes: 7.3.0 @@ -5426,6 +6765,8 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + longest-streak@3.1.0: {} + loupe@3.2.1: {} lru-cache@11.5.1: {} @@ -5444,14 +6785,316 @@ snapshots: many-keys-map@3.0.3: {} + markdown-table@3.0.4: {} + marky@1.3.0: {} math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + media-typer@1.1.0: {} merge-descriptors@2.0.0: {} + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -5498,6 +7141,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 + mri@1.2.0: {} + ms@2.1.3: {} multimatch@6.0.0: @@ -5536,6 +7181,11 @@ snapshots: normalize-path@3.0.0: {} + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -5591,6 +7241,30 @@ snapshots: os-shim@0.1.3: {} + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-map@7.0.5: {} + + p-retry@7.1.1: + dependencies: + is-network-error: 1.3.2 + + p-try@2.2.0: {} + package-json@10.0.1: dependencies: ky: 1.14.3 @@ -5598,6 +7272,10 @@ snapshots: registry-url: 6.0.1 semver: 7.8.5 + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + pako@1.0.11: {} parse-json@7.1.1: @@ -5608,6 +7286,8 @@ snapshots: lines-and-columns: 2.0.4 type-fest: 3.13.1 + parse-ms@4.0.0: {} + parseurl@1.3.3: {} partyserver@0.5.8(@cloudflare/workers-types@5.20260707.1): @@ -5621,12 +7301,18 @@ snapshots: optionalDependencies: react: 19.2.7 + path-exists@4.0.0: {} + path-key@3.1.1: {} + path-key@4.0.0: {} + path-to-regexp@6.3.0: {} path-to-regexp@8.4.2: {} + path-type@4.0.0: {} + pathe@1.1.2: {} pathe@2.0.3: {} @@ -5641,6 +7327,8 @@ snapshots: picomatch@4.0.5: {} + pify@4.0.1: {} + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -5681,8 +7369,18 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + posthog-node@5.40.0: + dependencies: + '@posthog/core': 1.40.1 + powershell-utils@0.1.0: {} + prettier@2.8.8: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} process-warning@5.0.0: {} @@ -5726,6 +7424,8 @@ snapshots: quansync@0.2.11: {} + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} range-parser@1.3.0: {} @@ -5756,6 +7456,13 @@ snapshots: react@19.2.7: {} + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.15.0 + pify: 4.0.1 + strip-bom: 3.0.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -5778,15 +7485,47 @@ snapshots: dependencies: rc: 1.2.8 + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remend@1.3.0: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} + resolve-from@5.0.0: {} + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 + reusify@1.1.0: {} + rfdc@1.4.1: {} rolldown@1.1.4: @@ -5853,6 +7592,10 @@ snapshots: run-applescript@7.1.0: {} + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -5867,6 +7610,13 @@ snapshots: scule@1.3.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + secure-json-parse@2.7.0: {} + semver@7.8.5: {} send@1.2.1: @@ -5978,6 +7728,8 @@ snapshots: sisteransi@1.0.5: {} + slash@3.0.0: {} + slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -6008,12 +7760,19 @@ snapshots: concat-stream: 1.6.2 os-shim: 0.1.3 + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + split2@4.2.0: {} split@1.0.1: dependencies: through: 2.3.8 + sprintf-js@1.0.3: {} + stackback@0.0.2: {} statuses@2.0.2: {} @@ -6051,8 +7810,14 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} + + strip-bom@3.0.0: {} + strip-bom@5.0.0: {} + strip-final-newline@4.0.0: {} + strip-json-comments@2.0.1: {} strip-json-comments@5.0.2: {} @@ -6069,6 +7834,8 @@ snapshots: supports-color@10.2.2: {} + term-size@2.2.1: {} + thread-stream@3.2.0: dependencies: real-require: 0.2.0 @@ -6096,8 +7863,16 @@ snapshots: tmp@0.2.5: {} + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + toidentifier@1.0.1: {} + tokenx@1.3.0: {} + + trough@2.2.0: {} + tslib@2.8.1: {} type-fest@3.13.1: {} @@ -6126,6 +7901,18 @@ snapshots: dependencies: pathe: 2.0.3 + unicorn-magic@0.3.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + unimport@6.3.0(esbuild@0.27.7)(rolldown@1.1.4)(rollup@4.62.2)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)): dependencies: acorn: 8.17.0 @@ -6154,6 +7941,27 @@ snapshots: - vite - webpack + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@0.1.2: {} + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -6195,10 +8003,22 @@ snapshots: util-deprecate@1.0.2: {} + uuid@11.1.1: {} + uuid@8.3.2: {} vary@1.1.2: {} + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite-node@2.1.9(@types/node@22.20.0)(lightningcss@1.32.0): dependencies: cac: 6.7.14 @@ -6522,6 +8342,8 @@ snapshots: xmlbuilder@11.0.1: {} + xxhash-wasm@1.1.0: {} + y18n@5.0.8: {} yaml@2.9.0: {} @@ -6549,6 +8371,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 + yoctocolors@2.1.2: {} + youch-core@0.3.3: dependencies: '@poppinss/exception': 1.2.3 @@ -6567,6 +8391,14 @@ snapshots: async: 3.2.6 jszip: 3.10.1 + zod-from-json-schema@0.0.5: + dependencies: + zod: 3.25.76 + + zod-from-json-schema@0.5.3: + dependencies: + zod: 4.4.3 + zod-to-json-schema@3.25.2(zod@4.4.3): dependencies: zod: 4.4.3 @@ -6574,3 +8406,5 @@ snapshots: zod@3.25.76: {} zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3fffce3..9874d5d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,6 +7,13 @@ packages: # Supply-chain guard: quarantine freshly published versions for 7 days (minutes). minimumReleaseAge: 10080 +# First-party org packages are exempt from the quarantine: we consume our own +# releases immediately (every published @proofoftech/breakwater version is +# younger than the 7-day window, so packages/connector could not resolve it +# at all otherwise). +minimumReleaseAgeExclude: + - "@proofoftech/breakwater" + # Dependency build-script approvals (pnpm 11 `allowBuilds` map). esbuild is a # trusted vitest/vite/WXT dependency that links its platform binary via an # install script.