diff --git a/.changeset/current-cosmos-omnigraph.md b/.changeset/current-cosmos-omnigraph.md new file mode 100644 index 0000000..70bed3c --- /dev/null +++ b/.changeset/current-cosmos-omnigraph.md @@ -0,0 +1,15 @@ +--- +'@modernrelay/orbit-engine-cosmos': minor +'@modernrelay/orbit-omnigraph': minor +'@modernrelay/orbit-react': patch +'@modernrelay/orbit-data': patch +'@modernrelay/orbit-core': patch +--- + +Upgrade Cosmos to 3.5.1 and OmniGraph to 0.14.0. Both adapters now require Node.js 22 or newer. + +The Cosmos adapter resolves the compatible Luma 9.3 peers and uses flat position snapshots. The OmniGraph adapter follows the 0.14 HTTP contract, reads physical IDs separately from user properties, normalizes nullable and UTC temporal values, and preserves search cancellation. Generated OmniGraph attribute types no longer inject a physical `id`; schema-declared `id` properties retain their declared types, and list types account for nullable elements. Regenerate generated types and update stored-query column mappings for the new result format when upgrading. + +Upgrade OmniGraph servers alongside the SDK; the 0.13 HTTP contract is no longer accepted. Export drift checks now read the captured head from bounded commit-history pages, preserving revision checks without fetching the entire history. Integration fixtures and CI use the official 0.14.0 server. + +Refresh dependencies across all packages and apps, including React 19.3, Vite 8, Storybook 10.6, Vitest 5, jsdom 30, Playwright 1.64, and TypeScript 7. React 18 remains supported. The root retains TypeScript 6 for build tools that require its compiler API, and Luma stays on the latest 9.3 patch required by Cosmos. Development uses pnpm 12 and Node.js 22.18+, 24.11+, or 26+. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 853e71c..7c72661 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,9 +10,9 @@ jobs: check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: node-version: 24 cache: pnpm @@ -37,9 +37,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: node-version: 24 cache: pnpm @@ -49,7 +49,7 @@ jobs: run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT" working-directory: apps/demo - name: Cache Playwright browsers - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.cache/ms-playwright key: playwright-${{ runner.os }}-${{ steps.pw.outputs.version }} @@ -75,7 +75,7 @@ jobs: # rendering only helps idle gaps, not active streaming. # Raising this back toward 30000 is a separate canary experiment. STREAM_ROWS: '12000' - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 if: always() with: name: demo-playwright @@ -85,6 +85,59 @@ jobs: if-no-files-found: ignore retention-days: 7 + omnigraph: + # Exercise the current protocol against an actual pinned server. The + # recordings stay useful for fast unit tests, but cannot replace this gate. + runs-on: ubuntu-latest + timeout-minutes: 25 + env: + OMNIGRAPH_LIVE_REQUIRED: '1' + steps: + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: 24 + cache: pnpm + - run: pnpm install --frozen-lockfile + - name: Install OmniGraph 0.14.0 + shell: bash + run: | + mkdir -p "$RUNNER_TEMP/omnigraph-0.14.0" + cd "$RUNNER_TEMP/omnigraph-0.14.0" + release_url=https://github.com/ModernRelay/omnigraph/releases/download/v0.14.0 + curl --fail --location --retry 3 "$release_url/omnigraph-linux-x86_64.tar.gz" -o omnigraph-linux-x86_64.tar.gz + curl --fail --location --retry 3 "$release_url/omnigraph-linux-x86_64.sha256" -o omnigraph-linux-x86_64.sha256 + sha256sum --check omnigraph-linux-x86_64.sha256 + tar -xzf omnigraph-linux-x86_64.tar.gz + "$RUNNER_TEMP/omnigraph-0.14.0/omnigraph" version + { + echo "OMNIGRAPH_BIN=$RUNNER_TEMP/omnigraph-0.14.0/omnigraph" + echo "OMNIGRAPH_SERVER_BIN=$RUNNER_TEMP/omnigraph-0.14.0/omnigraph-server" + } >> "$GITHUB_ENV" + - name: Install Playwright Chromium + timeout-minutes: 15 + run: | + for attempt in 1 2 3; do + if timeout 240 pnpm --filter orbit-demo exec playwright install --with-deps chromium; then + exit 0 + fi + echo "playwright install attempt ${attempt} failed or stalled; retrying" >&2 + sleep 5 + done + exit 1 + - name: Live export and stored-query integration + run: pnpm --filter orbit-demo exec playwright test e2e/omnigraph.spec.ts + - uses: actions/upload-artifact@v7 + if: always() + with: + name: omnigraph-playwright + path: | + apps/demo/playwright-report/ + apps/demo/test-results/ + if-no-files-found: ignore + retention-days: 7 + package: runs-on: ubuntu-latest strategy: @@ -92,9 +145,9 @@ jobs: matrix: node: [22, 24] steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: node-version: ${{ matrix.node }} cache: pnpm @@ -104,7 +157,7 @@ jobs: - run: pnpm run smoke - run: pnpm run probe:node - run: pnpm run svg:node-fixture - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 if: always() with: name: smoke-node-${{ matrix.node }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 552b5d0..56c6496 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,19 +29,23 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: node-version: 24 cache: pnpm - run: pnpm install --frozen-lockfile + - name: Configure npm publishing + uses: actions/setup-node@v7 + with: + registry-url: https://registry.npmjs.org - name: Version PR or publish - uses: changesets/action@v1 + uses: changesets/action@v2 with: - version: pnpm run version - publish: pnpm run release - createGithubReleases: true + version-script: pnpm run version + publish-script: pnpm run release + create-github-releases: true + github-token: ${{ secrets.GITHUB_TOKEN }} env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c1dd0c9..a7cdc58 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,12 +2,23 @@ ## Setup +Use Node.js 22.18+, 24.11+, or 26+ for the current development tools, and +pnpm 12.15.0 (pinned in `packageManager`). The published Cosmos and OmniGraph +adapters require Node.js 22 or newer. + ```bash pnpm install pnpm check # boundaries + lint + typecheck + all tests + gate evaluator pnpm demo:dev # demo app at http://localhost:5199 ``` +Workspace packages and apps use TypeScript 7 for `pnpm typecheck`, and the +OmniGraph code-generation tests invoke that compiler directly. The root keeps +TypeScript 6.0.3 for tsup declaration generation and typescript-eslint: these +tools still require the JavaScript compiler API removed from TypeScript 7. +Run typechecks through the workspace scripts, rather than the root `tsc` binary. +Remove the root compatibility compiler when both tools support TypeScript 7. + ## Ground rules - **One focused change per PR**, with tests. When a PR fixes a bug, add the diff --git a/README.md b/README.md index 817538a..a06d1e1 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,9 @@ Handles 100K+ node graphs. UI components included: search, tables, histograms, a npm install @modernrelay/orbit-react @modernrelay/orbit-core @modernrelay/orbit-engine-cosmos ``` -**Status:** `0.15.0` on npm — all five packages release in lockstep. See +The Cosmos engine and OmniGraph adapter require Node.js 22 or newer. + +All five packages release in lockstep. See [Releases](https://github.com/ModernRelay/orbit/releases) for changelogs. ## Packages diff --git a/apps/demo/e2e/data-search.spec.ts b/apps/demo/e2e/data-search.spec.ts index b326524..85af3a9 100644 --- a/apps/demo/e2e/data-search.spec.ts +++ b/apps/demo/e2e/data-search.spec.ts @@ -119,6 +119,9 @@ test('search: results list, Enter focuses, a filtered result surfaces its reason test('minimap: canvas rasterizes and a corner click pans the real viewport', async ({ page, }) => { + // Pausing physics does not stop the initial camera fit. Make that fit + // instant so the before/after zoom comparison measures only the minimap pan. + await page.emulateMedia({ reducedMotion: 'reduce' }); await gotoReady(page); await pauseSimulation(page); diff --git a/apps/demo/e2e/omnigraph.spec.ts b/apps/demo/e2e/omnigraph.spec.ts index 89b462e..bffedee 100644 --- a/apps/demo/e2e/omnigraph.spec.ts +++ b/apps/demo/e2e/omnigraph.spec.ts @@ -1,42 +1,35 @@ /** - * v0.6 omnigraph live-integration smoke. - * - * Boots the REAL `omnigraph-server` over the committed fixture cluster - * (fixtures/omnigraph/cluster) and drives the demo's Omnigraph panel end to - * end through the vite `/og` same-origin proxy: Load from Omnigraph → live - * meter completes → header counts match the recorded manifest's rowCounts → - * hovering a node surfaces a type-derived label → screenshot artifact. - * - * Skips cleanly (never fails) when the `omnigraph-server` binary or the - * fixture cluster graph store is absent — CI installs neither and consumes - * the recorded HTTP fixtures instead; this spec is the local full-stack - * proof. Regenerate the cluster store with `node scripts/omnigraph-fixture.mjs`. + * Live OmniGraph 0.14 integration. The fixture script creates a fresh local + * cluster, seeds it through HTTP, and owns its server until teardown. + * Optional locally; OMNIGRAPH_LIVE_REQUIRED=1 makes missing binaries fail CI. */ - import { spawn, spawnSync } from 'node:child_process'; import type { ChildProcess } from 'node:child_process'; -import { existsSync, readFileSync } from 'node:fs'; +import { once } from 'node:events'; +import { readFileSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { Omnigraph } from '@modernrelay/omnigraph'; +import { createGraphInstance } from '@modernrelay/orbit-core'; +import { FakeEngine } from '@modernrelay/orbit-core/testing'; +import { createOmnigraphSearchService, createOmnigraphSource, encodeSourceId } from '@modernrelay/orbit-omnigraph'; import { expect, test } from '@playwright/test'; import type { Page } from '@playwright/test'; const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..'); -const CLUSTER_DIR = path.join(ROOT, 'fixtures', 'omnigraph', 'cluster'); -const GRAPH_STORE = path.join(CLUSTER_DIR, 'graphs', 'demo.omni'); -const MANIFEST_PATH = path.join(ROOT, 'fixtures', 'omnigraph', 'recorded', 'manifest.json'); - -const BIND = '127.0.0.1:8199'; -const HEALTH_URL = `http://${BIND}/healthz`; - +const CLI = process.env.OMNIGRAPH_BIN || 'omnigraph'; +const SERVER = process.env.OMNIGRAPH_SERVER_BIN || 'omnigraph-server'; +const BASE = 'http://127.0.0.1:8199'; +const REQUIRED = process.env.OMNIGRAPH_LIVE_REQUIRED === '1'; +const cliVersion = spawnSync(CLI, ['version'], { encoding: 'utf8' }); +const AVAILABLE = cliVersion.status === 0 && cliVersion.stdout.split('\n').includes('omnigraph 0.14.0') && + spawnSync(SERVER, ['--help'], { stdio: 'ignore' }).status === 0; +const SKIP_REASON = 'Set OMNIGRAPH_BIN and OMNIGRAPH_SERVER_BIN to the pinned 0.14.0 binaries; OMNIGRAPH_LIVE_REQUIRED=1 requires the live test.'; const READY_DOT = '[data-testid="status-dot"][title="ready"]'; const NODE_COUNT = '[data-testid="node-count"]'; const EDGE_COUNT = '[data-testid="edge-count"]'; - -/** Status-bar hover readout format for omnigraph nodes (App.tsx `labelOf`). */ const TYPE_LABEL = /^(Actor|Decision|Trace|Signal|Artifact) · .+/; - const fmt = (n: number): string => n.toLocaleString('en-US'); interface RecordedManifest { @@ -44,60 +37,64 @@ interface RecordedManifest { branch: string; rowCounts: Record; } - -function hasServerBinary(): boolean { - try { - return spawnSync('omnigraph-server', ['--help'], { stdio: 'ignore' }).error === undefined; - } catch { - return false; - } -} - -const AVAILABLE = hasServerBinary() && existsSync(GRAPH_STORE) && existsSync(MANIFEST_PATH); -const SKIP_REASON = - 'omnigraph-server binary or fixture cluster store missing (CI) — ' + - 'recorded fixtures cover the adapter; run `node scripts/omnigraph-fixture.mjs` locally'; - -const manifest: RecordedManifest | null = AVAILABLE - ? (JSON.parse(readFileSync(MANIFEST_PATH, 'utf8')) as RecordedManifest) - : null; - +const manifest = JSON.parse(readFileSync(path.join(ROOT, 'fixtures/omnigraph/recorded/manifest.json'), 'utf8')) as RecordedManifest; function tableTotal(m: RecordedManifest, prefix: 'node:' | 'edge:'): number { - return Object.entries(m.rowCounts) - .filter(([key]) => key.startsWith(prefix)) - .reduce((sum, [, count]) => sum + count, 0); + return Object.entries(m.rowCounts).filter(([key]) => key.startsWith(prefix)).reduce((sum, [, count]) => sum + count, 0); } -async function healthy(): Promise { - try { - return (await fetch(HEALTH_URL)).ok; - } catch { - return false; - } -} - -/** Spawned only when nothing already answers on 8199 (reuse a dev server). */ -let server: ChildProcess | null = null; +let fixture: ChildProcess | null = null; +let fixtureClosed: Promise | null = null; +let fixtureLog = ''; +test.skip(!AVAILABLE && !REQUIRED, SKIP_REASON); test.beforeAll(async () => { - if (!AVAILABLE) return; - if (await healthy()) return; - server = spawn( - 'omnigraph-server', - ['--cluster', CLUSTER_DIR, '--unauthenticated', '--bind', BIND], - { stdio: 'ignore' }, - ); - const deadline = Date.now() + 20_000; - while (Date.now() < deadline) { - if (await healthy()) return; - await new Promise((resolve) => setTimeout(resolve, 200)); + test.setTimeout(60_000); + if (!AVAILABLE) throw new Error(SKIP_REASON); + fixture = spawn(process.execPath, [path.join(ROOT, 'scripts/omnigraph-fixture.mjs'), '--serve'], { + cwd: ROOT, env: { ...process.env, OMNIGRAPH_FIXTURE_PORT: '8199' }, stdio: ['ignore', 'pipe', 'pipe'], + }); + fixtureClosed = once(fixture, 'close'); + for (const output of [fixture.stdout, fixture.stderr]) output?.on('data', (chunk) => { fixtureLog = (fixtureLog + chunk).slice(-16000); }); + const deadline = Date.now() + 45_000; + while (!fixtureLog.includes('FIXTURE_READY')) { + if (fixture.exitCode !== null || fixture.signalCode !== null || Date.now() > deadline) throw new Error(`Fixture failed to start: ${fixtureLog}`); + await new Promise((resolve) => setTimeout(resolve, 100)); } - throw new Error(`omnigraph-server did not become healthy on ${HEALTH_URL} within 20s`); + const response = await fetch(`${BASE}/readyz`, { headers: { 'Omnigraph-Http-Api': '0.14' } }); + expect(response.ok).toBe(true); + expect(response.headers.get('Omnigraph-Http-Api')).toBe('0.14'); }); -test.afterAll(() => { - server?.kill(); - server = null; +test.afterAll(async () => { + if (fixture !== null && fixture.exitCode === null && fixture.signalCode === null) { + fixture.kill('SIGTERM'); + await fixtureClosed; + } + fixture = null; +}); + +test('live export and stored search share system identity while retaining user id data', async () => { + const client = new Omnigraph({ baseUrl: BASE }); + const search = createOmnigraphSearchService({ + client, graphId: 'demo', queryName: 'search_signals', typeOf: { s: 'Signal' }, + labelColumn: 's.title', params: (q) => ({ q }), + }); + const instance = createGraphInstance({ engine: () => new FakeEngine(), services: { search } }); + try { + const loaded = await createOmnigraphSource({ client, graphId: 'demo' }).load(instance); + expect(loaded.serverVersion).toBe('0.14.0'); + expect(loaded.counts).toMatchObject({ nodes: 300, edges: 500 }); + expect(loaded.warnings).toEqual([]); + const id = encodeSourceId('Signal', 'signal-001'); + expect(instance.getNode(id)?.attrs?.id).toBe(1); + expect(instance.getNode(encodeSourceId('Signal', 'signal-003'))?.attrs?.id).toBeNull(); + expect(instance.getNode(encodeSourceId('Actor', 'actor-001'))?.attrs).not.toHaveProperty('id'); + expect(instance.getNode(encodeSourceId('Decision', 'decision-001'))?.attrs?.updated_at).toMatch(/T.*\.\d{3}Z$/); + const hits = await instance.search('Signal 1:', { limit: 5 }); + expect(hits).toHaveLength(1); + expect(hits[0]).toMatchObject({ id, label: 'Signal 1: search admission' }); + expect(instance.getNode(hits[0]!.id)).toBeDefined(); + } finally { instance.destroy(); } }); /** Sweep a grid around the viewport center until the status bar shows an @@ -123,8 +120,6 @@ async function huntHoverLabel(page: Page): Promise { test('load from omnigraph → meter completes → counts match manifest → typed hover label', async ({ page, }, testInfo) => { - test.skip(!AVAILABLE, SKIP_REASON); - if (manifest === null) return; // unreachable past the skip; narrows the type const nodeTotal = tableTotal(manifest, 'node:'); const edgeTotal = tableTotal(manifest, 'edge:'); diff --git a/apps/demo/package.json b/apps/demo/package.json index de036fe..90d84d3 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -12,22 +12,22 @@ "e2e": "playwright test" }, "dependencies": { - "@modernrelay/omnigraph": "0.10.0", + "@modernrelay/omnigraph": "0.14.0", "@modernrelay/orbit-core": "workspace:*", "@modernrelay/orbit-data": "workspace:*", "@modernrelay/orbit-omnigraph": "workspace:*", "@modernrelay/orbit-engine-cosmos": "workspace:*", "@modernrelay/orbit-react": "workspace:*", - "react": "^18.3.1", - "react-dom": "^18.3.1" + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "devDependencies": { - "@axe-core/playwright": "^4.12.1", - "@playwright/test": "^1.49.0", - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.0", - "typescript": "^5.6.0", - "vite": "^6.0.0" + "@axe-core/playwright": "^4.14.0", + "@playwright/test": "^1.64.1", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "typescript": "^7.0.2", + "vite": "^8.3.5" } } diff --git a/apps/demo/src/omnigraph-types.generated.ts b/apps/demo/src/omnigraph-types.generated.ts index 620ceb3..67653d2 100644 --- a/apps/demo/src/omnigraph-types.generated.ts +++ b/apps/demo/src/omnigraph-types.generated.ts @@ -2,19 +2,18 @@ // // .pg → TypeScript typed attrs (wire-normalized), generated by // @modernrelay/orbit-omnigraph (`orbit-omnigraph-codegen`). -// Schema fingerprint: 7278e0632d9b14ee. +// Schema fingerprint: be00cb415f067bd9. // Source: fixtures/omnigraph/cluster/demo.pg // -// Shapes describe attrs AFTER the adapter's wire normalization (both read -// paths converge on the query-path string encodings): -// Date → 'YYYY-MM-DD' · DateTime → ISO 8601 · enum(...) → literal union +// Shapes describe export-loaded attrs AFTER the adapter's wire normalization: +// Physical entity ids live on GraphNode/GraphEdge, outside attrs. +// Date → 'YYYY-MM-DD' · DateTime → ISO 8601 UTC · enum(...) → literal union // I64/U64/F32/F64 → number · Vector(n) → number[] · T? → T | null +// [T] → (T | null)[] (null list elements are retained) // Blob → string ('data:' URI for inline blobs, stored URI for external) /** Normalized attrs for node type `Actor`. */ export interface ActorProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per node type only. */ - id: string; slug: string; name: string; email: string | null; @@ -24,8 +23,6 @@ export interface ActorProps { /** Normalized attrs for node type `Decision`. */ export interface DecisionProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per node type only. */ - id: string; slug: string; title: string; body: string | null; @@ -39,8 +36,6 @@ export interface DecisionProps { /** Normalized attrs for node type `Trace`. */ export interface TraceProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per node type only. */ - id: string; slug: string; title: string; body: string | null; @@ -54,8 +49,7 @@ export interface TraceProps { /** Normalized attrs for node type `Signal`. */ export interface SignalProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per node type only. */ - id: string; + id: number | null; slug: string; title: string; body: string | null; @@ -68,8 +62,6 @@ export interface SignalProps { /** Normalized attrs for node type `Artifact`. */ export interface ArtifactProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per node type only. */ - id: string; slug: string; title: string; kind: 'doc' | 'presentation' | 'proposal' | 'spec' | 'report' | 'memo'; @@ -81,40 +73,24 @@ export interface ArtifactProps { } /** Normalized attrs for edge type `OwnedBy`. */ -export interface OwnedByEdgeProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per edge type only. */ - id: string; -} +export type OwnedByEdgeProps = object; /** Normalized attrs for edge type `ParticipatedIn`. */ -export interface ParticipatedInEdgeProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per edge type only. */ - id: string; -} +export type ParticipatedInEdgeProps = object; /** Normalized attrs for edge type `RecordedBy`. */ -export interface RecordedByEdgeProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per edge type only. */ - id: string; -} +export type RecordedByEdgeProps = object; /** Normalized attrs for edge type `Supports`. */ export interface SupportsEdgeProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per edge type only. */ - id: string; weight: number | null; } /** Normalized attrs for edge type `Triggered`. */ -export interface TriggeredEdgeProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per edge type only. */ - id: string; -} +export type TriggeredEdgeProps = object; /** Normalized attrs for edge type `Correlates`. */ export interface CorrelatesEdgeProps { - /** Physical Omnigraph id — injected into every export line's `data`; unique per edge type only. */ - id: string; confidence: number; } diff --git a/apps/demo/src/omnigraphPanel.tsx b/apps/demo/src/omnigraphPanel.tsx index 5b0271a..aa8026d 100644 --- a/apps/demo/src/omnigraphPanel.tsx +++ b/apps/demo/src/omnigraphPanel.tsx @@ -338,13 +338,12 @@ export function OmnigraphPanel({ form, onFormChange, meter, result, error, onLoa {error} {CONNECTION_ERROR.test(error) && (
- graph server unreachable — start the fixture server:{' '} + graph server unreachable — start a fresh local 0.14 fixture:{' '} - omnigraph-server --cluster fixtures/omnigraph/cluster --unauthenticated --bind - 127.0.0.1:8199 + node scripts/omnigraph-fixture.mjs --serve {' '} - (run node scripts/omnigraph-fixture.mjs first if - fixtures/omnigraph/cluster/graphs/ is missing) + (set OMNIGRAPH_BIN and{' '} + OMNIGRAPH_SERVER_BIN to the 0.14.0 binaries)
)} diff --git a/apps/spike/package.json b/apps/spike/package.json index 326215f..711ebc7 100644 --- a/apps/spike/package.json +++ b/apps/spike/package.json @@ -10,11 +10,15 @@ "test": "echo \"spike has no unit tests; use pnpm probe\" && exit 0" }, "dependencies": { - "@cosmos.gl/graph": "3.4.0" + "@cosmos.gl/graph": "3.5.1", + "@luma.gl/core": "~9.3.6", + "@luma.gl/engine": "~9.3.6", + "@luma.gl/shadertools": "~9.3.6", + "@luma.gl/webgl": "~9.3.6" }, "devDependencies": { - "@playwright/test": "^1.49.0", - "typescript": "^5.6.0", - "vite": "^6.0.0" + "@playwright/test": "^1.64.1", + "typescript": "^7.0.2", + "vite": "^8.3.5" } } diff --git a/apps/spike/probes/position-snapshots.spec.ts b/apps/spike/probes/position-snapshots.spec.ts new file mode 100644 index 0000000..156b4d5 --- /dev/null +++ b/apps/spike/probes/position-snapshots.spec.ts @@ -0,0 +1,50 @@ +/** The adapter relies on Cosmos 3.5's flat readback being an owned snapshot. */ +import { test, expect } from '@playwright/test'; +import { openWorkbench } from './util'; +import { recordProbe } from './record'; + +test('position-snapshots: flat readbacks stay owned across reads and roster updates', async ({ page }) => { + await openWorkbench(page); + const result = await page.evaluate(async () => { + const s = window.__spike; + await s.init({ enableSimulation: false, fitViewOnInit: false, rescalePositions: false }); + const g = s.graph; + if (!g) throw new Error('graph missing'); + + const initial = Float32Array.of(100, 200, NaN, NaN, 300, 400); + g.setPointPositions(initial, true); + g.render(0, 0); + await s.sampleNextFrame([]); + const first = g.getPointPositionsArray(); + const same = (a: Float32Array, b: Float32Array): boolean => + a.length === b.length && a.every((value, index) => Object.is(value, b[index])); + const initialOk = first instanceof Float32Array && same(first, initial); + + // Mirror the core's pinned-coordinate overlay on a caller-owned snapshot. + first[0] = 999; + const second = g.getPointPositionsArray(); + const independentReads = first.buffer !== second.buffer && same(second, initial); + const firstExpected = Float32Array.of(999, 200, NaN, NaN, 300, 400); + + const replacement = Float32Array.of(10, 20); + g.setPointPositions(replacement, true); + g.render(0, 0); + await s.sampleNextFrame([]); + const current = g.getPointPositionsArray(); + const replacementOk = same(current, replacement); + const oldSnapshotsStable = same(first, firstExpected) && same(second, initial); + return { initialOk, independentReads, replacementOk, oldSnapshotsStable }; + }); + + recordProbe({ + capability: 'position-snapshots', + expected: 'getPointPositionsArray() returns owned Float32 snapshots, preserves NaN tombstones, ' + + 'and keeps earlier snapshots unchanged across caller mutations, later reads and roster replacement.', + observed: result, + pass: Object.values(result).every(Boolean), + notes: 'No reusable out array is passed; Orbit callers may mutate their snapshot to overlay pinned coordinates.', + }); + expect(result).toEqual({ + initialOk: true, independentReads: true, replacementOk: true, oldSnapshotsStable: true, + }); +}); diff --git a/apps/storybook/package.json b/apps/storybook/package.json index 3b7d09b..5beac42 100644 --- a/apps/storybook/package.json +++ b/apps/storybook/package.json @@ -13,17 +13,17 @@ "@modernrelay/orbit-core": "workspace:*", "@modernrelay/orbit-engine-cosmos": "workspace:*", "@modernrelay/orbit-react": "workspace:*", - "react": "^18.3.1", - "react-dom": "^18.3.1" + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "devDependencies": { - "@storybook/addon-docs": "10.5.10", - "@storybook/react-vite": "10.5.10", - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.0", - "storybook": "10.5.10", - "typescript": "^5.6.0", - "vite": "^6.0.0" + "@storybook/addon-docs": "10.6.3", + "@storybook/react-vite": "10.6.3", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "storybook": "10.6.3", + "typescript": "^7.0.2", + "vite": "^8.3.5" } } diff --git a/apps/storybook/src/exploration/InvestigationWorkspace.tsx b/apps/storybook/src/exploration/InvestigationWorkspace.tsx index 09ec463..606f9e1 100644 --- a/apps/storybook/src/exploration/InvestigationWorkspace.tsx +++ b/apps/storybook/src/exploration/InvestigationWorkspace.tsx @@ -82,7 +82,7 @@ export function InvestigationWorkspace({ workflow }: { workflow: Workflow }): Re function InvestigationWorkspaceContent({ workflow, graph, investigation }: { workflow: Workflow; - graph: RefObject>; + graph: RefObject | null>; investigation: InvestigationSession; }): ReactElement { const [instance, setInstance] = useState(null); diff --git a/fixtures/declarations/public-types.ts b/fixtures/declarations/public-types.ts new file mode 100644 index 0000000..8f347be --- /dev/null +++ b/fixtures/declarations/public-types.ts @@ -0,0 +1,36 @@ +/** + * A downstream library should be able to infer and emit these return types + * without naming Orbit's private declaration chunks. Compile against packed + * exports: source aliases cannot expose a missing public type re-export. + */ +import type { SceneGroups } from '@modernrelay/orbit-core'; +import type { GraphContextMenuProps } from '@modernrelay/orbit-react/components/ContextMenu'; +import type { GraphExplorerProps } from '@modernrelay/orbit-react/components/Explorer'; +import type { GraphHistogramProps } from '@modernrelay/orbit-react/components/Histogram'; +import type { GraphInspectorProps } from '@modernrelay/orbit-react/components/Inspector'; +import type { GraphLegendProps } from '@modernrelay/orbit-react/components/Legend'; +import type { GraphMinimapProps } from '@modernrelay/orbit-react/components/Minimap'; +import type { GraphNavigatorProps } from '@modernrelay/orbit-react/components/Navigator'; +import type { GraphSearchProps } from '@modernrelay/orbit-react/components/Search'; +import type { GraphSelectionActionsProps } from '@modernrelay/orbit-react/components/SelectionActions'; +import type { GraphSimControlsProps } from '@modernrelay/orbit-react/components/SimControls'; +import type { GraphTableProps } from '@modernrelay/orbit-react/components/Table'; +import type { GraphTimelineProps } from '@modernrelay/orbit-react/components/Timeline'; +import type { GraphToolbarProps } from '@modernrelay/orbit-react/components/Toolbar'; +import type { GraphTooltipProps } from '@modernrelay/orbit-react/components/Tooltip'; + +export const folds = (scene: SceneGroups) => scene.folds; +export const contextMenuInstance = (props: GraphContextMenuProps) => props.instance; +export const explorerInstance = (props: GraphExplorerProps) => props.instance; +export const histogramInstance = (props: GraphHistogramProps) => props.instance; +export const inspectorInstance = (props: GraphInspectorProps) => props.instance; +export const legendInstance = (props: GraphLegendProps) => props.instance; +export const minimapInstance = (props: GraphMinimapProps) => props.instance; +export const navigatorInstance = (props: GraphNavigatorProps) => props.instance; +export const searchInstance = (props: GraphSearchProps) => props.instance; +export const selectionActionsInstance = (props: GraphSelectionActionsProps) => props.instance; +export const simControlsInstance = (props: GraphSimControlsProps) => props.instance; +export const tableInstance = (props: GraphTableProps) => props.instance; +export const timelineInstance = (props: GraphTimelineProps) => props.instance; +export const toolbarInstance = (props: GraphToolbarProps) => props.instance; +export const tooltipInstance = (props: GraphTooltipProps) => props.instance; diff --git a/fixtures/omnigraph/README.md b/fixtures/omnigraph/README.md index aa9742f..ed36fa1 100644 --- a/fixtures/omnigraph/README.md +++ b/fixtures/omnigraph/README.md @@ -1,66 +1,102 @@ -# Omnigraph real-data fixtures +# OmniGraph 0.14 integration fixtures -Recorded HTTP responses from a real `omnigraph-server` (0.8.x), used to test -`@modernrelay/orbit-omnigraph` against genuine wire -bytes instead of hand-written mocks. Tests inject a replay `fetch` into the -real `@modernrelay/omnigraph` SDK (`OmnigraphOptions.fetch`) and serve these -files for the requests the SDK issues. +These are verbatim HTTP bodies recorded from the official **OmniGraph 0.14.0** +server. Adapter tests replay them through the real TypeScript SDK. The live +integration tests also start a fresh local server and exercise both the adapter +and the demo's same-origin `/og` proxy. -## Layout +## Contents -| Path | What | -|---|---| -| `cluster/cluster.yaml` | Minimal cluster config: one graph `demo`, no policies, no embedding provider | -| `cluster/demo.pg` | Schema (5 node types, 6 edge types) — adapted from omnigraph's `context.pg` test fixture, extended to cover every wire encoding (`Date`, `DateTime`, `enum`, `F64`, `I64`, optional `String`, edge properties) | -| `seed.ndjson` | Deterministic seed data in the `omnigraph load` line format: 300 nodes + 500 edges, seeded PRNG, hostile strings (` immediately","updated_at":1772247867939,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-014","body":null,"decided_at":16651,"slug":"decision-014","status":"proposed","title":"Decide on revision stamps (#14)","updated_at":1772004031315,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-015","body":"Rationale for decision-015: Ω-bounds.","decided_at":18239,"slug":"decision-015","status":"accepted","title":"Decide on search admission (#15)","updated_at":1533532999303,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-016","body":null,"decided_at":null,"slug":"decision-016","status":"proposed","title":"Decide on export streaming (#16)","updated_at":1583979725360,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-017","body":"Rationale for decision-017: search admission.","decided_at":17107,"slug":"decision-017","status":"proposed","title":"Decide on graph overlays (#17)","updated_at":1460040357405,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-018","body":null,"decided_at":null,"slug":"decision-018","status":"proposed","title":"Decide on search admission (#18)","updated_at":1432068185851,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-019","body":null,"decided_at":null,"slug":"decision-019","status":"rejected","title":"Decide on export streaming (#19)","updated_at":1477580759250,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-020","body":"Rationale for decision-020: typed attrs.","decided_at":16475,"slug":"decision-020","status":"rejected","title":"Decide on edge identity (#20)","updated_at":1524189663329,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-021","body":"Rationale for decision-021: Ω-bounds.","decided_at":17744,"slug":"decision-021","status":"accepted","title":"Decide on crème-fraîche caching (#21)","updated_at":1453746105762,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-022","body":null,"decided_at":null,"slug":"decision-022","status":"superseded","title":"Decide on naïve dedupe (#22)","updated_at":1500252094061,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-023","body":"Rationale for decision-023: wire encodings.","decided_at":19693,"slug":"decision-023","status":"rejected","title":"Decide on category scales — 图例 (#23)","updated_at":1471554597371,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-024","body":"Rationale for decision-024: branch quiescence.","decided_at":20294,"slug":"decision-024","status":"accepted","title":"Decide on Ω-bounds (#24)","updated_at":1552798140538,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-025","body":null,"decided_at":18696,"slug":"decision-025","status":"superseded","title":"Decide on graph overlays (#25)","updated_at":1754078083323,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-026","body":"Rationale for decision-026: branch quiescence.","decided_at":19680,"slug":"decision-026","status":"superseded","title":"Decide on graph overlays (#26)","updated_at":1765381352276,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-027","body":null,"decided_at":19655,"slug":"decision-027","status":"superseded","title":"Quote \"everything\" & escape \\ backslash — ok?","updated_at":1582317714662,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-028","body":null,"decided_at":17762,"slug":"decision-028","status":"superseded","title":"Decide on crème-fraîche caching (#28)","updated_at":1557599521665,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-029","body":"Rationale for decision-029: legend domains.","decided_at":null,"slug":"decision-029","status":"rejected","title":"Decide on category scales — 图例 (#29)","updated_at":1592388883067,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-030","body":"Rationale for decision-030: search admission.","decided_at":17491,"slug":"decision-030","status":"proposed","title":"Decide on edge identity (#30)","updated_at":1698465647839,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-031","body":"Rationale for decision-031: ingestion backpressure.","decided_at":20323,"slug":"decision-031","status":"proposed","title":"Decide on schema drift (#31)","updated_at":1566992879280,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-032","body":null,"decided_at":19304,"slug":"decision-032","status":"accepted","title":"Decide on export streaming (#32)","updated_at":1602485428464,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-033","body":"Rationale for decision-033: search admission.","decided_at":16844,"slug":"decision-033","status":"rejected","title":"Decide on category scales — 图例 (#33)","updated_at":1552142345894,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-034","body":"Rationale for decision-034: edge identity.","decided_at":null,"slug":"decision-034","status":"rejected","title":"Decide on category scales — 图例 (#34)","updated_at":1558693281069,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-035","body":"Rationale for decision-035: search admission.","decided_at":null,"slug":"decision-035","status":"accepted","title":"Decide on category scales — 图例 (#35)","updated_at":1679583200724,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-036","body":"Rationale for decision-036: ingestion backpressure.","decided_at":17430,"slug":"decision-036","status":"accepted","title":"Decide on schema drift (#36)","updated_at":1678978412910,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-037","body":"Rationale for decision-037: Ω-bounds.","decided_at":18471,"slug":"decision-037","status":"accepted","title":"Decide on category scales — 图例 (#37)","updated_at":1699551937639,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-038","body":null,"decided_at":18303,"slug":"decision-038","status":"rejected","title":"Decide on Ω-bounds (#38)","updated_at":1677117025095,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-039","body":"Rationale for decision-039: crème-fraîche caching.","decided_at":19193,"slug":"decision-039","status":"rejected","title":"Decide on graph overlays (#39)","updated_at":1445621447080,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-040","body":"Rationale for decision-040: edge identity.","decided_at":18744,"slug":"decision-040","status":"proposed","title":"Decide on crème-fraîche caching (#40)","updated_at":1630901603613,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-041","body":"Rationale for decision-041: naïve dedupe.","decided_at":16979,"slug":"decision-041","status":"proposed","title":"Decide on crème-fraîche caching (#41)","updated_at":1480586260555,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-042","body":null,"decided_at":null,"slug":"decision-042","status":"rejected","title":"Decide on naïve dedupe (#42)","updated_at":1445866873814,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-043","body":"Rationale for decision-043: export streaming.","decided_at":20350,"slug":"decision-043","status":"rejected","title":"Decide on naïve dedupe (#43)","updated_at":1717357378092,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-044","body":null,"decided_at":null,"slug":"decision-044","status":"accepted","title":"Decide on crème-fraîche caching (#44)","updated_at":1790019680646,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-045","body":null,"decided_at":17324,"slug":"decision-045","status":"superseded","title":"Decide on crème-fraîche caching (#45)","updated_at":1482153686420,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-046","body":"Rationale for decision-046: branch quiescence.","decided_at":18163,"slug":"decision-046","status":"proposed","title":"Decide on columnar snapshots (#46)","updated_at":1681577107167,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-047","body":"Rationale for decision-047: ingestion backpressure.","decided_at":null,"slug":"decision-047","status":"rejected","title":"Decide on edge identity (#47)","updated_at":1500472898194,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-048","body":"Rationale for decision-048: wire encodings.","decided_at":16629,"slug":"decision-048","status":"superseded","title":"Decide on schema drift (#48)","updated_at":1426711705437,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-049","body":"Rationale for decision-049: branch quiescence.","decided_at":null,"slug":"decision-049","status":"superseded","title":"Decide on branch quiescence (#49)","updated_at":1733888746020,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-050","body":"Rationale for decision-050: schema drift.","decided_at":19574,"slug":"decision-050","status":"proposed","title":"Decide on category scales — 图例 (#50)","updated_at":1640114267105,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-051","body":"Rationale for decision-051: branch quiescence.","decided_at":null,"slug":"decision-051","status":"superseded","title":"Decide on columnar snapshots (#51)","updated_at":1453134803495,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-052","body":null,"decided_at":20288,"slug":"decision-052","status":"superseded","title":"Decide on columnar snapshots (#52)","updated_at":1733056625070,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-053","body":"Rationale for decision-053: typed attrs.","decided_at":null,"slug":"decision-053","status":"superseded","title":"Decide on graph overlays (#53)","updated_at":1600898201872,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-054","body":"Rationale for decision-054: ingestion backpressure.","decided_at":18029,"slug":"decision-054","status":"superseded","title":"Decide on naïve dedupe (#54)","updated_at":1628732169559,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-055","body":null,"decided_at":19954,"slug":"decision-055","status":"proposed","title":"Decide on edge identity (#55)","updated_at":1631009512391,"urgency":"normal"}} -{"type":"Decision","data":{"id":"decision-056","body":"Rationale for decision-056: export streaming.","decided_at":17423,"slug":"decision-056","status":"rejected","title":"Decide on graph overlays (#56)","updated_at":1675976209218,"urgency":"high"}} -{"type":"Decision","data":{"id":"decision-057","body":null,"decided_at":null,"slug":"decision-057","status":"proposed","title":"Decide on category scales — 图例 (#57)","updated_at":1634029468595,"urgency":"low"}} -{"type":"Decision","data":{"id":"decision-058","body":null,"decided_at":18741,"slug":"decision-058","status":"superseded","title":"Decide on crème-fraîche caching (#58)","updated_at":1589472746280,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-059","body":null,"decided_at":19104,"slug":"decision-059","status":"superseded","title":"Decide on search admission (#59)","updated_at":1489006971199,"urgency":"critical"}} -{"type":"Decision","data":{"id":"decision-060","body":"Rationale for decision-060: legend domains.","decided_at":18898,"slug":"decision-060","status":"proposed","title":"Decide on export streaming (#60)","updated_at":1749308172558,"urgency":"normal"}} -{"type":"Signal","data":{"id":"signal-001","body":"Market movement around wire encodings.","category":"customer","observed_at":17326,"slug":"signal-001","source":null,"strength":0.0,"title":"Signal 1: search admission"}} -{"type":"Signal","data":{"id":"signal-002","body":"Market movement around typed attrs.","category":"technology","observed_at":18775,"slug":"signal-002","source":null,"strength":1e-9,"title":"Signal 2: columnar snapshots"}} -{"type":"Signal","data":{"id":"signal-003","body":"Market movement around category scales — 图例.","category":"regulatory","observed_at":20489,"slug":"signal-003","source":"https://example.test/signals/3","strength":0.479163,"title":"Signal 3: naïve dedupe"}} -{"type":"Signal","data":{"id":"signal-004","body":"Market movement around category scales — 图例.","category":"technology","observed_at":17163,"slug":"signal-004","source":null,"strength":0.519988,"title":"Signal 4: naïve dedupe"}} -{"type":"Signal","data":{"id":"signal-005","body":"Market movement around legend domains.","category":"regulatory","observed_at":17448,"slug":"signal-005","source":null,"strength":0.691345,"title":"Signal 5: branch quiescence"}} -{"type":"Signal","data":{"id":"signal-006","body":"Market movement around graph overlays.","category":"market","observed_at":17584,"slug":"signal-006","source":"https://example.test/signals/6","strength":0.551137,"title":"Signal 6: Ω-bounds"}} -{"type":"Signal","data":{"id":"signal-007","body":"Market movement around typed attrs.","category":"technology","observed_at":19105,"slug":"signal-007","source":"https://example.test/signals/7","strength":0.512544,"title":"Signal 7: category scales — 图例"}} -{"type":"Signal","data":{"id":"signal-008","body":"Market movement around legend domains.","category":"market","observed_at":19528,"slug":"signal-008","source":"https://example.test/signals/8","strength":0.869861,"title":"Signal 8: legend domains"}} -{"type":"Signal","data":{"id":"signal-009","body":null,"category":"competitor","observed_at":19628,"slug":"signal-009","source":"https://example.test/signals/9","strength":0.497684,"title":"Signal 9: revision stamps"}} -{"type":"Signal","data":{"id":"signal-010","body":null,"category":"customer","observed_at":16700,"slug":"signal-010","source":"https://example.test/signals/10","strength":0.096162,"title":"Signal 10: revision stamps"}} -{"type":"Signal","data":{"id":"signal-011","body":"Market movement around legend domains.","category":"regulatory","observed_at":19124,"slug":"signal-011","source":"https://example.test/signals/11","strength":0.472962,"title":"Signal 11: legend domains"}} -{"type":"Signal","data":{"id":"signal-012","body":"Market movement around naïve dedupe.","category":"customer","observed_at":20550,"slug":"signal-012","source":null,"strength":0.506528,"title":"Signal 12: naïve dedupe"}} -{"type":"Signal","data":{"id":"signal-013","body":"Market movement around revision stamps.","category":"customer","observed_at":17934,"slug":"signal-013","source":"https://example.test/signals/13","strength":0.422065,"title":"Signal 13: legend domains"}} -{"type":"Signal","data":{"id":"signal-014","body":null,"category":"market","observed_at":20744,"slug":"signal-014","source":"https://example.test/signals/14","strength":0.398996,"title":"Signal 14: naïve dedupe"}} -{"type":"Signal","data":{"id":"signal-015","body":"Market movement around export streaming.","category":"competitor","observed_at":20109,"slug":"signal-015","source":null,"strength":0.758282,"title":"Signal 15: ingestion backpressure"}} -{"type":"Signal","data":{"id":"signal-016","body":"Market movement around branch quiescence.","category":"customer","observed_at":18603,"slug":"signal-016","source":null,"strength":0.472056,"title":"Signal 16: typed attrs"}} -{"type":"Signal","data":{"id":"signal-017","body":null,"category":"customer","observed_at":20095,"slug":"signal-017","source":"https://example.test/signals/17","strength":0.083839,"title":"Signal 17: revision stamps"}} -{"type":"Signal","data":{"id":"signal-018","body":null,"category":"technology","observed_at":16692,"slug":"signal-018","source":null,"strength":0.937273,"title":"Signal 18: columnar snapshots"}} -{"type":"Signal","data":{"id":"signal-019","body":null,"category":"customer","observed_at":17706,"slug":"signal-019","source":null,"strength":0.469585,"title":"Signal 19: revision stamps"}} -{"type":"Signal","data":{"id":"signal-020","body":"Market movement around columnar snapshots.","category":"technology","observed_at":19882,"slug":"signal-020","source":"https://example.test/signals/20","strength":0.753215,"title":"Signal 20: edge identity"}} -{"type":"Signal","data":{"id":"signal-021","body":"Market movement around ingestion backpressure.","category":"competitor","observed_at":19880,"slug":"signal-021","source":"https://example.test/signals/21","strength":0.735278,"title":"Signal 21: Ω-bounds"}} -{"type":"Signal","data":{"id":"signal-022","body":null,"category":"regulatory","observed_at":16606,"slug":"signal-022","source":"https://example.test/signals/22","strength":0.846439,"title":"Signal 22: revision stamps"}} -{"type":"Signal","data":{"id":"signal-023","body":null,"category":"regulatory","observed_at":17162,"slug":"signal-023","source":"https://example.test/signals/23","strength":0.086616,"title":"Signal 23: export streaming"}} -{"type":"Signal","data":{"id":"signal-024","body":null,"category":"market","observed_at":20137,"slug":"signal-024","source":"https://example.test/signals/24","strength":0.040446,"title":"Signal 24: columnar snapshots"}} -{"type":"Signal","data":{"id":"signal-025","body":"Market movement around branch quiescence.","category":"market","observed_at":17806,"slug":"signal-025","source":"https://example.test/signals/25","strength":0.861196,"title":"Signal 25: ingestion backpressure"}} -{"type":"Signal","data":{"id":"signal-026","body":"Market movement around naïve dedupe.","category":"competitor","observed_at":17121,"slug":"signal-026","source":null,"strength":0.280003,"title":"Signal 26: search admission"}} -{"type":"Signal","data":{"id":"signal-027","body":"Market movement around schema drift.","category":"regulatory","observed_at":20356,"slug":"signal-027","source":"https://example.test/signals/27","strength":0.175595,"title":"Signal 27: naïve dedupe"}} -{"type":"Signal","data":{"id":"signal-028","body":null,"category":"regulatory","observed_at":19960,"slug":"signal-028","source":"https://example.test/signals/28","strength":0.831339,"title":"Signal 28: category scales — 图例"}} -{"type":"Signal","data":{"id":"signal-029","body":"Market movement around revision stamps.","category":"technology","observed_at":17199,"slug":"signal-029","source":"https://example.test/signals/29","strength":0.39148,"title":"Signal 29: export streaming"}} -{"type":"Signal","data":{"id":"signal-030","body":null,"category":"customer","observed_at":18653,"slug":"signal-030","source":"https://example.test/signals/30","strength":0.17736,"title":"Signal 30: crème-fraîche caching"}} -{"type":"Signal","data":{"id":"signal-031","body":"Market movement around columnar snapshots.","category":"regulatory","observed_at":19670,"slug":"signal-031","source":"https://example.test/signals/31","strength":0.302954,"title":"Signal 31: legend domains"}} -{"type":"Signal","data":{"id":"signal-032","body":null,"category":"customer","observed_at":17213,"slug":"signal-032","source":"https://example.test/signals/32","strength":0.644454,"title":"Signal 32: edge identity"}} -{"type":"Signal","data":{"id":"signal-033","body":"Market movement around category scales — 图例.","category":"customer","observed_at":19984,"slug":"signal-033","source":"https://example.test/signals/33","strength":0.386967,"title":"Signal 33: search admission"}} -{"type":"Signal","data":{"id":"signal-034","body":null,"category":"market","observed_at":19737,"slug":"signal-034","source":"https://example.test/signals/34","strength":0.026825,"title":"Signal 34: typed attrs"}} -{"type":"Signal","data":{"id":"signal-035","body":"Market movement around crème-fraîche caching.","category":"technology","observed_at":17329,"slug":"signal-035","source":"https://example.test/signals/35","strength":0.937112,"title":"Signal 35: ingestion backpressure"}} -{"type":"Signal","data":{"id":"signal-036","body":"Market movement around graph overlays.","category":"market","observed_at":18547,"slug":"signal-036","source":null,"strength":0.369431,"title":"Signal 36: search admission"}} -{"type":"Signal","data":{"id":"signal-037","body":"Market movement around typed attrs.","category":"technology","observed_at":16747,"slug":"signal-037","source":"https://example.test/signals/37","strength":0.883798,"title":"Signal 37: wire encodings"}} -{"type":"Signal","data":{"id":"signal-038","body":"Market movement around naïve dedupe.","category":"market","observed_at":19835,"slug":"signal-038","source":null,"strength":0.241285,"title":"Signal 38: edge identity"}} -{"type":"Signal","data":{"id":"signal-039","body":"Market movement around export streaming.","category":"customer","observed_at":18645,"slug":"signal-039","source":null,"strength":0.537504,"title":"Signal 39: crème-fraîche caching"}} -{"type":"Signal","data":{"id":"signal-040","body":null,"category":"technology","observed_at":16933,"slug":"signal-040","source":null,"strength":0.944124,"title":"Signal 40: ingestion backpressure"}} -{"type":"Signal","data":{"id":"signal-041","body":"Market movement around graph overlays.","category":"customer","observed_at":18969,"slug":"signal-041","source":"https://example.test/signals/41","strength":0.551587,"title":"Signal 41: search admission"}} -{"type":"Signal","data":{"id":"signal-042","body":"Market movement around crème-fraîche caching.","category":"customer","observed_at":20632,"slug":"signal-042","source":null,"strength":0.799856,"title":"Signal 42: branch quiescence"}} -{"type":"Signal","data":{"id":"signal-043","body":null,"category":"market","observed_at":17581,"slug":"signal-043","source":null,"strength":0.206987,"title":"Signal 43: columnar snapshots"}} -{"type":"Signal","data":{"id":"signal-044","body":null,"category":"regulatory","observed_at":19101,"slug":"signal-044","source":"https://example.test/signals/44","strength":0.825437,"title":"Signal 44: crème-fraîche caching"}} -{"type":"Signal","data":{"id":"signal-045","body":null,"category":"technology","observed_at":19652,"slug":"signal-045","source":null,"strength":0.597921,"title":"Signal 45: schema drift"}} -{"type":"Signal","data":{"id":"signal-046","body":null,"category":"regulatory","observed_at":18480,"slug":"signal-046","source":"https://example.test/signals/46","strength":0.028038,"title":"Signal 46: crème-fraîche caching"}} -{"type":"Signal","data":{"id":"signal-047","body":null,"category":"technology","observed_at":17049,"slug":"signal-047","source":"https://example.test/signals/47","strength":0.107928,"title":"Signal 47: typed attrs"}} -{"type":"Signal","data":{"id":"signal-048","body":"Market movement around schema drift.","category":"regulatory","observed_at":18454,"slug":"signal-048","source":"https://example.test/signals/48","strength":0.291874,"title":"Signal 48: ingestion backpressure"}} -{"type":"Signal","data":{"id":"signal-049","body":"Market movement around columnar snapshots.","category":"regulatory","observed_at":18910,"slug":"signal-049","source":null,"strength":0.467257,"title":"Signal 49: revision stamps"}} -{"type":"Signal","data":{"id":"signal-050","body":"Market movement around edge identity.","category":"customer","observed_at":19920,"slug":"signal-050","source":"https://example.test/signals/50","strength":0.385888,"title":"Signal 50: ingestion backpressure"}} -{"type":"Signal","data":{"id":"signal-051","body":"Market movement around typed attrs.","category":"regulatory","observed_at":17923,"slug":"signal-051","source":"https://example.test/signals/51","strength":0.43061,"title":"Signal 51: revision stamps"}} -{"type":"Signal","data":{"id":"signal-052","body":null,"category":"regulatory","observed_at":19894,"slug":"signal-052","source":"https://example.test/signals/52","strength":0.712629,"title":"Signal 52: Ω-bounds"}} -{"type":"Signal","data":{"id":"signal-053","body":null,"category":"market","observed_at":19070,"slug":"signal-053","source":null,"strength":0.037462,"title":"Signal 53: legend domains"}} -{"type":"Signal","data":{"id":"signal-054","body":null,"category":"competitor","observed_at":16653,"slug":"signal-054","source":"https://example.test/signals/54","strength":0.558492,"title":"Signal 54: export streaming"}} -{"type":"Signal","data":{"id":"signal-055","body":"Market movement around category scales — 图例.","category":"competitor","observed_at":17933,"slug":"signal-055","source":"https://example.test/signals/55","strength":0.837372,"title":"Signal 55: legend domains"}} -{"type":"Signal","data":{"id":"signal-056","body":"Market movement around schema drift.","category":"regulatory","observed_at":17807,"slug":"signal-056","source":null,"strength":0.308975,"title":"Signal 56: naïve dedupe"}} -{"type":"Signal","data":{"id":"signal-057","body":null,"category":"competitor","observed_at":16474,"slug":"signal-057","source":"https://example.test/signals/57","strength":0.195232,"title":"Signal 57: edge identity"}} -{"type":"Signal","data":{"id":"signal-058","body":null,"category":"competitor","observed_at":20011,"slug":"signal-058","source":"https://example.test/signals/58","strength":0.106871,"title":"Signal 58: graph overlays"}} -{"type":"Signal","data":{"id":"signal-059","body":null,"category":"regulatory","observed_at":16597,"slug":"signal-059","source":"https://example.test/signals/59","strength":0.008096,"title":"Signal 59: columnar snapshots"}} -{"type":"Signal","data":{"id":"signal-060","body":"Market movement around crème-fraîche caching.","category":"technology","observed_at":18486,"slug":"signal-060","source":null,"strength":0.117169,"title":"Signal 60: crème-fraîche caching"}} -{"type":"Trace","data":{"id":"trace-001","body":"Observed category scales — 图例 during document.","kind":"document","recorded_at":1493929831346,"slug":"trace-001","source":null,"title":"Trace 1: branch quiescence","word_count":19112}} -{"type":"Trace","data":{"id":"trace-002","body":"Observed wire encodings during note.","kind":"discussion","recorded_at":1480891545084,"slug":"trace-002","source":"https://example.test/traces/trace-002","title":"Trace 2: category scales — 图例","word_count":1386}} -{"type":"Trace","data":{"id":"trace-003","body":null,"kind":"note","recorded_at":1576310761236,"slug":"trace-003","source":"https://example.test/traces/trace-003","title":"Trace 3: edge identity","word_count":8577}} -{"type":"Trace","data":{"id":"trace-004","body":null,"kind":"meeting","recorded_at":1589374380278,"slug":"trace-004","source":"https://example.test/traces/trace-004","title":"Trace 4: edge identity","word_count":16947}} -{"type":"Trace","data":{"id":"trace-005","body":null,"kind":"note","recorded_at":1681040920184,"slug":"trace-005","source":null,"title":"Trace 5: columnar snapshots","word_count":625}} -{"type":"Trace","data":{"id":"trace-006","body":"Observed category scales — 图例 during experiment.","kind":"note","recorded_at":1752001138684,"slug":"trace-006","source":null,"title":"Trace 6: wire encodings","word_count":13155}} -{"type":"Trace","data":{"id":"trace-007","body":"Observed ingestion backpressure during note.","kind":"discussion","recorded_at":1442916540747,"slug":"trace-007","source":null,"title":"Trace 7: columnar snapshots","word_count":3943}} -{"type":"Trace","data":{"id":"trace-008","body":null,"kind":"note","recorded_at":1695527869061,"slug":"trace-008","source":"https://example.test/traces/trace-008","title":"Trace 8: branch quiescence","word_count":3981}} -{"type":"Trace","data":{"id":"trace-009","body":"Observed graph overlays during discussion.","kind":"document","recorded_at":1621919831489,"slug":"trace-009","source":"https://example.test/traces/trace-009","title":"Trace 9: crème-fraîche caching","word_count":18887}} -{"type":"Trace","data":{"id":"trace-010","body":"Observed branch quiescence during meeting.","kind":"review","recorded_at":1767445958408,"slug":"trace-010","source":"https://example.test/traces/trace-010","title":"Trace 10: graph overlays","word_count":13887}} -{"type":"Trace","data":{"id":"trace-011","body":"Observed search admission during review.","kind":"discussion","recorded_at":1487615007905,"slug":"trace-011","source":"https://example.test/traces/trace-011","title":"Trace 11: category scales — 图例","word_count":18645}} -{"type":"Trace","data":{"id":"trace-012","body":"Observed crème-fraîche caching during discussion.","kind":"note","recorded_at":1697114469651,"slug":"trace-012","source":null,"title":"Trace 12: branch quiescence","word_count":9887}} -{"type":"Trace","data":{"id":"trace-013","body":null,"kind":"document","recorded_at":1750450758324,"slug":"trace-013","source":null,"title":"Trace 13: ingestion backpressure","word_count":17994}} -{"type":"Trace","data":{"id":"trace-014","body":null,"kind":"review","recorded_at":1727863850164,"slug":"trace-014","source":null,"title":"Trace 14: edge identity","word_count":6831}} -{"type":"Trace","data":{"id":"trace-015","body":"Observed naïve dedupe during experiment.","kind":"experiment","recorded_at":1576600394831,"slug":"trace-015","source":null,"title":"Trace 15: export streaming","word_count":17082}} -{"type":"Trace","data":{"id":"trace-016","body":"Observed branch quiescence during discussion.","kind":"discussion","recorded_at":1678218361263,"slug":"trace-016","source":null,"title":"Trace 16: crème-fraîche caching","word_count":16761}} -{"type":"Trace","data":{"id":"trace-017","body":"Observed wire encodings during discussion.","kind":"review","recorded_at":1526635305075,"slug":"trace-017","source":"https://example.test/traces/trace-017","title":"Trace 17: wire encodings","word_count":10543}} -{"type":"Trace","data":{"id":"trace-018","body":"Observed revision stamps during experiment.","kind":"experiment","recorded_at":1746792070805,"slug":"trace-018","source":"https://example.test/traces/trace-018","title":"Trace 18: legend domains","word_count":5601}} -{"type":"Trace","data":{"id":"trace-019","body":"Observed ingestion backpressure during discussion.","kind":"experiment","recorded_at":1455279327052,"slug":"trace-019","source":null,"title":"Trace 19: columnar snapshots","word_count":11238}} -{"type":"Trace","data":{"id":"trace-020","body":null,"kind":"document","recorded_at":1647200677765,"slug":"trace-020","source":"https://example.test/traces/trace-020","title":"Trace 20: typed attrs","word_count":9694}} -{"type":"Trace","data":{"id":"trace-021","body":null,"kind":"experiment","recorded_at":1511093269068,"slug":"trace-021","source":"https://example.test/traces/trace-021","title":"Trace 21: ingestion backpressure","word_count":13171}} -{"type":"Trace","data":{"id":"trace-022","body":null,"kind":"document","recorded_at":1700995530538,"slug":"trace-022","source":"https://example.test/traces/trace-022","title":"Trace 22: crème-fraîche caching","word_count":14143}} -{"type":"Trace","data":{"id":"trace-023","body":"Observed category scales — 图例 during meeting.","kind":"document","recorded_at":1568543832750,"slug":"trace-023","source":null,"title":"Trace 23: edge identity","word_count":15242}} -{"type":"Trace","data":{"id":"trace-024","body":"Observed branch quiescence during note.","kind":"discussion","recorded_at":1452817688986,"slug":"trace-024","source":null,"title":"Trace 24: revision stamps","word_count":4558}} -{"type":"Trace","data":{"id":"trace-025","body":null,"kind":"experiment","recorded_at":1665344768245,"slug":"trace-025","source":"https://example.test/traces/trace-025","title":"Trace 25: export streaming","word_count":7096}} -{"type":"Trace","data":{"id":"trace-026","body":"Observed crème-fraîche caching during note.","kind":"experiment","recorded_at":1730845371155,"slug":"trace-026","source":null,"title":"Trace 26: Ω-bounds","word_count":375}} -{"type":"Trace","data":{"id":"trace-027","body":"Observed search admission during meeting.","kind":"review","recorded_at":1545606408792,"slug":"trace-027","source":null,"title":"Trace 27: typed attrs","word_count":6553}} -{"type":"Trace","data":{"id":"trace-028","body":"Observed search admission during experiment.","kind":"note","recorded_at":1524317924370,"slug":"trace-028","source":"https://example.test/traces/trace-028","title":"Trace 28: category scales — 图例","word_count":6099}} -{"type":"Trace","data":{"id":"trace-029","body":null,"kind":"experiment","recorded_at":1775302445075,"slug":"trace-029","source":null,"title":"Trace 29: crème-fraîche caching","word_count":3501}} -{"type":"Trace","data":{"id":"trace-030","body":"Observed columnar snapshots during document.","kind":"discussion","recorded_at":1438623543684,"slug":"trace-030","source":null,"title":"Trace 30: category scales — 图例","word_count":18145}} -{"type":"Trace","data":{"id":"trace-031","body":"Observed Ω-bounds during meeting.","kind":"note","recorded_at":1758589989179,"slug":"trace-031","source":"https://example.test/traces/trace-031","title":"Trace 31: graph overlays","word_count":12181}} -{"type":"Trace","data":{"id":"trace-032","body":null,"kind":"review","recorded_at":1736722946572,"slug":"trace-032","source":"https://example.test/traces/trace-032","title":"Trace 32: Ω-bounds","word_count":9880}} -{"type":"Trace","data":{"id":"trace-033","body":null,"kind":"note","recorded_at":1715517292105,"slug":"trace-033","source":null,"title":"Trace 33: Ω-bounds","word_count":12913}} -{"type":"Trace","data":{"id":"trace-034","body":null,"kind":"review","recorded_at":1514902390417,"slug":"trace-034","source":null,"title":"Trace 34: wire encodings","word_count":12939}} -{"type":"Trace","data":{"id":"trace-035","body":null,"kind":"meeting","recorded_at":1686809865464,"slug":"trace-035","source":null,"title":"Trace 35: category scales — 图例","word_count":13149}} -{"type":"Trace","data":{"id":"trace-036","body":null,"kind":"review","recorded_at":1563107173217,"slug":"trace-036","source":"https://example.test/traces/trace-036","title":"Trace 36: branch quiescence","word_count":13958}} -{"type":"Trace","data":{"id":"trace-037","body":null,"kind":"meeting","recorded_at":1460160658894,"slug":"trace-037","source":null,"title":"Trace 37: naïve dedupe","word_count":16142}} -{"type":"Trace","data":{"id":"trace-038","body":"Observed crème-fraîche caching during experiment.","kind":"meeting","recorded_at":1674762499455,"slug":"trace-038","source":"https://example.test/traces/trace-038","title":"Trace 38: edge identity","word_count":11214}} -{"type":"Trace","data":{"id":"trace-039","body":"Observed Ω-bounds during discussion.","kind":"review","recorded_at":1452484494063,"slug":"trace-039","source":null,"title":"Trace 39: export streaming","word_count":15373}} -{"type":"Trace","data":{"id":"trace-040","body":"Observed schema drift during document.","kind":"document","recorded_at":1542135812839,"slug":"trace-040","source":"https://example.test/traces/trace-040","title":"Trace 40: ingestion backpressure","word_count":1358}} -{"type":"Trace","data":{"id":"trace-041","body":null,"kind":"meeting","recorded_at":1697535152548,"slug":"trace-041","source":"https://example.test/traces/trace-041","title":"Trace 41: edge identity","word_count":6879}} -{"type":"Trace","data":{"id":"trace-042","body":null,"kind":"meeting","recorded_at":1423661697172,"slug":"trace-042","source":null,"title":"Trace 42: wire encodings","word_count":9007199254740991}} -{"type":"Trace","data":{"id":"trace-043","body":null,"kind":"note","recorded_at":1795024601300,"slug":"trace-043","source":"https://example.test/traces/trace-043","title":"Trace 43: category scales — 图例","word_count":8749}} -{"type":"Trace","data":{"id":"trace-044","body":null,"kind":"note","recorded_at":1463846842978,"slug":"trace-044","source":"https://example.test/traces/trace-044","title":"Trace 44: graph overlays","word_count":2233}} -{"type":"Trace","data":{"id":"trace-045","body":"Observed legend domains during meeting.","kind":"experiment","recorded_at":1513891538349,"slug":"trace-045","source":"https://example.test/traces/trace-045","title":"Trace 45: Ω-bounds","word_count":3016}} -{"type":"Trace","data":{"id":"trace-046","body":null,"kind":"discussion","recorded_at":1499577461694,"slug":"trace-046","source":"https://example.test/traces/trace-046","title":"Trace 46: columnar snapshots","word_count":1531}} -{"type":"Trace","data":{"id":"trace-047","body":null,"kind":"experiment","recorded_at":1626225422509,"slug":"trace-047","source":"https://example.test/traces/trace-047","title":"Trace 47: wire encodings","word_count":8090}} -{"type":"Trace","data":{"id":"trace-048","body":null,"kind":"review","recorded_at":1634762832147,"slug":"trace-048","source":null,"title":"Trace 48: naïve dedupe","word_count":2925}} -{"type":"Trace","data":{"id":"trace-049","body":"Observed ingestion backpressure during meeting.","kind":"document","recorded_at":1552715198686,"slug":"trace-049","source":"https://example.test/traces/trace-049","title":"Trace 49: columnar snapshots","word_count":12372}} -{"type":"Trace","data":{"id":"trace-050","body":"Observed wire encodings during meeting.","kind":"review","recorded_at":1726155645302,"slug":"trace-050","source":null,"title":"Trace 50: category scales — 图例","word_count":488}} -{"type":"Trace","data":{"id":"trace-051","body":null,"kind":"document","recorded_at":1504637812740,"slug":"trace-051","source":"https://example.test/traces/trace-051","title":"Trace 51: legend domains","word_count":7809}} -{"type":"Trace","data":{"id":"trace-052","body":"Observed branch quiescence during note.","kind":"review","recorded_at":1708855338978,"slug":"trace-052","source":null,"title":"Trace 52: columnar snapshots","word_count":9732}} -{"type":"Trace","data":{"id":"trace-053","body":null,"kind":"note","recorded_at":1612295985936,"slug":"trace-053","source":null,"title":"Trace 53: crème-fraîche caching","word_count":18833}} -{"type":"Trace","data":{"id":"trace-054","body":null,"kind":"review","recorded_at":1723542375897,"slug":"trace-054","source":null,"title":"Trace 54: category scales — 图例","word_count":18330}} -{"type":"Trace","data":{"id":"trace-055","body":"Observed typed attrs during meeting.","kind":"review","recorded_at":1429587015431,"slug":"trace-055","source":"https://example.test/traces/trace-055","title":"Trace 55: wire encodings","word_count":15318}} -{"type":"Trace","data":{"id":"trace-056","body":null,"kind":"note","recorded_at":1502632507508,"slug":"trace-056","source":"https://example.test/traces/trace-056","title":"Trace 56: naïve dedupe","word_count":14781}} -{"type":"Trace","data":{"id":"trace-057","body":"Observed wire encodings during experiment.","kind":"discussion","recorded_at":1541696220937,"slug":"trace-057","source":"https://example.test/traces/trace-057","title":"Trace 57: schema drift","word_count":3911}} -{"type":"Trace","data":{"id":"trace-058","body":null,"kind":"meeting","recorded_at":1563691965371,"slug":"trace-058","source":"https://example.test/traces/trace-058","title":"Trace 58: export streaming","word_count":9047}} -{"type":"Trace","data":{"id":"trace-059","body":"Observed crème-fraîche caching during review.","kind":"review","recorded_at":1672969028531,"slug":"trace-059","source":"https://example.test/traces/trace-059","title":"Trace 59: branch quiescence","word_count":7857}} -{"type":"Trace","data":{"id":"trace-060","body":null,"kind":"note","recorded_at":1543039764361,"slug":"trace-060","source":"https://example.test/traces/trace-060","title":"Trace 60: category scales — 图例","word_count":1843}} -{"type":"Trace","data":{"id":"trace-061","body":"Observed category scales — 图例 during discussion.","kind":"review","recorded_at":1613565723739,"slug":"trace-061","source":null,"title":"Trace 61: wire encodings","word_count":8109}} -{"type":"Trace","data":{"id":"trace-062","body":"Observed category scales — 图例 during experiment.","kind":"meeting","recorded_at":1428059983964,"slug":"trace-062","source":"https://example.test/traces/trace-062","title":"Trace 62: columnar snapshots","word_count":14136}} -{"type":"Trace","data":{"id":"trace-063","body":null,"kind":"discussion","recorded_at":1674105849244,"slug":"trace-063","source":null,"title":"Trace 63: schema drift","word_count":8649}} -{"type":"Trace","data":{"id":"trace-064","body":"Observed Ω-bounds during review.","kind":"document","recorded_at":1620514927813,"slug":"trace-064","source":"https://example.test/traces/trace-064","title":"Trace 64: legend domains","word_count":1796}} -{"type":"Trace","data":{"id":"trace-065","body":null,"kind":"experiment","recorded_at":1732146683765,"slug":"trace-065","source":"https://example.test/traces/trace-065","title":"Trace 65: legend domains","word_count":5868}} -{"type":"Trace","data":{"id":"trace-066","body":null,"kind":"discussion","recorded_at":1686208571764,"slug":"trace-066","source":null,"title":"Trace 66: revision stamps","word_count":2014}} -{"type":"Trace","data":{"id":"trace-067","body":"Observed Ω-bounds during experiment.","kind":"discussion","recorded_at":1489158017480,"slug":"trace-067","source":null,"title":"Trace 67: search admission","word_count":16993}} -{"type":"Trace","data":{"id":"trace-068","body":null,"kind":"meeting","recorded_at":1592148064375,"slug":"trace-068","source":"https://example.test/traces/trace-068","title":"Trace 68: naïve dedupe","word_count":12322}} -{"type":"Trace","data":{"id":"trace-069","body":"Observed category scales — 图例 during document.","kind":"review","recorded_at":1586283565257,"slug":"trace-069","source":"https://example.test/traces/trace-069","title":"Trace 69: edge identity","word_count":12656}} -{"type":"Trace","data":{"id":"trace-070","body":"Observed schema drift during discussion.","kind":"document","recorded_at":1447972849674,"slug":"trace-070","source":null,"title":"Trace 70: Ω-bounds","word_count":11694}} -{"type":"Trace","data":{"id":"trace-071","body":null,"kind":"note","recorded_at":1642474156677,"slug":"trace-071","source":"https://example.test/traces/trace-071","title":"Trace 71: edge identity","word_count":8903}} -{"type":"Trace","data":{"id":"trace-072","body":"Observed branch quiescence during document.","kind":"document","recorded_at":1728496759521,"slug":"trace-072","source":"https://example.test/traces/trace-072","title":"Trace 72: graph overlays","word_count":16253}} -{"type":"Trace","data":{"id":"trace-073","body":"Observed schema drift during note.","kind":"note","recorded_at":1569693721621,"slug":"trace-073","source":"https://example.test/traces/trace-073","title":"Trace 73: export streaming","word_count":1880}} -{"type":"Trace","data":{"id":"trace-074","body":"Observed crème-fraîche caching during experiment.","kind":"experiment","recorded_at":1615756518160,"slug":"trace-074","source":"https://example.test/traces/trace-074","title":"Trace 74: edge identity","word_count":18845}} -{"type":"Trace","data":{"id":"trace-075","body":"Observed legend domains during document.","kind":"experiment","recorded_at":1438527129343,"slug":"trace-075","source":null,"title":"Trace 75: Ω-bounds","word_count":17545}} -{"type":"Trace","data":{"id":"trace-076","body":"Observed naïve dedupe during review.","kind":"meeting","recorded_at":1588590239408,"slug":"trace-076","source":"https://example.test/traces/trace-076","title":"Trace 76: edge identity","word_count":16881}} -{"type":"Trace","data":{"id":"trace-077","body":"Observed Ω-bounds during meeting.","kind":"discussion","recorded_at":1742963278246,"slug":"trace-077","source":null,"title":"Trace 77: columnar snapshots","word_count":14789}} -{"type":"Trace","data":{"id":"trace-078","body":"Observed naïve dedupe during document.","kind":"note","recorded_at":1618657393358,"slug":"trace-078","source":"https://example.test/traces/trace-078","title":"Trace 78: Ω-bounds","word_count":420}} -{"type":"Trace","data":{"id":"trace-079","body":"Observed graph overlays during meeting.","kind":"experiment","recorded_at":1514837116363,"slug":"trace-079","source":null,"title":"Trace 79: graph overlays","word_count":5293}} -{"type":"Trace","data":{"id":"trace-080","body":"Observed schema drift during experiment.","kind":"note","recorded_at":1730836313419,"slug":"trace-080","source":null,"title":"Trace 80: naïve dedupe","word_count":8889}} -{"type":"Trace","data":{"id":"trace-081","body":null,"kind":"discussion","recorded_at":1746215839107,"slug":"trace-081","source":"https://example.test/traces/trace-081","title":"Trace 81: edge identity","word_count":19823}} -{"type":"Trace","data":{"id":"trace-082","body":null,"kind":"review","recorded_at":1594512227974,"slug":"trace-082","source":"https://example.test/traces/trace-082","title":"Trace 82: typed attrs","word_count":8678}} -{"type":"Trace","data":{"id":"trace-083","body":"Observed schema drift during review.","kind":"note","recorded_at":1587691020308,"slug":"trace-083","source":"https://example.test/traces/trace-083","title":"Trace 83: Ω-bounds","word_count":13572}} -{"type":"Trace","data":{"id":"trace-084","body":"Observed graph overlays during document.","kind":"document","recorded_at":1490195924798,"slug":"trace-084","source":null,"title":"Trace 84: search admission","word_count":14589}} -{"type":"Trace","data":{"id":"trace-085","body":null,"kind":"discussion","recorded_at":1597866247983,"slug":"trace-085","source":"https://example.test/traces/trace-085","title":"Trace 85: columnar snapshots","word_count":12376}} -{"type":"Trace","data":{"id":"trace-086","body":"Observed branch quiescence during document.","kind":"review","recorded_at":1794251785032,"slug":"trace-086","source":"https://example.test/traces/trace-086","title":"Trace 86: columnar snapshots","word_count":7605}} -{"type":"Trace","data":{"id":"trace-087","body":"Observed revision stamps during discussion.","kind":"note","recorded_at":1541930723270,"slug":"trace-087","source":"https://example.test/traces/trace-087","title":"Trace 87: export streaming","word_count":11648}} -{"type":"Trace","data":{"id":"trace-088","body":null,"kind":"experiment","recorded_at":1551762530832,"slug":"trace-088","source":"https://example.test/traces/trace-088","title":"Trace 88: crème-fraîche caching","word_count":4945}} -{"type":"Trace","data":{"id":"trace-089","body":"Observed legend domains during discussion.","kind":"meeting","recorded_at":1431022341792,"slug":"trace-089","source":null,"title":"Trace 89: search admission","word_count":17785}} -{"type":"Trace","data":{"id":"trace-090","body":null,"kind":"document","recorded_at":1466164848869,"slug":"trace-090","source":null,"title":"Trace 90: search admission","word_count":1339}} +{"edge":"Correlates","id":"corr-0001","from":"signal-041","to":"signal-057","data":{"confidence":0.79}} +{"edge":"Correlates","id":"corr-0002","from":"signal-021","to":"signal-052","data":{"confidence":0.46}} +{"edge":"Correlates","id":"corr-0003","from":"signal-022","to":"signal-060","data":{"confidence":0.03}} +{"edge":"Correlates","id":"corr-0004","from":"signal-027","to":"signal-033","data":{"confidence":0.06}} +{"edge":"Correlates","id":"corr-0005","from":"signal-034","to":"signal-010","data":{"confidence":0.85}} +{"edge":"Correlates","id":"corr-0006","from":"signal-028","to":"signal-007","data":{"confidence":0.97}} +{"edge":"Correlates","id":"corr-0007","from":"signal-005","to":"signal-044","data":{"confidence":0.35}} +{"edge":"Correlates","id":"corr-0008","from":"signal-033","to":"signal-014","data":{"confidence":0.32}} +{"edge":"Correlates","id":"corr-0009","from":"signal-031","to":"signal-033","data":{"confidence":0.27}} +{"edge":"Correlates","id":"corr-0010","from":"signal-004","to":"signal-001","data":{"confidence":0.86}} +{"edge":"Correlates","id":"corr-0011","from":"signal-034","to":"signal-044","data":{"confidence":0.09}} +{"edge":"Correlates","id":"corr-0012","from":"signal-013","to":"signal-012","data":{"confidence":0.14}} +{"edge":"Correlates","id":"corr-0013","from":"signal-055","to":"signal-008","data":{"confidence":0.77}} +{"edge":"Correlates","id":"corr-0014","from":"signal-034","to":"signal-035","data":{"confidence":0.41}} +{"edge":"Correlates","id":"corr-0015","from":"signal-017","to":"signal-033","data":{"confidence":0.6}} +{"edge":"Correlates","id":"corr-0016","from":"signal-049","to":"signal-055","data":{"confidence":0.0}} +{"edge":"Correlates","id":"corr-0017","from":"signal-043","to":"signal-020","data":{"confidence":0.65}} +{"edge":"Correlates","id":"corr-0018","from":"signal-039","to":"signal-055","data":{"confidence":0.45}} +{"edge":"Correlates","id":"corr-0019","from":"signal-018","to":"signal-060","data":{"confidence":0.69}} +{"edge":"Correlates","id":"corr-0020","from":"signal-005","to":"signal-004","data":{"confidence":0.21}} +{"edge":"Correlates","id":"corr-0021","from":"signal-027","to":"signal-005","data":{"confidence":0.32}} +{"edge":"Correlates","id":"corr-0022","from":"signal-036","to":"signal-004","data":{"confidence":0.29}} +{"edge":"Correlates","id":"corr-0023","from":"signal-039","to":"signal-052","data":{"confidence":0.65}} +{"edge":"Correlates","id":"corr-0024","from":"signal-001","to":"signal-007","data":{"confidence":0.46}} +{"edge":"Correlates","id":"corr-0025","from":"signal-032","to":"signal-043","data":{"confidence":1.0}} +{"edge":"Correlates","id":"corr-0026","from":"signal-046","to":"signal-029","data":{"confidence":0.31}} +{"edge":"Correlates","id":"corr-0027","from":"signal-031","to":"signal-045","data":{"confidence":0.48}} +{"edge":"Correlates","id":"corr-0028","from":"signal-010","to":"signal-044","data":{"confidence":0.42}} +{"edge":"Correlates","id":"corr-0029","from":"signal-053","to":"signal-047","data":{"confidence":0.84}} +{"edge":"Correlates","id":"corr-0030","from":"signal-030","to":"signal-035","data":{"confidence":0.12}} +{"edge":"Correlates","id":"corr-0031","from":"signal-022","to":"signal-059","data":{"confidence":0.09}} +{"edge":"Correlates","id":"corr-0032","from":"signal-005","to":"signal-006","data":{"confidence":0.89}} +{"edge":"Correlates","id":"corr-0033","from":"signal-003","to":"signal-044","data":{"confidence":0.11}} +{"edge":"Correlates","id":"corr-0034","from":"signal-017","to":"signal-026","data":{"confidence":0.84}} +{"edge":"Correlates","id":"corr-0035","from":"signal-004","to":"signal-057","data":{"confidence":0.83}} +{"edge":"Correlates","id":"corr-0036","from":"signal-002","to":"signal-007","data":{"confidence":0.61}} +{"edge":"Correlates","id":"corr-0037","from":"signal-011","to":"signal-022","data":{"confidence":0.05}} +{"edge":"Correlates","id":"corr-0038","from":"signal-057","to":"signal-053","data":{"confidence":0.28}} +{"edge":"Correlates","id":"corr-0039","from":"signal-048","to":"signal-016","data":{"confidence":0.71}} +{"edge":"Correlates","id":"corr-0040","from":"signal-056","to":"signal-060","data":{"confidence":0.02}} +{"edge":"Correlates","id":"corr-0041","from":"signal-014","to":"signal-021","data":{"confidence":0.97}} +{"edge":"Correlates","id":"corr-0042","from":"signal-034","to":"signal-037","data":{"confidence":0.14}} +{"edge":"Correlates","id":"corr-0043","from":"signal-046","to":"signal-044","data":{"confidence":0.04}} +{"edge":"Correlates","id":"corr-0044","from":"signal-031","to":"signal-020","data":{"confidence":0.95}} +{"edge":"Correlates","id":"corr-0045","from":"signal-051","to":"signal-033","data":{"confidence":0.07}} +{"edge":"Correlates","id":"corr-0046","from":"signal-032","to":"signal-036","data":{"confidence":0.04}} +{"edge":"Correlates","id":"corr-0047","from":"signal-047","to":"signal-003","data":{"confidence":0.15}} +{"edge":"Correlates","id":"corr-0048","from":"signal-052","to":"signal-049","data":{"confidence":0.08}} +{"edge":"Correlates","id":"corr-0049","from":"signal-008","to":"signal-053","data":{"confidence":0.15}} +{"edge":"Correlates","id":"corr-0050","from":"signal-044","to":"signal-055","data":{"confidence":0.38}} +{"edge":"OwnedBy","id":"own-0001","from":"decision-001","to":"actor-001","data":{}} +{"edge":"OwnedBy","id":"own-0002","from":"decision-002","to":"actor-002","data":{}} +{"edge":"OwnedBy","id":"own-0003","from":"decision-003","to":"actor-003","data":{}} +{"edge":"OwnedBy","id":"own-0004","from":"decision-004","to":"actor-004","data":{}} +{"edge":"OwnedBy","id":"own-0005","from":"decision-005","to":"actor-005","data":{}} +{"edge":"OwnedBy","id":"own-0006","from":"decision-006","to":"actor-006","data":{}} +{"edge":"OwnedBy","id":"own-0007","from":"decision-007","to":"actor-007","data":{}} +{"edge":"OwnedBy","id":"own-0008","from":"decision-008","to":"actor-008","data":{}} +{"edge":"OwnedBy","id":"own-0009","from":"decision-009","to":"actor-009","data":{}} +{"edge":"OwnedBy","id":"own-0010","from":"decision-010","to":"actor-010","data":{}} +{"edge":"OwnedBy","id":"own-0011","from":"decision-011","to":"actor-011","data":{}} +{"edge":"OwnedBy","id":"own-0012","from":"decision-012","to":"actor-012","data":{}} +{"edge":"OwnedBy","id":"own-0013","from":"decision-013","to":"actor-013","data":{}} +{"edge":"OwnedBy","id":"own-0014","from":"decision-014","to":"actor-014","data":{}} +{"edge":"OwnedBy","id":"own-0015","from":"decision-015","to":"actor-015","data":{}} +{"edge":"OwnedBy","id":"own-0016","from":"decision-016","to":"actor-016","data":{}} +{"edge":"OwnedBy","id":"own-0017","from":"decision-017","to":"actor-017","data":{}} +{"edge":"OwnedBy","id":"own-0018","from":"decision-018","to":"actor-018","data":{}} +{"edge":"OwnedBy","id":"own-0019","from":"decision-019","to":"actor-019","data":{}} +{"edge":"OwnedBy","id":"own-0020","from":"decision-020","to":"actor-020","data":{}} +{"edge":"OwnedBy","id":"own-0021","from":"decision-021","to":"actor-021","data":{}} +{"edge":"OwnedBy","id":"own-0022","from":"decision-022","to":"actor-022","data":{}} +{"edge":"OwnedBy","id":"own-0023","from":"decision-023","to":"actor-023","data":{}} +{"edge":"OwnedBy","id":"own-0024","from":"decision-024","to":"actor-024","data":{}} +{"edge":"OwnedBy","id":"own-0025","from":"decision-025","to":"actor-025","data":{}} +{"edge":"OwnedBy","id":"own-0026","from":"decision-026","to":"actor-026","data":{}} +{"edge":"OwnedBy","id":"own-0027","from":"decision-027","to":"actor-027","data":{}} +{"edge":"OwnedBy","id":"own-0028","from":"decision-028","to":"actor-028","data":{}} +{"edge":"OwnedBy","id":"own-0029","from":"decision-029","to":"actor-029","data":{}} +{"edge":"OwnedBy","id":"own-0030","from":"decision-030","to":"actor-030","data":{}} +{"edge":"OwnedBy","id":"own-0031","from":"decision-031","to":"actor-001","data":{}} +{"edge":"OwnedBy","id":"own-0032","from":"decision-032","to":"actor-002","data":{}} +{"edge":"OwnedBy","id":"own-0033","from":"decision-033","to":"actor-003","data":{}} +{"edge":"OwnedBy","id":"own-0034","from":"decision-034","to":"actor-004","data":{}} +{"edge":"OwnedBy","id":"own-0035","from":"decision-035","to":"actor-005","data":{}} +{"edge":"OwnedBy","id":"own-0036","from":"decision-036","to":"actor-006","data":{}} +{"edge":"OwnedBy","id":"own-0037","from":"decision-037","to":"actor-007","data":{}} +{"edge":"OwnedBy","id":"own-0038","from":"decision-038","to":"actor-008","data":{}} +{"edge":"OwnedBy","id":"own-0039","from":"decision-039","to":"actor-009","data":{}} +{"edge":"OwnedBy","id":"own-0040","from":"decision-040","to":"actor-010","data":{}} +{"edge":"OwnedBy","id":"own-0041","from":"decision-041","to":"actor-011","data":{}} +{"edge":"OwnedBy","id":"own-0042","from":"decision-042","to":"actor-012","data":{}} +{"edge":"OwnedBy","id":"own-0043","from":"decision-043","to":"actor-013","data":{}} +{"edge":"OwnedBy","id":"own-0044","from":"decision-044","to":"actor-014","data":{}} +{"edge":"OwnedBy","id":"own-0045","from":"decision-045","to":"actor-015","data":{}} +{"edge":"OwnedBy","id":"own-0046","from":"decision-046","to":"actor-016","data":{}} +{"edge":"OwnedBy","id":"own-0047","from":"decision-047","to":"actor-017","data":{}} +{"edge":"OwnedBy","id":"own-0048","from":"decision-048","to":"actor-018","data":{}} +{"edge":"OwnedBy","id":"own-0049","from":"decision-049","to":"actor-019","data":{}} +{"edge":"OwnedBy","id":"own-0050","from":"decision-050","to":"actor-020","data":{}} +{"edge":"OwnedBy","id":"own-0051","from":"decision-051","to":"actor-021","data":{}} +{"edge":"OwnedBy","id":"own-0052","from":"decision-052","to":"actor-022","data":{}} +{"edge":"OwnedBy","id":"own-0053","from":"decision-053","to":"actor-023","data":{}} +{"edge":"OwnedBy","id":"own-0054","from":"decision-054","to":"actor-024","data":{}} +{"edge":"OwnedBy","id":"own-0055","from":"decision-055","to":"actor-025","data":{}} +{"edge":"OwnedBy","id":"own-0056","from":"decision-056","to":"actor-026","data":{}} +{"edge":"OwnedBy","id":"own-0057","from":"decision-057","to":"actor-027","data":{}} +{"edge":"OwnedBy","id":"own-0058","from":"decision-058","to":"actor-028","data":{}} +{"edge":"OwnedBy","id":"own-0059","from":"decision-059","to":"actor-029","data":{}} +{"edge":"OwnedBy","id":"own-0060","from":"decision-060","to":"actor-030","data":{}} +{"edge":"ParticipatedIn","id":"part-0001","from":"actor-021","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0002","from":"actor-017","to":"decision-015","data":{}} +{"edge":"ParticipatedIn","id":"part-0003","from":"actor-020","to":"decision-038","data":{}} +{"edge":"ParticipatedIn","id":"part-0004","from":"actor-010","to":"decision-018","data":{}} +{"edge":"ParticipatedIn","id":"part-0005","from":"actor-006","to":"decision-027","data":{}} +{"edge":"ParticipatedIn","id":"part-0006","from":"actor-012","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0007","from":"actor-025","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0008","from":"actor-006","to":"decision-036","data":{}} +{"edge":"ParticipatedIn","id":"part-0009","from":"actor-008","to":"decision-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0010","from":"actor-015","to":"decision-012","data":{}} +{"edge":"ParticipatedIn","id":"part-0011","from":"actor-008","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0012","from":"actor-003","to":"decision-001","data":{}} +{"edge":"ParticipatedIn","id":"part-0013","from":"actor-016","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0014","from":"actor-027","to":"decision-007","data":{}} +{"edge":"ParticipatedIn","id":"part-0015","from":"actor-014","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0016","from":"actor-002","to":"decision-031","data":{}} +{"edge":"ParticipatedIn","id":"part-0017","from":"actor-023","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0018","from":"actor-002","to":"decision-025","data":{}} +{"edge":"ParticipatedIn","id":"part-0019","from":"actor-014","to":"decision-053","data":{}} +{"edge":"ParticipatedIn","id":"part-0020","from":"actor-015","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0021","from":"actor-023","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0022","from":"actor-004","to":"decision-043","data":{}} +{"edge":"ParticipatedIn","id":"part-0023","from":"actor-027","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0024","from":"actor-023","to":"decision-042","data":{}} +{"edge":"ParticipatedIn","id":"part-0025","from":"actor-023","to":"decision-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0026","from":"actor-016","to":"decision-054","data":{}} +{"edge":"ParticipatedIn","id":"part-0027","from":"actor-012","to":"decision-026","data":{}} +{"edge":"ParticipatedIn","id":"part-0028","from":"actor-008","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0029","from":"actor-024","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0030","from":"actor-008","to":"decision-014","data":{}} +{"edge":"ParticipatedIn","id":"part-0031","from":"actor-004","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0032","from":"actor-011","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0033","from":"actor-021","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0034","from":"actor-020","to":"decision-045","data":{}} +{"edge":"ParticipatedIn","id":"part-0035","from":"actor-020","to":"decision-031","data":{}} +{"edge":"ParticipatedIn","id":"part-0036","from":"actor-014","to":"decision-029","data":{}} +{"edge":"ParticipatedIn","id":"part-0037","from":"actor-005","to":"decision-004","data":{}} +{"edge":"ParticipatedIn","id":"part-0038","from":"actor-006","to":"decision-059","data":{}} +{"edge":"ParticipatedIn","id":"part-0039","from":"actor-022","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0040","from":"actor-013","to":"decision-031","data":{}} +{"edge":"ParticipatedIn","id":"part-0041","from":"actor-001","to":"decision-048","data":{}} +{"edge":"ParticipatedIn","id":"part-0042","from":"actor-012","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0043","from":"actor-014","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0044","from":"actor-005","to":"decision-028","data":{}} +{"edge":"ParticipatedIn","id":"part-0045","from":"actor-025","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0046","from":"actor-012","to":"decision-052","data":{}} +{"edge":"ParticipatedIn","id":"part-0047","from":"actor-023","to":"decision-020","data":{}} +{"edge":"ParticipatedIn","id":"part-0048","from":"actor-022","to":"decision-003","data":{}} +{"edge":"ParticipatedIn","id":"part-0049","from":"actor-029","to":"decision-050","data":{}} +{"edge":"ParticipatedIn","id":"part-0050","from":"actor-012","to":"decision-036","data":{}} +{"edge":"ParticipatedIn","id":"part-0051","from":"actor-020","to":"decision-041","data":{}} +{"edge":"ParticipatedIn","id":"part-0052","from":"actor-018","to":"decision-042","data":{}} +{"edge":"ParticipatedIn","id":"part-0053","from":"actor-012","to":"decision-025","data":{}} +{"edge":"ParticipatedIn","id":"part-0054","from":"actor-029","to":"decision-008","data":{}} +{"edge":"ParticipatedIn","id":"part-0055","from":"actor-027","to":"decision-004","data":{}} +{"edge":"ParticipatedIn","id":"part-0056","from":"actor-027","to":"decision-020","data":{}} +{"edge":"ParticipatedIn","id":"part-0057","from":"actor-029","to":"decision-042","data":{}} +{"edge":"ParticipatedIn","id":"part-0058","from":"actor-003","to":"decision-036","data":{}} +{"edge":"ParticipatedIn","id":"part-0059","from":"actor-004","to":"decision-014","data":{}} +{"edge":"ParticipatedIn","id":"part-0060","from":"actor-020","to":"decision-030","data":{}} +{"edge":"ParticipatedIn","id":"part-0061","from":"actor-007","to":"decision-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0062","from":"actor-010","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0063","from":"actor-019","to":"decision-048","data":{}} +{"edge":"ParticipatedIn","id":"part-0064","from":"actor-029","to":"decision-056","data":{}} +{"edge":"ParticipatedIn","id":"part-0065","from":"actor-014","to":"decision-001","data":{}} +{"edge":"ParticipatedIn","id":"part-0066","from":"actor-020","to":"decision-053","data":{}} +{"edge":"ParticipatedIn","id":"part-0067","from":"actor-001","to":"decision-008","data":{}} +{"edge":"ParticipatedIn","id":"part-0068","from":"actor-011","to":"decision-004","data":{}} +{"edge":"ParticipatedIn","id":"part-0069","from":"actor-025","to":"decision-033","data":{}} +{"edge":"ParticipatedIn","id":"part-0070","from":"actor-007","to":"decision-013","data":{}} +{"edge":"ParticipatedIn","id":"part-0071","from":"actor-026","to":"decision-054","data":{}} +{"edge":"ParticipatedIn","id":"part-0072","from":"actor-006","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0073","from":"actor-005","to":"decision-021","data":{}} +{"edge":"ParticipatedIn","id":"part-0074","from":"actor-030","to":"decision-026","data":{}} +{"edge":"ParticipatedIn","id":"part-0075","from":"actor-013","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0076","from":"actor-016","to":"decision-002","data":{}} +{"edge":"ParticipatedIn","id":"part-0077","from":"actor-024","to":"decision-017","data":{}} +{"edge":"ParticipatedIn","id":"part-0078","from":"actor-014","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0079","from":"actor-003","to":"decision-059","data":{}} +{"edge":"ParticipatedIn","id":"part-0080","from":"actor-005","to":"decision-008","data":{}} +{"edge":"ParticipatedIn","id":"part-0081","from":"actor-009","to":"decision-002","data":{}} +{"edge":"ParticipatedIn","id":"part-0082","from":"actor-027","to":"decision-012","data":{}} +{"edge":"ParticipatedIn","id":"part-0083","from":"actor-024","to":"decision-023","data":{}} +{"edge":"ParticipatedIn","id":"part-0084","from":"actor-007","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0085","from":"actor-029","to":"decision-002","data":{}} +{"edge":"ParticipatedIn","id":"part-0086","from":"actor-006","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0087","from":"actor-009","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0088","from":"actor-004","to":"decision-058","data":{}} +{"edge":"ParticipatedIn","id":"part-0089","from":"actor-010","to":"decision-033","data":{}} +{"edge":"ParticipatedIn","id":"part-0090","from":"actor-007","to":"decision-045","data":{}} +{"edge":"ParticipatedIn","id":"part-0091","from":"actor-030","to":"decision-043","data":{}} +{"edge":"ParticipatedIn","id":"part-0092","from":"actor-006","to":"decision-028","data":{}} +{"edge":"ParticipatedIn","id":"part-0093","from":"actor-006","to":"decision-001","data":{}} +{"edge":"ParticipatedIn","id":"part-0094","from":"actor-030","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0095","from":"actor-018","to":"decision-013","data":{}} +{"edge":"ParticipatedIn","id":"part-0096","from":"actor-019","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0097","from":"actor-017","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0098","from":"actor-016","to":"decision-003","data":{}} +{"edge":"ParticipatedIn","id":"part-0099","from":"actor-022","to":"decision-025","data":{}} +{"edge":"ParticipatedIn","id":"part-0100","from":"actor-010","to":"decision-054","data":{}} +{"edge":"ParticipatedIn","id":"part-0101","from":"actor-023","to":"decision-047","data":{}} +{"edge":"ParticipatedIn","id":"part-0102","from":"actor-010","to":"decision-010","data":{}} +{"edge":"ParticipatedIn","id":"part-0103","from":"actor-020","to":"decision-015","data":{}} +{"edge":"ParticipatedIn","id":"part-0104","from":"actor-018","to":"decision-040","data":{}} +{"edge":"ParticipatedIn","id":"part-0105","from":"actor-016","to":"decision-052","data":{}} +{"edge":"ParticipatedIn","id":"part-0106","from":"actor-019","to":"decision-055","data":{}} +{"edge":"ParticipatedIn","id":"part-0107","from":"actor-001","to":"decision-038","data":{}} +{"edge":"ParticipatedIn","id":"part-0108","from":"actor-016","to":"decision-007","data":{}} +{"edge":"ParticipatedIn","id":"part-0109","from":"actor-005","to":"decision-048","data":{}} +{"edge":"ParticipatedIn","id":"part-0110","from":"actor-019","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0111","from":"actor-022","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0112","from":"actor-005","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0113","from":"actor-008","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0114","from":"actor-013","to":"decision-038","data":{}} +{"edge":"ParticipatedIn","id":"part-0115","from":"actor-017","to":"decision-057","data":{}} +{"edge":"ParticipatedIn","id":"part-0116","from":"actor-018","to":"decision-050","data":{}} +{"edge":"ParticipatedIn","id":"part-0117","from":"actor-006","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0118","from":"actor-020","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0119","from":"actor-021","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0120","from":"actor-021","to":"decision-046","data":{}} +{"edge":"RecordedBy","id":"rec-0001","from":"trace-001","to":"actor-001","data":{}} +{"edge":"RecordedBy","id":"rec-0002","from":"trace-002","to":"actor-008","data":{}} +{"edge":"RecordedBy","id":"rec-0003","from":"trace-003","to":"actor-015","data":{}} +{"edge":"RecordedBy","id":"rec-0004","from":"trace-004","to":"actor-022","data":{}} +{"edge":"RecordedBy","id":"rec-0005","from":"trace-005","to":"actor-029","data":{}} +{"edge":"RecordedBy","id":"rec-0006","from":"trace-006","to":"actor-006","data":{}} +{"edge":"RecordedBy","id":"rec-0007","from":"trace-007","to":"actor-013","data":{}} +{"edge":"RecordedBy","id":"rec-0008","from":"trace-008","to":"actor-020","data":{}} +{"edge":"RecordedBy","id":"rec-0009","from":"trace-009","to":"actor-027","data":{}} +{"edge":"RecordedBy","id":"rec-0010","from":"trace-010","to":"actor-004","data":{}} +{"edge":"RecordedBy","id":"rec-0011","from":"trace-011","to":"actor-011","data":{}} +{"edge":"RecordedBy","id":"rec-0012","from":"trace-012","to":"actor-018","data":{}} +{"edge":"RecordedBy","id":"rec-0013","from":"trace-013","to":"actor-025","data":{}} +{"edge":"RecordedBy","id":"rec-0014","from":"trace-014","to":"actor-002","data":{}} +{"edge":"RecordedBy","id":"rec-0015","from":"trace-015","to":"actor-009","data":{}} +{"edge":"RecordedBy","id":"rec-0016","from":"trace-016","to":"actor-016","data":{}} +{"edge":"RecordedBy","id":"rec-0017","from":"trace-017","to":"actor-023","data":{}} +{"edge":"RecordedBy","id":"rec-0018","from":"trace-018","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0019","from":"trace-019","to":"actor-007","data":{}} +{"edge":"RecordedBy","id":"rec-0020","from":"trace-020","to":"actor-014","data":{}} +{"edge":"RecordedBy","id":"rec-0021","from":"trace-021","to":"actor-021","data":{}} +{"edge":"RecordedBy","id":"rec-0022","from":"trace-022","to":"actor-028","data":{}} +{"edge":"RecordedBy","id":"rec-0023","from":"trace-023","to":"actor-005","data":{}} +{"edge":"RecordedBy","id":"rec-0024","from":"trace-024","to":"actor-012","data":{}} +{"edge":"RecordedBy","id":"rec-0025","from":"trace-025","to":"actor-019","data":{}} +{"edge":"RecordedBy","id":"rec-0026","from":"trace-026","to":"actor-026","data":{}} +{"edge":"RecordedBy","id":"rec-0027","from":"trace-027","to":"actor-003","data":{}} +{"edge":"RecordedBy","id":"rec-0028","from":"trace-028","to":"actor-010","data":{}} +{"edge":"RecordedBy","id":"rec-0029","from":"trace-029","to":"actor-017","data":{}} +{"edge":"RecordedBy","id":"rec-0030","from":"trace-030","to":"actor-024","data":{}} +{"edge":"RecordedBy","id":"rec-0031","from":"trace-031","to":"actor-001","data":{}} +{"edge":"RecordedBy","id":"rec-0032","from":"trace-032","to":"actor-008","data":{}} +{"edge":"RecordedBy","id":"rec-0033","from":"trace-033","to":"actor-015","data":{}} +{"edge":"RecordedBy","id":"rec-0034","from":"trace-034","to":"actor-022","data":{}} +{"edge":"RecordedBy","id":"rec-0035","from":"trace-035","to":"actor-029","data":{}} +{"edge":"RecordedBy","id":"rec-0036","from":"trace-036","to":"actor-006","data":{}} +{"edge":"RecordedBy","id":"rec-0037","from":"trace-037","to":"actor-013","data":{}} +{"edge":"RecordedBy","id":"rec-0038","from":"trace-038","to":"actor-020","data":{}} +{"edge":"RecordedBy","id":"rec-0039","from":"trace-039","to":"actor-027","data":{}} +{"edge":"RecordedBy","id":"rec-0040","from":"trace-040","to":"actor-004","data":{}} +{"edge":"RecordedBy","id":"rec-0041","from":"trace-041","to":"actor-011","data":{}} +{"edge":"RecordedBy","id":"rec-0042","from":"trace-042","to":"actor-018","data":{}} +{"edge":"RecordedBy","id":"rec-0043","from":"trace-043","to":"actor-025","data":{}} +{"edge":"RecordedBy","id":"rec-0044","from":"trace-044","to":"actor-002","data":{}} +{"edge":"RecordedBy","id":"rec-0045","from":"trace-045","to":"actor-009","data":{}} +{"edge":"RecordedBy","id":"rec-0046","from":"trace-046","to":"actor-016","data":{}} +{"edge":"RecordedBy","id":"rec-0047","from":"trace-047","to":"actor-023","data":{}} +{"edge":"RecordedBy","id":"rec-0048","from":"trace-048","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0049","from":"trace-049","to":"actor-007","data":{}} +{"edge":"RecordedBy","id":"rec-0050","from":"trace-050","to":"actor-014","data":{}} +{"edge":"RecordedBy","id":"rec-0051","from":"trace-051","to":"actor-021","data":{}} +{"edge":"RecordedBy","id":"rec-0052","from":"trace-052","to":"actor-028","data":{}} +{"edge":"RecordedBy","id":"rec-0053","from":"trace-053","to":"actor-005","data":{}} +{"edge":"RecordedBy","id":"rec-0054","from":"trace-054","to":"actor-012","data":{}} +{"edge":"RecordedBy","id":"rec-0055","from":"trace-055","to":"actor-019","data":{}} +{"edge":"RecordedBy","id":"rec-0056","from":"trace-056","to":"actor-026","data":{}} +{"edge":"RecordedBy","id":"rec-0057","from":"trace-057","to":"actor-003","data":{}} +{"edge":"RecordedBy","id":"rec-0058","from":"trace-058","to":"actor-010","data":{}} +{"edge":"RecordedBy","id":"rec-0059","from":"trace-059","to":"actor-017","data":{}} +{"edge":"RecordedBy","id":"rec-0060","from":"trace-060","to":"actor-024","data":{}} +{"edge":"RecordedBy","id":"rec-0061","from":"trace-061","to":"actor-001","data":{}} +{"edge":"RecordedBy","id":"rec-0062","from":"trace-062","to":"actor-008","data":{}} +{"edge":"RecordedBy","id":"rec-0063","from":"trace-063","to":"actor-015","data":{}} +{"edge":"RecordedBy","id":"rec-0064","from":"trace-064","to":"actor-022","data":{}} +{"edge":"RecordedBy","id":"rec-0065","from":"trace-065","to":"actor-029","data":{}} +{"edge":"RecordedBy","id":"rec-0066","from":"trace-066","to":"actor-006","data":{}} +{"edge":"RecordedBy","id":"rec-0067","from":"trace-067","to":"actor-013","data":{}} +{"edge":"RecordedBy","id":"rec-0068","from":"trace-068","to":"actor-020","data":{}} +{"edge":"RecordedBy","id":"rec-0069","from":"trace-069","to":"actor-027","data":{}} +{"edge":"RecordedBy","id":"rec-0070","from":"trace-070","to":"actor-004","data":{}} +{"edge":"RecordedBy","id":"rec-0071","from":"trace-071","to":"actor-011","data":{}} +{"edge":"RecordedBy","id":"rec-0072","from":"trace-072","to":"actor-018","data":{}} +{"edge":"RecordedBy","id":"rec-0073","from":"trace-073","to":"actor-025","data":{}} +{"edge":"RecordedBy","id":"rec-0074","from":"trace-074","to":"actor-002","data":{}} +{"edge":"RecordedBy","id":"rec-0075","from":"trace-075","to":"actor-009","data":{}} +{"edge":"RecordedBy","id":"rec-0076","from":"trace-076","to":"actor-016","data":{}} +{"edge":"RecordedBy","id":"rec-0077","from":"trace-077","to":"actor-023","data":{}} +{"edge":"RecordedBy","id":"rec-0078","from":"trace-078","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0079","from":"trace-079","to":"actor-007","data":{}} +{"edge":"RecordedBy","id":"rec-0080","from":"trace-080","to":"actor-014","data":{}} +{"edge":"RecordedBy","id":"rec-0081","from":"trace-081","to":"actor-021","data":{}} +{"edge":"RecordedBy","id":"rec-0082","from":"trace-082","to":"actor-028","data":{}} +{"edge":"RecordedBy","id":"rec-0083","from":"trace-083","to":"actor-005","data":{}} +{"edge":"RecordedBy","id":"rec-0084","from":"trace-084","to":"actor-012","data":{}} +{"edge":"RecordedBy","id":"rec-0085","from":"trace-085","to":"actor-019","data":{}} +{"edge":"RecordedBy","id":"rec-0086","from":"trace-086","to":"actor-026","data":{}} +{"edge":"RecordedBy","id":"rec-0087","from":"trace-087","to":"actor-003","data":{}} +{"edge":"RecordedBy","id":"rec-0088","from":"trace-088","to":"actor-010","data":{}} +{"edge":"RecordedBy","id":"rec-0089","from":"trace-089","to":"actor-017","data":{}} +{"edge":"RecordedBy","id":"rec-0090","from":"trace-090","to":"actor-024","data":{}} +{"edge":"Supports","id":"sup-0001","from":"trace-021","to":"decision-043","data":{}} +{"edge":"Supports","id":"sup-0002","from":"trace-086","to":"decision-008","data":{"weight":0.996}} +{"edge":"Supports","id":"sup-0003","from":"trace-019","to":"decision-002","data":{"weight":0.62}} +{"edge":"Supports","id":"sup-0004","from":"trace-025","to":"decision-043","data":{}} +{"edge":"Supports","id":"sup-0005","from":"trace-082","to":"decision-027","data":{"weight":0.803}} +{"edge":"Supports","id":"sup-0006","from":"trace-089","to":"decision-031","data":{"weight":0.111}} +{"edge":"Supports","id":"sup-0007","from":"trace-088","to":"decision-046","data":{"weight":0.307}} +{"edge":"Supports","id":"sup-0008","from":"trace-064","to":"decision-049","data":{"weight":0.621}} +{"edge":"Supports","id":"sup-0009","from":"trace-040","to":"decision-043","data":{}} +{"edge":"Supports","id":"sup-0010","from":"trace-046","to":"decision-015","data":{}} +{"edge":"Supports","id":"sup-0011","from":"trace-024","to":"decision-002","data":{"weight":0.584}} +{"edge":"Supports","id":"sup-0012","from":"trace-023","to":"decision-020","data":{"weight":0.009}} +{"edge":"Supports","id":"sup-0013","from":"trace-002","to":"decision-017","data":{"weight":0.701}} +{"edge":"Supports","id":"sup-0014","from":"trace-044","to":"decision-002","data":{}} +{"edge":"Supports","id":"sup-0015","from":"trace-016","to":"decision-045","data":{"weight":0.382}} +{"edge":"Supports","id":"sup-0016","from":"trace-042","to":"decision-014","data":{"weight":0.852}} +{"edge":"Supports","id":"sup-0017","from":"trace-049","to":"decision-014","data":{"weight":0.57}} +{"edge":"Supports","id":"sup-0018","from":"trace-019","to":"decision-011","data":{"weight":0.122}} +{"edge":"Supports","id":"sup-0019","from":"trace-089","to":"decision-002","data":{"weight":0.69}} +{"edge":"Supports","id":"sup-0020","from":"trace-060","to":"decision-021","data":{"weight":0.7}} +{"edge":"Supports","id":"sup-0021","from":"trace-071","to":"decision-011","data":{"weight":0.595}} +{"edge":"Supports","id":"sup-0022","from":"trace-034","to":"decision-012","data":{"weight":0.908}} +{"edge":"Supports","id":"sup-0023","from":"trace-055","to":"decision-059","data":{"weight":0.845}} +{"edge":"Supports","id":"sup-0024","from":"trace-004","to":"decision-049","data":{"weight":0.922}} +{"edge":"Supports","id":"sup-0025","from":"trace-081","to":"decision-022","data":{"weight":0.563}} +{"edge":"Supports","id":"sup-0026","from":"trace-069","to":"decision-003","data":{}} +{"edge":"Supports","id":"sup-0027","from":"trace-089","to":"decision-028","data":{"weight":0.008}} +{"edge":"Supports","id":"sup-0028","from":"trace-003","to":"decision-047","data":{"weight":0.866}} +{"edge":"Supports","id":"sup-0029","from":"trace-035","to":"decision-007","data":{"weight":0.238}} +{"edge":"Supports","id":"sup-0030","from":"trace-067","to":"decision-056","data":{"weight":0.613}} +{"edge":"Supports","id":"sup-0031","from":"trace-053","to":"decision-051","data":{"weight":0.339}} +{"edge":"Supports","id":"sup-0032","from":"trace-048","to":"decision-012","data":{"weight":0.662}} +{"edge":"Supports","id":"sup-0033","from":"trace-038","to":"decision-029","data":{"weight":0.94}} +{"edge":"Supports","id":"sup-0034","from":"trace-040","to":"decision-001","data":{"weight":0.889}} +{"edge":"Supports","id":"sup-0035","from":"trace-056","to":"decision-013","data":{"weight":0.09}} +{"edge":"Supports","id":"sup-0036","from":"trace-014","to":"decision-036","data":{"weight":0.09}} +{"edge":"Supports","id":"sup-0037","from":"trace-030","to":"decision-020","data":{"weight":0.903}} +{"edge":"Supports","id":"sup-0038","from":"trace-058","to":"decision-026","data":{"weight":0.293}} +{"edge":"Supports","id":"sup-0039","from":"trace-022","to":"decision-006","data":{"weight":0.524}} +{"edge":"Supports","id":"sup-0040","from":"trace-050","to":"decision-033","data":{"weight":0.532}} +{"edge":"Supports","id":"sup-0041","from":"trace-044","to":"decision-010","data":{"weight":0.797}} +{"edge":"Supports","id":"sup-0042","from":"trace-084","to":"decision-054","data":{"weight":0.967}} +{"edge":"Supports","id":"sup-0043","from":"trace-005","to":"decision-033","data":{"weight":0.424}} +{"edge":"Supports","id":"sup-0044","from":"trace-020","to":"decision-044","data":{"weight":0.023}} +{"edge":"Supports","id":"sup-0045","from":"trace-027","to":"decision-001","data":{"weight":0.775}} +{"edge":"Supports","id":"sup-0046","from":"trace-004","to":"decision-040","data":{"weight":0.886}} +{"edge":"Supports","id":"sup-0047","from":"trace-080","to":"decision-056","data":{"weight":0.186}} +{"edge":"Supports","id":"sup-0048","from":"trace-055","to":"decision-051","data":{"weight":0.01}} +{"edge":"Supports","id":"sup-0049","from":"trace-022","to":"decision-015","data":{"weight":0.54}} +{"edge":"Supports","id":"sup-0050","from":"trace-055","to":"decision-052","data":{"weight":0.69}} +{"edge":"Supports","id":"sup-0051","from":"trace-011","to":"decision-059","data":{"weight":0.486}} +{"edge":"Supports","id":"sup-0052","from":"trace-015","to":"decision-010","data":{"weight":0.431}} +{"edge":"Supports","id":"sup-0053","from":"trace-051","to":"decision-022","data":{"weight":0.002}} +{"edge":"Supports","id":"sup-0054","from":"trace-089","to":"decision-045","data":{"weight":0.381}} +{"edge":"Supports","id":"sup-0055","from":"trace-013","to":"decision-011","data":{"weight":0.413}} +{"edge":"Supports","id":"sup-0056","from":"trace-090","to":"decision-020","data":{"weight":0.114}} +{"edge":"Supports","id":"sup-0057","from":"trace-019","to":"decision-020","data":{"weight":0.995}} +{"edge":"Supports","id":"sup-0058","from":"trace-029","to":"decision-040","data":{"weight":0.527}} +{"edge":"Supports","id":"sup-0059","from":"trace-054","to":"decision-017","data":{"weight":0.396}} +{"edge":"Supports","id":"sup-0060","from":"trace-071","to":"decision-038","data":{}} +{"edge":"Supports","id":"sup-0061","from":"trace-017","to":"decision-023","data":{}} +{"edge":"Supports","id":"sup-0062","from":"trace-078","to":"decision-008","data":{"weight":0.329}} +{"edge":"Supports","id":"sup-0063","from":"trace-080","to":"decision-032","data":{"weight":0.756}} +{"edge":"Supports","id":"sup-0064","from":"trace-049","to":"decision-026","data":{}} +{"edge":"Supports","id":"sup-0065","from":"trace-014","to":"decision-053","data":{"weight":0.583}} +{"edge":"Supports","id":"sup-0066","from":"trace-086","to":"decision-018","data":{"weight":0.818}} +{"edge":"Supports","id":"sup-0067","from":"trace-072","to":"decision-052","data":{"weight":0.2}} +{"edge":"Supports","id":"sup-0068","from":"trace-043","to":"decision-031","data":{}} +{"edge":"Supports","id":"sup-0069","from":"trace-070","to":"decision-007","data":{"weight":0.136}} +{"edge":"Supports","id":"sup-0070","from":"trace-071","to":"decision-025","data":{"weight":0.763}} +{"edge":"Supports","id":"sup-0071","from":"trace-066","to":"decision-024","data":{"weight":0.769}} +{"edge":"Supports","id":"sup-0072","from":"trace-033","to":"decision-041","data":{}} +{"edge":"Supports","id":"sup-0073","from":"trace-088","to":"decision-032","data":{"weight":0.386}} +{"edge":"Supports","id":"sup-0074","from":"trace-043","to":"decision-044","data":{"weight":0.635}} +{"edge":"Supports","id":"sup-0075","from":"trace-089","to":"decision-017","data":{"weight":0.301}} +{"edge":"Supports","id":"sup-0076","from":"trace-019","to":"decision-006","data":{"weight":0.798}} +{"edge":"Supports","id":"sup-0077","from":"trace-009","to":"decision-039","data":{"weight":0.578}} +{"edge":"Supports","id":"sup-0078","from":"trace-059","to":"decision-012","data":{"weight":0.423}} +{"edge":"Supports","id":"sup-0079","from":"trace-057","to":"decision-052","data":{"weight":0.54}} +{"edge":"Supports","id":"sup-0080","from":"trace-047","to":"decision-036","data":{}} +{"edge":"Supports","id":"sup-0081","from":"trace-072","to":"decision-001","data":{"weight":0.677}} +{"edge":"Supports","id":"sup-0082","from":"trace-072","to":"decision-048","data":{}} +{"edge":"Supports","id":"sup-0083","from":"trace-027","to":"decision-028","data":{"weight":0.902}} +{"edge":"Supports","id":"sup-0084","from":"trace-030","to":"decision-001","data":{"weight":0.918}} +{"edge":"Supports","id":"sup-0085","from":"trace-056","to":"decision-023","data":{"weight":0.827}} +{"edge":"Supports","id":"sup-0086","from":"trace-006","to":"decision-054","data":{"weight":0.541}} +{"edge":"Supports","id":"sup-0087","from":"trace-056","to":"decision-007","data":{}} +{"edge":"Supports","id":"sup-0088","from":"trace-006","to":"decision-058","data":{"weight":0.115}} +{"edge":"Supports","id":"sup-0089","from":"trace-067","to":"decision-057","data":{"weight":0.194}} +{"edge":"Supports","id":"sup-0090","from":"trace-068","to":"decision-016","data":{"weight":0.776}} +{"edge":"Supports","id":"sup-0091","from":"trace-037","to":"decision-060","data":{"weight":0.066}} +{"edge":"Supports","id":"sup-0092","from":"trace-034","to":"decision-014","data":{"weight":0.873}} +{"edge":"Supports","id":"sup-0093","from":"trace-016","to":"decision-008","data":{"weight":0.347}} +{"edge":"Supports","id":"sup-0094","from":"trace-089","to":"decision-026","data":{"weight":0.647}} +{"edge":"Supports","id":"sup-0095","from":"trace-028","to":"decision-053","data":{"weight":0.106}} +{"edge":"Supports","id":"sup-0096","from":"trace-030","to":"decision-034","data":{}} +{"edge":"Supports","id":"sup-0097","from":"trace-037","to":"decision-015","data":{"weight":0.735}} +{"edge":"Supports","id":"sup-0098","from":"trace-010","to":"decision-013","data":{"weight":0.816}} +{"edge":"Supports","id":"sup-0099","from":"trace-086","to":"decision-003","data":{"weight":0.197}} +{"edge":"Supports","id":"sup-0100","from":"trace-060","to":"decision-050","data":{"weight":0.881}} +{"edge":"Supports","id":"sup-0101","from":"trace-013","to":"decision-027","data":{"weight":0.228}} +{"edge":"Supports","id":"sup-0102","from":"trace-004","to":"decision-053","data":{"weight":0.404}} +{"edge":"Supports","id":"sup-0103","from":"trace-045","to":"decision-040","data":{"weight":0.741}} +{"edge":"Supports","id":"sup-0104","from":"trace-017","to":"decision-016","data":{"weight":0.014}} +{"edge":"Supports","id":"sup-0105","from":"trace-001","to":"decision-024","data":{}} +{"edge":"Supports","id":"sup-0106","from":"trace-024","to":"decision-024","data":{"weight":0.116}} +{"edge":"Supports","id":"sup-0107","from":"trace-012","to":"decision-025","data":{}} +{"edge":"Supports","id":"sup-0108","from":"trace-013","to":"decision-018","data":{"weight":0.948}} +{"edge":"Supports","id":"sup-0109","from":"trace-027","to":"decision-043","data":{}} +{"edge":"Supports","id":"sup-0110","from":"trace-053","to":"decision-002","data":{"weight":0.663}} +{"edge":"Triggered","id":"trig-0001","from":"signal-007","to":"decision-040","data":{}} +{"edge":"Triggered","id":"trig-0002","from":"signal-056","to":"decision-021","data":{}} +{"edge":"Triggered","id":"trig-0003","from":"signal-013","to":"decision-056","data":{}} +{"edge":"Triggered","id":"trig-0004","from":"signal-056","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0005","from":"signal-039","to":"decision-012","data":{}} +{"edge":"Triggered","id":"trig-0006","from":"signal-002","to":"decision-017","data":{}} +{"edge":"Triggered","id":"trig-0007","from":"signal-018","to":"decision-050","data":{}} +{"edge":"Triggered","id":"trig-0008","from":"signal-048","to":"decision-052","data":{}} +{"edge":"Triggered","id":"trig-0009","from":"signal-004","to":"decision-011","data":{}} +{"edge":"Triggered","id":"trig-0010","from":"signal-047","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0011","from":"signal-042","to":"decision-021","data":{}} +{"edge":"Triggered","id":"trig-0012","from":"signal-025","to":"decision-019","data":{}} +{"edge":"Triggered","id":"trig-0013","from":"signal-054","to":"decision-057","data":{}} +{"edge":"Triggered","id":"trig-0014","from":"signal-023","to":"decision-001","data":{}} +{"edge":"Triggered","id":"trig-0015","from":"signal-049","to":"decision-017","data":{}} +{"edge":"Triggered","id":"trig-0016","from":"signal-053","to":"decision-056","data":{}} +{"edge":"Triggered","id":"trig-0017","from":"signal-022","to":"decision-042","data":{}} +{"edge":"Triggered","id":"trig-0018","from":"signal-035","to":"decision-018","data":{}} +{"edge":"Triggered","id":"trig-0019","from":"signal-058","to":"decision-049","data":{}} +{"edge":"Triggered","id":"trig-0020","from":"signal-057","to":"decision-057","data":{}} +{"edge":"Triggered","id":"trig-0021","from":"signal-040","to":"decision-047","data":{}} +{"edge":"Triggered","id":"trig-0022","from":"signal-049","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0023","from":"signal-049","to":"decision-007","data":{}} +{"edge":"Triggered","id":"trig-0024","from":"signal-018","to":"decision-042","data":{}} +{"edge":"Triggered","id":"trig-0025","from":"signal-052","to":"decision-021","data":{}} +{"edge":"Triggered","id":"trig-0026","from":"signal-009","to":"decision-043","data":{}} +{"edge":"Triggered","id":"trig-0027","from":"signal-054","to":"decision-012","data":{}} +{"edge":"Triggered","id":"trig-0028","from":"signal-058","to":"decision-060","data":{}} +{"edge":"Triggered","id":"trig-0029","from":"signal-043","to":"decision-019","data":{}} +{"edge":"Triggered","id":"trig-0030","from":"signal-056","to":"decision-005","data":{}} +{"edge":"Triggered","id":"trig-0031","from":"signal-039","to":"decision-024","data":{}} +{"edge":"Triggered","id":"trig-0032","from":"signal-050","to":"decision-013","data":{}} +{"edge":"Triggered","id":"trig-0033","from":"signal-026","to":"decision-059","data":{}} +{"edge":"Triggered","id":"trig-0034","from":"signal-049","to":"decision-010","data":{}} +{"edge":"Triggered","id":"trig-0035","from":"signal-037","to":"decision-007","data":{}} +{"edge":"Triggered","id":"trig-0036","from":"signal-031","to":"decision-050","data":{}} +{"edge":"Triggered","id":"trig-0037","from":"signal-016","to":"decision-002","data":{}} +{"edge":"Triggered","id":"trig-0038","from":"signal-029","to":"decision-044","data":{}} +{"edge":"Triggered","id":"trig-0039","from":"signal-010","to":"decision-046","data":{}} +{"edge":"Triggered","id":"trig-0040","from":"signal-049","to":"decision-031","data":{}} +{"edge":"Triggered","id":"trig-0041","from":"signal-032","to":"decision-017","data":{}} +{"edge":"Triggered","id":"trig-0042","from":"signal-049","to":"decision-029","data":{}} +{"edge":"Triggered","id":"trig-0043","from":"signal-037","to":"decision-002","data":{}} +{"edge":"Triggered","id":"trig-0044","from":"signal-058","to":"decision-047","data":{}} +{"edge":"Triggered","id":"trig-0045","from":"signal-047","to":"decision-036","data":{}} +{"edge":"Triggered","id":"trig-0046","from":"signal-058","to":"decision-050","data":{}} +{"edge":"Triggered","id":"trig-0047","from":"signal-051","to":"decision-014","data":{}} +{"edge":"Triggered","id":"trig-0048","from":"signal-055","to":"decision-059","data":{}} +{"edge":"Triggered","id":"trig-0049","from":"signal-019","to":"decision-025","data":{}} +{"edge":"Triggered","id":"trig-0050","from":"signal-053","to":"decision-006","data":{}} +{"edge":"Triggered","id":"trig-0051","from":"signal-039","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0052","from":"signal-015","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0053","from":"signal-056","to":"decision-038","data":{}} +{"edge":"Triggered","id":"trig-0054","from":"signal-054","to":"decision-001","data":{}} +{"edge":"Triggered","id":"trig-0055","from":"signal-003","to":"decision-030","data":{}} +{"edge":"Triggered","id":"trig-0056","from":"signal-037","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0057","from":"signal-054","to":"decision-004","data":{}} +{"edge":"Triggered","id":"trig-0058","from":"signal-055","to":"decision-002","data":{}} +{"edge":"Triggered","id":"trig-0059","from":"signal-048","to":"decision-035","data":{}} +{"edge":"Triggered","id":"trig-0060","from":"signal-021","to":"decision-030","data":{}} +{"edge":"Triggered","id":"trig-0061","from":"signal-058","to":"decision-024","data":{}} +{"edge":"Triggered","id":"trig-0062","from":"signal-036","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0063","from":"signal-032","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0064","from":"signal-019","to":"decision-023","data":{}} +{"edge":"Triggered","id":"trig-0065","from":"signal-045","to":"decision-046","data":{}} +{"edge":"Triggered","id":"trig-0066","from":"signal-022","to":"decision-037","data":{}} +{"edge":"Triggered","id":"trig-0067","from":"signal-050","to":"decision-023","data":{}} +{"edge":"Triggered","id":"trig-0068","from":"signal-026","to":"decision-044","data":{}} +{"edge":"Triggered","id":"trig-0069","from":"signal-025","to":"decision-025","data":{}} +{"edge":"Triggered","id":"trig-0070","from":"signal-009","to":"decision-033","data":{}} +{"type":"Actor","id":"actor-001","data":{"email":"user1@example.test","joined_at":"2022-08-06","name":"Søren Nguyễn","slug":"actor-001"}} +{"type":"Actor","id":"actor-002","data":{"email":"user2@example.test","joined_at":"2020-04-06","name":"田中 Ó Briain","slug":"actor-002"}} +{"type":"Actor","id":"actor-003","data":{"joined_at":"2019-09-11","name":"Ada 太郎","slug":"actor-003"}} +{"type":"Actor","id":"actor-004","data":{"email":"user4@example.test","joined_at":"2026-01-03","name":"Ada Lovelace","slug":"actor-004"}} +{"type":"Actor","id":"actor-005","data":{"email":"user5@example.test","joined_at":"2016-06-23","name":"Łukasz Þórsdóttir","slug":"actor-005"}} +{"type":"Actor","id":"actor-006","data":{"email":"user6@example.test","joined_at":"2023-12-02","name":"Søren Dijkstra","slug":"actor-006"}} +{"type":"Actor","id":"actor-007","data":{"email":"user7@example.test","joined_at":"2020-08-02","name":"Søren Þórsdóttir","slug":"actor-007"}} +{"type":"Actor","id":"actor-008","data":{"joined_at":"2023-12-04","name":"Edsger 太郎","slug":"actor-008"}} +{"type":"Actor","id":"actor-009","data":{"email":"user9@example.test","joined_at":"2018-09-18","name":"Alan Dijkstra","slug":"actor-009"}} +{"type":"Actor","id":"actor-010","data":{"email":"user10@example.test","joined_at":"2019-06-27","name":"Chidi al-Zahra","slug":"actor-010"}} +{"type":"Actor","id":"actor-011","data":{"email":"user11@example.test","joined_at":"2022-10-13","name":"Alan Nguyễn","slug":"actor-011"}} +{"type":"Actor","id":"actor-012","data":{"email":"user12@example.test","joined_at":"2023-09-25","name":"Björk 太郎","slug":"actor-012"}} +{"type":"Actor","id":"actor-013","data":{"email":"user13@example.test","joined_at":"2015-07-12","name":"Nadia Liskov","slug":"actor-013"}} +{"type":"Actor","id":"actor-014","data":{"email":"user14@example.test","joined_at":"2016-01-07","name":"Barbara Liskov","slug":"actor-014"}} +{"type":"Actor","id":"actor-015","data":{"email":"user15@example.test","joined_at":"2015-11-28","name":"Søren al-Zahra","slug":"actor-015"}} +{"type":"Actor","id":"actor-016","data":{"joined_at":"2024-03-05","name":"Barbara Kierkegaard","slug":"actor-016"}} +{"type":"Actor","id":"actor-017","data":{"email":"user17@example.test","joined_at":"2018-05-23","name":"Nadia Nguyễn","slug":"actor-017"}} +{"type":"Actor","id":"actor-018","data":{"joined_at":"2015-08-11","name":"Meera 太郎","slug":"actor-018"}} +{"type":"Actor","id":"actor-019","data":{"email":"user19@example.test","joined_at":"2021-07-04","name":"Łukasz García","slug":"actor-019"}} +{"type":"Actor","id":"actor-020","data":{"email":"user20@example.test","joined_at":"2018-03-17","name":"Alan Dijkstra","slug":"actor-020"}} +{"type":"Actor","id":"actor-021","data":{"email":"user21@example.test","joined_at":"2017-12-02","name":"Zoë García","slug":"actor-021"}} +{"type":"Actor","id":"actor-022","data":{"email":"user22@example.test","joined_at":"2015-09-04","name":"José Liskov","slug":"actor-022"}} +{"type":"Actor","id":"actor-023","data":{"joined_at":"2024-05-21","name":"Zoë Turing","slug":"actor-023"}} +{"type":"Actor","id":"actor-024","data":{"joined_at":"2026-09-23","name":"José Müller","slug":"actor-024"}} +{"type":"Actor","id":"actor-025","data":{"email":"user25@example.test","joined_at":"2025-05-02","name":"Barbara Þórsdóttir","slug":"actor-025"}} +{"type":"Actor","id":"actor-026","data":{"joined_at":"2023-01-25","name":"Fatima Ó Briain","slug":"actor-026"}} +{"type":"Actor","id":"actor-027","data":{"joined_at":"2017-06-13","name":"Edsger Turing","slug":"actor-027"}} +{"type":"Actor","id":"actor-028","data":{"joined_at":"2026-08-13","name":"Alan 太郎","slug":"actor-028"}} +{"type":"Actor","id":"actor-029","data":{"email":"user29@example.test","joined_at":"2024-11-09","name":"Приёмов Okafor","slug":"actor-029"}} +{"type":"Actor","id":"actor-030","data":{"email":"user30@example.test","joined_at":"2021-04-25","name":"José Kierkegaard","slug":"actor-030"}} +{"type":"Artifact","id":"artifact-001","data":{"created_at":"2021-12-26","kind":"report","revision":39,"slug":"artifact-001","title":"Artifact 1: category scales — 图例","url":"https://example.test/artifacts/naïve-1?q=图"}} +{"type":"Artifact","id":"artifact-002","data":{"created_at":"2016-03-21","kind":"presentation","revision":24,"slug":"artifact-002","title":"Artifact 2: naïve dedupe","url":"https://example.test/artifacts/naïve-2?q=图"}} +{"type":"Artifact","id":"artifact-003","data":{"created_at":"2021-12-07","kind":"doc","revision":9,"slug":"artifact-003","title":"Artifact 3: edge identity"}} +{"type":"Artifact","id":"artifact-004","data":{"created_at":"2019-11-15","kind":"spec","revision":1,"slug":"artifact-004","title":"Artifact 4: graph overlays","url":"https://example.test/artifacts/naïve-4?q=图"}} +{"type":"Artifact","id":"artifact-005","data":{"created_at":"2024-07-16","kind":"memo","revision":28,"slug":"artifact-005","title":"Artifact 5: ingestion backpressure","url":"https://example.test/artifacts/naïve-5?q=图"}} +{"type":"Artifact","id":"artifact-006","data":{"created_at":"2015-09-09","kind":"report","revision":27,"slug":"artifact-006","title":"Artifact 6: ingestion backpressure","url":"https://example.test/artifacts/naïve-6?q=图"}} +{"type":"Artifact","id":"artifact-007","data":{"created_at":"2023-02-05","kind":"doc","revision":40,"slug":"artifact-007","title":"Artifact 7: export streaming"}} +{"type":"Artifact","id":"artifact-008","data":{"created_at":"2020-07-23","kind":"spec","revision":33,"slug":"artifact-008","title":"Artifact 8: typed attrs","url":"https://example.test/artifacts/naïve-8?q=图"}} +{"type":"Artifact","id":"artifact-009","data":{"created_at":"2018-02-03","kind":"doc","revision":30,"slug":"artifact-009","title":"Artifact 9: wire encodings","url":"https://example.test/artifacts/naïve-9?q=图"}} +{"type":"Artifact","id":"artifact-010","data":{"created_at":"2021-02-06","kind":"report","revision":21,"slug":"artifact-010","title":"Artifact 10: naïve dedupe","url":"https://example.test/artifacts/naïve-10?q=图"}} +{"type":"Artifact","id":"artifact-011","data":{"created_at":"2023-05-10","kind":"report","revision":9,"slug":"artifact-011","title":"Artifact 11: schema drift"}} +{"type":"Artifact","id":"artifact-012","data":{"created_at":"2015-03-10","kind":"proposal","revision":1,"slug":"artifact-012","title":"Artifact 12: wire encodings"}} +{"type":"Artifact","id":"artifact-013","data":{"created_at":"2022-03-05","kind":"report","revision":35,"slug":"artifact-013","title":"Artifact 13: Ω-bounds","url":"https://example.test/artifacts/naïve-13?q=图"}} +{"type":"Artifact","id":"artifact-014","data":{"created_at":"2022-10-07","kind":"report","revision":3,"slug":"artifact-014","title":"Artifact 14: edge identity","url":"https://example.test/artifacts/naïve-14?q=图"}} +{"type":"Artifact","id":"artifact-015","data":{"created_at":"2023-12-01","kind":"memo","revision":14,"slug":"artifact-015","title":"Artifact 15: schema drift","url":"https://example.test/artifacts/naïve-15?q=图"}} +{"type":"Artifact","id":"artifact-016","data":{"created_at":"2018-06-24","kind":"memo","revision":26,"slug":"artifact-016","title":"Artifact 16: graph overlays","url":"https://example.test/artifacts/naïve-16?q=图"}} +{"type":"Artifact","id":"artifact-017","data":{"created_at":"2015-03-24","kind":"report","revision":30,"slug":"artifact-017","title":"Artifact 17: export streaming","url":"https://example.test/artifacts/naïve-17?q=图"}} +{"type":"Artifact","id":"artifact-018","data":{"created_at":"2020-01-02","kind":"report","revision":9,"slug":"artifact-018","title":"Artifact 18: crème-fraîche caching"}} +{"type":"Artifact","id":"artifact-019","data":{"created_at":"2020-04-05","kind":"spec","revision":11,"slug":"artifact-019","title":"Artifact 19: category scales — 图例","url":"https://example.test/artifacts/naïve-19?q=图"}} +{"type":"Artifact","id":"artifact-020","data":{"created_at":"2022-08-06","kind":"doc","revision":12,"slug":"artifact-020","title":"Artifact 20: category scales — 图例","url":"https://example.test/artifacts/naïve-20?q=图"}} +{"type":"Artifact","id":"artifact-021","data":{"created_at":"2019-06-23","kind":"spec","revision":17,"slug":"artifact-021","title":"Artifact 21: ingestion backpressure","url":"https://example.test/artifacts/naïve-21?q=图"}} +{"type":"Artifact","id":"artifact-022","data":{"created_at":"2025-09-08","kind":"proposal","revision":9,"slug":"artifact-022","title":"Artifact 22: export streaming"}} +{"type":"Artifact","id":"artifact-023","data":{"created_at":"2021-01-11","kind":"report","revision":27,"slug":"artifact-023","title":"Artifact 23: columnar snapshots"}} +{"type":"Artifact","id":"artifact-024","data":{"created_at":"2015-10-03","kind":"spec","revision":8,"slug":"artifact-024","title":"Artifact 24: typed attrs","url":"https://example.test/artifacts/naïve-24?q=图"}} +{"type":"Artifact","id":"artifact-025","data":{"created_at":"2024-11-22","kind":"doc","revision":14,"slug":"artifact-025","title":"Artifact 25: export streaming"}} +{"type":"Artifact","id":"artifact-026","data":{"created_at":"2020-06-19","kind":"proposal","revision":30,"slug":"artifact-026","title":"Artifact 26: revision stamps","url":"https://example.test/artifacts/naïve-26?q=图"}} +{"type":"Artifact","id":"artifact-027","data":{"created_at":"2023-10-09","kind":"report","revision":31,"slug":"artifact-027","title":"Artifact 27: branch quiescence","url":"https://example.test/artifacts/naïve-27?q=图"}} +{"type":"Artifact","id":"artifact-028","data":{"created_at":"2019-03-22","kind":"spec","revision":23,"slug":"artifact-028","title":"Artifact 28: branch quiescence"}} +{"type":"Artifact","id":"artifact-029","data":{"created_at":"2015-10-26","kind":"report","revision":19,"slug":"artifact-029","title":"Artifact 29: export streaming","url":"https://example.test/artifacts/naïve-29?q=图"}} +{"type":"Artifact","id":"artifact-030","data":{"created_at":"2026-02-05","kind":"doc","revision":34,"slug":"artifact-030","title":"Artifact 30: export streaming","url":"https://example.test/artifacts/naïve-30?q=图"}} +{"type":"Artifact","id":"artifact-031","data":{"created_at":"2019-09-14","kind":"presentation","revision":37,"slug":"artifact-031","title":"Artifact 31: branch quiescence","url":"https://example.test/artifacts/naïve-31?q=图"}} +{"type":"Artifact","id":"artifact-032","data":{"created_at":"2018-01-07","kind":"spec","revision":18,"slug":"artifact-032","title":"Artifact 32: search admission","url":"https://example.test/artifacts/naïve-32?q=图"}} +{"type":"Artifact","id":"artifact-033","data":{"created_at":"2026-04-11","kind":"proposal","revision":19,"slug":"artifact-033","title":"Artifact 33: typed attrs","url":"https://example.test/artifacts/naïve-33?q=图"}} +{"type":"Artifact","id":"artifact-034","data":{"created_at":"2022-11-04","kind":"spec","revision":8,"slug":"artifact-034","title":"Artifact 34: graph overlays","url":"https://example.test/artifacts/naïve-34?q=图"}} +{"type":"Artifact","id":"artifact-035","data":{"created_at":"2020-03-22","kind":"spec","revision":34,"slug":"artifact-035","title":"Artifact 35: category scales — 图例","url":"https://example.test/artifacts/naïve-35?q=图"}} +{"type":"Artifact","id":"artifact-036","data":{"created_at":"2020-09-26","kind":"doc","revision":32,"slug":"artifact-036","title":"Artifact 36: category scales — 图例","url":"https://example.test/artifacts/naïve-36?q=图"}} +{"type":"Artifact","id":"artifact-037","data":{"created_at":"2025-01-22","kind":"doc","revision":28,"slug":"artifact-037","title":"Artifact 37: graph overlays","url":"https://example.test/artifacts/naïve-37?q=图"}} +{"type":"Artifact","id":"artifact-038","data":{"created_at":"2023-10-14","kind":"memo","revision":39,"slug":"artifact-038","title":"Artifact 38: edge identity"}} +{"type":"Artifact","id":"artifact-039","data":{"created_at":"2026-07-24","kind":"memo","revision":26,"slug":"artifact-039","title":"Artifact 39: columnar snapshots","url":"https://example.test/artifacts/naïve-39?q=图"}} +{"type":"Artifact","id":"artifact-040","data":{"created_at":"2025-02-25","kind":"memo","revision":39,"slug":"artifact-040","title":"Artifact 40: typed attrs","url":"https://example.test/artifacts/naïve-40?q=图"}} +{"type":"Artifact","id":"artifact-041","data":{"created_at":"2022-03-10","kind":"proposal","revision":40,"slug":"artifact-041","title":"Artifact 41: graph overlays"}} +{"type":"Artifact","id":"artifact-042","data":{"created_at":"2017-11-20","kind":"proposal","revision":26,"slug":"artifact-042","title":"Artifact 42: Ω-bounds","url":"https://example.test/artifacts/naïve-42?q=图"}} +{"type":"Artifact","id":"artifact-043","data":{"created_at":"2019-03-09","kind":"presentation","revision":8,"slug":"artifact-043","title":"Artifact 43: search admission"}} +{"type":"Artifact","id":"artifact-044","data":{"created_at":"2016-03-21","kind":"report","revision":4,"slug":"artifact-044","title":"Artifact 44: Ω-bounds"}} +{"type":"Artifact","id":"artifact-045","data":{"created_at":"2017-09-27","kind":"memo","revision":6,"slug":"artifact-045","title":"Artifact 45: branch quiescence"}} +{"type":"Artifact","id":"artifact-046","data":{"created_at":"2015-12-09","kind":"proposal","revision":13,"slug":"artifact-046","title":"Artifact 46: search admission","url":"https://example.test/artifacts/naïve-46?q=图"}} +{"type":"Artifact","id":"artifact-047","data":{"created_at":"2025-11-26","kind":"memo","revision":2,"slug":"artifact-047","title":"Artifact 47: branch quiescence","url":"https://example.test/artifacts/naïve-47?q=图"}} +{"type":"Artifact","id":"artifact-048","data":{"created_at":"2025-05-14","kind":"presentation","revision":8,"slug":"artifact-048","title":"Artifact 48: ingestion backpressure","url":"https://example.test/artifacts/naïve-48?q=图"}} +{"type":"Artifact","id":"artifact-049","data":{"created_at":"2016-02-04","kind":"doc","revision":14,"slug":"artifact-049","title":"Artifact 49: graph overlays"}} +{"type":"Artifact","id":"artifact-050","data":{"created_at":"2017-11-07","kind":"memo","revision":31,"slug":"artifact-050","title":"Artifact 50: typed attrs","url":"https://example.test/artifacts/naïve-50?q=图"}} +{"type":"Artifact","id":"artifact-051","data":{"created_at":"2023-07-12","kind":"presentation","revision":30,"slug":"artifact-051","title":"Artifact 51: wire encodings","url":"https://example.test/artifacts/naïve-51?q=图"}} +{"type":"Artifact","id":"artifact-052","data":{"created_at":"2025-12-03","kind":"spec","revision":2,"slug":"artifact-052","title":"Artifact 52: Ω-bounds"}} +{"type":"Artifact","id":"artifact-053","data":{"created_at":"2022-10-08","kind":"spec","revision":6,"slug":"artifact-053","title":"Artifact 53: naïve dedupe","url":"https://example.test/artifacts/naïve-53?q=图"}} +{"type":"Artifact","id":"artifact-054","data":{"created_at":"2026-05-18","kind":"proposal","revision":2,"slug":"artifact-054","title":"Artifact 54: category scales — 图例","url":"https://example.test/artifacts/naïve-54?q=图"}} +{"type":"Artifact","id":"artifact-055","data":{"created_at":"2025-12-06","kind":"proposal","revision":20,"slug":"artifact-055","title":"Artifact 55: edge identity","url":"https://example.test/artifacts/naïve-55?q=图"}} +{"type":"Artifact","id":"artifact-056","data":{"created_at":"2015-02-01","kind":"memo","revision":2,"slug":"artifact-056","title":"Artifact 56: crème-fraîche caching"}} +{"type":"Artifact","id":"artifact-057","data":{"created_at":"2021-08-07","kind":"spec","revision":18,"slug":"artifact-057","title":"Artifact 57: search admission","url":"https://example.test/artifacts/naïve-57?q=图"}} +{"type":"Artifact","id":"artifact-058","data":{"created_at":"2017-05-13","kind":"doc","revision":36,"slug":"artifact-058","title":"Artifact 58: columnar snapshots","url":"https://example.test/artifacts/naïve-58?q=图"}} +{"type":"Artifact","id":"artifact-059","data":{"created_at":"2015-06-23","kind":"doc","revision":39,"slug":"artifact-059","title":"Artifact 59: columnar snapshots","url":"https://example.test/artifacts/naïve-59?q=图"}} +{"type":"Artifact","id":"artifact-060","data":{"created_at":"2022-04-12","kind":"spec","revision":39,"slug":"artifact-060","title":"Artifact 60: Ω-bounds","url":"https://example.test/artifacts/naïve-60?q=图"}} +{"type":"Decision","id":"decision-001","data":{"body":"Rationale for decision-001: revision stamps.","slug":"decision-001","status":"rejected","title":"Decide on category scales — 图例 (#1)","updated_at":"2022-09-05T22:49:57.244","urgency":"high"}} +{"type":"Decision","id":"decision-002","data":{"body":"Rationale for decision-002: legend domains.","decided_at":"2024-08-07","slug":"decision-002","status":"rejected","title":"Decide on wire encodings (#2)","updated_at":"2022-12-10T19:55:02.134","urgency":"high"}} +{"type":"Decision","id":"decision-003","data":{"body":"Rationale for decision-003: export streaming.","decided_at":"2023-05-25","slug":"decision-003","status":"rejected","title":"Decide on edge identity (#3)","updated_at":"2015-09-21T08:10:52.595","urgency":"critical"}} +{"type":"Decision","id":"decision-004","data":{"slug":"decision-004","status":"accepted","title":"Decide on crème-fraîche caching (#4)","updated_at":"2018-03-20T04:05:24.150","urgency":"normal"}} +{"type":"Decision","id":"decision-005","data":{"body":"Rationale for decision-005: schema drift.","decided_at":"2015-03-23","slug":"decision-005","status":"superseded","title":"Decide on legend domains (#5)","updated_at":"2016-11-20T19:08:38.418","urgency":"low"}} +{"type":"Decision","id":"decision-006","data":{"body":"Rationale for decision-006: search admission.","decided_at":"2023-09-12","slug":"decision-006","status":"accepted","title":"Decide on revision stamps (#6)","updated_at":"2019-11-24T02:20:11.599","urgency":"normal"}} +{"type":"Decision","id":"decision-007","data":{"body":"Rationale for decision-007: typed attrs.","decided_at":"2018-03-01","slug":"decision-007","status":"accepted","title":"Decide on ingestion backpressure (#7)","updated_at":"2016-07-17T16:01:30.413","urgency":"high"}} +{"type":"Decision","id":"decision-008","data":{"body":"Rationale for decision-008: typed attrs.","decided_at":"2019-08-20","slug":"decision-008","status":"accepted","title":"Decide on legend domains (#8)","updated_at":"2019-02-26T06:00:58.067","urgency":"critical"}} +{"type":"Decision","id":"decision-009","data":{"body":"Rationale for decision-009: Ω-bounds.","decided_at":"2021-04-14","slug":"decision-009","status":"proposed","title":"Decide on edge identity (#9)","updated_at":"2015-03-14T02:00:30.502","urgency":"high"}} +{"type":"Decision","id":"decision-010","data":{"body":"Rationale for decision-010: wire encodings.","decided_at":"2018-05-04","slug":"decision-010","status":"superseded","title":"Decide on naïve dedupe (#10)","updated_at":"2024-03-05T17:41:54.385","urgency":"normal"}} +{"type":"Decision","id":"decision-011","data":{"decided_at":"2015-10-04","slug":"decision-011","status":"accepted","title":"Decide on graph overlays (#11)","updated_at":"2020-03-24T00:14:34.948","urgency":"critical"}} +{"type":"Decision","id":"decision-012","data":{"body":"Rationale for decision-012: category scales — 图例.","decided_at":"2024-09-07","slug":"decision-012","status":"rejected","title":"Decide on search admission (#12)","updated_at":"2016-06-13T10:32:23.204","urgency":"critical"}} +{"type":"Decision","id":"decision-013","data":{"body":"Rationale for decision-013: Ω-bounds.","decided_at":"2018-08-23","slug":"decision-013","status":"rejected","title":"Adopt immediately","updated_at":"2026-02-28T03:04:27.939","urgency":"critical"}} +{"type":"Decision","id":"decision-014","data":{"decided_at":"2015-08-04","slug":"decision-014","status":"proposed","title":"Decide on revision stamps (#14)","updated_at":"2026-02-25T07:20:31.315","urgency":"normal"}} +{"type":"Decision","id":"decision-015","data":{"body":"Rationale for decision-015: Ω-bounds.","decided_at":"2019-12-09","slug":"decision-015","status":"accepted","title":"Decide on search admission (#15)","updated_at":"2018-08-06T05:23:19.303","urgency":"normal"}} +{"type":"Decision","id":"decision-016","data":{"slug":"decision-016","status":"proposed","title":"Decide on export streaming (#16)","updated_at":"2020-03-12T02:22:05.360","urgency":"low"}} +{"type":"Decision","id":"decision-017","data":{"body":"Rationale for decision-017: search admission.","decided_at":"2016-11-02","slug":"decision-017","status":"proposed","title":"Decide on graph overlays (#17)","updated_at":"2016-04-07T14:45:57.405","urgency":"low"}} +{"type":"Decision","id":"decision-018","data":{"slug":"decision-018","status":"proposed","title":"Decide on search admission (#18)","updated_at":"2015-05-19T20:43:05.851","urgency":"low"}} +{"type":"Decision","id":"decision-019","data":{"slug":"decision-019","status":"rejected","title":"Decide on export streaming (#19)","updated_at":"2016-10-27T15:05:59.250","urgency":"normal"}} +{"type":"Decision","id":"decision-020","data":{"body":"Rationale for decision-020: typed attrs.","decided_at":"2015-02-09","slug":"decision-020","status":"rejected","title":"Decide on edge identity (#20)","updated_at":"2018-04-20T02:01:03.329","urgency":"high"}} +{"type":"Decision","id":"decision-021","data":{"body":"Rationale for decision-021: Ω-bounds.","decided_at":"2018-08-01","slug":"decision-021","status":"accepted","title":"Decide on crème-fraîche caching (#21)","updated_at":"2016-01-25T18:21:45.762","urgency":"high"}} +{"type":"Decision","id":"decision-022","data":{"slug":"decision-022","status":"superseded","title":"Decide on naïve dedupe (#22)","updated_at":"2017-07-17T00:41:34.061","urgency":"normal"}} +{"type":"Decision","id":"decision-023","data":{"body":"Rationale for decision-023: wire encodings.","decided_at":"2023-12-02","slug":"decision-023","status":"rejected","title":"Decide on category scales — 图例 (#23)","updated_at":"2016-08-18T21:09:57.371","urgency":"low"}} +{"type":"Decision","id":"decision-024","data":{"body":"Rationale for decision-024: branch quiescence.","decided_at":"2025-07-25","slug":"decision-024","status":"accepted","title":"Decide on Ω-bounds (#24)","updated_at":"2019-03-17T04:49:00.538","urgency":"normal"}} +{"type":"Decision","id":"decision-025","data":{"decided_at":"2021-03-10","slug":"decision-025","status":"superseded","title":"Decide on graph overlays (#25)","updated_at":"2025-08-01T19:54:43.323","urgency":"low"}} +{"type":"Decision","id":"decision-026","data":{"body":"Rationale for decision-026: branch quiescence.","decided_at":"2023-11-19","slug":"decision-026","status":"superseded","title":"Decide on graph overlays (#26)","updated_at":"2025-12-10T15:42:32.276","urgency":"low"}} +{"type":"Decision","id":"decision-027","data":{"decided_at":"2023-10-25","slug":"decision-027","status":"superseded","title":"Quote \"everything\" & escape \\ backslash — ok?","updated_at":"2020-02-21T20:41:54.662","urgency":"normal"}} +{"type":"Decision","id":"decision-028","data":{"decided_at":"2018-08-19","slug":"decision-028","status":"superseded","title":"Decide on crème-fraîche caching (#28)","updated_at":"2019-05-11T18:32:01.665","urgency":"critical"}} +{"type":"Decision","id":"decision-029","data":{"body":"Rationale for decision-029: legend domains.","slug":"decision-029","status":"rejected","title":"Decide on category scales — 图例 (#29)","updated_at":"2020-06-17T10:14:43.067","urgency":"normal"}} +{"type":"Decision","id":"decision-030","data":{"body":"Rationale for decision-030: search admission.","decided_at":"2017-11-21","slug":"decision-030","status":"proposed","title":"Decide on edge identity (#30)","updated_at":"2023-10-28T04:00:47.839","urgency":"high"}} +{"type":"Decision","id":"decision-031","data":{"body":"Rationale for decision-031: ingestion backpressure.","decided_at":"2025-08-23","slug":"decision-031","status":"proposed","title":"Decide on schema drift (#31)","updated_at":"2019-08-28T11:47:59.280","urgency":"critical"}} +{"type":"Decision","id":"decision-032","data":{"decided_at":"2022-11-08","slug":"decision-032","status":"accepted","title":"Decide on export streaming (#32)","updated_at":"2020-10-12T06:50:28.464","urgency":"critical"}} +{"type":"Decision","id":"decision-033","data":{"body":"Rationale for decision-033: search admission.","decided_at":"2016-02-13","slug":"decision-033","status":"rejected","title":"Decide on category scales — 图例 (#33)","updated_at":"2019-03-09T14:39:05.894","urgency":"high"}} +{"type":"Decision","id":"decision-034","data":{"body":"Rationale for decision-034: edge identity.","slug":"decision-034","status":"rejected","title":"Decide on category scales — 图例 (#34)","updated_at":"2019-05-24T10:21:21.069","urgency":"normal"}} +{"type":"Decision","id":"decision-035","data":{"body":"Rationale for decision-035: search admission.","slug":"decision-035","status":"accepted","title":"Decide on category scales — 图例 (#35)","updated_at":"2023-03-23T14:53:20.724","urgency":"critical"}} +{"type":"Decision","id":"decision-036","data":{"body":"Rationale for decision-036: ingestion backpressure.","decided_at":"2017-09-21","slug":"decision-036","status":"accepted","title":"Decide on schema drift (#36)","updated_at":"2023-03-16T14:53:32.910","urgency":"normal"}} +{"type":"Decision","id":"decision-037","data":{"body":"Rationale for decision-037: Ω-bounds.","decided_at":"2020-07-28","slug":"decision-037","status":"accepted","title":"Decide on category scales — 图例 (#37)","updated_at":"2023-11-09T17:45:37.639","urgency":"normal"}} +{"type":"Decision","id":"decision-038","data":{"decided_at":"2020-02-11","slug":"decision-038","status":"rejected","title":"Decide on Ω-bounds (#38)","updated_at":"2023-02-23T01:50:25.095","urgency":"high"}} +{"type":"Decision","id":"decision-039","data":{"body":"Rationale for decision-039: crème-fraîche caching.","decided_at":"2022-07-20","slug":"decision-039","status":"rejected","title":"Decide on graph overlays (#39)","updated_at":"2015-10-23T17:30:47.080","urgency":"normal"}} +{"type":"Decision","id":"decision-040","data":{"body":"Rationale for decision-040: edge identity.","decided_at":"2021-04-27","slug":"decision-040","status":"proposed","title":"Decide on crème-fraîche caching (#40)","updated_at":"2021-09-06T04:13:23.613","urgency":"normal"}} +{"type":"Decision","id":"decision-041","data":{"body":"Rationale for decision-041: naïve dedupe.","decided_at":"2016-06-27","slug":"decision-041","status":"proposed","title":"Decide on crème-fraîche caching (#41)","updated_at":"2016-12-01T09:57:40.555","urgency":"normal"}} +{"type":"Decision","id":"decision-042","data":{"slug":"decision-042","status":"rejected","title":"Decide on naïve dedupe (#42)","updated_at":"2015-10-26T13:41:13.814","urgency":"high"}} +{"type":"Decision","id":"decision-043","data":{"body":"Rationale for decision-043: export streaming.","decided_at":"2025-09-19","slug":"decision-043","status":"rejected","title":"Decide on naïve dedupe (#43)","updated_at":"2024-06-02T19:42:58.092","urgency":"critical"}} +{"type":"Decision","id":"decision-044","data":{"slug":"decision-044","status":"accepted","title":"Decide on crème-fraîche caching (#44)","updated_at":"2026-09-21T19:41:20.646","urgency":"normal"}} +{"type":"Decision","id":"decision-045","data":{"decided_at":"2017-06-07","slug":"decision-045","status":"superseded","title":"Decide on crème-fraîche caching (#45)","updated_at":"2016-12-19T13:21:26.420","urgency":"low"}} +{"type":"Decision","id":"decision-046","data":{"body":"Rationale for decision-046: branch quiescence.","decided_at":"2019-09-24","slug":"decision-046","status":"proposed","title":"Decide on columnar snapshots (#46)","updated_at":"2023-04-15T16:45:07.167","urgency":"normal"}} +{"type":"Decision","id":"decision-047","data":{"body":"Rationale for decision-047: ingestion backpressure.","slug":"decision-047","status":"rejected","title":"Decide on edge identity (#47)","updated_at":"2017-07-19T14:01:38.194","urgency":"low"}} +{"type":"Decision","id":"decision-048","data":{"body":"Rationale for decision-048: wire encodings.","decided_at":"2015-07-13","slug":"decision-048","status":"superseded","title":"Decide on schema drift (#48)","updated_at":"2015-03-18T20:48:25.437","urgency":"normal"}} +{"type":"Decision","id":"decision-049","data":{"body":"Rationale for decision-049: branch quiescence.","slug":"decision-049","status":"superseded","title":"Decide on branch quiescence (#49)","updated_at":"2024-12-11T03:45:46.020","urgency":"critical"}} +{"type":"Decision","id":"decision-050","data":{"body":"Rationale for decision-050: schema drift.","decided_at":"2023-08-05","slug":"decision-050","status":"proposed","title":"Decide on category scales — 图例 (#50)","updated_at":"2021-12-21T19:17:47.105","urgency":"normal"}} +{"type":"Decision","id":"decision-051","data":{"body":"Rationale for decision-051: branch quiescence.","slug":"decision-051","status":"superseded","title":"Decide on columnar snapshots (#51)","updated_at":"2016-01-18T16:33:23.495","urgency":"normal"}} +{"type":"Decision","id":"decision-052","data":{"decided_at":"2025-07-19","slug":"decision-052","status":"superseded","title":"Decide on columnar snapshots (#52)","updated_at":"2024-12-01T12:37:05.070","urgency":"normal"}} +{"type":"Decision","id":"decision-053","data":{"body":"Rationale for decision-053: typed attrs.","slug":"decision-053","status":"superseded","title":"Decide on graph overlays (#53)","updated_at":"2020-09-23T21:56:41.872","urgency":"high"}} +{"type":"Decision","id":"decision-054","data":{"body":"Rationale for decision-054: ingestion backpressure.","decided_at":"2019-05-13","slug":"decision-054","status":"superseded","title":"Decide on naïve dedupe (#54)","updated_at":"2021-08-12T01:36:09.559","urgency":"normal"}} +{"type":"Decision","id":"decision-055","data":{"decided_at":"2024-08-19","slug":"decision-055","status":"proposed","title":"Decide on edge identity (#55)","updated_at":"2021-09-07T10:11:52.391","urgency":"normal"}} +{"type":"Decision","id":"decision-056","data":{"body":"Rationale for decision-056: export streaming.","decided_at":"2017-09-14","slug":"decision-056","status":"rejected","title":"Decide on graph overlays (#56)","updated_at":"2023-02-09T20:56:49.218","urgency":"high"}} +{"type":"Decision","id":"decision-057","data":{"slug":"decision-057","status":"proposed","title":"Decide on category scales — 图例 (#57)","updated_at":"2021-10-12T09:04:28.595","urgency":"low"}} +{"type":"Decision","id":"decision-058","data":{"decided_at":"2021-04-24","slug":"decision-058","status":"superseded","title":"Decide on crème-fraîche caching (#58)","updated_at":"2020-05-14T16:12:26.280","urgency":"critical"}} +{"type":"Decision","id":"decision-059","data":{"decided_at":"2022-04-22","slug":"decision-059","status":"superseded","title":"Decide on search admission (#59)","updated_at":"2017-03-08T21:02:51.199","urgency":"critical"}} +{"type":"Decision","id":"decision-060","data":{"body":"Rationale for decision-060: legend domains.","decided_at":"2021-09-28","slug":"decision-060","status":"proposed","title":"Decide on export streaming (#60)","updated_at":"2025-06-07T14:56:12.558","urgency":"normal"}} +{"type":"Signal","id":"signal-001","data":{"body":"Market movement around wire encodings.","category":"customer","id":1,"observed_at":"2017-06-09","slug":"signal-001","strength":0.0,"title":"Signal 1: search admission"}} +{"type":"Signal","id":"signal-002","data":{"body":"Market movement around typed attrs.","category":"technology","id":2,"observed_at":"2021-05-28","slug":"signal-002","strength":1.0e-9,"title":"Signal 2: columnar snapshots"}} +{"type":"Signal","id":"signal-003","data":{"body":"Market movement around category scales — 图例.","category":"regulatory","observed_at":"2026-02-05","slug":"signal-003","source":"https://example.test/signals/3","strength":0.479163,"title":"Signal 3: naïve dedupe"}} +{"type":"Signal","id":"signal-004","data":{"body":"Market movement around category scales — 图例.","category":"technology","id":4,"observed_at":"2016-12-28","slug":"signal-004","strength":0.519988,"title":"Signal 4: naïve dedupe"}} +{"type":"Signal","id":"signal-005","data":{"body":"Market movement around legend domains.","category":"regulatory","id":5,"observed_at":"2017-10-09","slug":"signal-005","strength":0.691345,"title":"Signal 5: branch quiescence"}} +{"type":"Signal","id":"signal-006","data":{"body":"Market movement around graph overlays.","category":"market","observed_at":"2018-02-22","slug":"signal-006","source":"https://example.test/signals/6","strength":0.551137,"title":"Signal 6: Ω-bounds"}} +{"type":"Signal","id":"signal-007","data":{"body":"Market movement around typed attrs.","category":"technology","id":7,"observed_at":"2022-04-23","slug":"signal-007","source":"https://example.test/signals/7","strength":0.512544,"title":"Signal 7: category scales — 图例"}} +{"type":"Signal","id":"signal-008","data":{"body":"Market movement around legend domains.","category":"market","id":8,"observed_at":"2023-06-20","slug":"signal-008","source":"https://example.test/signals/8","strength":0.869861,"title":"Signal 8: legend domains"}} +{"type":"Signal","id":"signal-009","data":{"category":"competitor","observed_at":"2023-09-28","slug":"signal-009","source":"https://example.test/signals/9","strength":0.497684,"title":"Signal 9: revision stamps"}} +{"type":"Signal","id":"signal-010","data":{"category":"customer","id":10,"observed_at":"2015-09-22","slug":"signal-010","source":"https://example.test/signals/10","strength":0.096162,"title":"Signal 10: revision stamps"}} +{"type":"Signal","id":"signal-011","data":{"body":"Market movement around legend domains.","category":"regulatory","id":11,"observed_at":"2022-05-12","slug":"signal-011","source":"https://example.test/signals/11","strength":0.472962,"title":"Signal 11: legend domains"}} +{"type":"Signal","id":"signal-012","data":{"body":"Market movement around naïve dedupe.","category":"customer","observed_at":"2026-04-07","slug":"signal-012","strength":0.506528,"title":"Signal 12: naïve dedupe"}} +{"type":"Signal","id":"signal-013","data":{"body":"Market movement around revision stamps.","category":"customer","id":13,"observed_at":"2019-02-07","slug":"signal-013","source":"https://example.test/signals/13","strength":0.422065,"title":"Signal 13: legend domains"}} +{"type":"Signal","id":"signal-014","data":{"category":"market","id":14,"observed_at":"2026-10-18","slug":"signal-014","source":"https://example.test/signals/14","strength":0.398996,"title":"Signal 14: naïve dedupe"}} +{"type":"Signal","id":"signal-015","data":{"body":"Market movement around export streaming.","category":"competitor","observed_at":"2025-01-21","slug":"signal-015","strength":0.758282,"title":"Signal 15: ingestion backpressure"}} +{"type":"Signal","id":"signal-016","data":{"body":"Market movement around branch quiescence.","category":"customer","id":16,"observed_at":"2020-12-07","slug":"signal-016","strength":0.472056,"title":"Signal 16: typed attrs"}} +{"type":"Signal","id":"signal-017","data":{"category":"customer","id":17,"observed_at":"2025-01-07","slug":"signal-017","source":"https://example.test/signals/17","strength":0.083839,"title":"Signal 17: revision stamps"}} +{"type":"Signal","id":"signal-018","data":{"category":"technology","observed_at":"2015-09-14","slug":"signal-018","strength":0.937273,"title":"Signal 18: columnar snapshots"}} +{"type":"Signal","id":"signal-019","data":{"category":"customer","id":19,"observed_at":"2018-06-24","slug":"signal-019","strength":0.469585,"title":"Signal 19: revision stamps"}} +{"type":"Signal","id":"signal-020","data":{"body":"Market movement around columnar snapshots.","category":"technology","id":20,"observed_at":"2024-06-08","slug":"signal-020","source":"https://example.test/signals/20","strength":0.753215,"title":"Signal 20: edge identity"}} +{"type":"Signal","id":"signal-021","data":{"body":"Market movement around ingestion backpressure.","category":"competitor","observed_at":"2024-06-06","slug":"signal-021","source":"https://example.test/signals/21","strength":0.735278,"title":"Signal 21: Ω-bounds"}} +{"type":"Signal","id":"signal-022","data":{"category":"regulatory","id":22,"observed_at":"2015-06-20","slug":"signal-022","source":"https://example.test/signals/22","strength":0.846439,"title":"Signal 22: revision stamps"}} +{"type":"Signal","id":"signal-023","data":{"category":"regulatory","id":23,"observed_at":"2016-12-27","slug":"signal-023","source":"https://example.test/signals/23","strength":0.086616,"title":"Signal 23: export streaming"}} +{"type":"Signal","id":"signal-024","data":{"category":"market","observed_at":"2025-02-18","slug":"signal-024","source":"https://example.test/signals/24","strength":0.040446,"title":"Signal 24: columnar snapshots"}} +{"type":"Signal","id":"signal-025","data":{"body":"Market movement around branch quiescence.","category":"market","id":25,"observed_at":"2018-10-02","slug":"signal-025","source":"https://example.test/signals/25","strength":0.861196,"title":"Signal 25: ingestion backpressure"}} +{"type":"Signal","id":"signal-026","data":{"body":"Market movement around naïve dedupe.","category":"competitor","id":26,"observed_at":"2016-11-16","slug":"signal-026","strength":0.280003,"title":"Signal 26: search admission"}} +{"type":"Signal","id":"signal-027","data":{"body":"Market movement around schema drift.","category":"regulatory","observed_at":"2025-09-25","slug":"signal-027","source":"https://example.test/signals/27","strength":0.175595,"title":"Signal 27: naïve dedupe"}} +{"type":"Signal","id":"signal-028","data":{"category":"regulatory","id":28,"observed_at":"2024-08-25","slug":"signal-028","source":"https://example.test/signals/28","strength":0.831339,"title":"Signal 28: category scales — 图例"}} +{"type":"Signal","id":"signal-029","data":{"body":"Market movement around revision stamps.","category":"technology","id":29,"observed_at":"2017-02-02","slug":"signal-029","source":"https://example.test/signals/29","strength":0.39148,"title":"Signal 29: export streaming"}} +{"type":"Signal","id":"signal-030","data":{"category":"customer","observed_at":"2021-01-26","slug":"signal-030","source":"https://example.test/signals/30","strength":0.17736,"title":"Signal 30: crème-fraîche caching"}} +{"type":"Signal","id":"signal-031","data":{"body":"Market movement around columnar snapshots.","category":"regulatory","id":31,"observed_at":"2023-11-09","slug":"signal-031","source":"https://example.test/signals/31","strength":0.302954,"title":"Signal 31: legend domains"}} +{"type":"Signal","id":"signal-032","data":{"category":"customer","id":32,"observed_at":"2017-02-16","slug":"signal-032","source":"https://example.test/signals/32","strength":0.644454,"title":"Signal 32: edge identity"}} +{"type":"Signal","id":"signal-033","data":{"body":"Market movement around category scales — 图例.","category":"customer","observed_at":"2024-09-18","slug":"signal-033","source":"https://example.test/signals/33","strength":0.386967,"title":"Signal 33: search admission"}} +{"type":"Signal","id":"signal-034","data":{"category":"market","id":34,"observed_at":"2024-01-15","slug":"signal-034","source":"https://example.test/signals/34","strength":0.026825,"title":"Signal 34: typed attrs"}} +{"type":"Signal","id":"signal-035","data":{"body":"Market movement around crème-fraîche caching.","category":"technology","id":35,"observed_at":"2017-06-12","slug":"signal-035","source":"https://example.test/signals/35","strength":0.937112,"title":"Signal 35: ingestion backpressure"}} +{"type":"Signal","id":"signal-036","data":{"body":"Market movement around graph overlays.","category":"market","observed_at":"2020-10-12","slug":"signal-036","strength":0.369431,"title":"Signal 36: search admission"}} +{"type":"Signal","id":"signal-037","data":{"body":"Market movement around typed attrs.","category":"technology","id":37,"observed_at":"2015-11-08","slug":"signal-037","source":"https://example.test/signals/37","strength":0.883798,"title":"Signal 37: wire encodings"}} +{"type":"Signal","id":"signal-038","data":{"body":"Market movement around naïve dedupe.","category":"market","id":38,"observed_at":"2024-04-22","slug":"signal-038","strength":0.241285,"title":"Signal 38: edge identity"}} +{"type":"Signal","id":"signal-039","data":{"body":"Market movement around export streaming.","category":"customer","observed_at":"2021-01-18","slug":"signal-039","strength":0.537504,"title":"Signal 39: crème-fraîche caching"}} +{"type":"Signal","id":"signal-040","data":{"category":"technology","id":40,"observed_at":"2016-05-12","slug":"signal-040","strength":0.944124,"title":"Signal 40: ingestion backpressure"}} +{"type":"Signal","id":"signal-041","data":{"body":"Market movement around graph overlays.","category":"customer","id":41,"observed_at":"2021-12-08","slug":"signal-041","source":"https://example.test/signals/41","strength":0.551587,"title":"Signal 41: search admission"}} +{"type":"Signal","id":"signal-042","data":{"body":"Market movement around crème-fraîche caching.","category":"customer","observed_at":"2026-06-28","slug":"signal-042","strength":0.799856,"title":"Signal 42: branch quiescence"}} +{"type":"Signal","id":"signal-043","data":{"category":"market","id":43,"observed_at":"2018-02-19","slug":"signal-043","strength":0.206987,"title":"Signal 43: columnar snapshots"}} +{"type":"Signal","id":"signal-044","data":{"category":"regulatory","id":44,"observed_at":"2022-04-19","slug":"signal-044","source":"https://example.test/signals/44","strength":0.825437,"title":"Signal 44: crème-fraîche caching"}} +{"type":"Signal","id":"signal-045","data":{"category":"technology","observed_at":"2023-10-22","slug":"signal-045","strength":0.597921,"title":"Signal 45: schema drift"}} +{"type":"Signal","id":"signal-046","data":{"category":"regulatory","id":46,"observed_at":"2020-08-06","slug":"signal-046","source":"https://example.test/signals/46","strength":0.028038,"title":"Signal 46: crème-fraîche caching"}} +{"type":"Signal","id":"signal-047","data":{"category":"technology","id":47,"observed_at":"2016-09-05","slug":"signal-047","source":"https://example.test/signals/47","strength":0.107928,"title":"Signal 47: typed attrs"}} +{"type":"Signal","id":"signal-048","data":{"body":"Market movement around schema drift.","category":"regulatory","observed_at":"2020-07-11","slug":"signal-048","source":"https://example.test/signals/48","strength":0.291874,"title":"Signal 48: ingestion backpressure"}} +{"type":"Signal","id":"signal-049","data":{"body":"Market movement around columnar snapshots.","category":"regulatory","id":49,"observed_at":"2021-10-10","slug":"signal-049","strength":0.467257,"title":"Signal 49: revision stamps"}} +{"type":"Signal","id":"signal-050","data":{"body":"Market movement around edge identity.","category":"customer","id":50,"observed_at":"2024-07-16","slug":"signal-050","source":"https://example.test/signals/50","strength":0.385888,"title":"Signal 50: ingestion backpressure"}} +{"type":"Signal","id":"signal-051","data":{"body":"Market movement around typed attrs.","category":"regulatory","observed_at":"2019-01-27","slug":"signal-051","source":"https://example.test/signals/51","strength":0.43061,"title":"Signal 51: revision stamps"}} +{"type":"Signal","id":"signal-052","data":{"category":"regulatory","id":52,"observed_at":"2024-06-20","slug":"signal-052","source":"https://example.test/signals/52","strength":0.712629,"title":"Signal 52: Ω-bounds"}} +{"type":"Signal","id":"signal-053","data":{"category":"market","id":53,"observed_at":"2022-03-19","slug":"signal-053","strength":0.037462,"title":"Signal 53: legend domains"}} +{"type":"Signal","id":"signal-054","data":{"category":"competitor","observed_at":"2015-08-06","slug":"signal-054","source":"https://example.test/signals/54","strength":0.558492,"title":"Signal 54: export streaming"}} +{"type":"Signal","id":"signal-055","data":{"body":"Market movement around category scales — 图例.","category":"competitor","id":55,"observed_at":"2019-02-06","slug":"signal-055","source":"https://example.test/signals/55","strength":0.837372,"title":"Signal 55: legend domains"}} +{"type":"Signal","id":"signal-056","data":{"body":"Market movement around schema drift.","category":"regulatory","id":56,"observed_at":"2018-10-03","slug":"signal-056","strength":0.308975,"title":"Signal 56: naïve dedupe"}} +{"type":"Signal","id":"signal-057","data":{"category":"competitor","observed_at":"2015-02-08","slug":"signal-057","source":"https://example.test/signals/57","strength":0.195232,"title":"Signal 57: edge identity"}} +{"type":"Signal","id":"signal-058","data":{"category":"competitor","id":58,"observed_at":"2024-10-15","slug":"signal-058","source":"https://example.test/signals/58","strength":0.106871,"title":"Signal 58: graph overlays"}} +{"type":"Signal","id":"signal-059","data":{"category":"regulatory","id":59,"observed_at":"2015-06-11","slug":"signal-059","source":"https://example.test/signals/59","strength":0.008096,"title":"Signal 59: columnar snapshots"}} +{"type":"Signal","id":"signal-060","data":{"body":"Market movement around crème-fraîche caching.","category":"technology","observed_at":"2020-08-12","slug":"signal-060","strength":0.117169,"title":"Signal 60: crème-fraîche caching"}} +{"type":"Trace","id":"trace-001","data":{"body":"Observed category scales — 图例 during document.","kind":"document","recorded_at":"2017-05-04T20:30:31.346","slug":"trace-001","title":"Trace 1: branch quiescence","word_count":19112}} +{"type":"Trace","id":"trace-002","data":{"body":"Observed wire encodings during note.","kind":"discussion","recorded_at":"2016-12-04T22:45:45.084","slug":"trace-002","source":"https://example.test/traces/trace-002","title":"Trace 2: category scales — 图例","word_count":1386}} +{"type":"Trace","id":"trace-003","data":{"kind":"note","recorded_at":"2019-12-14T08:06:01.236","slug":"trace-003","source":"https://example.test/traces/trace-003","title":"Trace 3: edge identity","word_count":8577}} +{"type":"Trace","id":"trace-004","data":{"kind":"meeting","recorded_at":"2020-05-13T12:53:00.278","slug":"trace-004","source":"https://example.test/traces/trace-004","title":"Trace 4: edge identity","word_count":16947}} +{"type":"Trace","id":"trace-005","data":{"kind":"note","recorded_at":"2023-04-09T11:48:40.184","slug":"trace-005","title":"Trace 5: columnar snapshots","word_count":625}} +{"type":"Trace","id":"trace-006","data":{"body":"Observed category scales — 图例 during experiment.","kind":"note","recorded_at":"2025-07-08T18:58:58.684","slug":"trace-006","title":"Trace 6: wire encodings","word_count":13155}} +{"type":"Trace","id":"trace-007","data":{"body":"Observed ingestion backpressure during note.","kind":"discussion","recorded_at":"2015-09-22T10:09:00.747","slug":"trace-007","title":"Trace 7: columnar snapshots","word_count":3943}} +{"type":"Trace","id":"trace-008","data":{"kind":"note","recorded_at":"2023-09-24T03:57:49.061","slug":"trace-008","source":"https://example.test/traces/trace-008","title":"Trace 8: branch quiescence","word_count":3981}} +{"type":"Trace","id":"trace-009","data":{"body":"Observed graph overlays during discussion.","kind":"document","recorded_at":"2021-05-25T05:17:11.489","slug":"trace-009","source":"https://example.test/traces/trace-009","title":"Trace 9: crème-fraîche caching","word_count":18887}} +{"type":"Trace","id":"trace-010","data":{"body":"Observed branch quiescence during meeting.","kind":"review","recorded_at":"2026-01-03T13:12:38.408","slug":"trace-010","source":"https://example.test/traces/trace-010","title":"Trace 10: graph overlays","word_count":13887}} +{"type":"Trace","id":"trace-011","data":{"body":"Observed search admission during review.","kind":"discussion","recorded_at":"2017-02-20T18:23:27.905","slug":"trace-011","source":"https://example.test/traces/trace-011","title":"Trace 11: category scales — 图例","word_count":18645}} +{"type":"Trace","id":"trace-012","data":{"body":"Observed crème-fraîche caching during discussion.","kind":"note","recorded_at":"2023-10-12T12:41:09.651","slug":"trace-012","title":"Trace 12: branch quiescence","word_count":9887}} +{"type":"Trace","id":"trace-013","data":{"kind":"document","recorded_at":"2025-06-20T20:19:18.324","slug":"trace-013","title":"Trace 13: ingestion backpressure","word_count":17994}} +{"type":"Trace","id":"trace-014","data":{"kind":"review","recorded_at":"2024-10-02T10:10:50.164","slug":"trace-014","title":"Trace 14: edge identity","word_count":6831}} +{"type":"Trace","id":"trace-015","data":{"body":"Observed naïve dedupe during experiment.","kind":"experiment","recorded_at":"2019-12-17T16:33:14.831","slug":"trace-015","title":"Trace 15: export streaming","word_count":17082}} +{"type":"Trace","id":"trace-016","data":{"body":"Observed branch quiescence during discussion.","kind":"discussion","recorded_at":"2023-03-07T19:46:01.263","slug":"trace-016","title":"Trace 16: crème-fraîche caching","word_count":16761}} +{"type":"Trace","id":"trace-017","data":{"body":"Observed wire encodings during discussion.","kind":"review","recorded_at":"2018-05-18T09:21:45.075","slug":"trace-017","source":"https://example.test/traces/trace-017","title":"Trace 17: wire encodings","word_count":10543}} +{"type":"Trace","id":"trace-018","data":{"body":"Observed revision stamps during experiment.","kind":"experiment","recorded_at":"2025-05-09T12:01:10.805","slug":"trace-018","source":"https://example.test/traces/trace-018","title":"Trace 18: legend domains","word_count":5601}} +{"type":"Trace","id":"trace-019","data":{"body":"Observed ingestion backpressure during discussion.","kind":"experiment","recorded_at":"2016-02-12T12:15:27.052","slug":"trace-019","title":"Trace 19: columnar snapshots","word_count":11238}} +{"type":"Trace","id":"trace-020","data":{"kind":"document","recorded_at":"2022-03-13T19:44:37.765","slug":"trace-020","source":"https://example.test/traces/trace-020","title":"Trace 20: typed attrs","word_count":9694}} +{"type":"Trace","id":"trace-021","data":{"kind":"experiment","recorded_at":"2017-11-19T12:07:49.068","slug":"trace-021","source":"https://example.test/traces/trace-021","title":"Trace 21: ingestion backpressure","word_count":13171}} +{"type":"Trace","id":"trace-022","data":{"kind":"document","recorded_at":"2023-11-26T10:45:30.538","slug":"trace-022","source":"https://example.test/traces/trace-022","title":"Trace 22: crème-fraîche caching","word_count":14143}} +{"type":"Trace","id":"trace-023","data":{"body":"Observed category scales — 图例 during meeting.","kind":"document","recorded_at":"2019-09-15T10:37:12.750","slug":"trace-023","title":"Trace 23: edge identity","word_count":15242}} +{"type":"Trace","id":"trace-024","data":{"body":"Observed branch quiescence during note.","kind":"discussion","recorded_at":"2016-01-15T00:28:08.986","slug":"trace-024","title":"Trace 24: revision stamps","word_count":4558}} +{"type":"Trace","id":"trace-025","data":{"kind":"experiment","recorded_at":"2022-10-09T19:46:08.245","slug":"trace-025","source":"https://example.test/traces/trace-025","title":"Trace 25: export streaming","word_count":7096}} +{"type":"Trace","id":"trace-026","data":{"body":"Observed crème-fraîche caching during note.","kind":"experiment","recorded_at":"2024-11-05T22:22:51.155","slug":"trace-026","title":"Trace 26: Ω-bounds","word_count":375}} +{"type":"Trace","id":"trace-027","data":{"body":"Observed search admission during meeting.","kind":"review","recorded_at":"2018-12-23T23:06:48.792","slug":"trace-027","title":"Trace 27: typed attrs","word_count":6553}} +{"type":"Trace","id":"trace-028","data":{"body":"Observed search admission during experiment.","kind":"note","recorded_at":"2018-04-21T13:38:44.370","slug":"trace-028","source":"https://example.test/traces/trace-028","title":"Trace 28: category scales — 图例","word_count":6099}} +{"type":"Trace","id":"trace-029","data":{"kind":"experiment","recorded_at":"2026-04-04T11:34:05.075","slug":"trace-029","title":"Trace 29: crème-fraîche caching","word_count":3501}} +{"type":"Trace","id":"trace-030","data":{"body":"Observed columnar snapshots during document.","kind":"discussion","recorded_at":"2015-08-03T17:39:03.684","slug":"trace-030","title":"Trace 30: category scales — 图例","word_count":18145}} +{"type":"Trace","id":"trace-031","data":{"body":"Observed Ω-bounds during meeting.","kind":"note","recorded_at":"2025-09-23T01:13:09.179","slug":"trace-031","source":"https://example.test/traces/trace-031","title":"Trace 31: graph overlays","word_count":12181}} +{"type":"Trace","id":"trace-032","data":{"kind":"review","recorded_at":"2025-01-12T23:02:26.572","slug":"trace-032","source":"https://example.test/traces/trace-032","title":"Trace 32: Ω-bounds","word_count":9880}} +{"type":"Trace","id":"trace-033","data":{"kind":"note","recorded_at":"2024-05-12T12:34:52.105","slug":"trace-033","title":"Trace 33: Ω-bounds","word_count":12913}} +{"type":"Trace","id":"trace-034","data":{"kind":"review","recorded_at":"2018-01-02T14:13:10.417","slug":"trace-034","title":"Trace 34: wire encodings","word_count":12939}} +{"type":"Trace","id":"trace-035","data":{"kind":"meeting","recorded_at":"2023-06-15T06:17:45.464","slug":"trace-035","title":"Trace 35: category scales — 图例","word_count":13149}} +{"type":"Trace","id":"trace-036","data":{"kind":"review","recorded_at":"2019-07-14T12:26:13.217","slug":"trace-036","source":"https://example.test/traces/trace-036","title":"Trace 36: branch quiescence","word_count":13958}} +{"type":"Trace","id":"trace-037","data":{"kind":"meeting","recorded_at":"2016-04-09T00:10:58.894","slug":"trace-037","title":"Trace 37: naïve dedupe","word_count":16142}} +{"type":"Trace","id":"trace-038","data":{"body":"Observed crème-fraîche caching during experiment.","kind":"meeting","recorded_at":"2023-01-26T19:48:19.455","slug":"trace-038","source":"https://example.test/traces/trace-038","title":"Trace 38: edge identity","word_count":11214}} +{"type":"Trace","id":"trace-039","data":{"body":"Observed Ω-bounds during discussion.","kind":"review","recorded_at":"2016-01-11T03:54:54.063","slug":"trace-039","title":"Trace 39: export streaming","word_count":15373}} +{"type":"Trace","id":"trace-040","data":{"body":"Observed schema drift during document.","kind":"document","recorded_at":"2018-11-13T19:03:32.839","slug":"trace-040","source":"https://example.test/traces/trace-040","title":"Trace 40: ingestion backpressure","word_count":1358}} +{"type":"Trace","id":"trace-041","data":{"kind":"meeting","recorded_at":"2023-10-17T09:32:32.548","slug":"trace-041","source":"https://example.test/traces/trace-041","title":"Trace 41: edge identity","word_count":6879}} +{"type":"Trace","id":"trace-042","data":{"kind":"meeting","recorded_at":"2015-02-11T13:34:57.172","slug":"trace-042","title":"Trace 42: wire encodings","word_count":9007199254740991}} +{"type":"Trace","id":"trace-043","data":{"kind":"note","recorded_at":"2026-11-18T17:56:41.300","slug":"trace-043","source":"https://example.test/traces/trace-043","title":"Trace 43: category scales — 图例","word_count":8749}} +{"type":"Trace","id":"trace-044","data":{"kind":"note","recorded_at":"2016-05-21T16:07:22.978","slug":"trace-044","source":"https://example.test/traces/trace-044","title":"Trace 44: graph overlays","word_count":2233}} +{"type":"Trace","id":"trace-045","data":{"body":"Observed legend domains during meeting.","kind":"experiment","recorded_at":"2017-12-21T21:25:38.349","slug":"trace-045","source":"https://example.test/traces/trace-045","title":"Trace 45: Ω-bounds","word_count":3016}} +{"type":"Trace","id":"trace-046","data":{"kind":"discussion","recorded_at":"2017-07-09T05:17:41.694","slug":"trace-046","source":"https://example.test/traces/trace-046","title":"Trace 46: columnar snapshots","word_count":1531}} +{"type":"Trace","id":"trace-047","data":{"kind":"experiment","recorded_at":"2021-07-14T01:17:02.509","slug":"trace-047","source":"https://example.test/traces/trace-047","title":"Trace 47: wire encodings","word_count":8090}} +{"type":"Trace","id":"trace-048","data":{"kind":"review","recorded_at":"2021-10-20T20:47:12.147","slug":"trace-048","title":"Trace 48: naïve dedupe","word_count":2925}} +{"type":"Trace","id":"trace-049","data":{"body":"Observed ingestion backpressure during meeting.","kind":"document","recorded_at":"2019-03-16T05:46:38.686","slug":"trace-049","source":"https://example.test/traces/trace-049","title":"Trace 49: columnar snapshots","word_count":12372}} +{"type":"Trace","id":"trace-050","data":{"body":"Observed wire encodings during meeting.","kind":"review","recorded_at":"2024-09-12T15:40:45.302","slug":"trace-050","title":"Trace 50: category scales — 图例","word_count":488}} +{"type":"Trace","id":"trace-051","data":{"kind":"document","recorded_at":"2017-09-05T18:56:52.740","slug":"trace-051","source":"https://example.test/traces/trace-051","title":"Trace 51: legend domains","word_count":7809}} +{"type":"Trace","id":"trace-052","data":{"body":"Observed branch quiescence during note.","kind":"review","recorded_at":"2024-02-25T10:02:18.978","slug":"trace-052","title":"Trace 52: columnar snapshots","word_count":9732}} +{"type":"Trace","id":"trace-053","data":{"kind":"note","recorded_at":"2021-02-02T19:59:45.936","slug":"trace-053","title":"Trace 53: crème-fraîche caching","word_count":18833}} +{"type":"Trace","id":"trace-054","data":{"kind":"review","recorded_at":"2024-08-13T09:46:15.897","slug":"trace-054","title":"Trace 54: category scales — 图例","word_count":18330}} +{"type":"Trace","id":"trace-055","data":{"body":"Observed typed attrs during meeting.","kind":"review","recorded_at":"2015-04-21T03:30:15.431","slug":"trace-055","source":"https://example.test/traces/trace-055","title":"Trace 55: wire encodings","word_count":15318}} +{"type":"Trace","id":"trace-056","data":{"kind":"note","recorded_at":"2017-08-13T13:55:07.508","slug":"trace-056","source":"https://example.test/traces/trace-056","title":"Trace 56: naïve dedupe","word_count":14781}} +{"type":"Trace","id":"trace-057","data":{"body":"Observed wire encodings during experiment.","kind":"discussion","recorded_at":"2018-11-08T16:57:00.937","slug":"trace-057","source":"https://example.test/traces/trace-057","title":"Trace 57: schema drift","word_count":3911}} +{"type":"Trace","id":"trace-058","data":{"kind":"meeting","recorded_at":"2019-07-21T06:52:45.371","slug":"trace-058","source":"https://example.test/traces/trace-058","title":"Trace 58: export streaming","word_count":9047}} +{"type":"Trace","id":"trace-059","data":{"body":"Observed crème-fraîche caching during review.","kind":"review","recorded_at":"2023-01-06T01:37:08.531","slug":"trace-059","source":"https://example.test/traces/trace-059","title":"Trace 59: branch quiescence","word_count":7857}} +{"type":"Trace","id":"trace-060","data":{"kind":"note","recorded_at":"2018-11-24T06:09:24.361","slug":"trace-060","source":"https://example.test/traces/trace-060","title":"Trace 60: category scales — 图例","word_count":1843}} +{"type":"Trace","id":"trace-061","data":{"body":"Observed category scales — 图例 during discussion.","kind":"review","recorded_at":"2021-02-17T12:42:03.739","slug":"trace-061","title":"Trace 61: wire encodings","word_count":8109}} +{"type":"Trace","id":"trace-062","data":{"body":"Observed category scales — 图例 during experiment.","kind":"meeting","recorded_at":"2015-04-03T11:19:43.964","slug":"trace-062","source":"https://example.test/traces/trace-062","title":"Trace 62: columnar snapshots","word_count":14136}} +{"type":"Trace","id":"trace-063","data":{"kind":"discussion","recorded_at":"2023-01-19T05:24:09.244","slug":"trace-063","title":"Trace 63: schema drift","word_count":8649}} +{"type":"Trace","id":"trace-064","data":{"body":"Observed Ω-bounds during review.","kind":"document","recorded_at":"2021-05-08T23:02:07.813","slug":"trace-064","source":"https://example.test/traces/trace-064","title":"Trace 64: legend domains","word_count":1796}} +{"type":"Trace","id":"trace-065","data":{"kind":"experiment","recorded_at":"2024-11-20T23:51:23.765","slug":"trace-065","source":"https://example.test/traces/trace-065","title":"Trace 65: legend domains","word_count":5868}} +{"type":"Trace","id":"trace-066","data":{"kind":"discussion","recorded_at":"2023-06-08T07:16:11.764","slug":"trace-066","title":"Trace 66: revision stamps","word_count":2014}} +{"type":"Trace","id":"trace-067","data":{"body":"Observed Ω-bounds during experiment.","kind":"discussion","recorded_at":"2017-03-10T15:00:17.480","slug":"trace-067","title":"Trace 67: search admission","word_count":16993}} +{"type":"Trace","id":"trace-068","data":{"kind":"meeting","recorded_at":"2020-06-14T15:21:04.375","slug":"trace-068","source":"https://example.test/traces/trace-068","title":"Trace 68: naïve dedupe","word_count":12322}} +{"type":"Trace","id":"trace-069","data":{"body":"Observed category scales — 图例 during document.","kind":"review","recorded_at":"2020-04-07T18:19:25.257","slug":"trace-069","source":"https://example.test/traces/trace-069","title":"Trace 69: edge identity","word_count":12656}} +{"type":"Trace","id":"trace-070","data":{"body":"Observed schema drift during discussion.","kind":"document","recorded_at":"2015-11-19T22:40:49.674","slug":"trace-070","title":"Trace 70: Ω-bounds","word_count":11694}} +{"type":"Trace","id":"trace-071","data":{"kind":"note","recorded_at":"2022-01-18T02:49:16.677","slug":"trace-071","source":"https://example.test/traces/trace-071","title":"Trace 71: edge identity","word_count":8903}} +{"type":"Trace","id":"trace-072","data":{"body":"Observed branch quiescence during document.","kind":"document","recorded_at":"2024-10-09T17:59:19.521","slug":"trace-072","source":"https://example.test/traces/trace-072","title":"Trace 72: graph overlays","word_count":16253}} +{"type":"Trace","id":"trace-073","data":{"body":"Observed schema drift during note.","kind":"note","recorded_at":"2019-09-28T18:02:01.621","slug":"trace-073","source":"https://example.test/traces/trace-073","title":"Trace 73: export streaming","word_count":1880}} +{"type":"Trace","id":"trace-074","data":{"body":"Observed crème-fraîche caching during experiment.","kind":"experiment","recorded_at":"2021-03-14T21:15:18.160","slug":"trace-074","source":"https://example.test/traces/trace-074","title":"Trace 74: edge identity","word_count":18845}} +{"type":"Trace","id":"trace-075","data":{"body":"Observed legend domains during document.","kind":"experiment","recorded_at":"2015-08-02T14:52:09.343","slug":"trace-075","title":"Trace 75: Ω-bounds","word_count":17545}} +{"type":"Trace","id":"trace-076","data":{"body":"Observed naïve dedupe during review.","kind":"meeting","recorded_at":"2020-05-04T11:03:59.408","slug":"trace-076","source":"https://example.test/traces/trace-076","title":"Trace 76: edge identity","word_count":16881}} +{"type":"Trace","id":"trace-077","data":{"body":"Observed Ω-bounds during meeting.","kind":"discussion","recorded_at":"2025-03-26T04:27:58.246","slug":"trace-077","title":"Trace 77: columnar snapshots","word_count":14789}} +{"type":"Trace","id":"trace-078","data":{"body":"Observed naïve dedupe during document.","kind":"note","recorded_at":"2021-04-17T11:03:13.358","slug":"trace-078","source":"https://example.test/traces/trace-078","title":"Trace 78: Ω-bounds","word_count":420}} +{"type":"Trace","id":"trace-079","data":{"body":"Observed graph overlays during meeting.","kind":"experiment","recorded_at":"2018-01-01T20:05:16.363","slug":"trace-079","title":"Trace 79: graph overlays","word_count":5293}} +{"type":"Trace","id":"trace-080","data":{"body":"Observed schema drift during experiment.","kind":"note","recorded_at":"2024-11-05T19:51:53.419","slug":"trace-080","title":"Trace 80: naïve dedupe","word_count":8889}} +{"type":"Trace","id":"trace-081","data":{"kind":"discussion","recorded_at":"2025-05-02T19:57:19.107","slug":"trace-081","source":"https://example.test/traces/trace-081","title":"Trace 81: edge identity","word_count":19823}} +{"type":"Trace","id":"trace-082","data":{"kind":"review","recorded_at":"2020-07-12T00:03:47.974","slug":"trace-082","source":"https://example.test/traces/trace-082","title":"Trace 82: typed attrs","word_count":8678}} +{"type":"Trace","id":"trace-083","data":{"body":"Observed schema drift during review.","kind":"note","recorded_at":"2020-04-24T01:17:00.308","slug":"trace-083","source":"https://example.test/traces/trace-083","title":"Trace 83: Ω-bounds","word_count":13572}} +{"type":"Trace","id":"trace-084","data":{"body":"Observed graph overlays during document.","kind":"document","recorded_at":"2017-03-22T15:18:44.798","slug":"trace-084","title":"Trace 84: search admission","word_count":14589}} +{"type":"Trace","id":"trace-085","data":{"kind":"discussion","recorded_at":"2020-08-19T19:44:07.983","slug":"trace-085","source":"https://example.test/traces/trace-085","title":"Trace 85: columnar snapshots","word_count":12376}} +{"type":"Trace","id":"trace-086","data":{"body":"Observed branch quiescence during document.","kind":"review","recorded_at":"2026-11-09T19:16:25.032","slug":"trace-086","source":"https://example.test/traces/trace-086","title":"Trace 86: columnar snapshots","word_count":7605}} +{"type":"Trace","id":"trace-087","data":{"body":"Observed revision stamps during discussion.","kind":"note","recorded_at":"2018-11-11T10:05:23.270","slug":"trace-087","source":"https://example.test/traces/trace-087","title":"Trace 87: export streaming","word_count":11648}} +{"type":"Trace","id":"trace-088","data":{"kind":"experiment","recorded_at":"2019-03-05T05:08:50.832","slug":"trace-088","source":"https://example.test/traces/trace-088","title":"Trace 88: crème-fraîche caching","word_count":4945}} +{"type":"Trace","id":"trace-089","data":{"body":"Observed legend domains during discussion.","kind":"meeting","recorded_at":"2015-05-07T18:12:21.792","slug":"trace-089","title":"Trace 89: search admission","word_count":17785}} +{"type":"Trace","id":"trace-090","data":{"kind":"document","recorded_at":"2016-06-17T12:00:48.869","slug":"trace-090","title":"Trace 90: search admission","word_count":1339}} diff --git a/fixtures/omnigraph/recorded/health.json b/fixtures/omnigraph/recorded/health.json index a806709..196c1d8 100644 --- a/fixtures/omnigraph/recorded/health.json +++ b/fixtures/omnigraph/recorded/health.json @@ -1 +1 @@ -{"status":"ok","version":"0.10.0","internal_schema_version":6} \ No newline at end of file +{"status":"ok","version":"0.14.0","internal_schema_version":16,"source_version":"60bfd19db780fdff3a5178f959c1204143420114"} \ No newline at end of file diff --git a/fixtures/omnigraph/recorded/http.json b/fixtures/omnigraph/recorded/http.json new file mode 100644 index 0000000..fe0e0e0 --- /dev/null +++ b/fixtures/omnigraph/recorded/http.json @@ -0,0 +1,13 @@ +{ + "requestHeader": { + "Omnigraph-Http-Api": "0.14" + }, + "discovery": { + "method": "HEAD", + "path": "/healthz", + "status": 200, + "responseHeader": { + "Omnigraph-Http-Api": "0.14" + } + } +} diff --git a/fixtures/omnigraph/recorded/manifest.json b/fixtures/omnigraph/recorded/manifest.json index dcb6bd7..20318f2 100644 --- a/fixtures/omnigraph/recorded/manifest.json +++ b/fixtures/omnigraph/recorded/manifest.json @@ -1,10 +1,11 @@ { - "recordedAt": "2026-09-03T19:44:16.952Z", - "serverVersion": "0.10.0", + "recordedAt": "2026-10-23T15:29:58.465Z", + "serverVersion": "0.14.0", + "httpApiContract": "0.14", "graphId": "demo", "branch": "main", - "headBefore": "01M1MCSW52VSBY71WP1S08WRN0", - "headAfter": "01M1MCSW52VSBY71WP1S08WRN0", + "headBefore": "hb1.01M5MP45JC4C435R73CJ95BR6H.1.01M5MP45JC4C435R73CJ95BR6H", + "headAfter": "hb1.01M5MP45JC4C435R73CJ95BR6H.1.01M5MP45JC4C435R73CJ95BR6H", "rowCounts": { "edge:Correlates": 50, "edge:OwnedBy": 60, @@ -20,5 +21,5 @@ }, "exportLineCount": 800, "edgeLinesBeforeNodeLines": true, - "notes": "Raw HTTP bodies recorded verbatim from omnigraph-server against the requests the @modernrelay/omnigraph SDK issues (graph-scoped paths under /graphs/demo). export.ndjson streams tables in lexicographic table-key order, so all edge:* lines precede node:* lines (verified). headBefore == headAfter: the branch was quiescent across the export, the stable case for the source revision stamp." + "notes": "Verbatim OmniGraph 0.14.0 HTTP bodies from a fresh isolated local cluster. Identity is top-level id in export and @id in query node values; nullable data properties are omitted. The branch was quiescent during recording." } diff --git a/fixtures/omnigraph/recorded/schema.json b/fixtures/omnigraph/recorded/schema.json index e3cc9b0..07a9f58 100644 --- a/fixtures/omnigraph/recorded/schema.json +++ b/fixtures/omnigraph/recorded/schema.json @@ -1 +1 @@ -{"schema_source":"// Orbit fixture schema — adapted from omnigraph's context.pg test fixture\n// (decisions, the people behind them, the evidence trail, and market signals).\n//\n// Extended so the recorded export/query fixtures cover every wire encoding in\n// the adapter's wire encodings:\n// Date Actor.joined_at, Signal.observed_at, Artifact.created_at\n// Date? Decision.decided_at\n// DateTime Decision.updated_at, Trace.recorded_at\n// enum(...) Decision.status/.urgency, Trace.kind, Signal.category, Artifact.kind\n// F64 Signal.strength, Correlates.confidence\n// F64? Supports.weight (edge property)\n// I64 Trace.word_count, Artifact.revision\n// String? Actor.email, Decision.body, Trace.source, Signal.source, Artifact.url\n\n// ── Nodes ────────────────────────────────────────────\n\nnode Actor {\n slug: String @key\n name: String\n email: String? @unique\n joined_at: Date\n}\n\nnode Decision {\n slug: String @key\n title: String @index\n body: String?\n status: enum(proposed, accepted, rejected, superseded)\n urgency: enum(low, normal, high, critical)\n decided_at: Date?\n updated_at: DateTime\n}\n\nnode Trace {\n slug: String @key\n title: String @index\n body: String?\n kind: enum(note, discussion, experiment, review, meeting, document)\n recorded_at: DateTime\n word_count: I64\n source: String?\n}\n\nnode Signal {\n slug: String @key\n title: String @index\n body: String?\n category: enum(competitor, market, regulatory, technology, customer)\n strength: F64\n observed_at: Date\n source: String?\n}\n\nnode Artifact {\n slug: String @key\n title: String @index\n kind: enum(doc, presentation, proposal, spec, report, memo)\n url: String?\n created_at: Date\n revision: I64\n}\n\n// ── Edges ────────────────────────────────────────────\n\nedge OwnedBy: Decision -> Actor @card(1..1)\n\nedge ParticipatedIn: Actor -> Decision\n\nedge RecordedBy: Trace -> Actor @card(1..1)\n\nedge Supports: Trace -> Decision {\n weight: F64?\n}\n\nedge Triggered: Signal -> Decision\n\nedge Correlates: Signal -> Signal {\n confidence: F64\n @unique(src, dst)\n}\n"} \ No newline at end of file +{"schema_source":"// Orbit fixture schema — adapted from omnigraph's context.pg test fixture\n// (decisions, the people behind them, the evidence trail, and market signals).\n//\n// Extended so the recorded export/query fixtures cover every wire encoding in\n// the adapter's wire encodings:\n// Date Actor.joined_at, Signal.observed_at, Artifact.created_at\n// Date? Decision.decided_at\n// DateTime Decision.updated_at, Trace.recorded_at\n// enum(...) Decision.status/.urgency, Trace.kind, Signal.category, Artifact.kind\n// F64 Signal.strength, Correlates.confidence\n// F64? Supports.weight (edge property)\n// I64 Trace.word_count, Artifact.revision\n// String? Actor.email, Decision.body, Trace.source, Signal.source, Artifact.url\n\n// ── Nodes ────────────────────────────────────────────\n\nnode Actor {\n slug: String @key\n name: String\n email: String? @unique\n joined_at: Date\n}\n\nnode Decision {\n slug: String @key\n title: String @index\n body: String?\n status: enum(proposed, accepted, rejected, superseded)\n urgency: enum(low, normal, high, critical)\n decided_at: Date?\n updated_at: DateTime\n}\n\nnode Trace {\n slug: String @key\n title: String @index\n body: String?\n kind: enum(note, discussion, experiment, review, meeting, document)\n recorded_at: DateTime\n word_count: I64\n source: String?\n}\n\nnode Signal {\n // Ordinary user property, distinct from system identity (@id).\n id: I32?\n slug: String @key\n title: String @index\n body: String?\n category: enum(competitor, market, regulatory, technology, customer)\n strength: F64\n observed_at: Date\n source: String?\n}\n\nnode Artifact {\n slug: String @key\n title: String @index\n kind: enum(doc, presentation, proposal, spec, report, memo)\n url: String?\n created_at: Date\n revision: I64\n}\n\n// ── Edges ────────────────────────────────────────────\n\nedge OwnedBy: Decision -> Actor @card(1..1)\n\nedge ParticipatedIn: Actor -> Decision\n\nedge RecordedBy: Trace -> Actor @card(1..1)\n\nedge Supports: Trace -> Decision {\n weight: F64?\n}\n\nedge Triggered: Signal -> Decision\n\nedge Correlates: Signal -> Signal {\n confidence: F64\n @unique(@src, @dst)\n}\n","system_columns":{"id":"__id","src":"__src","dst":"__dst"},"catalogue_source":"node @Operator {\n name: String @key\n inputs: [I64]\n}\n\nnode @Pass {\n name: String @key\n position: I64\n}\n\nnode @Setting {\n name: String @key\n kind: String\n default: String\n scope: String\n}\n\nnode @Engine {\n version: String @key\n current_internal_schema_version: I64\n min_supported_internal_schema_version: I64\n}\n\nnode @LogicalKind {\n name: String @key\n coverage: String\n}"} \ No newline at end of file diff --git a/fixtures/omnigraph/recorded/search.json b/fixtures/omnigraph/recorded/search.json new file mode 100644 index 0000000..63bb59c --- /dev/null +++ b/fixtures/omnigraph/recorded/search.json @@ -0,0 +1 @@ +{"query_name":"search_signals","target":{"branch":"main","snapshot":null},"row_count":1,"columns":["s","s.title"],"rows":[{"s":{"@id":"signal-001","body":"Market movement around wire encodings.","category":"customer","id":1,"observed_at":"2017-06-09","slug":"signal-001","strength":0.0,"title":"Signal 1: search admission"},"s.title":"Signal 1: search admission"}],"graph_commit_id":"hb1.01M5MP45JC4C435R73CJ95BR6H.1.01M5MP45JC4C435R73CJ95BR6H"} \ No newline at end of file diff --git a/fixtures/omnigraph/recorded/snapshot.json b/fixtures/omnigraph/recorded/snapshot.json index 665bfc0..2670d0d 100644 --- a/fixtures/omnigraph/recorded/snapshot.json +++ b/fixtures/omnigraph/recorded/snapshot.json @@ -1 +1 @@ -{"graph_branch":"main","graph_manifest_version":2,"internal_schema_version":6,"datasets":[{"entity_kind":"edge","type_name":"Correlates","dataset_path":"edges/0000000000000006-0000000000000032","published_dataset_version":2,"native_dataset_branch":null,"entity_count":50},{"entity_kind":"edge","type_name":"OwnedBy","dataset_path":"edges/0000000000000007-0000000000000033","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"edge","type_name":"ParticipatedIn","dataset_path":"edges/0000000000000008-0000000000000034","published_dataset_version":2,"native_dataset_branch":null,"entity_count":120},{"entity_kind":"edge","type_name":"RecordedBy","dataset_path":"edges/0000000000000009-0000000000000035","published_dataset_version":2,"native_dataset_branch":null,"entity_count":90},{"entity_kind":"edge","type_name":"Supports","dataset_path":"edges/000000000000000a-0000000000000036","published_dataset_version":2,"native_dataset_branch":null,"entity_count":110},{"entity_kind":"edge","type_name":"Triggered","dataset_path":"edges/000000000000000b-0000000000000037","published_dataset_version":2,"native_dataset_branch":null,"entity_count":70},{"entity_kind":"node","type_name":"Actor","dataset_path":"nodes/0000000000000001-000000000000002d","published_dataset_version":2,"native_dataset_branch":null,"entity_count":30},{"entity_kind":"node","type_name":"Artifact","dataset_path":"nodes/0000000000000002-000000000000002e","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"node","type_name":"Decision","dataset_path":"nodes/0000000000000003-000000000000002f","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"node","type_name":"Signal","dataset_path":"nodes/0000000000000004-0000000000000030","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"node","type_name":"Trace","dataset_path":"nodes/0000000000000005-0000000000000031","published_dataset_version":2,"native_dataset_branch":null,"entity_count":90}]} \ No newline at end of file +{"graph_branch":"main","graph_manifest_version":2,"internal_schema_version":16,"datasets":[{"entity_kind":"edge","type_name":"Correlates","dataset_path":"edges/0000000000000006-0000000000000033","published_dataset_version":2,"native_dataset_branch":null,"entity_count":50},{"entity_kind":"edge","type_name":"OwnedBy","dataset_path":"edges/0000000000000007-0000000000000034","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"edge","type_name":"ParticipatedIn","dataset_path":"edges/0000000000000008-0000000000000035","published_dataset_version":2,"native_dataset_branch":null,"entity_count":120},{"entity_kind":"edge","type_name":"RecordedBy","dataset_path":"edges/0000000000000009-0000000000000036","published_dataset_version":2,"native_dataset_branch":null,"entity_count":90},{"entity_kind":"edge","type_name":"Supports","dataset_path":"edges/000000000000000a-0000000000000037","published_dataset_version":2,"native_dataset_branch":null,"entity_count":110},{"entity_kind":"edge","type_name":"Triggered","dataset_path":"edges/000000000000000b-0000000000000038","published_dataset_version":2,"native_dataset_branch":null,"entity_count":70},{"entity_kind":"node","type_name":"Actor","dataset_path":"nodes/0000000000000001-000000000000002e","published_dataset_version":2,"native_dataset_branch":null,"entity_count":30},{"entity_kind":"node","type_name":"Artifact","dataset_path":"nodes/0000000000000002-000000000000002f","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"node","type_name":"Decision","dataset_path":"nodes/0000000000000003-0000000000000030","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"node","type_name":"Signal","dataset_path":"nodes/0000000000000004-0000000000000031","published_dataset_version":2,"native_dataset_branch":null,"entity_count":60},{"entity_kind":"node","type_name":"Trace","dataset_path":"nodes/0000000000000005-0000000000000032","published_dataset_version":2,"native_dataset_branch":null,"entity_count":90}]} \ No newline at end of file diff --git a/fixtures/omnigraph/seed.ndjson b/fixtures/omnigraph/seed.ndjson index 4a31396..844d5ab 100644 --- a/fixtures/omnigraph/seed.ndjson +++ b/fixtures/omnigraph/seed.ndjson @@ -178,66 +178,66 @@ {"type":"Trace","data":{"slug":"trace-088","title":"Trace 88: crème-fraîche caching","body":null,"kind":"experiment","recorded_at":"2019-03-05T05:08:50.832Z","word_count":4945,"source":"https://example.test/traces/trace-088"}} {"type":"Trace","data":{"slug":"trace-089","title":"Trace 89: search admission","body":"Observed legend domains during discussion.","kind":"meeting","recorded_at":"2015-05-07T18:12:21.792Z","word_count":17785,"source":null}} {"type":"Trace","data":{"slug":"trace-090","title":"Trace 90: search admission","body":null,"kind":"document","recorded_at":"2016-06-17T12:00:48.869Z","word_count":1339,"source":null}} -{"type":"Signal","data":{"slug":"signal-001","title":"Signal 1: search admission","body":"Market movement around wire encodings.","category":"customer","strength":0,"observed_at":"2017-06-09","source":null}} -{"type":"Signal","data":{"slug":"signal-002","title":"Signal 2: columnar snapshots","body":"Market movement around typed attrs.","category":"technology","strength":1e-9,"observed_at":"2021-05-28","source":null}} -{"type":"Signal","data":{"slug":"signal-003","title":"Signal 3: naïve dedupe","body":"Market movement around category scales — 图例.","category":"regulatory","strength":0.479163,"observed_at":"2026-02-05","source":"https://example.test/signals/3"}} -{"type":"Signal","data":{"slug":"signal-004","title":"Signal 4: naïve dedupe","body":"Market movement around category scales — 图例.","category":"technology","strength":0.519988,"observed_at":"2016-12-28","source":null}} -{"type":"Signal","data":{"slug":"signal-005","title":"Signal 5: branch quiescence","body":"Market movement around legend domains.","category":"regulatory","strength":0.691345,"observed_at":"2017-10-09","source":null}} -{"type":"Signal","data":{"slug":"signal-006","title":"Signal 6: Ω-bounds","body":"Market movement around graph overlays.","category":"market","strength":0.551137,"observed_at":"2018-02-22","source":"https://example.test/signals/6"}} -{"type":"Signal","data":{"slug":"signal-007","title":"Signal 7: category scales — 图例","body":"Market movement around typed attrs.","category":"technology","strength":0.512544,"observed_at":"2022-04-23","source":"https://example.test/signals/7"}} -{"type":"Signal","data":{"slug":"signal-008","title":"Signal 8: legend domains","body":"Market movement around legend domains.","category":"market","strength":0.869861,"observed_at":"2023-06-20","source":"https://example.test/signals/8"}} -{"type":"Signal","data":{"slug":"signal-009","title":"Signal 9: revision stamps","body":null,"category":"competitor","strength":0.497684,"observed_at":"2023-09-28","source":"https://example.test/signals/9"}} -{"type":"Signal","data":{"slug":"signal-010","title":"Signal 10: revision stamps","body":null,"category":"customer","strength":0.096162,"observed_at":"2015-09-22","source":"https://example.test/signals/10"}} -{"type":"Signal","data":{"slug":"signal-011","title":"Signal 11: legend domains","body":"Market movement around legend domains.","category":"regulatory","strength":0.472962,"observed_at":"2022-05-12","source":"https://example.test/signals/11"}} -{"type":"Signal","data":{"slug":"signal-012","title":"Signal 12: naïve dedupe","body":"Market movement around naïve dedupe.","category":"customer","strength":0.506528,"observed_at":"2026-04-07","source":null}} -{"type":"Signal","data":{"slug":"signal-013","title":"Signal 13: legend domains","body":"Market movement around revision stamps.","category":"customer","strength":0.422065,"observed_at":"2019-02-07","source":"https://example.test/signals/13"}} -{"type":"Signal","data":{"slug":"signal-014","title":"Signal 14: naïve dedupe","body":null,"category":"market","strength":0.398996,"observed_at":"2026-10-18","source":"https://example.test/signals/14"}} -{"type":"Signal","data":{"slug":"signal-015","title":"Signal 15: ingestion backpressure","body":"Market movement around export streaming.","category":"competitor","strength":0.758282,"observed_at":"2025-01-21","source":null}} -{"type":"Signal","data":{"slug":"signal-016","title":"Signal 16: typed attrs","body":"Market movement around branch quiescence.","category":"customer","strength":0.472056,"observed_at":"2020-12-07","source":null}} -{"type":"Signal","data":{"slug":"signal-017","title":"Signal 17: revision stamps","body":null,"category":"customer","strength":0.083839,"observed_at":"2025-01-07","source":"https://example.test/signals/17"}} -{"type":"Signal","data":{"slug":"signal-018","title":"Signal 18: columnar snapshots","body":null,"category":"technology","strength":0.937273,"observed_at":"2015-09-14","source":null}} -{"type":"Signal","data":{"slug":"signal-019","title":"Signal 19: revision stamps","body":null,"category":"customer","strength":0.469585,"observed_at":"2018-06-24","source":null}} -{"type":"Signal","data":{"slug":"signal-020","title":"Signal 20: edge identity","body":"Market movement around columnar snapshots.","category":"technology","strength":0.753215,"observed_at":"2024-06-08","source":"https://example.test/signals/20"}} -{"type":"Signal","data":{"slug":"signal-021","title":"Signal 21: Ω-bounds","body":"Market movement around ingestion backpressure.","category":"competitor","strength":0.735278,"observed_at":"2024-06-06","source":"https://example.test/signals/21"}} -{"type":"Signal","data":{"slug":"signal-022","title":"Signal 22: revision stamps","body":null,"category":"regulatory","strength":0.846439,"observed_at":"2015-06-20","source":"https://example.test/signals/22"}} -{"type":"Signal","data":{"slug":"signal-023","title":"Signal 23: export streaming","body":null,"category":"regulatory","strength":0.086616,"observed_at":"2016-12-27","source":"https://example.test/signals/23"}} -{"type":"Signal","data":{"slug":"signal-024","title":"Signal 24: columnar snapshots","body":null,"category":"market","strength":0.040446,"observed_at":"2025-02-18","source":"https://example.test/signals/24"}} -{"type":"Signal","data":{"slug":"signal-025","title":"Signal 25: ingestion backpressure","body":"Market movement around branch quiescence.","category":"market","strength":0.861196,"observed_at":"2018-10-02","source":"https://example.test/signals/25"}} -{"type":"Signal","data":{"slug":"signal-026","title":"Signal 26: search admission","body":"Market movement around naïve dedupe.","category":"competitor","strength":0.280003,"observed_at":"2016-11-16","source":null}} -{"type":"Signal","data":{"slug":"signal-027","title":"Signal 27: naïve dedupe","body":"Market movement around schema drift.","category":"regulatory","strength":0.175595,"observed_at":"2025-09-25","source":"https://example.test/signals/27"}} -{"type":"Signal","data":{"slug":"signal-028","title":"Signal 28: category scales — 图例","body":null,"category":"regulatory","strength":0.831339,"observed_at":"2024-08-25","source":"https://example.test/signals/28"}} -{"type":"Signal","data":{"slug":"signal-029","title":"Signal 29: export streaming","body":"Market movement around revision stamps.","category":"technology","strength":0.39148,"observed_at":"2017-02-02","source":"https://example.test/signals/29"}} -{"type":"Signal","data":{"slug":"signal-030","title":"Signal 30: crème-fraîche caching","body":null,"category":"customer","strength":0.17736,"observed_at":"2021-01-26","source":"https://example.test/signals/30"}} -{"type":"Signal","data":{"slug":"signal-031","title":"Signal 31: legend domains","body":"Market movement around columnar snapshots.","category":"regulatory","strength":0.302954,"observed_at":"2023-11-09","source":"https://example.test/signals/31"}} -{"type":"Signal","data":{"slug":"signal-032","title":"Signal 32: edge identity","body":null,"category":"customer","strength":0.644454,"observed_at":"2017-02-16","source":"https://example.test/signals/32"}} -{"type":"Signal","data":{"slug":"signal-033","title":"Signal 33: search admission","body":"Market movement around category scales — 图例.","category":"customer","strength":0.386967,"observed_at":"2024-09-18","source":"https://example.test/signals/33"}} -{"type":"Signal","data":{"slug":"signal-034","title":"Signal 34: typed attrs","body":null,"category":"market","strength":0.026825,"observed_at":"2024-01-15","source":"https://example.test/signals/34"}} -{"type":"Signal","data":{"slug":"signal-035","title":"Signal 35: ingestion backpressure","body":"Market movement around crème-fraîche caching.","category":"technology","strength":0.937112,"observed_at":"2017-06-12","source":"https://example.test/signals/35"}} -{"type":"Signal","data":{"slug":"signal-036","title":"Signal 36: search admission","body":"Market movement around graph overlays.","category":"market","strength":0.369431,"observed_at":"2020-10-12","source":null}} -{"type":"Signal","data":{"slug":"signal-037","title":"Signal 37: wire encodings","body":"Market movement around typed attrs.","category":"technology","strength":0.883798,"observed_at":"2015-11-08","source":"https://example.test/signals/37"}} -{"type":"Signal","data":{"slug":"signal-038","title":"Signal 38: edge identity","body":"Market movement around naïve dedupe.","category":"market","strength":0.241285,"observed_at":"2024-04-22","source":null}} -{"type":"Signal","data":{"slug":"signal-039","title":"Signal 39: crème-fraîche caching","body":"Market movement around export streaming.","category":"customer","strength":0.537504,"observed_at":"2021-01-18","source":null}} -{"type":"Signal","data":{"slug":"signal-040","title":"Signal 40: ingestion backpressure","body":null,"category":"technology","strength":0.944124,"observed_at":"2016-05-12","source":null}} -{"type":"Signal","data":{"slug":"signal-041","title":"Signal 41: search admission","body":"Market movement around graph overlays.","category":"customer","strength":0.551587,"observed_at":"2021-12-08","source":"https://example.test/signals/41"}} -{"type":"Signal","data":{"slug":"signal-042","title":"Signal 42: branch quiescence","body":"Market movement around crème-fraîche caching.","category":"customer","strength":0.799856,"observed_at":"2026-06-28","source":null}} -{"type":"Signal","data":{"slug":"signal-043","title":"Signal 43: columnar snapshots","body":null,"category":"market","strength":0.206987,"observed_at":"2018-02-19","source":null}} -{"type":"Signal","data":{"slug":"signal-044","title":"Signal 44: crème-fraîche caching","body":null,"category":"regulatory","strength":0.825437,"observed_at":"2022-04-19","source":"https://example.test/signals/44"}} -{"type":"Signal","data":{"slug":"signal-045","title":"Signal 45: schema drift","body":null,"category":"technology","strength":0.597921,"observed_at":"2023-10-22","source":null}} -{"type":"Signal","data":{"slug":"signal-046","title":"Signal 46: crème-fraîche caching","body":null,"category":"regulatory","strength":0.028038,"observed_at":"2020-08-06","source":"https://example.test/signals/46"}} -{"type":"Signal","data":{"slug":"signal-047","title":"Signal 47: typed attrs","body":null,"category":"technology","strength":0.107928,"observed_at":"2016-09-05","source":"https://example.test/signals/47"}} -{"type":"Signal","data":{"slug":"signal-048","title":"Signal 48: ingestion backpressure","body":"Market movement around schema drift.","category":"regulatory","strength":0.291874,"observed_at":"2020-07-11","source":"https://example.test/signals/48"}} -{"type":"Signal","data":{"slug":"signal-049","title":"Signal 49: revision stamps","body":"Market movement around columnar snapshots.","category":"regulatory","strength":0.467257,"observed_at":"2021-10-10","source":null}} -{"type":"Signal","data":{"slug":"signal-050","title":"Signal 50: ingestion backpressure","body":"Market movement around edge identity.","category":"customer","strength":0.385888,"observed_at":"2024-07-16","source":"https://example.test/signals/50"}} -{"type":"Signal","data":{"slug":"signal-051","title":"Signal 51: revision stamps","body":"Market movement around typed attrs.","category":"regulatory","strength":0.43061,"observed_at":"2019-01-27","source":"https://example.test/signals/51"}} -{"type":"Signal","data":{"slug":"signal-052","title":"Signal 52: Ω-bounds","body":null,"category":"regulatory","strength":0.712629,"observed_at":"2024-06-20","source":"https://example.test/signals/52"}} -{"type":"Signal","data":{"slug":"signal-053","title":"Signal 53: legend domains","body":null,"category":"market","strength":0.037462,"observed_at":"2022-03-19","source":null}} -{"type":"Signal","data":{"slug":"signal-054","title":"Signal 54: export streaming","body":null,"category":"competitor","strength":0.558492,"observed_at":"2015-08-06","source":"https://example.test/signals/54"}} -{"type":"Signal","data":{"slug":"signal-055","title":"Signal 55: legend domains","body":"Market movement around category scales — 图例.","category":"competitor","strength":0.837372,"observed_at":"2019-02-06","source":"https://example.test/signals/55"}} -{"type":"Signal","data":{"slug":"signal-056","title":"Signal 56: naïve dedupe","body":"Market movement around schema drift.","category":"regulatory","strength":0.308975,"observed_at":"2018-10-03","source":null}} -{"type":"Signal","data":{"slug":"signal-057","title":"Signal 57: edge identity","body":null,"category":"competitor","strength":0.195232,"observed_at":"2015-02-08","source":"https://example.test/signals/57"}} -{"type":"Signal","data":{"slug":"signal-058","title":"Signal 58: graph overlays","body":null,"category":"competitor","strength":0.106871,"observed_at":"2024-10-15","source":"https://example.test/signals/58"}} -{"type":"Signal","data":{"slug":"signal-059","title":"Signal 59: columnar snapshots","body":null,"category":"regulatory","strength":0.008096,"observed_at":"2015-06-11","source":"https://example.test/signals/59"}} -{"type":"Signal","data":{"slug":"signal-060","title":"Signal 60: crème-fraîche caching","body":"Market movement around crème-fraîche caching.","category":"technology","strength":0.117169,"observed_at":"2020-08-12","source":null}} +{"type":"Signal","data":{"id":1,"slug":"signal-001","title":"Signal 1: search admission","body":"Market movement around wire encodings.","category":"customer","strength":0,"observed_at":"2017-06-09","source":null}} +{"type":"Signal","data":{"id":2,"slug":"signal-002","title":"Signal 2: columnar snapshots","body":"Market movement around typed attrs.","category":"technology","strength":1e-9,"observed_at":"2021-05-28","source":null}} +{"type":"Signal","data":{"id":null,"slug":"signal-003","title":"Signal 3: naïve dedupe","body":"Market movement around category scales — 图例.","category":"regulatory","strength":0.479163,"observed_at":"2026-02-05","source":"https://example.test/signals/3"}} +{"type":"Signal","data":{"id":4,"slug":"signal-004","title":"Signal 4: naïve dedupe","body":"Market movement around category scales — 图例.","category":"technology","strength":0.519988,"observed_at":"2016-12-28","source":null}} +{"type":"Signal","data":{"id":5,"slug":"signal-005","title":"Signal 5: branch quiescence","body":"Market movement around legend domains.","category":"regulatory","strength":0.691345,"observed_at":"2017-10-09","source":null}} +{"type":"Signal","data":{"id":null,"slug":"signal-006","title":"Signal 6: Ω-bounds","body":"Market movement around graph overlays.","category":"market","strength":0.551137,"observed_at":"2018-02-22","source":"https://example.test/signals/6"}} +{"type":"Signal","data":{"id":7,"slug":"signal-007","title":"Signal 7: category scales — 图例","body":"Market movement around typed attrs.","category":"technology","strength":0.512544,"observed_at":"2022-04-23","source":"https://example.test/signals/7"}} +{"type":"Signal","data":{"id":8,"slug":"signal-008","title":"Signal 8: legend domains","body":"Market movement around legend domains.","category":"market","strength":0.869861,"observed_at":"2023-06-20","source":"https://example.test/signals/8"}} +{"type":"Signal","data":{"id":null,"slug":"signal-009","title":"Signal 9: revision stamps","body":null,"category":"competitor","strength":0.497684,"observed_at":"2023-09-28","source":"https://example.test/signals/9"}} +{"type":"Signal","data":{"id":10,"slug":"signal-010","title":"Signal 10: revision stamps","body":null,"category":"customer","strength":0.096162,"observed_at":"2015-09-22","source":"https://example.test/signals/10"}} +{"type":"Signal","data":{"id":11,"slug":"signal-011","title":"Signal 11: legend domains","body":"Market movement around legend domains.","category":"regulatory","strength":0.472962,"observed_at":"2022-05-12","source":"https://example.test/signals/11"}} +{"type":"Signal","data":{"id":null,"slug":"signal-012","title":"Signal 12: naïve dedupe","body":"Market movement around naïve dedupe.","category":"customer","strength":0.506528,"observed_at":"2026-04-07","source":null}} +{"type":"Signal","data":{"id":13,"slug":"signal-013","title":"Signal 13: legend domains","body":"Market movement around revision stamps.","category":"customer","strength":0.422065,"observed_at":"2019-02-07","source":"https://example.test/signals/13"}} +{"type":"Signal","data":{"id":14,"slug":"signal-014","title":"Signal 14: naïve dedupe","body":null,"category":"market","strength":0.398996,"observed_at":"2026-10-18","source":"https://example.test/signals/14"}} +{"type":"Signal","data":{"id":null,"slug":"signal-015","title":"Signal 15: ingestion backpressure","body":"Market movement around export streaming.","category":"competitor","strength":0.758282,"observed_at":"2025-01-21","source":null}} +{"type":"Signal","data":{"id":16,"slug":"signal-016","title":"Signal 16: typed attrs","body":"Market movement around branch quiescence.","category":"customer","strength":0.472056,"observed_at":"2020-12-07","source":null}} +{"type":"Signal","data":{"id":17,"slug":"signal-017","title":"Signal 17: revision stamps","body":null,"category":"customer","strength":0.083839,"observed_at":"2025-01-07","source":"https://example.test/signals/17"}} +{"type":"Signal","data":{"id":null,"slug":"signal-018","title":"Signal 18: columnar snapshots","body":null,"category":"technology","strength":0.937273,"observed_at":"2015-09-14","source":null}} +{"type":"Signal","data":{"id":19,"slug":"signal-019","title":"Signal 19: revision stamps","body":null,"category":"customer","strength":0.469585,"observed_at":"2018-06-24","source":null}} +{"type":"Signal","data":{"id":20,"slug":"signal-020","title":"Signal 20: edge identity","body":"Market movement around columnar snapshots.","category":"technology","strength":0.753215,"observed_at":"2024-06-08","source":"https://example.test/signals/20"}} +{"type":"Signal","data":{"id":null,"slug":"signal-021","title":"Signal 21: Ω-bounds","body":"Market movement around ingestion backpressure.","category":"competitor","strength":0.735278,"observed_at":"2024-06-06","source":"https://example.test/signals/21"}} +{"type":"Signal","data":{"id":22,"slug":"signal-022","title":"Signal 22: revision stamps","body":null,"category":"regulatory","strength":0.846439,"observed_at":"2015-06-20","source":"https://example.test/signals/22"}} +{"type":"Signal","data":{"id":23,"slug":"signal-023","title":"Signal 23: export streaming","body":null,"category":"regulatory","strength":0.086616,"observed_at":"2016-12-27","source":"https://example.test/signals/23"}} +{"type":"Signal","data":{"id":null,"slug":"signal-024","title":"Signal 24: columnar snapshots","body":null,"category":"market","strength":0.040446,"observed_at":"2025-02-18","source":"https://example.test/signals/24"}} +{"type":"Signal","data":{"id":25,"slug":"signal-025","title":"Signal 25: ingestion backpressure","body":"Market movement around branch quiescence.","category":"market","strength":0.861196,"observed_at":"2018-10-02","source":"https://example.test/signals/25"}} +{"type":"Signal","data":{"id":26,"slug":"signal-026","title":"Signal 26: search admission","body":"Market movement around naïve dedupe.","category":"competitor","strength":0.280003,"observed_at":"2016-11-16","source":null}} +{"type":"Signal","data":{"id":null,"slug":"signal-027","title":"Signal 27: naïve dedupe","body":"Market movement around schema drift.","category":"regulatory","strength":0.175595,"observed_at":"2025-09-25","source":"https://example.test/signals/27"}} +{"type":"Signal","data":{"id":28,"slug":"signal-028","title":"Signal 28: category scales — 图例","body":null,"category":"regulatory","strength":0.831339,"observed_at":"2024-08-25","source":"https://example.test/signals/28"}} +{"type":"Signal","data":{"id":29,"slug":"signal-029","title":"Signal 29: export streaming","body":"Market movement around revision stamps.","category":"technology","strength":0.39148,"observed_at":"2017-02-02","source":"https://example.test/signals/29"}} +{"type":"Signal","data":{"id":null,"slug":"signal-030","title":"Signal 30: crème-fraîche caching","body":null,"category":"customer","strength":0.17736,"observed_at":"2021-01-26","source":"https://example.test/signals/30"}} +{"type":"Signal","data":{"id":31,"slug":"signal-031","title":"Signal 31: legend domains","body":"Market movement around columnar snapshots.","category":"regulatory","strength":0.302954,"observed_at":"2023-11-09","source":"https://example.test/signals/31"}} +{"type":"Signal","data":{"id":32,"slug":"signal-032","title":"Signal 32: edge identity","body":null,"category":"customer","strength":0.644454,"observed_at":"2017-02-16","source":"https://example.test/signals/32"}} +{"type":"Signal","data":{"id":null,"slug":"signal-033","title":"Signal 33: search admission","body":"Market movement around category scales — 图例.","category":"customer","strength":0.386967,"observed_at":"2024-09-18","source":"https://example.test/signals/33"}} +{"type":"Signal","data":{"id":34,"slug":"signal-034","title":"Signal 34: typed attrs","body":null,"category":"market","strength":0.026825,"observed_at":"2024-01-15","source":"https://example.test/signals/34"}} +{"type":"Signal","data":{"id":35,"slug":"signal-035","title":"Signal 35: ingestion backpressure","body":"Market movement around crème-fraîche caching.","category":"technology","strength":0.937112,"observed_at":"2017-06-12","source":"https://example.test/signals/35"}} +{"type":"Signal","data":{"id":null,"slug":"signal-036","title":"Signal 36: search admission","body":"Market movement around graph overlays.","category":"market","strength":0.369431,"observed_at":"2020-10-12","source":null}} +{"type":"Signal","data":{"id":37,"slug":"signal-037","title":"Signal 37: wire encodings","body":"Market movement around typed attrs.","category":"technology","strength":0.883798,"observed_at":"2015-11-08","source":"https://example.test/signals/37"}} +{"type":"Signal","data":{"id":38,"slug":"signal-038","title":"Signal 38: edge identity","body":"Market movement around naïve dedupe.","category":"market","strength":0.241285,"observed_at":"2024-04-22","source":null}} +{"type":"Signal","data":{"id":null,"slug":"signal-039","title":"Signal 39: crème-fraîche caching","body":"Market movement around export streaming.","category":"customer","strength":0.537504,"observed_at":"2021-01-18","source":null}} +{"type":"Signal","data":{"id":40,"slug":"signal-040","title":"Signal 40: ingestion backpressure","body":null,"category":"technology","strength":0.944124,"observed_at":"2016-05-12","source":null}} +{"type":"Signal","data":{"id":41,"slug":"signal-041","title":"Signal 41: search admission","body":"Market movement around graph overlays.","category":"customer","strength":0.551587,"observed_at":"2021-12-08","source":"https://example.test/signals/41"}} +{"type":"Signal","data":{"id":null,"slug":"signal-042","title":"Signal 42: branch quiescence","body":"Market movement around crème-fraîche caching.","category":"customer","strength":0.799856,"observed_at":"2026-06-28","source":null}} +{"type":"Signal","data":{"id":43,"slug":"signal-043","title":"Signal 43: columnar snapshots","body":null,"category":"market","strength":0.206987,"observed_at":"2018-02-19","source":null}} +{"type":"Signal","data":{"id":44,"slug":"signal-044","title":"Signal 44: crème-fraîche caching","body":null,"category":"regulatory","strength":0.825437,"observed_at":"2022-04-19","source":"https://example.test/signals/44"}} +{"type":"Signal","data":{"id":null,"slug":"signal-045","title":"Signal 45: schema drift","body":null,"category":"technology","strength":0.597921,"observed_at":"2023-10-22","source":null}} +{"type":"Signal","data":{"id":46,"slug":"signal-046","title":"Signal 46: crème-fraîche caching","body":null,"category":"regulatory","strength":0.028038,"observed_at":"2020-08-06","source":"https://example.test/signals/46"}} +{"type":"Signal","data":{"id":47,"slug":"signal-047","title":"Signal 47: typed attrs","body":null,"category":"technology","strength":0.107928,"observed_at":"2016-09-05","source":"https://example.test/signals/47"}} +{"type":"Signal","data":{"id":null,"slug":"signal-048","title":"Signal 48: ingestion backpressure","body":"Market movement around schema drift.","category":"regulatory","strength":0.291874,"observed_at":"2020-07-11","source":"https://example.test/signals/48"}} +{"type":"Signal","data":{"id":49,"slug":"signal-049","title":"Signal 49: revision stamps","body":"Market movement around columnar snapshots.","category":"regulatory","strength":0.467257,"observed_at":"2021-10-10","source":null}} +{"type":"Signal","data":{"id":50,"slug":"signal-050","title":"Signal 50: ingestion backpressure","body":"Market movement around edge identity.","category":"customer","strength":0.385888,"observed_at":"2024-07-16","source":"https://example.test/signals/50"}} +{"type":"Signal","data":{"id":null,"slug":"signal-051","title":"Signal 51: revision stamps","body":"Market movement around typed attrs.","category":"regulatory","strength":0.43061,"observed_at":"2019-01-27","source":"https://example.test/signals/51"}} +{"type":"Signal","data":{"id":52,"slug":"signal-052","title":"Signal 52: Ω-bounds","body":null,"category":"regulatory","strength":0.712629,"observed_at":"2024-06-20","source":"https://example.test/signals/52"}} +{"type":"Signal","data":{"id":53,"slug":"signal-053","title":"Signal 53: legend domains","body":null,"category":"market","strength":0.037462,"observed_at":"2022-03-19","source":null}} +{"type":"Signal","data":{"id":null,"slug":"signal-054","title":"Signal 54: export streaming","body":null,"category":"competitor","strength":0.558492,"observed_at":"2015-08-06","source":"https://example.test/signals/54"}} +{"type":"Signal","data":{"id":55,"slug":"signal-055","title":"Signal 55: legend domains","body":"Market movement around category scales — 图例.","category":"competitor","strength":0.837372,"observed_at":"2019-02-06","source":"https://example.test/signals/55"}} +{"type":"Signal","data":{"id":56,"slug":"signal-056","title":"Signal 56: naïve dedupe","body":"Market movement around schema drift.","category":"regulatory","strength":0.308975,"observed_at":"2018-10-03","source":null}} +{"type":"Signal","data":{"id":null,"slug":"signal-057","title":"Signal 57: edge identity","body":null,"category":"competitor","strength":0.195232,"observed_at":"2015-02-08","source":"https://example.test/signals/57"}} +{"type":"Signal","data":{"id":58,"slug":"signal-058","title":"Signal 58: graph overlays","body":null,"category":"competitor","strength":0.106871,"observed_at":"2024-10-15","source":"https://example.test/signals/58"}} +{"type":"Signal","data":{"id":59,"slug":"signal-059","title":"Signal 59: columnar snapshots","body":null,"category":"regulatory","strength":0.008096,"observed_at":"2015-06-11","source":"https://example.test/signals/59"}} +{"type":"Signal","data":{"id":null,"slug":"signal-060","title":"Signal 60: crème-fraîche caching","body":"Market movement around crème-fraîche caching.","category":"technology","strength":0.117169,"observed_at":"2020-08-12","source":null}} {"type":"Artifact","data":{"slug":"artifact-001","title":"Artifact 1: category scales — 图例","kind":"report","url":"https://example.test/artifacts/naïve-1?q=图","created_at":"2021-12-26","revision":39}} {"type":"Artifact","data":{"slug":"artifact-002","title":"Artifact 2: naïve dedupe","kind":"presentation","url":"https://example.test/artifacts/naïve-2?q=图","created_at":"2016-03-21","revision":24}} {"type":"Artifact","data":{"slug":"artifact-003","title":"Artifact 3: edge identity","kind":"doc","url":null,"created_at":"2021-12-07","revision":9}} @@ -298,503 +298,503 @@ {"type":"Artifact","data":{"slug":"artifact-058","title":"Artifact 58: columnar snapshots","kind":"doc","url":"https://example.test/artifacts/naïve-58?q=图","created_at":"2017-05-13","revision":36}} {"type":"Artifact","data":{"slug":"artifact-059","title":"Artifact 59: columnar snapshots","kind":"doc","url":"https://example.test/artifacts/naïve-59?q=图","created_at":"2015-06-23","revision":39}} {"type":"Artifact","data":{"slug":"artifact-060","title":"Artifact 60: Ω-bounds","kind":"spec","url":"https://example.test/artifacts/naïve-60?q=图","created_at":"2022-04-12","revision":39}} -{"edge":"OwnedBy","from":"decision-001","to":"actor-001","data":{"id":"own-0001"}} -{"edge":"OwnedBy","from":"decision-002","to":"actor-002","data":{"id":"own-0002"}} -{"edge":"OwnedBy","from":"decision-003","to":"actor-003","data":{"id":"own-0003"}} -{"edge":"OwnedBy","from":"decision-004","to":"actor-004","data":{"id":"own-0004"}} -{"edge":"OwnedBy","from":"decision-005","to":"actor-005","data":{"id":"own-0005"}} -{"edge":"OwnedBy","from":"decision-006","to":"actor-006","data":{"id":"own-0006"}} -{"edge":"OwnedBy","from":"decision-007","to":"actor-007","data":{"id":"own-0007"}} -{"edge":"OwnedBy","from":"decision-008","to":"actor-008","data":{"id":"own-0008"}} -{"edge":"OwnedBy","from":"decision-009","to":"actor-009","data":{"id":"own-0009"}} -{"edge":"OwnedBy","from":"decision-010","to":"actor-010","data":{"id":"own-0010"}} -{"edge":"OwnedBy","from":"decision-011","to":"actor-011","data":{"id":"own-0011"}} -{"edge":"OwnedBy","from":"decision-012","to":"actor-012","data":{"id":"own-0012"}} -{"edge":"OwnedBy","from":"decision-013","to":"actor-013","data":{"id":"own-0013"}} -{"edge":"OwnedBy","from":"decision-014","to":"actor-014","data":{"id":"own-0014"}} -{"edge":"OwnedBy","from":"decision-015","to":"actor-015","data":{"id":"own-0015"}} -{"edge":"OwnedBy","from":"decision-016","to":"actor-016","data":{"id":"own-0016"}} -{"edge":"OwnedBy","from":"decision-017","to":"actor-017","data":{"id":"own-0017"}} -{"edge":"OwnedBy","from":"decision-018","to":"actor-018","data":{"id":"own-0018"}} -{"edge":"OwnedBy","from":"decision-019","to":"actor-019","data":{"id":"own-0019"}} -{"edge":"OwnedBy","from":"decision-020","to":"actor-020","data":{"id":"own-0020"}} -{"edge":"OwnedBy","from":"decision-021","to":"actor-021","data":{"id":"own-0021"}} -{"edge":"OwnedBy","from":"decision-022","to":"actor-022","data":{"id":"own-0022"}} -{"edge":"OwnedBy","from":"decision-023","to":"actor-023","data":{"id":"own-0023"}} -{"edge":"OwnedBy","from":"decision-024","to":"actor-024","data":{"id":"own-0024"}} -{"edge":"OwnedBy","from":"decision-025","to":"actor-025","data":{"id":"own-0025"}} -{"edge":"OwnedBy","from":"decision-026","to":"actor-026","data":{"id":"own-0026"}} -{"edge":"OwnedBy","from":"decision-027","to":"actor-027","data":{"id":"own-0027"}} -{"edge":"OwnedBy","from":"decision-028","to":"actor-028","data":{"id":"own-0028"}} -{"edge":"OwnedBy","from":"decision-029","to":"actor-029","data":{"id":"own-0029"}} -{"edge":"OwnedBy","from":"decision-030","to":"actor-030","data":{"id":"own-0030"}} -{"edge":"OwnedBy","from":"decision-031","to":"actor-001","data":{"id":"own-0031"}} -{"edge":"OwnedBy","from":"decision-032","to":"actor-002","data":{"id":"own-0032"}} -{"edge":"OwnedBy","from":"decision-033","to":"actor-003","data":{"id":"own-0033"}} -{"edge":"OwnedBy","from":"decision-034","to":"actor-004","data":{"id":"own-0034"}} -{"edge":"OwnedBy","from":"decision-035","to":"actor-005","data":{"id":"own-0035"}} -{"edge":"OwnedBy","from":"decision-036","to":"actor-006","data":{"id":"own-0036"}} -{"edge":"OwnedBy","from":"decision-037","to":"actor-007","data":{"id":"own-0037"}} -{"edge":"OwnedBy","from":"decision-038","to":"actor-008","data":{"id":"own-0038"}} -{"edge":"OwnedBy","from":"decision-039","to":"actor-009","data":{"id":"own-0039"}} -{"edge":"OwnedBy","from":"decision-040","to":"actor-010","data":{"id":"own-0040"}} -{"edge":"OwnedBy","from":"decision-041","to":"actor-011","data":{"id":"own-0041"}} -{"edge":"OwnedBy","from":"decision-042","to":"actor-012","data":{"id":"own-0042"}} -{"edge":"OwnedBy","from":"decision-043","to":"actor-013","data":{"id":"own-0043"}} -{"edge":"OwnedBy","from":"decision-044","to":"actor-014","data":{"id":"own-0044"}} -{"edge":"OwnedBy","from":"decision-045","to":"actor-015","data":{"id":"own-0045"}} -{"edge":"OwnedBy","from":"decision-046","to":"actor-016","data":{"id":"own-0046"}} -{"edge":"OwnedBy","from":"decision-047","to":"actor-017","data":{"id":"own-0047"}} -{"edge":"OwnedBy","from":"decision-048","to":"actor-018","data":{"id":"own-0048"}} -{"edge":"OwnedBy","from":"decision-049","to":"actor-019","data":{"id":"own-0049"}} -{"edge":"OwnedBy","from":"decision-050","to":"actor-020","data":{"id":"own-0050"}} -{"edge":"OwnedBy","from":"decision-051","to":"actor-021","data":{"id":"own-0051"}} -{"edge":"OwnedBy","from":"decision-052","to":"actor-022","data":{"id":"own-0052"}} -{"edge":"OwnedBy","from":"decision-053","to":"actor-023","data":{"id":"own-0053"}} -{"edge":"OwnedBy","from":"decision-054","to":"actor-024","data":{"id":"own-0054"}} -{"edge":"OwnedBy","from":"decision-055","to":"actor-025","data":{"id":"own-0055"}} -{"edge":"OwnedBy","from":"decision-056","to":"actor-026","data":{"id":"own-0056"}} -{"edge":"OwnedBy","from":"decision-057","to":"actor-027","data":{"id":"own-0057"}} -{"edge":"OwnedBy","from":"decision-058","to":"actor-028","data":{"id":"own-0058"}} -{"edge":"OwnedBy","from":"decision-059","to":"actor-029","data":{"id":"own-0059"}} -{"edge":"OwnedBy","from":"decision-060","to":"actor-030","data":{"id":"own-0060"}} -{"edge":"RecordedBy","from":"trace-001","to":"actor-001","data":{"id":"rec-0001"}} -{"edge":"RecordedBy","from":"trace-002","to":"actor-008","data":{"id":"rec-0002"}} -{"edge":"RecordedBy","from":"trace-003","to":"actor-015","data":{"id":"rec-0003"}} -{"edge":"RecordedBy","from":"trace-004","to":"actor-022","data":{"id":"rec-0004"}} -{"edge":"RecordedBy","from":"trace-005","to":"actor-029","data":{"id":"rec-0005"}} -{"edge":"RecordedBy","from":"trace-006","to":"actor-006","data":{"id":"rec-0006"}} -{"edge":"RecordedBy","from":"trace-007","to":"actor-013","data":{"id":"rec-0007"}} -{"edge":"RecordedBy","from":"trace-008","to":"actor-020","data":{"id":"rec-0008"}} -{"edge":"RecordedBy","from":"trace-009","to":"actor-027","data":{"id":"rec-0009"}} -{"edge":"RecordedBy","from":"trace-010","to":"actor-004","data":{"id":"rec-0010"}} -{"edge":"RecordedBy","from":"trace-011","to":"actor-011","data":{"id":"rec-0011"}} -{"edge":"RecordedBy","from":"trace-012","to":"actor-018","data":{"id":"rec-0012"}} -{"edge":"RecordedBy","from":"trace-013","to":"actor-025","data":{"id":"rec-0013"}} -{"edge":"RecordedBy","from":"trace-014","to":"actor-002","data":{"id":"rec-0014"}} -{"edge":"RecordedBy","from":"trace-015","to":"actor-009","data":{"id":"rec-0015"}} -{"edge":"RecordedBy","from":"trace-016","to":"actor-016","data":{"id":"rec-0016"}} -{"edge":"RecordedBy","from":"trace-017","to":"actor-023","data":{"id":"rec-0017"}} -{"edge":"RecordedBy","from":"trace-018","to":"actor-030","data":{"id":"rec-0018"}} -{"edge":"RecordedBy","from":"trace-019","to":"actor-007","data":{"id":"rec-0019"}} -{"edge":"RecordedBy","from":"trace-020","to":"actor-014","data":{"id":"rec-0020"}} -{"edge":"RecordedBy","from":"trace-021","to":"actor-021","data":{"id":"rec-0021"}} -{"edge":"RecordedBy","from":"trace-022","to":"actor-028","data":{"id":"rec-0022"}} -{"edge":"RecordedBy","from":"trace-023","to":"actor-005","data":{"id":"rec-0023"}} -{"edge":"RecordedBy","from":"trace-024","to":"actor-012","data":{"id":"rec-0024"}} -{"edge":"RecordedBy","from":"trace-025","to":"actor-019","data":{"id":"rec-0025"}} -{"edge":"RecordedBy","from":"trace-026","to":"actor-026","data":{"id":"rec-0026"}} -{"edge":"RecordedBy","from":"trace-027","to":"actor-003","data":{"id":"rec-0027"}} -{"edge":"RecordedBy","from":"trace-028","to":"actor-010","data":{"id":"rec-0028"}} -{"edge":"RecordedBy","from":"trace-029","to":"actor-017","data":{"id":"rec-0029"}} -{"edge":"RecordedBy","from":"trace-030","to":"actor-024","data":{"id":"rec-0030"}} -{"edge":"RecordedBy","from":"trace-031","to":"actor-001","data":{"id":"rec-0031"}} -{"edge":"RecordedBy","from":"trace-032","to":"actor-008","data":{"id":"rec-0032"}} -{"edge":"RecordedBy","from":"trace-033","to":"actor-015","data":{"id":"rec-0033"}} -{"edge":"RecordedBy","from":"trace-034","to":"actor-022","data":{"id":"rec-0034"}} -{"edge":"RecordedBy","from":"trace-035","to":"actor-029","data":{"id":"rec-0035"}} -{"edge":"RecordedBy","from":"trace-036","to":"actor-006","data":{"id":"rec-0036"}} -{"edge":"RecordedBy","from":"trace-037","to":"actor-013","data":{"id":"rec-0037"}} -{"edge":"RecordedBy","from":"trace-038","to":"actor-020","data":{"id":"rec-0038"}} -{"edge":"RecordedBy","from":"trace-039","to":"actor-027","data":{"id":"rec-0039"}} -{"edge":"RecordedBy","from":"trace-040","to":"actor-004","data":{"id":"rec-0040"}} -{"edge":"RecordedBy","from":"trace-041","to":"actor-011","data":{"id":"rec-0041"}} -{"edge":"RecordedBy","from":"trace-042","to":"actor-018","data":{"id":"rec-0042"}} -{"edge":"RecordedBy","from":"trace-043","to":"actor-025","data":{"id":"rec-0043"}} -{"edge":"RecordedBy","from":"trace-044","to":"actor-002","data":{"id":"rec-0044"}} -{"edge":"RecordedBy","from":"trace-045","to":"actor-009","data":{"id":"rec-0045"}} -{"edge":"RecordedBy","from":"trace-046","to":"actor-016","data":{"id":"rec-0046"}} -{"edge":"RecordedBy","from":"trace-047","to":"actor-023","data":{"id":"rec-0047"}} -{"edge":"RecordedBy","from":"trace-048","to":"actor-030","data":{"id":"rec-0048"}} -{"edge":"RecordedBy","from":"trace-049","to":"actor-007","data":{"id":"rec-0049"}} -{"edge":"RecordedBy","from":"trace-050","to":"actor-014","data":{"id":"rec-0050"}} -{"edge":"RecordedBy","from":"trace-051","to":"actor-021","data":{"id":"rec-0051"}} -{"edge":"RecordedBy","from":"trace-052","to":"actor-028","data":{"id":"rec-0052"}} -{"edge":"RecordedBy","from":"trace-053","to":"actor-005","data":{"id":"rec-0053"}} -{"edge":"RecordedBy","from":"trace-054","to":"actor-012","data":{"id":"rec-0054"}} -{"edge":"RecordedBy","from":"trace-055","to":"actor-019","data":{"id":"rec-0055"}} -{"edge":"RecordedBy","from":"trace-056","to":"actor-026","data":{"id":"rec-0056"}} -{"edge":"RecordedBy","from":"trace-057","to":"actor-003","data":{"id":"rec-0057"}} -{"edge":"RecordedBy","from":"trace-058","to":"actor-010","data":{"id":"rec-0058"}} -{"edge":"RecordedBy","from":"trace-059","to":"actor-017","data":{"id":"rec-0059"}} -{"edge":"RecordedBy","from":"trace-060","to":"actor-024","data":{"id":"rec-0060"}} -{"edge":"RecordedBy","from":"trace-061","to":"actor-001","data":{"id":"rec-0061"}} -{"edge":"RecordedBy","from":"trace-062","to":"actor-008","data":{"id":"rec-0062"}} -{"edge":"RecordedBy","from":"trace-063","to":"actor-015","data":{"id":"rec-0063"}} -{"edge":"RecordedBy","from":"trace-064","to":"actor-022","data":{"id":"rec-0064"}} -{"edge":"RecordedBy","from":"trace-065","to":"actor-029","data":{"id":"rec-0065"}} -{"edge":"RecordedBy","from":"trace-066","to":"actor-006","data":{"id":"rec-0066"}} -{"edge":"RecordedBy","from":"trace-067","to":"actor-013","data":{"id":"rec-0067"}} -{"edge":"RecordedBy","from":"trace-068","to":"actor-020","data":{"id":"rec-0068"}} -{"edge":"RecordedBy","from":"trace-069","to":"actor-027","data":{"id":"rec-0069"}} -{"edge":"RecordedBy","from":"trace-070","to":"actor-004","data":{"id":"rec-0070"}} -{"edge":"RecordedBy","from":"trace-071","to":"actor-011","data":{"id":"rec-0071"}} -{"edge":"RecordedBy","from":"trace-072","to":"actor-018","data":{"id":"rec-0072"}} -{"edge":"RecordedBy","from":"trace-073","to":"actor-025","data":{"id":"rec-0073"}} -{"edge":"RecordedBy","from":"trace-074","to":"actor-002","data":{"id":"rec-0074"}} -{"edge":"RecordedBy","from":"trace-075","to":"actor-009","data":{"id":"rec-0075"}} -{"edge":"RecordedBy","from":"trace-076","to":"actor-016","data":{"id":"rec-0076"}} -{"edge":"RecordedBy","from":"trace-077","to":"actor-023","data":{"id":"rec-0077"}} -{"edge":"RecordedBy","from":"trace-078","to":"actor-030","data":{"id":"rec-0078"}} -{"edge":"RecordedBy","from":"trace-079","to":"actor-007","data":{"id":"rec-0079"}} -{"edge":"RecordedBy","from":"trace-080","to":"actor-014","data":{"id":"rec-0080"}} -{"edge":"RecordedBy","from":"trace-081","to":"actor-021","data":{"id":"rec-0081"}} -{"edge":"RecordedBy","from":"trace-082","to":"actor-028","data":{"id":"rec-0082"}} -{"edge":"RecordedBy","from":"trace-083","to":"actor-005","data":{"id":"rec-0083"}} -{"edge":"RecordedBy","from":"trace-084","to":"actor-012","data":{"id":"rec-0084"}} -{"edge":"RecordedBy","from":"trace-085","to":"actor-019","data":{"id":"rec-0085"}} -{"edge":"RecordedBy","from":"trace-086","to":"actor-026","data":{"id":"rec-0086"}} -{"edge":"RecordedBy","from":"trace-087","to":"actor-003","data":{"id":"rec-0087"}} -{"edge":"RecordedBy","from":"trace-088","to":"actor-010","data":{"id":"rec-0088"}} -{"edge":"RecordedBy","from":"trace-089","to":"actor-017","data":{"id":"rec-0089"}} -{"edge":"RecordedBy","from":"trace-090","to":"actor-024","data":{"id":"rec-0090"}} -{"edge":"ParticipatedIn","from":"actor-021","to":"decision-046","data":{"id":"part-0001"}} -{"edge":"ParticipatedIn","from":"actor-017","to":"decision-015","data":{"id":"part-0002"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-038","data":{"id":"part-0003"}} -{"edge":"ParticipatedIn","from":"actor-010","to":"decision-018","data":{"id":"part-0004"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-027","data":{"id":"part-0005"}} -{"edge":"ParticipatedIn","from":"actor-012","to":"decision-046","data":{"id":"part-0006"}} -{"edge":"ParticipatedIn","from":"actor-025","to":"decision-019","data":{"id":"part-0007"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-036","data":{"id":"part-0008"}} -{"edge":"ParticipatedIn","from":"actor-008","to":"decision-024","data":{"id":"part-0009"}} -{"edge":"ParticipatedIn","from":"actor-015","to":"decision-012","data":{"id":"part-0010"}} -{"edge":"ParticipatedIn","from":"actor-008","to":"decision-022","data":{"id":"part-0011"}} -{"edge":"ParticipatedIn","from":"actor-003","to":"decision-001","data":{"id":"part-0012"}} -{"edge":"ParticipatedIn","from":"actor-016","to":"decision-039","data":{"id":"part-0013"}} -{"edge":"ParticipatedIn","from":"actor-027","to":"decision-007","data":{"id":"part-0014"}} -{"edge":"ParticipatedIn","from":"actor-014","to":"decision-022","data":{"id":"part-0015"}} -{"edge":"ParticipatedIn","from":"actor-002","to":"decision-031","data":{"id":"part-0016"}} -{"edge":"ParticipatedIn","from":"actor-023","to":"decision-035","data":{"id":"part-0017"}} -{"edge":"ParticipatedIn","from":"actor-002","to":"decision-025","data":{"id":"part-0018"}} -{"edge":"ParticipatedIn","from":"actor-014","to":"decision-053","data":{"id":"part-0019"}} -{"edge":"ParticipatedIn","from":"actor-015","to":"decision-005","data":{"id":"part-0020"}} -{"edge":"ParticipatedIn","from":"actor-023","to":"decision-011","data":{"id":"part-0021"}} -{"edge":"ParticipatedIn","from":"actor-004","to":"decision-043","data":{"id":"part-0022"}} -{"edge":"ParticipatedIn","from":"actor-027","to":"decision-032","data":{"id":"part-0023"}} -{"edge":"ParticipatedIn","from":"actor-023","to":"decision-042","data":{"id":"part-0024"}} -{"edge":"ParticipatedIn","from":"actor-023","to":"decision-024","data":{"id":"part-0025"}} -{"edge":"ParticipatedIn","from":"actor-016","to":"decision-054","data":{"id":"part-0026"}} -{"edge":"ParticipatedIn","from":"actor-012","to":"decision-026","data":{"id":"part-0027"}} -{"edge":"ParticipatedIn","from":"actor-008","to":"decision-022","data":{"id":"part-0028"}} -{"edge":"ParticipatedIn","from":"actor-024","to":"decision-005","data":{"id":"part-0029"}} -{"edge":"ParticipatedIn","from":"actor-008","to":"decision-014","data":{"id":"part-0030"}} -{"edge":"ParticipatedIn","from":"actor-004","to":"decision-019","data":{"id":"part-0031"}} -{"edge":"ParticipatedIn","from":"actor-011","to":"decision-046","data":{"id":"part-0032"}} -{"edge":"ParticipatedIn","from":"actor-021","to":"decision-022","data":{"id":"part-0033"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-045","data":{"id":"part-0034"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-031","data":{"id":"part-0035"}} -{"edge":"ParticipatedIn","from":"actor-014","to":"decision-029","data":{"id":"part-0036"}} -{"edge":"ParticipatedIn","from":"actor-005","to":"decision-004","data":{"id":"part-0037"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-059","data":{"id":"part-0038"}} -{"edge":"ParticipatedIn","from":"actor-022","to":"decision-039","data":{"id":"part-0039"}} -{"edge":"ParticipatedIn","from":"actor-013","to":"decision-031","data":{"id":"part-0040"}} -{"edge":"ParticipatedIn","from":"actor-001","to":"decision-048","data":{"id":"part-0041"}} -{"edge":"ParticipatedIn","from":"actor-012","to":"decision-011","data":{"id":"part-0042"}} -{"edge":"ParticipatedIn","from":"actor-014","to":"decision-019","data":{"id":"part-0043"}} -{"edge":"ParticipatedIn","from":"actor-005","to":"decision-028","data":{"id":"part-0044"}} -{"edge":"ParticipatedIn","from":"actor-025","to":"decision-011","data":{"id":"part-0045"}} -{"edge":"ParticipatedIn","from":"actor-012","to":"decision-052","data":{"id":"part-0046"}} -{"edge":"ParticipatedIn","from":"actor-023","to":"decision-020","data":{"id":"part-0047"}} -{"edge":"ParticipatedIn","from":"actor-022","to":"decision-003","data":{"id":"part-0048"}} -{"edge":"ParticipatedIn","from":"actor-029","to":"decision-050","data":{"id":"part-0049"}} -{"edge":"ParticipatedIn","from":"actor-012","to":"decision-036","data":{"id":"part-0050"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-041","data":{"id":"part-0051"}} -{"edge":"ParticipatedIn","from":"actor-018","to":"decision-042","data":{"id":"part-0052"}} -{"edge":"ParticipatedIn","from":"actor-012","to":"decision-025","data":{"id":"part-0053"}} -{"edge":"ParticipatedIn","from":"actor-029","to":"decision-008","data":{"id":"part-0054"}} -{"edge":"ParticipatedIn","from":"actor-027","to":"decision-004","data":{"id":"part-0055"}} -{"edge":"ParticipatedIn","from":"actor-027","to":"decision-020","data":{"id":"part-0056"}} -{"edge":"ParticipatedIn","from":"actor-029","to":"decision-042","data":{"id":"part-0057"}} -{"edge":"ParticipatedIn","from":"actor-003","to":"decision-036","data":{"id":"part-0058"}} -{"edge":"ParticipatedIn","from":"actor-004","to":"decision-014","data":{"id":"part-0059"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-030","data":{"id":"part-0060"}} -{"edge":"ParticipatedIn","from":"actor-007","to":"decision-024","data":{"id":"part-0061"}} -{"edge":"ParticipatedIn","from":"actor-010","to":"decision-022","data":{"id":"part-0062"}} -{"edge":"ParticipatedIn","from":"actor-019","to":"decision-048","data":{"id":"part-0063"}} -{"edge":"ParticipatedIn","from":"actor-029","to":"decision-056","data":{"id":"part-0064"}} -{"edge":"ParticipatedIn","from":"actor-014","to":"decision-001","data":{"id":"part-0065"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-053","data":{"id":"part-0066"}} -{"edge":"ParticipatedIn","from":"actor-001","to":"decision-008","data":{"id":"part-0067"}} -{"edge":"ParticipatedIn","from":"actor-011","to":"decision-004","data":{"id":"part-0068"}} -{"edge":"ParticipatedIn","from":"actor-025","to":"decision-033","data":{"id":"part-0069"}} -{"edge":"ParticipatedIn","from":"actor-007","to":"decision-013","data":{"id":"part-0070"}} -{"edge":"ParticipatedIn","from":"actor-026","to":"decision-054","data":{"id":"part-0071"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-011","data":{"id":"part-0072"}} -{"edge":"ParticipatedIn","from":"actor-005","to":"decision-021","data":{"id":"part-0073"}} -{"edge":"ParticipatedIn","from":"actor-030","to":"decision-026","data":{"id":"part-0074"}} -{"edge":"ParticipatedIn","from":"actor-013","to":"decision-022","data":{"id":"part-0075"}} -{"edge":"ParticipatedIn","from":"actor-016","to":"decision-002","data":{"id":"part-0076"}} -{"edge":"ParticipatedIn","from":"actor-024","to":"decision-017","data":{"id":"part-0077"}} -{"edge":"ParticipatedIn","from":"actor-014","to":"decision-032","data":{"id":"part-0078"}} -{"edge":"ParticipatedIn","from":"actor-003","to":"decision-059","data":{"id":"part-0079"}} -{"edge":"ParticipatedIn","from":"actor-005","to":"decision-008","data":{"id":"part-0080"}} -{"edge":"ParticipatedIn","from":"actor-009","to":"decision-002","data":{"id":"part-0081"}} -{"edge":"ParticipatedIn","from":"actor-027","to":"decision-012","data":{"id":"part-0082"}} -{"edge":"ParticipatedIn","from":"actor-024","to":"decision-023","data":{"id":"part-0083"}} -{"edge":"ParticipatedIn","from":"actor-007","to":"decision-039","data":{"id":"part-0084"}} -{"edge":"ParticipatedIn","from":"actor-029","to":"decision-002","data":{"id":"part-0085"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-039","data":{"id":"part-0086"}} -{"edge":"ParticipatedIn","from":"actor-009","to":"decision-032","data":{"id":"part-0087"}} -{"edge":"ParticipatedIn","from":"actor-004","to":"decision-058","data":{"id":"part-0088"}} -{"edge":"ParticipatedIn","from":"actor-010","to":"decision-033","data":{"id":"part-0089"}} -{"edge":"ParticipatedIn","from":"actor-007","to":"decision-045","data":{"id":"part-0090"}} -{"edge":"ParticipatedIn","from":"actor-030","to":"decision-043","data":{"id":"part-0091"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-028","data":{"id":"part-0092"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-001","data":{"id":"part-0093"}} -{"edge":"ParticipatedIn","from":"actor-030","to":"decision-035","data":{"id":"part-0094"}} -{"edge":"ParticipatedIn","from":"actor-018","to":"decision-013","data":{"id":"part-0095"}} -{"edge":"ParticipatedIn","from":"actor-019","to":"decision-005","data":{"id":"part-0096"}} -{"edge":"ParticipatedIn","from":"actor-017","to":"decision-035","data":{"id":"part-0097"}} -{"edge":"ParticipatedIn","from":"actor-016","to":"decision-003","data":{"id":"part-0098"}} -{"edge":"ParticipatedIn","from":"actor-022","to":"decision-025","data":{"id":"part-0099"}} -{"edge":"ParticipatedIn","from":"actor-010","to":"decision-054","data":{"id":"part-0100"}} -{"edge":"ParticipatedIn","from":"actor-023","to":"decision-047","data":{"id":"part-0101"}} -{"edge":"ParticipatedIn","from":"actor-010","to":"decision-010","data":{"id":"part-0102"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-015","data":{"id":"part-0103"}} -{"edge":"ParticipatedIn","from":"actor-018","to":"decision-040","data":{"id":"part-0104"}} -{"edge":"ParticipatedIn","from":"actor-016","to":"decision-052","data":{"id":"part-0105"}} -{"edge":"ParticipatedIn","from":"actor-019","to":"decision-055","data":{"id":"part-0106"}} -{"edge":"ParticipatedIn","from":"actor-001","to":"decision-038","data":{"id":"part-0107"}} -{"edge":"ParticipatedIn","from":"actor-016","to":"decision-007","data":{"id":"part-0108"}} -{"edge":"ParticipatedIn","from":"actor-005","to":"decision-048","data":{"id":"part-0109"}} -{"edge":"ParticipatedIn","from":"actor-019","to":"decision-039","data":{"id":"part-0110"}} -{"edge":"ParticipatedIn","from":"actor-022","to":"decision-032","data":{"id":"part-0111"}} -{"edge":"ParticipatedIn","from":"actor-005","to":"decision-005","data":{"id":"part-0112"}} -{"edge":"ParticipatedIn","from":"actor-008","to":"decision-019","data":{"id":"part-0113"}} -{"edge":"ParticipatedIn","from":"actor-013","to":"decision-038","data":{"id":"part-0114"}} -{"edge":"ParticipatedIn","from":"actor-017","to":"decision-057","data":{"id":"part-0115"}} -{"edge":"ParticipatedIn","from":"actor-018","to":"decision-050","data":{"id":"part-0116"}} -{"edge":"ParticipatedIn","from":"actor-006","to":"decision-035","data":{"id":"part-0117"}} -{"edge":"ParticipatedIn","from":"actor-020","to":"decision-035","data":{"id":"part-0118"}} -{"edge":"ParticipatedIn","from":"actor-021","to":"decision-046","data":{"id":"part-0119"}} -{"edge":"ParticipatedIn","from":"actor-021","to":"decision-046","data":{"id":"part-0120"}} -{"edge":"Supports","from":"trace-021","to":"decision-043","data":{"id":"sup-0001","weight":null}} -{"edge":"Supports","from":"trace-086","to":"decision-008","data":{"id":"sup-0002","weight":0.996}} -{"edge":"Supports","from":"trace-019","to":"decision-002","data":{"id":"sup-0003","weight":0.62}} -{"edge":"Supports","from":"trace-025","to":"decision-043","data":{"id":"sup-0004","weight":null}} -{"edge":"Supports","from":"trace-082","to":"decision-027","data":{"id":"sup-0005","weight":0.803}} -{"edge":"Supports","from":"trace-089","to":"decision-031","data":{"id":"sup-0006","weight":0.111}} -{"edge":"Supports","from":"trace-088","to":"decision-046","data":{"id":"sup-0007","weight":0.307}} -{"edge":"Supports","from":"trace-064","to":"decision-049","data":{"id":"sup-0008","weight":0.621}} -{"edge":"Supports","from":"trace-040","to":"decision-043","data":{"id":"sup-0009","weight":null}} -{"edge":"Supports","from":"trace-046","to":"decision-015","data":{"id":"sup-0010","weight":null}} -{"edge":"Supports","from":"trace-024","to":"decision-002","data":{"id":"sup-0011","weight":0.584}} -{"edge":"Supports","from":"trace-023","to":"decision-020","data":{"id":"sup-0012","weight":0.009}} -{"edge":"Supports","from":"trace-002","to":"decision-017","data":{"id":"sup-0013","weight":0.701}} -{"edge":"Supports","from":"trace-044","to":"decision-002","data":{"id":"sup-0014","weight":null}} -{"edge":"Supports","from":"trace-016","to":"decision-045","data":{"id":"sup-0015","weight":0.382}} -{"edge":"Supports","from":"trace-042","to":"decision-014","data":{"id":"sup-0016","weight":0.852}} -{"edge":"Supports","from":"trace-049","to":"decision-014","data":{"id":"sup-0017","weight":0.57}} -{"edge":"Supports","from":"trace-019","to":"decision-011","data":{"id":"sup-0018","weight":0.122}} -{"edge":"Supports","from":"trace-089","to":"decision-002","data":{"id":"sup-0019","weight":0.69}} -{"edge":"Supports","from":"trace-060","to":"decision-021","data":{"id":"sup-0020","weight":0.7}} -{"edge":"Supports","from":"trace-071","to":"decision-011","data":{"id":"sup-0021","weight":0.595}} -{"edge":"Supports","from":"trace-034","to":"decision-012","data":{"id":"sup-0022","weight":0.908}} -{"edge":"Supports","from":"trace-055","to":"decision-059","data":{"id":"sup-0023","weight":0.845}} -{"edge":"Supports","from":"trace-004","to":"decision-049","data":{"id":"sup-0024","weight":0.922}} -{"edge":"Supports","from":"trace-081","to":"decision-022","data":{"id":"sup-0025","weight":0.563}} -{"edge":"Supports","from":"trace-069","to":"decision-003","data":{"id":"sup-0026","weight":null}} -{"edge":"Supports","from":"trace-089","to":"decision-028","data":{"id":"sup-0027","weight":0.008}} -{"edge":"Supports","from":"trace-003","to":"decision-047","data":{"id":"sup-0028","weight":0.866}} -{"edge":"Supports","from":"trace-035","to":"decision-007","data":{"id":"sup-0029","weight":0.238}} -{"edge":"Supports","from":"trace-067","to":"decision-056","data":{"id":"sup-0030","weight":0.613}} -{"edge":"Supports","from":"trace-053","to":"decision-051","data":{"id":"sup-0031","weight":0.339}} -{"edge":"Supports","from":"trace-048","to":"decision-012","data":{"id":"sup-0032","weight":0.662}} -{"edge":"Supports","from":"trace-038","to":"decision-029","data":{"id":"sup-0033","weight":0.94}} -{"edge":"Supports","from":"trace-040","to":"decision-001","data":{"id":"sup-0034","weight":0.889}} -{"edge":"Supports","from":"trace-056","to":"decision-013","data":{"id":"sup-0035","weight":0.09}} -{"edge":"Supports","from":"trace-014","to":"decision-036","data":{"id":"sup-0036","weight":0.09}} -{"edge":"Supports","from":"trace-030","to":"decision-020","data":{"id":"sup-0037","weight":0.903}} -{"edge":"Supports","from":"trace-058","to":"decision-026","data":{"id":"sup-0038","weight":0.293}} -{"edge":"Supports","from":"trace-022","to":"decision-006","data":{"id":"sup-0039","weight":0.524}} -{"edge":"Supports","from":"trace-050","to":"decision-033","data":{"id":"sup-0040","weight":0.532}} -{"edge":"Supports","from":"trace-044","to":"decision-010","data":{"id":"sup-0041","weight":0.797}} -{"edge":"Supports","from":"trace-084","to":"decision-054","data":{"id":"sup-0042","weight":0.967}} -{"edge":"Supports","from":"trace-005","to":"decision-033","data":{"id":"sup-0043","weight":0.424}} -{"edge":"Supports","from":"trace-020","to":"decision-044","data":{"id":"sup-0044","weight":0.023}} -{"edge":"Supports","from":"trace-027","to":"decision-001","data":{"id":"sup-0045","weight":0.775}} -{"edge":"Supports","from":"trace-004","to":"decision-040","data":{"id":"sup-0046","weight":0.886}} -{"edge":"Supports","from":"trace-080","to":"decision-056","data":{"id":"sup-0047","weight":0.186}} -{"edge":"Supports","from":"trace-055","to":"decision-051","data":{"id":"sup-0048","weight":0.01}} -{"edge":"Supports","from":"trace-022","to":"decision-015","data":{"id":"sup-0049","weight":0.54}} -{"edge":"Supports","from":"trace-055","to":"decision-052","data":{"id":"sup-0050","weight":0.69}} -{"edge":"Supports","from":"trace-011","to":"decision-059","data":{"id":"sup-0051","weight":0.486}} -{"edge":"Supports","from":"trace-015","to":"decision-010","data":{"id":"sup-0052","weight":0.431}} -{"edge":"Supports","from":"trace-051","to":"decision-022","data":{"id":"sup-0053","weight":0.002}} -{"edge":"Supports","from":"trace-089","to":"decision-045","data":{"id":"sup-0054","weight":0.381}} -{"edge":"Supports","from":"trace-013","to":"decision-011","data":{"id":"sup-0055","weight":0.413}} -{"edge":"Supports","from":"trace-090","to":"decision-020","data":{"id":"sup-0056","weight":0.114}} -{"edge":"Supports","from":"trace-019","to":"decision-020","data":{"id":"sup-0057","weight":0.995}} -{"edge":"Supports","from":"trace-029","to":"decision-040","data":{"id":"sup-0058","weight":0.527}} -{"edge":"Supports","from":"trace-054","to":"decision-017","data":{"id":"sup-0059","weight":0.396}} -{"edge":"Supports","from":"trace-071","to":"decision-038","data":{"id":"sup-0060","weight":null}} -{"edge":"Supports","from":"trace-017","to":"decision-023","data":{"id":"sup-0061","weight":null}} -{"edge":"Supports","from":"trace-078","to":"decision-008","data":{"id":"sup-0062","weight":0.329}} -{"edge":"Supports","from":"trace-080","to":"decision-032","data":{"id":"sup-0063","weight":0.756}} -{"edge":"Supports","from":"trace-049","to":"decision-026","data":{"id":"sup-0064","weight":null}} -{"edge":"Supports","from":"trace-014","to":"decision-053","data":{"id":"sup-0065","weight":0.583}} -{"edge":"Supports","from":"trace-086","to":"decision-018","data":{"id":"sup-0066","weight":0.818}} -{"edge":"Supports","from":"trace-072","to":"decision-052","data":{"id":"sup-0067","weight":0.2}} -{"edge":"Supports","from":"trace-043","to":"decision-031","data":{"id":"sup-0068","weight":null}} -{"edge":"Supports","from":"trace-070","to":"decision-007","data":{"id":"sup-0069","weight":0.136}} -{"edge":"Supports","from":"trace-071","to":"decision-025","data":{"id":"sup-0070","weight":0.763}} -{"edge":"Supports","from":"trace-066","to":"decision-024","data":{"id":"sup-0071","weight":0.769}} -{"edge":"Supports","from":"trace-033","to":"decision-041","data":{"id":"sup-0072","weight":null}} -{"edge":"Supports","from":"trace-088","to":"decision-032","data":{"id":"sup-0073","weight":0.386}} -{"edge":"Supports","from":"trace-043","to":"decision-044","data":{"id":"sup-0074","weight":0.635}} -{"edge":"Supports","from":"trace-089","to":"decision-017","data":{"id":"sup-0075","weight":0.301}} -{"edge":"Supports","from":"trace-019","to":"decision-006","data":{"id":"sup-0076","weight":0.798}} -{"edge":"Supports","from":"trace-009","to":"decision-039","data":{"id":"sup-0077","weight":0.578}} -{"edge":"Supports","from":"trace-059","to":"decision-012","data":{"id":"sup-0078","weight":0.423}} -{"edge":"Supports","from":"trace-057","to":"decision-052","data":{"id":"sup-0079","weight":0.54}} -{"edge":"Supports","from":"trace-047","to":"decision-036","data":{"id":"sup-0080","weight":null}} -{"edge":"Supports","from":"trace-072","to":"decision-001","data":{"id":"sup-0081","weight":0.677}} -{"edge":"Supports","from":"trace-072","to":"decision-048","data":{"id":"sup-0082","weight":null}} -{"edge":"Supports","from":"trace-027","to":"decision-028","data":{"id":"sup-0083","weight":0.902}} -{"edge":"Supports","from":"trace-030","to":"decision-001","data":{"id":"sup-0084","weight":0.918}} -{"edge":"Supports","from":"trace-056","to":"decision-023","data":{"id":"sup-0085","weight":0.827}} -{"edge":"Supports","from":"trace-006","to":"decision-054","data":{"id":"sup-0086","weight":0.541}} -{"edge":"Supports","from":"trace-056","to":"decision-007","data":{"id":"sup-0087","weight":null}} -{"edge":"Supports","from":"trace-006","to":"decision-058","data":{"id":"sup-0088","weight":0.115}} -{"edge":"Supports","from":"trace-067","to":"decision-057","data":{"id":"sup-0089","weight":0.194}} -{"edge":"Supports","from":"trace-068","to":"decision-016","data":{"id":"sup-0090","weight":0.776}} -{"edge":"Supports","from":"trace-037","to":"decision-060","data":{"id":"sup-0091","weight":0.066}} -{"edge":"Supports","from":"trace-034","to":"decision-014","data":{"id":"sup-0092","weight":0.873}} -{"edge":"Supports","from":"trace-016","to":"decision-008","data":{"id":"sup-0093","weight":0.347}} -{"edge":"Supports","from":"trace-089","to":"decision-026","data":{"id":"sup-0094","weight":0.647}} -{"edge":"Supports","from":"trace-028","to":"decision-053","data":{"id":"sup-0095","weight":0.106}} -{"edge":"Supports","from":"trace-030","to":"decision-034","data":{"id":"sup-0096","weight":null}} -{"edge":"Supports","from":"trace-037","to":"decision-015","data":{"id":"sup-0097","weight":0.735}} -{"edge":"Supports","from":"trace-010","to":"decision-013","data":{"id":"sup-0098","weight":0.816}} -{"edge":"Supports","from":"trace-086","to":"decision-003","data":{"id":"sup-0099","weight":0.197}} -{"edge":"Supports","from":"trace-060","to":"decision-050","data":{"id":"sup-0100","weight":0.881}} -{"edge":"Supports","from":"trace-013","to":"decision-027","data":{"id":"sup-0101","weight":0.228}} -{"edge":"Supports","from":"trace-004","to":"decision-053","data":{"id":"sup-0102","weight":0.404}} -{"edge":"Supports","from":"trace-045","to":"decision-040","data":{"id":"sup-0103","weight":0.741}} -{"edge":"Supports","from":"trace-017","to":"decision-016","data":{"id":"sup-0104","weight":0.014}} -{"edge":"Supports","from":"trace-001","to":"decision-024","data":{"id":"sup-0105","weight":null}} -{"edge":"Supports","from":"trace-024","to":"decision-024","data":{"id":"sup-0106","weight":0.116}} -{"edge":"Supports","from":"trace-012","to":"decision-025","data":{"id":"sup-0107","weight":null}} -{"edge":"Supports","from":"trace-013","to":"decision-018","data":{"id":"sup-0108","weight":0.948}} -{"edge":"Supports","from":"trace-027","to":"decision-043","data":{"id":"sup-0109","weight":null}} -{"edge":"Supports","from":"trace-053","to":"decision-002","data":{"id":"sup-0110","weight":0.663}} -{"edge":"Triggered","from":"signal-007","to":"decision-040","data":{"id":"trig-0001"}} -{"edge":"Triggered","from":"signal-056","to":"decision-021","data":{"id":"trig-0002"}} -{"edge":"Triggered","from":"signal-013","to":"decision-056","data":{"id":"trig-0003"}} -{"edge":"Triggered","from":"signal-056","to":"decision-055","data":{"id":"trig-0004"}} -{"edge":"Triggered","from":"signal-039","to":"decision-012","data":{"id":"trig-0005"}} -{"edge":"Triggered","from":"signal-002","to":"decision-017","data":{"id":"trig-0006"}} -{"edge":"Triggered","from":"signal-018","to":"decision-050","data":{"id":"trig-0007"}} -{"edge":"Triggered","from":"signal-048","to":"decision-052","data":{"id":"trig-0008"}} -{"edge":"Triggered","from":"signal-004","to":"decision-011","data":{"id":"trig-0009"}} -{"edge":"Triggered","from":"signal-047","to":"decision-055","data":{"id":"trig-0010"}} -{"edge":"Triggered","from":"signal-042","to":"decision-021","data":{"id":"trig-0011"}} -{"edge":"Triggered","from":"signal-025","to":"decision-019","data":{"id":"trig-0012"}} -{"edge":"Triggered","from":"signal-054","to":"decision-057","data":{"id":"trig-0013"}} -{"edge":"Triggered","from":"signal-023","to":"decision-001","data":{"id":"trig-0014"}} -{"edge":"Triggered","from":"signal-049","to":"decision-017","data":{"id":"trig-0015"}} -{"edge":"Triggered","from":"signal-053","to":"decision-056","data":{"id":"trig-0016"}} -{"edge":"Triggered","from":"signal-022","to":"decision-042","data":{"id":"trig-0017"}} -{"edge":"Triggered","from":"signal-035","to":"decision-018","data":{"id":"trig-0018"}} -{"edge":"Triggered","from":"signal-058","to":"decision-049","data":{"id":"trig-0019"}} -{"edge":"Triggered","from":"signal-057","to":"decision-057","data":{"id":"trig-0020"}} -{"edge":"Triggered","from":"signal-040","to":"decision-047","data":{"id":"trig-0021"}} -{"edge":"Triggered","from":"signal-049","to":"decision-003","data":{"id":"trig-0022"}} -{"edge":"Triggered","from":"signal-049","to":"decision-007","data":{"id":"trig-0023"}} -{"edge":"Triggered","from":"signal-018","to":"decision-042","data":{"id":"trig-0024"}} -{"edge":"Triggered","from":"signal-052","to":"decision-021","data":{"id":"trig-0025"}} -{"edge":"Triggered","from":"signal-009","to":"decision-043","data":{"id":"trig-0026"}} -{"edge":"Triggered","from":"signal-054","to":"decision-012","data":{"id":"trig-0027"}} -{"edge":"Triggered","from":"signal-058","to":"decision-060","data":{"id":"trig-0028"}} -{"edge":"Triggered","from":"signal-043","to":"decision-019","data":{"id":"trig-0029"}} -{"edge":"Triggered","from":"signal-056","to":"decision-005","data":{"id":"trig-0030"}} -{"edge":"Triggered","from":"signal-039","to":"decision-024","data":{"id":"trig-0031"}} -{"edge":"Triggered","from":"signal-050","to":"decision-013","data":{"id":"trig-0032"}} -{"edge":"Triggered","from":"signal-026","to":"decision-059","data":{"id":"trig-0033"}} -{"edge":"Triggered","from":"signal-049","to":"decision-010","data":{"id":"trig-0034"}} -{"edge":"Triggered","from":"signal-037","to":"decision-007","data":{"id":"trig-0035"}} -{"edge":"Triggered","from":"signal-031","to":"decision-050","data":{"id":"trig-0036"}} -{"edge":"Triggered","from":"signal-016","to":"decision-002","data":{"id":"trig-0037"}} -{"edge":"Triggered","from":"signal-029","to":"decision-044","data":{"id":"trig-0038"}} -{"edge":"Triggered","from":"signal-010","to":"decision-046","data":{"id":"trig-0039"}} -{"edge":"Triggered","from":"signal-049","to":"decision-031","data":{"id":"trig-0040"}} -{"edge":"Triggered","from":"signal-032","to":"decision-017","data":{"id":"trig-0041"}} -{"edge":"Triggered","from":"signal-049","to":"decision-029","data":{"id":"trig-0042"}} -{"edge":"Triggered","from":"signal-037","to":"decision-002","data":{"id":"trig-0043"}} -{"edge":"Triggered","from":"signal-058","to":"decision-047","data":{"id":"trig-0044"}} -{"edge":"Triggered","from":"signal-047","to":"decision-036","data":{"id":"trig-0045"}} -{"edge":"Triggered","from":"signal-058","to":"decision-050","data":{"id":"trig-0046"}} -{"edge":"Triggered","from":"signal-051","to":"decision-014","data":{"id":"trig-0047"}} -{"edge":"Triggered","from":"signal-055","to":"decision-059","data":{"id":"trig-0048"}} -{"edge":"Triggered","from":"signal-019","to":"decision-025","data":{"id":"trig-0049"}} -{"edge":"Triggered","from":"signal-053","to":"decision-006","data":{"id":"trig-0050"}} -{"edge":"Triggered","from":"signal-039","to":"decision-055","data":{"id":"trig-0051"}} -{"edge":"Triggered","from":"signal-015","to":"decision-003","data":{"id":"trig-0052"}} -{"edge":"Triggered","from":"signal-056","to":"decision-038","data":{"id":"trig-0053"}} -{"edge":"Triggered","from":"signal-054","to":"decision-001","data":{"id":"trig-0054"}} -{"edge":"Triggered","from":"signal-003","to":"decision-030","data":{"id":"trig-0055"}} -{"edge":"Triggered","from":"signal-037","to":"decision-003","data":{"id":"trig-0056"}} -{"edge":"Triggered","from":"signal-054","to":"decision-004","data":{"id":"trig-0057"}} -{"edge":"Triggered","from":"signal-055","to":"decision-002","data":{"id":"trig-0058"}} -{"edge":"Triggered","from":"signal-048","to":"decision-035","data":{"id":"trig-0059"}} -{"edge":"Triggered","from":"signal-021","to":"decision-030","data":{"id":"trig-0060"}} -{"edge":"Triggered","from":"signal-058","to":"decision-024","data":{"id":"trig-0061"}} -{"edge":"Triggered","from":"signal-036","to":"decision-055","data":{"id":"trig-0062"}} -{"edge":"Triggered","from":"signal-032","to":"decision-003","data":{"id":"trig-0063"}} -{"edge":"Triggered","from":"signal-019","to":"decision-023","data":{"id":"trig-0064"}} -{"edge":"Triggered","from":"signal-045","to":"decision-046","data":{"id":"trig-0065"}} -{"edge":"Triggered","from":"signal-022","to":"decision-037","data":{"id":"trig-0066"}} -{"edge":"Triggered","from":"signal-050","to":"decision-023","data":{"id":"trig-0067"}} -{"edge":"Triggered","from":"signal-026","to":"decision-044","data":{"id":"trig-0068"}} -{"edge":"Triggered","from":"signal-025","to":"decision-025","data":{"id":"trig-0069"}} -{"edge":"Triggered","from":"signal-009","to":"decision-033","data":{"id":"trig-0070"}} -{"edge":"Correlates","from":"signal-041","to":"signal-057","data":{"id":"corr-0001","confidence":0.79}} -{"edge":"Correlates","from":"signal-021","to":"signal-052","data":{"id":"corr-0002","confidence":0.46}} -{"edge":"Correlates","from":"signal-022","to":"signal-060","data":{"id":"corr-0003","confidence":0.03}} -{"edge":"Correlates","from":"signal-027","to":"signal-033","data":{"id":"corr-0004","confidence":0.06}} -{"edge":"Correlates","from":"signal-034","to":"signal-010","data":{"id":"corr-0005","confidence":0.85}} -{"edge":"Correlates","from":"signal-028","to":"signal-007","data":{"id":"corr-0006","confidence":0.97}} -{"edge":"Correlates","from":"signal-005","to":"signal-044","data":{"id":"corr-0007","confidence":0.35}} -{"edge":"Correlates","from":"signal-033","to":"signal-014","data":{"id":"corr-0008","confidence":0.32}} -{"edge":"Correlates","from":"signal-031","to":"signal-033","data":{"id":"corr-0009","confidence":0.27}} -{"edge":"Correlates","from":"signal-004","to":"signal-001","data":{"id":"corr-0010","confidence":0.86}} -{"edge":"Correlates","from":"signal-034","to":"signal-044","data":{"id":"corr-0011","confidence":0.09}} -{"edge":"Correlates","from":"signal-013","to":"signal-012","data":{"id":"corr-0012","confidence":0.14}} -{"edge":"Correlates","from":"signal-055","to":"signal-008","data":{"id":"corr-0013","confidence":0.77}} -{"edge":"Correlates","from":"signal-034","to":"signal-035","data":{"id":"corr-0014","confidence":0.41}} -{"edge":"Correlates","from":"signal-017","to":"signal-033","data":{"id":"corr-0015","confidence":0.6}} -{"edge":"Correlates","from":"signal-049","to":"signal-055","data":{"id":"corr-0016","confidence":0}} -{"edge":"Correlates","from":"signal-043","to":"signal-020","data":{"id":"corr-0017","confidence":0.65}} -{"edge":"Correlates","from":"signal-039","to":"signal-055","data":{"id":"corr-0018","confidence":0.45}} -{"edge":"Correlates","from":"signal-018","to":"signal-060","data":{"id":"corr-0019","confidence":0.69}} -{"edge":"Correlates","from":"signal-005","to":"signal-004","data":{"id":"corr-0020","confidence":0.21}} -{"edge":"Correlates","from":"signal-027","to":"signal-005","data":{"id":"corr-0021","confidence":0.32}} -{"edge":"Correlates","from":"signal-036","to":"signal-004","data":{"id":"corr-0022","confidence":0.29}} -{"edge":"Correlates","from":"signal-039","to":"signal-052","data":{"id":"corr-0023","confidence":0.65}} -{"edge":"Correlates","from":"signal-001","to":"signal-007","data":{"id":"corr-0024","confidence":0.46}} -{"edge":"Correlates","from":"signal-032","to":"signal-043","data":{"id":"corr-0025","confidence":1}} -{"edge":"Correlates","from":"signal-046","to":"signal-029","data":{"id":"corr-0026","confidence":0.31}} -{"edge":"Correlates","from":"signal-031","to":"signal-045","data":{"id":"corr-0027","confidence":0.48}} -{"edge":"Correlates","from":"signal-010","to":"signal-044","data":{"id":"corr-0028","confidence":0.42}} -{"edge":"Correlates","from":"signal-053","to":"signal-047","data":{"id":"corr-0029","confidence":0.84}} -{"edge":"Correlates","from":"signal-030","to":"signal-035","data":{"id":"corr-0030","confidence":0.12}} -{"edge":"Correlates","from":"signal-022","to":"signal-059","data":{"id":"corr-0031","confidence":0.09}} -{"edge":"Correlates","from":"signal-005","to":"signal-006","data":{"id":"corr-0032","confidence":0.89}} -{"edge":"Correlates","from":"signal-003","to":"signal-044","data":{"id":"corr-0033","confidence":0.11}} -{"edge":"Correlates","from":"signal-017","to":"signal-026","data":{"id":"corr-0034","confidence":0.84}} -{"edge":"Correlates","from":"signal-004","to":"signal-057","data":{"id":"corr-0035","confidence":0.83}} -{"edge":"Correlates","from":"signal-002","to":"signal-007","data":{"id":"corr-0036","confidence":0.61}} -{"edge":"Correlates","from":"signal-011","to":"signal-022","data":{"id":"corr-0037","confidence":0.05}} -{"edge":"Correlates","from":"signal-057","to":"signal-053","data":{"id":"corr-0038","confidence":0.28}} -{"edge":"Correlates","from":"signal-048","to":"signal-016","data":{"id":"corr-0039","confidence":0.71}} -{"edge":"Correlates","from":"signal-056","to":"signal-060","data":{"id":"corr-0040","confidence":0.02}} -{"edge":"Correlates","from":"signal-014","to":"signal-021","data":{"id":"corr-0041","confidence":0.97}} -{"edge":"Correlates","from":"signal-034","to":"signal-037","data":{"id":"corr-0042","confidence":0.14}} -{"edge":"Correlates","from":"signal-046","to":"signal-044","data":{"id":"corr-0043","confidence":0.04}} -{"edge":"Correlates","from":"signal-031","to":"signal-020","data":{"id":"corr-0044","confidence":0.95}} -{"edge":"Correlates","from":"signal-051","to":"signal-033","data":{"id":"corr-0045","confidence":0.07}} -{"edge":"Correlates","from":"signal-032","to":"signal-036","data":{"id":"corr-0046","confidence":0.04}} -{"edge":"Correlates","from":"signal-047","to":"signal-003","data":{"id":"corr-0047","confidence":0.15}} -{"edge":"Correlates","from":"signal-052","to":"signal-049","data":{"id":"corr-0048","confidence":0.08}} -{"edge":"Correlates","from":"signal-008","to":"signal-053","data":{"id":"corr-0049","confidence":0.15}} -{"edge":"Correlates","from":"signal-044","to":"signal-055","data":{"id":"corr-0050","confidence":0.38}} +{"edge":"OwnedBy","id":"own-0001","from":"decision-001","to":"actor-001","data":{}} +{"edge":"OwnedBy","id":"own-0002","from":"decision-002","to":"actor-002","data":{}} +{"edge":"OwnedBy","id":"own-0003","from":"decision-003","to":"actor-003","data":{}} +{"edge":"OwnedBy","id":"own-0004","from":"decision-004","to":"actor-004","data":{}} +{"edge":"OwnedBy","id":"own-0005","from":"decision-005","to":"actor-005","data":{}} +{"edge":"OwnedBy","id":"own-0006","from":"decision-006","to":"actor-006","data":{}} +{"edge":"OwnedBy","id":"own-0007","from":"decision-007","to":"actor-007","data":{}} +{"edge":"OwnedBy","id":"own-0008","from":"decision-008","to":"actor-008","data":{}} +{"edge":"OwnedBy","id":"own-0009","from":"decision-009","to":"actor-009","data":{}} +{"edge":"OwnedBy","id":"own-0010","from":"decision-010","to":"actor-010","data":{}} +{"edge":"OwnedBy","id":"own-0011","from":"decision-011","to":"actor-011","data":{}} +{"edge":"OwnedBy","id":"own-0012","from":"decision-012","to":"actor-012","data":{}} +{"edge":"OwnedBy","id":"own-0013","from":"decision-013","to":"actor-013","data":{}} +{"edge":"OwnedBy","id":"own-0014","from":"decision-014","to":"actor-014","data":{}} +{"edge":"OwnedBy","id":"own-0015","from":"decision-015","to":"actor-015","data":{}} +{"edge":"OwnedBy","id":"own-0016","from":"decision-016","to":"actor-016","data":{}} +{"edge":"OwnedBy","id":"own-0017","from":"decision-017","to":"actor-017","data":{}} +{"edge":"OwnedBy","id":"own-0018","from":"decision-018","to":"actor-018","data":{}} +{"edge":"OwnedBy","id":"own-0019","from":"decision-019","to":"actor-019","data":{}} +{"edge":"OwnedBy","id":"own-0020","from":"decision-020","to":"actor-020","data":{}} +{"edge":"OwnedBy","id":"own-0021","from":"decision-021","to":"actor-021","data":{}} +{"edge":"OwnedBy","id":"own-0022","from":"decision-022","to":"actor-022","data":{}} +{"edge":"OwnedBy","id":"own-0023","from":"decision-023","to":"actor-023","data":{}} +{"edge":"OwnedBy","id":"own-0024","from":"decision-024","to":"actor-024","data":{}} +{"edge":"OwnedBy","id":"own-0025","from":"decision-025","to":"actor-025","data":{}} +{"edge":"OwnedBy","id":"own-0026","from":"decision-026","to":"actor-026","data":{}} +{"edge":"OwnedBy","id":"own-0027","from":"decision-027","to":"actor-027","data":{}} +{"edge":"OwnedBy","id":"own-0028","from":"decision-028","to":"actor-028","data":{}} +{"edge":"OwnedBy","id":"own-0029","from":"decision-029","to":"actor-029","data":{}} +{"edge":"OwnedBy","id":"own-0030","from":"decision-030","to":"actor-030","data":{}} +{"edge":"OwnedBy","id":"own-0031","from":"decision-031","to":"actor-001","data":{}} +{"edge":"OwnedBy","id":"own-0032","from":"decision-032","to":"actor-002","data":{}} +{"edge":"OwnedBy","id":"own-0033","from":"decision-033","to":"actor-003","data":{}} +{"edge":"OwnedBy","id":"own-0034","from":"decision-034","to":"actor-004","data":{}} +{"edge":"OwnedBy","id":"own-0035","from":"decision-035","to":"actor-005","data":{}} +{"edge":"OwnedBy","id":"own-0036","from":"decision-036","to":"actor-006","data":{}} +{"edge":"OwnedBy","id":"own-0037","from":"decision-037","to":"actor-007","data":{}} +{"edge":"OwnedBy","id":"own-0038","from":"decision-038","to":"actor-008","data":{}} +{"edge":"OwnedBy","id":"own-0039","from":"decision-039","to":"actor-009","data":{}} +{"edge":"OwnedBy","id":"own-0040","from":"decision-040","to":"actor-010","data":{}} +{"edge":"OwnedBy","id":"own-0041","from":"decision-041","to":"actor-011","data":{}} +{"edge":"OwnedBy","id":"own-0042","from":"decision-042","to":"actor-012","data":{}} +{"edge":"OwnedBy","id":"own-0043","from":"decision-043","to":"actor-013","data":{}} +{"edge":"OwnedBy","id":"own-0044","from":"decision-044","to":"actor-014","data":{}} +{"edge":"OwnedBy","id":"own-0045","from":"decision-045","to":"actor-015","data":{}} +{"edge":"OwnedBy","id":"own-0046","from":"decision-046","to":"actor-016","data":{}} +{"edge":"OwnedBy","id":"own-0047","from":"decision-047","to":"actor-017","data":{}} +{"edge":"OwnedBy","id":"own-0048","from":"decision-048","to":"actor-018","data":{}} +{"edge":"OwnedBy","id":"own-0049","from":"decision-049","to":"actor-019","data":{}} +{"edge":"OwnedBy","id":"own-0050","from":"decision-050","to":"actor-020","data":{}} +{"edge":"OwnedBy","id":"own-0051","from":"decision-051","to":"actor-021","data":{}} +{"edge":"OwnedBy","id":"own-0052","from":"decision-052","to":"actor-022","data":{}} +{"edge":"OwnedBy","id":"own-0053","from":"decision-053","to":"actor-023","data":{}} +{"edge":"OwnedBy","id":"own-0054","from":"decision-054","to":"actor-024","data":{}} +{"edge":"OwnedBy","id":"own-0055","from":"decision-055","to":"actor-025","data":{}} +{"edge":"OwnedBy","id":"own-0056","from":"decision-056","to":"actor-026","data":{}} +{"edge":"OwnedBy","id":"own-0057","from":"decision-057","to":"actor-027","data":{}} +{"edge":"OwnedBy","id":"own-0058","from":"decision-058","to":"actor-028","data":{}} +{"edge":"OwnedBy","id":"own-0059","from":"decision-059","to":"actor-029","data":{}} +{"edge":"OwnedBy","id":"own-0060","from":"decision-060","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0001","from":"trace-001","to":"actor-001","data":{}} +{"edge":"RecordedBy","id":"rec-0002","from":"trace-002","to":"actor-008","data":{}} +{"edge":"RecordedBy","id":"rec-0003","from":"trace-003","to":"actor-015","data":{}} +{"edge":"RecordedBy","id":"rec-0004","from":"trace-004","to":"actor-022","data":{}} +{"edge":"RecordedBy","id":"rec-0005","from":"trace-005","to":"actor-029","data":{}} +{"edge":"RecordedBy","id":"rec-0006","from":"trace-006","to":"actor-006","data":{}} +{"edge":"RecordedBy","id":"rec-0007","from":"trace-007","to":"actor-013","data":{}} +{"edge":"RecordedBy","id":"rec-0008","from":"trace-008","to":"actor-020","data":{}} +{"edge":"RecordedBy","id":"rec-0009","from":"trace-009","to":"actor-027","data":{}} +{"edge":"RecordedBy","id":"rec-0010","from":"trace-010","to":"actor-004","data":{}} +{"edge":"RecordedBy","id":"rec-0011","from":"trace-011","to":"actor-011","data":{}} +{"edge":"RecordedBy","id":"rec-0012","from":"trace-012","to":"actor-018","data":{}} +{"edge":"RecordedBy","id":"rec-0013","from":"trace-013","to":"actor-025","data":{}} +{"edge":"RecordedBy","id":"rec-0014","from":"trace-014","to":"actor-002","data":{}} +{"edge":"RecordedBy","id":"rec-0015","from":"trace-015","to":"actor-009","data":{}} +{"edge":"RecordedBy","id":"rec-0016","from":"trace-016","to":"actor-016","data":{}} +{"edge":"RecordedBy","id":"rec-0017","from":"trace-017","to":"actor-023","data":{}} +{"edge":"RecordedBy","id":"rec-0018","from":"trace-018","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0019","from":"trace-019","to":"actor-007","data":{}} +{"edge":"RecordedBy","id":"rec-0020","from":"trace-020","to":"actor-014","data":{}} +{"edge":"RecordedBy","id":"rec-0021","from":"trace-021","to":"actor-021","data":{}} +{"edge":"RecordedBy","id":"rec-0022","from":"trace-022","to":"actor-028","data":{}} +{"edge":"RecordedBy","id":"rec-0023","from":"trace-023","to":"actor-005","data":{}} +{"edge":"RecordedBy","id":"rec-0024","from":"trace-024","to":"actor-012","data":{}} +{"edge":"RecordedBy","id":"rec-0025","from":"trace-025","to":"actor-019","data":{}} +{"edge":"RecordedBy","id":"rec-0026","from":"trace-026","to":"actor-026","data":{}} +{"edge":"RecordedBy","id":"rec-0027","from":"trace-027","to":"actor-003","data":{}} +{"edge":"RecordedBy","id":"rec-0028","from":"trace-028","to":"actor-010","data":{}} +{"edge":"RecordedBy","id":"rec-0029","from":"trace-029","to":"actor-017","data":{}} +{"edge":"RecordedBy","id":"rec-0030","from":"trace-030","to":"actor-024","data":{}} +{"edge":"RecordedBy","id":"rec-0031","from":"trace-031","to":"actor-001","data":{}} +{"edge":"RecordedBy","id":"rec-0032","from":"trace-032","to":"actor-008","data":{}} +{"edge":"RecordedBy","id":"rec-0033","from":"trace-033","to":"actor-015","data":{}} +{"edge":"RecordedBy","id":"rec-0034","from":"trace-034","to":"actor-022","data":{}} +{"edge":"RecordedBy","id":"rec-0035","from":"trace-035","to":"actor-029","data":{}} +{"edge":"RecordedBy","id":"rec-0036","from":"trace-036","to":"actor-006","data":{}} +{"edge":"RecordedBy","id":"rec-0037","from":"trace-037","to":"actor-013","data":{}} +{"edge":"RecordedBy","id":"rec-0038","from":"trace-038","to":"actor-020","data":{}} +{"edge":"RecordedBy","id":"rec-0039","from":"trace-039","to":"actor-027","data":{}} +{"edge":"RecordedBy","id":"rec-0040","from":"trace-040","to":"actor-004","data":{}} +{"edge":"RecordedBy","id":"rec-0041","from":"trace-041","to":"actor-011","data":{}} +{"edge":"RecordedBy","id":"rec-0042","from":"trace-042","to":"actor-018","data":{}} +{"edge":"RecordedBy","id":"rec-0043","from":"trace-043","to":"actor-025","data":{}} +{"edge":"RecordedBy","id":"rec-0044","from":"trace-044","to":"actor-002","data":{}} +{"edge":"RecordedBy","id":"rec-0045","from":"trace-045","to":"actor-009","data":{}} +{"edge":"RecordedBy","id":"rec-0046","from":"trace-046","to":"actor-016","data":{}} +{"edge":"RecordedBy","id":"rec-0047","from":"trace-047","to":"actor-023","data":{}} +{"edge":"RecordedBy","id":"rec-0048","from":"trace-048","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0049","from":"trace-049","to":"actor-007","data":{}} +{"edge":"RecordedBy","id":"rec-0050","from":"trace-050","to":"actor-014","data":{}} +{"edge":"RecordedBy","id":"rec-0051","from":"trace-051","to":"actor-021","data":{}} +{"edge":"RecordedBy","id":"rec-0052","from":"trace-052","to":"actor-028","data":{}} +{"edge":"RecordedBy","id":"rec-0053","from":"trace-053","to":"actor-005","data":{}} +{"edge":"RecordedBy","id":"rec-0054","from":"trace-054","to":"actor-012","data":{}} +{"edge":"RecordedBy","id":"rec-0055","from":"trace-055","to":"actor-019","data":{}} +{"edge":"RecordedBy","id":"rec-0056","from":"trace-056","to":"actor-026","data":{}} +{"edge":"RecordedBy","id":"rec-0057","from":"trace-057","to":"actor-003","data":{}} +{"edge":"RecordedBy","id":"rec-0058","from":"trace-058","to":"actor-010","data":{}} +{"edge":"RecordedBy","id":"rec-0059","from":"trace-059","to":"actor-017","data":{}} +{"edge":"RecordedBy","id":"rec-0060","from":"trace-060","to":"actor-024","data":{}} +{"edge":"RecordedBy","id":"rec-0061","from":"trace-061","to":"actor-001","data":{}} +{"edge":"RecordedBy","id":"rec-0062","from":"trace-062","to":"actor-008","data":{}} +{"edge":"RecordedBy","id":"rec-0063","from":"trace-063","to":"actor-015","data":{}} +{"edge":"RecordedBy","id":"rec-0064","from":"trace-064","to":"actor-022","data":{}} +{"edge":"RecordedBy","id":"rec-0065","from":"trace-065","to":"actor-029","data":{}} +{"edge":"RecordedBy","id":"rec-0066","from":"trace-066","to":"actor-006","data":{}} +{"edge":"RecordedBy","id":"rec-0067","from":"trace-067","to":"actor-013","data":{}} +{"edge":"RecordedBy","id":"rec-0068","from":"trace-068","to":"actor-020","data":{}} +{"edge":"RecordedBy","id":"rec-0069","from":"trace-069","to":"actor-027","data":{}} +{"edge":"RecordedBy","id":"rec-0070","from":"trace-070","to":"actor-004","data":{}} +{"edge":"RecordedBy","id":"rec-0071","from":"trace-071","to":"actor-011","data":{}} +{"edge":"RecordedBy","id":"rec-0072","from":"trace-072","to":"actor-018","data":{}} +{"edge":"RecordedBy","id":"rec-0073","from":"trace-073","to":"actor-025","data":{}} +{"edge":"RecordedBy","id":"rec-0074","from":"trace-074","to":"actor-002","data":{}} +{"edge":"RecordedBy","id":"rec-0075","from":"trace-075","to":"actor-009","data":{}} +{"edge":"RecordedBy","id":"rec-0076","from":"trace-076","to":"actor-016","data":{}} +{"edge":"RecordedBy","id":"rec-0077","from":"trace-077","to":"actor-023","data":{}} +{"edge":"RecordedBy","id":"rec-0078","from":"trace-078","to":"actor-030","data":{}} +{"edge":"RecordedBy","id":"rec-0079","from":"trace-079","to":"actor-007","data":{}} +{"edge":"RecordedBy","id":"rec-0080","from":"trace-080","to":"actor-014","data":{}} +{"edge":"RecordedBy","id":"rec-0081","from":"trace-081","to":"actor-021","data":{}} +{"edge":"RecordedBy","id":"rec-0082","from":"trace-082","to":"actor-028","data":{}} +{"edge":"RecordedBy","id":"rec-0083","from":"trace-083","to":"actor-005","data":{}} +{"edge":"RecordedBy","id":"rec-0084","from":"trace-084","to":"actor-012","data":{}} +{"edge":"RecordedBy","id":"rec-0085","from":"trace-085","to":"actor-019","data":{}} +{"edge":"RecordedBy","id":"rec-0086","from":"trace-086","to":"actor-026","data":{}} +{"edge":"RecordedBy","id":"rec-0087","from":"trace-087","to":"actor-003","data":{}} +{"edge":"RecordedBy","id":"rec-0088","from":"trace-088","to":"actor-010","data":{}} +{"edge":"RecordedBy","id":"rec-0089","from":"trace-089","to":"actor-017","data":{}} +{"edge":"RecordedBy","id":"rec-0090","from":"trace-090","to":"actor-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0001","from":"actor-021","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0002","from":"actor-017","to":"decision-015","data":{}} +{"edge":"ParticipatedIn","id":"part-0003","from":"actor-020","to":"decision-038","data":{}} +{"edge":"ParticipatedIn","id":"part-0004","from":"actor-010","to":"decision-018","data":{}} +{"edge":"ParticipatedIn","id":"part-0005","from":"actor-006","to":"decision-027","data":{}} +{"edge":"ParticipatedIn","id":"part-0006","from":"actor-012","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0007","from":"actor-025","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0008","from":"actor-006","to":"decision-036","data":{}} +{"edge":"ParticipatedIn","id":"part-0009","from":"actor-008","to":"decision-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0010","from":"actor-015","to":"decision-012","data":{}} +{"edge":"ParticipatedIn","id":"part-0011","from":"actor-008","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0012","from":"actor-003","to":"decision-001","data":{}} +{"edge":"ParticipatedIn","id":"part-0013","from":"actor-016","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0014","from":"actor-027","to":"decision-007","data":{}} +{"edge":"ParticipatedIn","id":"part-0015","from":"actor-014","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0016","from":"actor-002","to":"decision-031","data":{}} +{"edge":"ParticipatedIn","id":"part-0017","from":"actor-023","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0018","from":"actor-002","to":"decision-025","data":{}} +{"edge":"ParticipatedIn","id":"part-0019","from":"actor-014","to":"decision-053","data":{}} +{"edge":"ParticipatedIn","id":"part-0020","from":"actor-015","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0021","from":"actor-023","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0022","from":"actor-004","to":"decision-043","data":{}} +{"edge":"ParticipatedIn","id":"part-0023","from":"actor-027","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0024","from":"actor-023","to":"decision-042","data":{}} +{"edge":"ParticipatedIn","id":"part-0025","from":"actor-023","to":"decision-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0026","from":"actor-016","to":"decision-054","data":{}} +{"edge":"ParticipatedIn","id":"part-0027","from":"actor-012","to":"decision-026","data":{}} +{"edge":"ParticipatedIn","id":"part-0028","from":"actor-008","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0029","from":"actor-024","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0030","from":"actor-008","to":"decision-014","data":{}} +{"edge":"ParticipatedIn","id":"part-0031","from":"actor-004","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0032","from":"actor-011","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0033","from":"actor-021","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0034","from":"actor-020","to":"decision-045","data":{}} +{"edge":"ParticipatedIn","id":"part-0035","from":"actor-020","to":"decision-031","data":{}} +{"edge":"ParticipatedIn","id":"part-0036","from":"actor-014","to":"decision-029","data":{}} +{"edge":"ParticipatedIn","id":"part-0037","from":"actor-005","to":"decision-004","data":{}} +{"edge":"ParticipatedIn","id":"part-0038","from":"actor-006","to":"decision-059","data":{}} +{"edge":"ParticipatedIn","id":"part-0039","from":"actor-022","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0040","from":"actor-013","to":"decision-031","data":{}} +{"edge":"ParticipatedIn","id":"part-0041","from":"actor-001","to":"decision-048","data":{}} +{"edge":"ParticipatedIn","id":"part-0042","from":"actor-012","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0043","from":"actor-014","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0044","from":"actor-005","to":"decision-028","data":{}} +{"edge":"ParticipatedIn","id":"part-0045","from":"actor-025","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0046","from":"actor-012","to":"decision-052","data":{}} +{"edge":"ParticipatedIn","id":"part-0047","from":"actor-023","to":"decision-020","data":{}} +{"edge":"ParticipatedIn","id":"part-0048","from":"actor-022","to":"decision-003","data":{}} +{"edge":"ParticipatedIn","id":"part-0049","from":"actor-029","to":"decision-050","data":{}} +{"edge":"ParticipatedIn","id":"part-0050","from":"actor-012","to":"decision-036","data":{}} +{"edge":"ParticipatedIn","id":"part-0051","from":"actor-020","to":"decision-041","data":{}} +{"edge":"ParticipatedIn","id":"part-0052","from":"actor-018","to":"decision-042","data":{}} +{"edge":"ParticipatedIn","id":"part-0053","from":"actor-012","to":"decision-025","data":{}} +{"edge":"ParticipatedIn","id":"part-0054","from":"actor-029","to":"decision-008","data":{}} +{"edge":"ParticipatedIn","id":"part-0055","from":"actor-027","to":"decision-004","data":{}} +{"edge":"ParticipatedIn","id":"part-0056","from":"actor-027","to":"decision-020","data":{}} +{"edge":"ParticipatedIn","id":"part-0057","from":"actor-029","to":"decision-042","data":{}} +{"edge":"ParticipatedIn","id":"part-0058","from":"actor-003","to":"decision-036","data":{}} +{"edge":"ParticipatedIn","id":"part-0059","from":"actor-004","to":"decision-014","data":{}} +{"edge":"ParticipatedIn","id":"part-0060","from":"actor-020","to":"decision-030","data":{}} +{"edge":"ParticipatedIn","id":"part-0061","from":"actor-007","to":"decision-024","data":{}} +{"edge":"ParticipatedIn","id":"part-0062","from":"actor-010","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0063","from":"actor-019","to":"decision-048","data":{}} +{"edge":"ParticipatedIn","id":"part-0064","from":"actor-029","to":"decision-056","data":{}} +{"edge":"ParticipatedIn","id":"part-0065","from":"actor-014","to":"decision-001","data":{}} +{"edge":"ParticipatedIn","id":"part-0066","from":"actor-020","to":"decision-053","data":{}} +{"edge":"ParticipatedIn","id":"part-0067","from":"actor-001","to":"decision-008","data":{}} +{"edge":"ParticipatedIn","id":"part-0068","from":"actor-011","to":"decision-004","data":{}} +{"edge":"ParticipatedIn","id":"part-0069","from":"actor-025","to":"decision-033","data":{}} +{"edge":"ParticipatedIn","id":"part-0070","from":"actor-007","to":"decision-013","data":{}} +{"edge":"ParticipatedIn","id":"part-0071","from":"actor-026","to":"decision-054","data":{}} +{"edge":"ParticipatedIn","id":"part-0072","from":"actor-006","to":"decision-011","data":{}} +{"edge":"ParticipatedIn","id":"part-0073","from":"actor-005","to":"decision-021","data":{}} +{"edge":"ParticipatedIn","id":"part-0074","from":"actor-030","to":"decision-026","data":{}} +{"edge":"ParticipatedIn","id":"part-0075","from":"actor-013","to":"decision-022","data":{}} +{"edge":"ParticipatedIn","id":"part-0076","from":"actor-016","to":"decision-002","data":{}} +{"edge":"ParticipatedIn","id":"part-0077","from":"actor-024","to":"decision-017","data":{}} +{"edge":"ParticipatedIn","id":"part-0078","from":"actor-014","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0079","from":"actor-003","to":"decision-059","data":{}} +{"edge":"ParticipatedIn","id":"part-0080","from":"actor-005","to":"decision-008","data":{}} +{"edge":"ParticipatedIn","id":"part-0081","from":"actor-009","to":"decision-002","data":{}} +{"edge":"ParticipatedIn","id":"part-0082","from":"actor-027","to":"decision-012","data":{}} +{"edge":"ParticipatedIn","id":"part-0083","from":"actor-024","to":"decision-023","data":{}} +{"edge":"ParticipatedIn","id":"part-0084","from":"actor-007","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0085","from":"actor-029","to":"decision-002","data":{}} +{"edge":"ParticipatedIn","id":"part-0086","from":"actor-006","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0087","from":"actor-009","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0088","from":"actor-004","to":"decision-058","data":{}} +{"edge":"ParticipatedIn","id":"part-0089","from":"actor-010","to":"decision-033","data":{}} +{"edge":"ParticipatedIn","id":"part-0090","from":"actor-007","to":"decision-045","data":{}} +{"edge":"ParticipatedIn","id":"part-0091","from":"actor-030","to":"decision-043","data":{}} +{"edge":"ParticipatedIn","id":"part-0092","from":"actor-006","to":"decision-028","data":{}} +{"edge":"ParticipatedIn","id":"part-0093","from":"actor-006","to":"decision-001","data":{}} +{"edge":"ParticipatedIn","id":"part-0094","from":"actor-030","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0095","from":"actor-018","to":"decision-013","data":{}} +{"edge":"ParticipatedIn","id":"part-0096","from":"actor-019","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0097","from":"actor-017","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0098","from":"actor-016","to":"decision-003","data":{}} +{"edge":"ParticipatedIn","id":"part-0099","from":"actor-022","to":"decision-025","data":{}} +{"edge":"ParticipatedIn","id":"part-0100","from":"actor-010","to":"decision-054","data":{}} +{"edge":"ParticipatedIn","id":"part-0101","from":"actor-023","to":"decision-047","data":{}} +{"edge":"ParticipatedIn","id":"part-0102","from":"actor-010","to":"decision-010","data":{}} +{"edge":"ParticipatedIn","id":"part-0103","from":"actor-020","to":"decision-015","data":{}} +{"edge":"ParticipatedIn","id":"part-0104","from":"actor-018","to":"decision-040","data":{}} +{"edge":"ParticipatedIn","id":"part-0105","from":"actor-016","to":"decision-052","data":{}} +{"edge":"ParticipatedIn","id":"part-0106","from":"actor-019","to":"decision-055","data":{}} +{"edge":"ParticipatedIn","id":"part-0107","from":"actor-001","to":"decision-038","data":{}} +{"edge":"ParticipatedIn","id":"part-0108","from":"actor-016","to":"decision-007","data":{}} +{"edge":"ParticipatedIn","id":"part-0109","from":"actor-005","to":"decision-048","data":{}} +{"edge":"ParticipatedIn","id":"part-0110","from":"actor-019","to":"decision-039","data":{}} +{"edge":"ParticipatedIn","id":"part-0111","from":"actor-022","to":"decision-032","data":{}} +{"edge":"ParticipatedIn","id":"part-0112","from":"actor-005","to":"decision-005","data":{}} +{"edge":"ParticipatedIn","id":"part-0113","from":"actor-008","to":"decision-019","data":{}} +{"edge":"ParticipatedIn","id":"part-0114","from":"actor-013","to":"decision-038","data":{}} +{"edge":"ParticipatedIn","id":"part-0115","from":"actor-017","to":"decision-057","data":{}} +{"edge":"ParticipatedIn","id":"part-0116","from":"actor-018","to":"decision-050","data":{}} +{"edge":"ParticipatedIn","id":"part-0117","from":"actor-006","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0118","from":"actor-020","to":"decision-035","data":{}} +{"edge":"ParticipatedIn","id":"part-0119","from":"actor-021","to":"decision-046","data":{}} +{"edge":"ParticipatedIn","id":"part-0120","from":"actor-021","to":"decision-046","data":{}} +{"edge":"Supports","id":"sup-0001","from":"trace-021","to":"decision-043","data":{"weight":null}} +{"edge":"Supports","id":"sup-0002","from":"trace-086","to":"decision-008","data":{"weight":0.996}} +{"edge":"Supports","id":"sup-0003","from":"trace-019","to":"decision-002","data":{"weight":0.62}} +{"edge":"Supports","id":"sup-0004","from":"trace-025","to":"decision-043","data":{"weight":null}} +{"edge":"Supports","id":"sup-0005","from":"trace-082","to":"decision-027","data":{"weight":0.803}} +{"edge":"Supports","id":"sup-0006","from":"trace-089","to":"decision-031","data":{"weight":0.111}} +{"edge":"Supports","id":"sup-0007","from":"trace-088","to":"decision-046","data":{"weight":0.307}} +{"edge":"Supports","id":"sup-0008","from":"trace-064","to":"decision-049","data":{"weight":0.621}} +{"edge":"Supports","id":"sup-0009","from":"trace-040","to":"decision-043","data":{"weight":null}} +{"edge":"Supports","id":"sup-0010","from":"trace-046","to":"decision-015","data":{"weight":null}} +{"edge":"Supports","id":"sup-0011","from":"trace-024","to":"decision-002","data":{"weight":0.584}} +{"edge":"Supports","id":"sup-0012","from":"trace-023","to":"decision-020","data":{"weight":0.009}} +{"edge":"Supports","id":"sup-0013","from":"trace-002","to":"decision-017","data":{"weight":0.701}} +{"edge":"Supports","id":"sup-0014","from":"trace-044","to":"decision-002","data":{"weight":null}} +{"edge":"Supports","id":"sup-0015","from":"trace-016","to":"decision-045","data":{"weight":0.382}} +{"edge":"Supports","id":"sup-0016","from":"trace-042","to":"decision-014","data":{"weight":0.852}} +{"edge":"Supports","id":"sup-0017","from":"trace-049","to":"decision-014","data":{"weight":0.57}} +{"edge":"Supports","id":"sup-0018","from":"trace-019","to":"decision-011","data":{"weight":0.122}} +{"edge":"Supports","id":"sup-0019","from":"trace-089","to":"decision-002","data":{"weight":0.69}} +{"edge":"Supports","id":"sup-0020","from":"trace-060","to":"decision-021","data":{"weight":0.7}} +{"edge":"Supports","id":"sup-0021","from":"trace-071","to":"decision-011","data":{"weight":0.595}} +{"edge":"Supports","id":"sup-0022","from":"trace-034","to":"decision-012","data":{"weight":0.908}} +{"edge":"Supports","id":"sup-0023","from":"trace-055","to":"decision-059","data":{"weight":0.845}} +{"edge":"Supports","id":"sup-0024","from":"trace-004","to":"decision-049","data":{"weight":0.922}} +{"edge":"Supports","id":"sup-0025","from":"trace-081","to":"decision-022","data":{"weight":0.563}} +{"edge":"Supports","id":"sup-0026","from":"trace-069","to":"decision-003","data":{"weight":null}} +{"edge":"Supports","id":"sup-0027","from":"trace-089","to":"decision-028","data":{"weight":0.008}} +{"edge":"Supports","id":"sup-0028","from":"trace-003","to":"decision-047","data":{"weight":0.866}} +{"edge":"Supports","id":"sup-0029","from":"trace-035","to":"decision-007","data":{"weight":0.238}} +{"edge":"Supports","id":"sup-0030","from":"trace-067","to":"decision-056","data":{"weight":0.613}} +{"edge":"Supports","id":"sup-0031","from":"trace-053","to":"decision-051","data":{"weight":0.339}} +{"edge":"Supports","id":"sup-0032","from":"trace-048","to":"decision-012","data":{"weight":0.662}} +{"edge":"Supports","id":"sup-0033","from":"trace-038","to":"decision-029","data":{"weight":0.94}} +{"edge":"Supports","id":"sup-0034","from":"trace-040","to":"decision-001","data":{"weight":0.889}} +{"edge":"Supports","id":"sup-0035","from":"trace-056","to":"decision-013","data":{"weight":0.09}} +{"edge":"Supports","id":"sup-0036","from":"trace-014","to":"decision-036","data":{"weight":0.09}} +{"edge":"Supports","id":"sup-0037","from":"trace-030","to":"decision-020","data":{"weight":0.903}} +{"edge":"Supports","id":"sup-0038","from":"trace-058","to":"decision-026","data":{"weight":0.293}} +{"edge":"Supports","id":"sup-0039","from":"trace-022","to":"decision-006","data":{"weight":0.524}} +{"edge":"Supports","id":"sup-0040","from":"trace-050","to":"decision-033","data":{"weight":0.532}} +{"edge":"Supports","id":"sup-0041","from":"trace-044","to":"decision-010","data":{"weight":0.797}} +{"edge":"Supports","id":"sup-0042","from":"trace-084","to":"decision-054","data":{"weight":0.967}} +{"edge":"Supports","id":"sup-0043","from":"trace-005","to":"decision-033","data":{"weight":0.424}} +{"edge":"Supports","id":"sup-0044","from":"trace-020","to":"decision-044","data":{"weight":0.023}} +{"edge":"Supports","id":"sup-0045","from":"trace-027","to":"decision-001","data":{"weight":0.775}} +{"edge":"Supports","id":"sup-0046","from":"trace-004","to":"decision-040","data":{"weight":0.886}} +{"edge":"Supports","id":"sup-0047","from":"trace-080","to":"decision-056","data":{"weight":0.186}} +{"edge":"Supports","id":"sup-0048","from":"trace-055","to":"decision-051","data":{"weight":0.01}} +{"edge":"Supports","id":"sup-0049","from":"trace-022","to":"decision-015","data":{"weight":0.54}} +{"edge":"Supports","id":"sup-0050","from":"trace-055","to":"decision-052","data":{"weight":0.69}} +{"edge":"Supports","id":"sup-0051","from":"trace-011","to":"decision-059","data":{"weight":0.486}} +{"edge":"Supports","id":"sup-0052","from":"trace-015","to":"decision-010","data":{"weight":0.431}} +{"edge":"Supports","id":"sup-0053","from":"trace-051","to":"decision-022","data":{"weight":0.002}} +{"edge":"Supports","id":"sup-0054","from":"trace-089","to":"decision-045","data":{"weight":0.381}} +{"edge":"Supports","id":"sup-0055","from":"trace-013","to":"decision-011","data":{"weight":0.413}} +{"edge":"Supports","id":"sup-0056","from":"trace-090","to":"decision-020","data":{"weight":0.114}} +{"edge":"Supports","id":"sup-0057","from":"trace-019","to":"decision-020","data":{"weight":0.995}} +{"edge":"Supports","id":"sup-0058","from":"trace-029","to":"decision-040","data":{"weight":0.527}} +{"edge":"Supports","id":"sup-0059","from":"trace-054","to":"decision-017","data":{"weight":0.396}} +{"edge":"Supports","id":"sup-0060","from":"trace-071","to":"decision-038","data":{"weight":null}} +{"edge":"Supports","id":"sup-0061","from":"trace-017","to":"decision-023","data":{"weight":null}} +{"edge":"Supports","id":"sup-0062","from":"trace-078","to":"decision-008","data":{"weight":0.329}} +{"edge":"Supports","id":"sup-0063","from":"trace-080","to":"decision-032","data":{"weight":0.756}} +{"edge":"Supports","id":"sup-0064","from":"trace-049","to":"decision-026","data":{"weight":null}} +{"edge":"Supports","id":"sup-0065","from":"trace-014","to":"decision-053","data":{"weight":0.583}} +{"edge":"Supports","id":"sup-0066","from":"trace-086","to":"decision-018","data":{"weight":0.818}} +{"edge":"Supports","id":"sup-0067","from":"trace-072","to":"decision-052","data":{"weight":0.2}} +{"edge":"Supports","id":"sup-0068","from":"trace-043","to":"decision-031","data":{"weight":null}} +{"edge":"Supports","id":"sup-0069","from":"trace-070","to":"decision-007","data":{"weight":0.136}} +{"edge":"Supports","id":"sup-0070","from":"trace-071","to":"decision-025","data":{"weight":0.763}} +{"edge":"Supports","id":"sup-0071","from":"trace-066","to":"decision-024","data":{"weight":0.769}} +{"edge":"Supports","id":"sup-0072","from":"trace-033","to":"decision-041","data":{"weight":null}} +{"edge":"Supports","id":"sup-0073","from":"trace-088","to":"decision-032","data":{"weight":0.386}} +{"edge":"Supports","id":"sup-0074","from":"trace-043","to":"decision-044","data":{"weight":0.635}} +{"edge":"Supports","id":"sup-0075","from":"trace-089","to":"decision-017","data":{"weight":0.301}} +{"edge":"Supports","id":"sup-0076","from":"trace-019","to":"decision-006","data":{"weight":0.798}} +{"edge":"Supports","id":"sup-0077","from":"trace-009","to":"decision-039","data":{"weight":0.578}} +{"edge":"Supports","id":"sup-0078","from":"trace-059","to":"decision-012","data":{"weight":0.423}} +{"edge":"Supports","id":"sup-0079","from":"trace-057","to":"decision-052","data":{"weight":0.54}} +{"edge":"Supports","id":"sup-0080","from":"trace-047","to":"decision-036","data":{"weight":null}} +{"edge":"Supports","id":"sup-0081","from":"trace-072","to":"decision-001","data":{"weight":0.677}} +{"edge":"Supports","id":"sup-0082","from":"trace-072","to":"decision-048","data":{"weight":null}} +{"edge":"Supports","id":"sup-0083","from":"trace-027","to":"decision-028","data":{"weight":0.902}} +{"edge":"Supports","id":"sup-0084","from":"trace-030","to":"decision-001","data":{"weight":0.918}} +{"edge":"Supports","id":"sup-0085","from":"trace-056","to":"decision-023","data":{"weight":0.827}} +{"edge":"Supports","id":"sup-0086","from":"trace-006","to":"decision-054","data":{"weight":0.541}} +{"edge":"Supports","id":"sup-0087","from":"trace-056","to":"decision-007","data":{"weight":null}} +{"edge":"Supports","id":"sup-0088","from":"trace-006","to":"decision-058","data":{"weight":0.115}} +{"edge":"Supports","id":"sup-0089","from":"trace-067","to":"decision-057","data":{"weight":0.194}} +{"edge":"Supports","id":"sup-0090","from":"trace-068","to":"decision-016","data":{"weight":0.776}} +{"edge":"Supports","id":"sup-0091","from":"trace-037","to":"decision-060","data":{"weight":0.066}} +{"edge":"Supports","id":"sup-0092","from":"trace-034","to":"decision-014","data":{"weight":0.873}} +{"edge":"Supports","id":"sup-0093","from":"trace-016","to":"decision-008","data":{"weight":0.347}} +{"edge":"Supports","id":"sup-0094","from":"trace-089","to":"decision-026","data":{"weight":0.647}} +{"edge":"Supports","id":"sup-0095","from":"trace-028","to":"decision-053","data":{"weight":0.106}} +{"edge":"Supports","id":"sup-0096","from":"trace-030","to":"decision-034","data":{"weight":null}} +{"edge":"Supports","id":"sup-0097","from":"trace-037","to":"decision-015","data":{"weight":0.735}} +{"edge":"Supports","id":"sup-0098","from":"trace-010","to":"decision-013","data":{"weight":0.816}} +{"edge":"Supports","id":"sup-0099","from":"trace-086","to":"decision-003","data":{"weight":0.197}} +{"edge":"Supports","id":"sup-0100","from":"trace-060","to":"decision-050","data":{"weight":0.881}} +{"edge":"Supports","id":"sup-0101","from":"trace-013","to":"decision-027","data":{"weight":0.228}} +{"edge":"Supports","id":"sup-0102","from":"trace-004","to":"decision-053","data":{"weight":0.404}} +{"edge":"Supports","id":"sup-0103","from":"trace-045","to":"decision-040","data":{"weight":0.741}} +{"edge":"Supports","id":"sup-0104","from":"trace-017","to":"decision-016","data":{"weight":0.014}} +{"edge":"Supports","id":"sup-0105","from":"trace-001","to":"decision-024","data":{"weight":null}} +{"edge":"Supports","id":"sup-0106","from":"trace-024","to":"decision-024","data":{"weight":0.116}} +{"edge":"Supports","id":"sup-0107","from":"trace-012","to":"decision-025","data":{"weight":null}} +{"edge":"Supports","id":"sup-0108","from":"trace-013","to":"decision-018","data":{"weight":0.948}} +{"edge":"Supports","id":"sup-0109","from":"trace-027","to":"decision-043","data":{"weight":null}} +{"edge":"Supports","id":"sup-0110","from":"trace-053","to":"decision-002","data":{"weight":0.663}} +{"edge":"Triggered","id":"trig-0001","from":"signal-007","to":"decision-040","data":{}} +{"edge":"Triggered","id":"trig-0002","from":"signal-056","to":"decision-021","data":{}} +{"edge":"Triggered","id":"trig-0003","from":"signal-013","to":"decision-056","data":{}} +{"edge":"Triggered","id":"trig-0004","from":"signal-056","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0005","from":"signal-039","to":"decision-012","data":{}} +{"edge":"Triggered","id":"trig-0006","from":"signal-002","to":"decision-017","data":{}} +{"edge":"Triggered","id":"trig-0007","from":"signal-018","to":"decision-050","data":{}} +{"edge":"Triggered","id":"trig-0008","from":"signal-048","to":"decision-052","data":{}} +{"edge":"Triggered","id":"trig-0009","from":"signal-004","to":"decision-011","data":{}} +{"edge":"Triggered","id":"trig-0010","from":"signal-047","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0011","from":"signal-042","to":"decision-021","data":{}} +{"edge":"Triggered","id":"trig-0012","from":"signal-025","to":"decision-019","data":{}} +{"edge":"Triggered","id":"trig-0013","from":"signal-054","to":"decision-057","data":{}} +{"edge":"Triggered","id":"trig-0014","from":"signal-023","to":"decision-001","data":{}} +{"edge":"Triggered","id":"trig-0015","from":"signal-049","to":"decision-017","data":{}} +{"edge":"Triggered","id":"trig-0016","from":"signal-053","to":"decision-056","data":{}} +{"edge":"Triggered","id":"trig-0017","from":"signal-022","to":"decision-042","data":{}} +{"edge":"Triggered","id":"trig-0018","from":"signal-035","to":"decision-018","data":{}} +{"edge":"Triggered","id":"trig-0019","from":"signal-058","to":"decision-049","data":{}} +{"edge":"Triggered","id":"trig-0020","from":"signal-057","to":"decision-057","data":{}} +{"edge":"Triggered","id":"trig-0021","from":"signal-040","to":"decision-047","data":{}} +{"edge":"Triggered","id":"trig-0022","from":"signal-049","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0023","from":"signal-049","to":"decision-007","data":{}} +{"edge":"Triggered","id":"trig-0024","from":"signal-018","to":"decision-042","data":{}} +{"edge":"Triggered","id":"trig-0025","from":"signal-052","to":"decision-021","data":{}} +{"edge":"Triggered","id":"trig-0026","from":"signal-009","to":"decision-043","data":{}} +{"edge":"Triggered","id":"trig-0027","from":"signal-054","to":"decision-012","data":{}} +{"edge":"Triggered","id":"trig-0028","from":"signal-058","to":"decision-060","data":{}} +{"edge":"Triggered","id":"trig-0029","from":"signal-043","to":"decision-019","data":{}} +{"edge":"Triggered","id":"trig-0030","from":"signal-056","to":"decision-005","data":{}} +{"edge":"Triggered","id":"trig-0031","from":"signal-039","to":"decision-024","data":{}} +{"edge":"Triggered","id":"trig-0032","from":"signal-050","to":"decision-013","data":{}} +{"edge":"Triggered","id":"trig-0033","from":"signal-026","to":"decision-059","data":{}} +{"edge":"Triggered","id":"trig-0034","from":"signal-049","to":"decision-010","data":{}} +{"edge":"Triggered","id":"trig-0035","from":"signal-037","to":"decision-007","data":{}} +{"edge":"Triggered","id":"trig-0036","from":"signal-031","to":"decision-050","data":{}} +{"edge":"Triggered","id":"trig-0037","from":"signal-016","to":"decision-002","data":{}} +{"edge":"Triggered","id":"trig-0038","from":"signal-029","to":"decision-044","data":{}} +{"edge":"Triggered","id":"trig-0039","from":"signal-010","to":"decision-046","data":{}} +{"edge":"Triggered","id":"trig-0040","from":"signal-049","to":"decision-031","data":{}} +{"edge":"Triggered","id":"trig-0041","from":"signal-032","to":"decision-017","data":{}} +{"edge":"Triggered","id":"trig-0042","from":"signal-049","to":"decision-029","data":{}} +{"edge":"Triggered","id":"trig-0043","from":"signal-037","to":"decision-002","data":{}} +{"edge":"Triggered","id":"trig-0044","from":"signal-058","to":"decision-047","data":{}} +{"edge":"Triggered","id":"trig-0045","from":"signal-047","to":"decision-036","data":{}} +{"edge":"Triggered","id":"trig-0046","from":"signal-058","to":"decision-050","data":{}} +{"edge":"Triggered","id":"trig-0047","from":"signal-051","to":"decision-014","data":{}} +{"edge":"Triggered","id":"trig-0048","from":"signal-055","to":"decision-059","data":{}} +{"edge":"Triggered","id":"trig-0049","from":"signal-019","to":"decision-025","data":{}} +{"edge":"Triggered","id":"trig-0050","from":"signal-053","to":"decision-006","data":{}} +{"edge":"Triggered","id":"trig-0051","from":"signal-039","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0052","from":"signal-015","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0053","from":"signal-056","to":"decision-038","data":{}} +{"edge":"Triggered","id":"trig-0054","from":"signal-054","to":"decision-001","data":{}} +{"edge":"Triggered","id":"trig-0055","from":"signal-003","to":"decision-030","data":{}} +{"edge":"Triggered","id":"trig-0056","from":"signal-037","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0057","from":"signal-054","to":"decision-004","data":{}} +{"edge":"Triggered","id":"trig-0058","from":"signal-055","to":"decision-002","data":{}} +{"edge":"Triggered","id":"trig-0059","from":"signal-048","to":"decision-035","data":{}} +{"edge":"Triggered","id":"trig-0060","from":"signal-021","to":"decision-030","data":{}} +{"edge":"Triggered","id":"trig-0061","from":"signal-058","to":"decision-024","data":{}} +{"edge":"Triggered","id":"trig-0062","from":"signal-036","to":"decision-055","data":{}} +{"edge":"Triggered","id":"trig-0063","from":"signal-032","to":"decision-003","data":{}} +{"edge":"Triggered","id":"trig-0064","from":"signal-019","to":"decision-023","data":{}} +{"edge":"Triggered","id":"trig-0065","from":"signal-045","to":"decision-046","data":{}} +{"edge":"Triggered","id":"trig-0066","from":"signal-022","to":"decision-037","data":{}} +{"edge":"Triggered","id":"trig-0067","from":"signal-050","to":"decision-023","data":{}} +{"edge":"Triggered","id":"trig-0068","from":"signal-026","to":"decision-044","data":{}} +{"edge":"Triggered","id":"trig-0069","from":"signal-025","to":"decision-025","data":{}} +{"edge":"Triggered","id":"trig-0070","from":"signal-009","to":"decision-033","data":{}} +{"edge":"Correlates","id":"corr-0001","from":"signal-041","to":"signal-057","data":{"confidence":0.79}} +{"edge":"Correlates","id":"corr-0002","from":"signal-021","to":"signal-052","data":{"confidence":0.46}} +{"edge":"Correlates","id":"corr-0003","from":"signal-022","to":"signal-060","data":{"confidence":0.03}} +{"edge":"Correlates","id":"corr-0004","from":"signal-027","to":"signal-033","data":{"confidence":0.06}} +{"edge":"Correlates","id":"corr-0005","from":"signal-034","to":"signal-010","data":{"confidence":0.85}} +{"edge":"Correlates","id":"corr-0006","from":"signal-028","to":"signal-007","data":{"confidence":0.97}} +{"edge":"Correlates","id":"corr-0007","from":"signal-005","to":"signal-044","data":{"confidence":0.35}} +{"edge":"Correlates","id":"corr-0008","from":"signal-033","to":"signal-014","data":{"confidence":0.32}} +{"edge":"Correlates","id":"corr-0009","from":"signal-031","to":"signal-033","data":{"confidence":0.27}} +{"edge":"Correlates","id":"corr-0010","from":"signal-004","to":"signal-001","data":{"confidence":0.86}} +{"edge":"Correlates","id":"corr-0011","from":"signal-034","to":"signal-044","data":{"confidence":0.09}} +{"edge":"Correlates","id":"corr-0012","from":"signal-013","to":"signal-012","data":{"confidence":0.14}} +{"edge":"Correlates","id":"corr-0013","from":"signal-055","to":"signal-008","data":{"confidence":0.77}} +{"edge":"Correlates","id":"corr-0014","from":"signal-034","to":"signal-035","data":{"confidence":0.41}} +{"edge":"Correlates","id":"corr-0015","from":"signal-017","to":"signal-033","data":{"confidence":0.6}} +{"edge":"Correlates","id":"corr-0016","from":"signal-049","to":"signal-055","data":{"confidence":0}} +{"edge":"Correlates","id":"corr-0017","from":"signal-043","to":"signal-020","data":{"confidence":0.65}} +{"edge":"Correlates","id":"corr-0018","from":"signal-039","to":"signal-055","data":{"confidence":0.45}} +{"edge":"Correlates","id":"corr-0019","from":"signal-018","to":"signal-060","data":{"confidence":0.69}} +{"edge":"Correlates","id":"corr-0020","from":"signal-005","to":"signal-004","data":{"confidence":0.21}} +{"edge":"Correlates","id":"corr-0021","from":"signal-027","to":"signal-005","data":{"confidence":0.32}} +{"edge":"Correlates","id":"corr-0022","from":"signal-036","to":"signal-004","data":{"confidence":0.29}} +{"edge":"Correlates","id":"corr-0023","from":"signal-039","to":"signal-052","data":{"confidence":0.65}} +{"edge":"Correlates","id":"corr-0024","from":"signal-001","to":"signal-007","data":{"confidence":0.46}} +{"edge":"Correlates","id":"corr-0025","from":"signal-032","to":"signal-043","data":{"confidence":1}} +{"edge":"Correlates","id":"corr-0026","from":"signal-046","to":"signal-029","data":{"confidence":0.31}} +{"edge":"Correlates","id":"corr-0027","from":"signal-031","to":"signal-045","data":{"confidence":0.48}} +{"edge":"Correlates","id":"corr-0028","from":"signal-010","to":"signal-044","data":{"confidence":0.42}} +{"edge":"Correlates","id":"corr-0029","from":"signal-053","to":"signal-047","data":{"confidence":0.84}} +{"edge":"Correlates","id":"corr-0030","from":"signal-030","to":"signal-035","data":{"confidence":0.12}} +{"edge":"Correlates","id":"corr-0031","from":"signal-022","to":"signal-059","data":{"confidence":0.09}} +{"edge":"Correlates","id":"corr-0032","from":"signal-005","to":"signal-006","data":{"confidence":0.89}} +{"edge":"Correlates","id":"corr-0033","from":"signal-003","to":"signal-044","data":{"confidence":0.11}} +{"edge":"Correlates","id":"corr-0034","from":"signal-017","to":"signal-026","data":{"confidence":0.84}} +{"edge":"Correlates","id":"corr-0035","from":"signal-004","to":"signal-057","data":{"confidence":0.83}} +{"edge":"Correlates","id":"corr-0036","from":"signal-002","to":"signal-007","data":{"confidence":0.61}} +{"edge":"Correlates","id":"corr-0037","from":"signal-011","to":"signal-022","data":{"confidence":0.05}} +{"edge":"Correlates","id":"corr-0038","from":"signal-057","to":"signal-053","data":{"confidence":0.28}} +{"edge":"Correlates","id":"corr-0039","from":"signal-048","to":"signal-016","data":{"confidence":0.71}} +{"edge":"Correlates","id":"corr-0040","from":"signal-056","to":"signal-060","data":{"confidence":0.02}} +{"edge":"Correlates","id":"corr-0041","from":"signal-014","to":"signal-021","data":{"confidence":0.97}} +{"edge":"Correlates","id":"corr-0042","from":"signal-034","to":"signal-037","data":{"confidence":0.14}} +{"edge":"Correlates","id":"corr-0043","from":"signal-046","to":"signal-044","data":{"confidence":0.04}} +{"edge":"Correlates","id":"corr-0044","from":"signal-031","to":"signal-020","data":{"confidence":0.95}} +{"edge":"Correlates","id":"corr-0045","from":"signal-051","to":"signal-033","data":{"confidence":0.07}} +{"edge":"Correlates","id":"corr-0046","from":"signal-032","to":"signal-036","data":{"confidence":0.04}} +{"edge":"Correlates","id":"corr-0047","from":"signal-047","to":"signal-003","data":{"confidence":0.15}} +{"edge":"Correlates","id":"corr-0048","from":"signal-052","to":"signal-049","data":{"confidence":0.08}} +{"edge":"Correlates","id":"corr-0049","from":"signal-008","to":"signal-053","data":{"confidence":0.15}} +{"edge":"Correlates","id":"corr-0050","from":"signal-044","to":"signal-055","data":{"confidence":0.38}} diff --git a/package.json b/package.json index be117a6..8c3802a 100644 --- a/package.json +++ b/package.json @@ -25,14 +25,17 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", - "@changesets/cli": "^2.31.1", - "esbuild": "^0.28.1", - "eslint": "^10.7.0", - "publint": "^0.3.21", - "tsup": "^8.5.1", - "typescript": "^5.6.0", - "typescript-eslint": "^8.65.0", - "vitest": "^3.0.0" + "@changesets/cli": "^3.0.3", + "esbuild": "^0.28.2", + "eslint": "^10.13.0", + "publint": "^0.3.25", + "tsup": "^9.0.0", + "typescript": "^6.0.3", + "typescript-eslint": "^8.72.0", + "vitest": "^5.0.5" }, - "packageManager": "pnpm@10.33.3" + "packageManager": "pnpm@12.15.0", + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + } } diff --git a/packages/core/package.json b/packages/core/package.json index 804018f..751f003 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -41,10 +41,11 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "zustand": "^5.0.0" + "zustand": "^5.0.16" }, "devDependencies": { - "typescript": "^5.6.0", - "vitest": "^3.0.0" + "typescript": "^7.0.2", + "vitest": "^5.0.5", + "@types/node": "^26.6.5" } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1161a0d..4182537 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -26,6 +26,7 @@ export type { AcceptedGraph, RenderScene, SceneGroups, + SceneFold, ScenePointRef, SceneLinkRef, Accessor, diff --git a/packages/core/src/linkPick.ts b/packages/core/src/linkPick.ts index 370a029..2e38409 100644 --- a/packages/core/src/linkPick.ts +++ b/packages/core/src/linkPick.ts @@ -553,11 +553,11 @@ export class LinkPickIndex { let bestIdx = -1; let bestD2 = Number.POSITIVE_INFINITY; for (let r = r0; r <= r1; r++) { - const rowBase = r * g.cols; + const rowBase: number = r * g.cols; for (let c = c0; c <= c1; c++) { - const cell = rowBase + c; + const cell: number = rowBase + c; const end = cellOffsets[cell + 1]!; - for (let i = cellOffsets[cell]!; i < end; i++) { + for (let i: number = cellOffsets[cell]!; i < end; i++) { const l = cellLinkIds[i]!; if (stamps[l] === stamp) continue; // already tested via another cell stamps[l] = stamp; diff --git a/packages/core/test/parity-object-columnar.test.ts b/packages/core/test/parity-object-columnar.test.ts index 184564a..18ffc46 100644 --- a/packages/core/test/parity-object-columnar.test.ts +++ b/packages/core/test/parity-object-columnar.test.ts @@ -7,6 +7,7 @@ * Byte-exact is the bar — Buffer-level equality, not approximate. */ +import { Buffer } from 'node:buffer'; import { describe, expect, it } from 'vitest'; import type { ColumnarGraphSnapshot, GraphSnapshot } from '../src/types'; diff --git a/packages/core/test/ranged-patches.test.ts b/packages/core/test/ranged-patches.test.ts index c656fc8..ccd62af 100644 --- a/packages/core/test/ranged-patches.test.ts +++ b/packages/core/test/ranged-patches.test.ts @@ -8,6 +8,7 @@ * emulated — cosmos keeps `rangeUpdates: []` and full uploads. */ +import { Buffer } from 'node:buffer'; import { describe, expect, it } from 'vitest'; import { createGraphInstance } from '../src/instance'; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 7680f99..9241f01 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,4 +1,7 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"] + }, "include": ["src", "test"] } diff --git a/packages/data/package.json b/packages/data/package.json index d37d326..5bf68c6 100644 --- a/packages/data/package.json +++ b/packages/data/package.json @@ -57,8 +57,8 @@ }, "devDependencies": { "apache-arrow": "^21.2.0", - "hyparquet": "^1.26.2", - "typescript": "^5.6.0", - "vitest": "^3.0.0" + "hyparquet": "^1.31.5", + "typescript": "^7.0.2", + "vitest": "^5.0.5" } } diff --git a/packages/engine-cosmos/README.md b/packages/engine-cosmos/README.md index 26005c1..6190b93 100644 --- a/packages/engine-cosmos/README.md +++ b/packages/engine-cosmos/README.md @@ -4,13 +4,19 @@ Cosmos engine adapter for Orbit. ## Tested engine range -This adapter is developed and probed against exactly **`@cosmos.gl/graph@3.4.0`** +This adapter is developed and probed against exactly **`@cosmos.gl/graph@3.5.1`** (exact pin, no range). In the repository, `pnpm cosmos:pin-check` verifies that the adapter and `apps/spike` declare the same exact version. Any pin bump must update both manifests, pass that check and `pnpm probe:node`, then be exercised locally with the headful `pnpm probe` suite on a real GPU before the new version -is considered supported. The 3.3.0 → 3.4.0 bump was re-probed on 2026-08-10; -upstream on-demand rendering made the quiescence probe pass. +is considered supported. The 3.4.0 → 3.5.0 bump passed all three Node probes +and all ten headful GPU probe tests on 2026-10-07. The earlier 3.3.0 → 3.4.0 +bump introduced upstream on-demand rendering and made the quiescence probe pass. + +Node.js **22 or newer** is required. Cosmos 3.5 declares its four Luma 9.3 +packages as peers; the adapter supplies `@luma.gl/core`, `@luma.gl/engine`, +`@luma.gl/shadertools` and `@luma.gl/webgl` as dependencies in that compatible +minor line. ## Capability profile @@ -18,13 +24,14 @@ Node-verifiable facts (measured by `pnpm probe:node`, re-checked in CI): | Capability | Value | Basis | | --- | --- | --- | -| `rangeUpdates` | `[]` | Every buffer setter in `dist/index.d.ts` (`setPointPositions`, `setPointColors`, `setLinks`, …) takes a full array; no offset/count variants exist. Whole-buffer re-upload is the only update path. | +| `rangeUpdates` | `[]` | The adapter uses full-array setters for its atomic `EngineCommit` buffer channels. Cosmos 3.5 also exposes sparse live-position writes (`setPointPosition`, `setPointPositionsByIndices`) and a per-index pin toggle (`setPinnedPoint`); these are not wired as Orbit range channels. The Node probe inventories both surfaces. | | `postDrawFrames` | `false` | The `config.d.ts` callback inventory has no draw/render-phase hook — only simulation (`onSimulationTick/Start/End/Pause/Unpause`), transition, zoom, drag and pointer callbacks. Post-draw work must be scheduled externally. Since v0.13 this is a REAL `EngineCapabilities` field, not just prose. | | `idleFrames` | `'stops'` | cosmos ≥3.4 on-demand rendering idle-stops the engine loop, and the adapter's gated activity clock stops with it — measured 0 idle frames and 0 rAF registrations per 750 ms at rest by the quiescence probe below. | | `node-import-safe` | `true` | `await import('@cosmos.gl/graph')` succeeds in plain Node (module scope guards `typeof window`), so SSR and test imports never crash. | -GPU-probed capabilities (re-measured 2026-08-10 on Apple M5 Pro, ANGLE Metal, headful -Chromium): +GPU-probed capabilities (re-measured 2026-10-07 on Cosmos 3.5.0, Apple M5 Pro, +ANGLE Metal, headful Chromium 149). These are semantic checks; the single-run +readback timings are diagnostic, not a qualified performance comparison: | Capability | Result | Finding | | --- | --- | --- | @@ -33,19 +40,20 @@ Chromium): | `link-picking` | ✅ pass | Native `onLinkClick`/`onLinkMouseOver` deliver correct link indices; ~4 px perpendicular tolerance on a 2 px link. **Flipped:** the adapter now reports `capabilities.linkPicking: true` and wires `onLinkClick`/`onLinkMouseOver`/`onLinkMouseOut` to the host events, backed by the headful probe. | | `nan-tombstones` | ✅ pass | NaN'd points escape hit-testing, incident links vanish, `fitView` ignores tombstoned slots. | | `native-pinning` | ✅ pass | `setPinnedPoints` excludes points from force integration; `[]`/repeat calls are idempotent. | -| `tracked-positions` | ⚠️ fail (budget) | Semantics correct (packing order, last-call-replaces), but each `getTrackedPointPositionsArray` read stalls ~8.7 ms p50 on 3.4.0 (was ~18 ms on 3.3) **regardless of k** — a sync pipeline flush, not payload cost. Per-frame tracked readback stays non-viable; DOM-label positioning reads at settle/idle cadence. | -| `quiescence` | ✅ pass (3.4.0) | On-demand rendering: 0 idle frames AND 0 rAF registrations per 750 ms at rest (was 91 on 3.3.0). Settle lands ~5 s after `onSimulationEnd` (trailing transitions). Picking stays index-truthful at rest, drag release renders its final frame, and a `render()` + same-tick capture reads valid pixels (the stale-wake micro-cases). | +| `tracked-positions` | ✅ semantics; ⚠️ timing diagnostic | Packing order and last-call-replaces semantics pass. The diagnostic run exceeded the probe's synchronous readback budget; no new performance claim is made without repeated, variance-qualified runs. Orbit keeps its existing label cadence and does not opt into the new nonblocking tracked-map API. | +| `position-snapshots` | ✅ pass | Flat `Float32Array` reads preserve NaN tombstones and remain independent across caller mutations, subsequent reads and roster replacement. | +| `quiescence` | ✅ pass | On-demand rendering: 0 idle frames AND 0 rAF registrations per 750 ms at rest. Picking remains live at rest, drag release renders its final frame, and a `render()` + same-tick capture reads valid pixels (the stale-wake micro-cases). | | `context-loss` | ⚠️ fail (by design) | `lost`/`restored` events surface, but no combination of buffer/config replay revives rendering after `restoreContext()` — only a full `Graph` destroy + re-create recovers. This validates the adapter's recreate-on-restore protocol: `CosmosEngine` rebuilds the Graph in the same container and the core replays the scene. | ## Interaction surface The `fitView({ maxZoom })` clamp uses the same position snapshot as native Cosmos fitting: destination positions during a position transition, live GPU -positions otherwise. This uses the exact-pin 3.4.0 runtime helper +positions otherwise. This uses the exact-pin 3.5.1 runtime helper `getFitViewPositions` (private in its TypeScript declaration), with shrinking and expanding transitions covered by the demo's real-engine regression suite. -Coordinate-space facts verified against the exact-pin 3.4.0 dist (see the +Coordinate-space facts verified against the exact-pin dist (see the `CosmosEngine.ts` module header for the exact evidence): - `pointsInPolygon(screenPolygon)` — cosmos' `findPointsInPolygon` takes @@ -61,6 +69,15 @@ Coordinate-space facts verified against the exact-pin 3.4.0 dist (see the - `setPinnedIndices` maps to `setPinnedPoints` (full-set replace; `null`/`[]` unpin all). Re-applying pins after context-loss recovery is core-owned. +`getPositions()` uses Cosmos 3.5's `getPointPositionsArray()` without an +output buffer, which returns a fresh `Float32Array` snapshot. This removes +the intermediate boxed `number[]` and conversion back to `Float32Array`. +Callers may overlay pinned coordinates without changing subsequent reads; +later reads and roster updates leave earlier snapshots intact, and NaN +tombstones remain NaN. The `position-snapshots` GPU probe checks that ownership +contract against the real engine. The GPU read remains synchronous; this +change does not introduce asynchronous readback or a new overlay scheduler. + ## Overlay & toolbar surface | Capability | Behavior | Basis / degradation | @@ -72,13 +89,13 @@ Coordinate-space facts verified against the exact-pin 3.4.0 dist (see the ## Styling channels -Facts verified against the exact-pin 3.4.0 dist typings (`config.d.ts` / `index.d.ts`): +Facts verified against the exact-pin 3.5.0 dist typings (`config.d.ts` / `index.d.ts`): | Capability | Value | Mechanism / basis | | --- | --- | --- | | `edgeArrows` | `true` | Commit `config.linkArrows` maps to cosmos' `linkDefaultArrows` config key (config.d.ts, default `false`) via `setConfigPartial` — instanced arrowheads toggle atomically within the commit's single `render()`. No per-link `setLinkArrows(boolean[])` buffer is used (Orbit's toggle is scene-wide). | -| `pointImages` | `true` | cosmos 3.4.0 exposes `setImageData(ImageData[])` + `setPointImageIndices(Float32Array)` (index.d.ts). The adapter maintains a slot→`ImageData` mirror of the atlas: commit upserts transcode each `ImageBitmap` through an offscreen 2D canvas (`drawImage` + `getImageData`), `removeSlots` blanks entries with a 1×1 transparent `ImageData` (slot indices stay stable), and any atlas change re-uploads the FULL array (cosmos has no partial image update — consistent with `rangeUpdates: []`). The mirror is CPU-side, so it survives context loss; post-restore atlas commits re-upload everything to the fresh graph. **Degradation:** where no 2D context exists (jsdom without the canvas package), the image channel no-ops — never throws — and reports the `engine:image-channel-unavailable` warning diagnostic exactly once. | -| `renderLinks` toggle | config-only | cosmos 3.4.0 has a first-class `renderLinks: boolean` config key (config.d.ts, default `true`), so commit `config.renderLinks` is a pure `setConfigPartial` toggle — **zero buffer setters**, no `linkOpacity` workaround, no link-buffer rebuild. | +| `pointImages` | `true` | cosmos 3.5.1 exposes `setImageData(ImageData[])` + `setPointImageIndices(Float32Array)` (index.d.ts). The adapter maintains a slot→`ImageData` mirror of the atlas: commit upserts transcode each `ImageBitmap` through an offscreen 2D canvas (`drawImage` + `getImageData`), `removeSlots` blanks entries with a 1×1 transparent `ImageData` (slot indices stay stable), and any atlas change re-uploads the FULL array (cosmos has no partial image update — consistent with `rangeUpdates: []`). The mirror is CPU-side, so it survives context loss; post-restore atlas commits re-upload everything to the fresh graph. **Degradation:** where no 2D context exists (jsdom without the canvas package), the image channel no-ops — never throws — and reports the `engine:image-channel-unavailable` warning diagnostic exactly once. | +| `renderLinks` toggle | config-only | cosmos 3.5.1 has a first-class `renderLinks: boolean` config key (config.d.ts, default `true`), so commit `config.renderLinks` is a pure `setConfigPartial` toggle — **zero buffer setters**, no `linkOpacity` workaround, no link-buffer rebuild. | | Theme default colors | config-only | Commit `config.defaultPointColor`/`config.defaultLinkColor` map to cosmos' `pointDefaultColor`/`linkDefaultColor` config keys (CSS color strings accepted natively). | While pre-mount, context-lost, or terminally failed, resources fold into the @@ -90,7 +107,7 @@ the same slot), and the latest `pointImageIndex` replaces wholesale. | Capability | Value | Mechanism / basis | | --- | --- | --- | -| `clusterForce` | `true` | **Dist investigation (3.4.0, the exact pin):** `dist/index.d.ts` exposes `setPointClusters((number \| undefined)[])`, `setClusterPositions((number \| undefined)[])`, `setPointClusterStrength(Float32Array)` and `getClusterPositions()`; `dist/config.d.ts` exposes the `simulationCluster` coefficient (default `0.1`); `dist/modules/Clusters/index.d.ts` is the GPU module implementing it (centermass FBO + force application pass). The capability is therefore declared honestly, not faked. **Evidence class: Node-verifiable (dist typing scan), like `rangeUpdates`/`postDrawFrames` — the API surface is present and wired, but the visible force behavior still requires a headful probe (see the GPU evidence policy below).** | +| `clusterForce` | `true` | **Dist investigation (3.5.1, the exact pin):** `dist/index.d.ts` exposes `setPointClusters((number \| undefined)[])`, `setClusterPositions((number \| undefined)[])`, `setPointClusterStrength(Float32Array)` and `getClusterPositions()`; `dist/config.d.ts` exposes the `simulationCluster` coefficient (default `0.1`); `dist/modules/Clusters/index.d.ts` is the GPU module implementing it (centermass FBO + force application pass). The capability is therefore declared honestly, not faked. **Evidence class: Node-verifiable (dist typing scan), like `rangeUpdates`/`postDrawFrames` — the API surface is present and wired, but the visible force behavior still requires a headful probe (see the GPU evidence policy below).** | Contract mapping applied inside the single atomic commit (staged after the roster, before the one `render()`): @@ -114,7 +131,7 @@ roster, before the one `render()`): | Capability | Behavior | Basis / formula | | --- | --- | --- | -| `setViewport({x, y, zoom})` — **real pan** | Centers space point `(x, y)` at exactly the requested (or current) zoom in one call; a follow-up `getViewport()` returns the same `{x, y, zoom}` (modulo cosmos' d3 `scaleExtent` clamp). A missing `x` or `y` is filled from the current viewport; zoom-only calls keep the `setZoomLevel` path (d3 `scaleTo` preserves the center). Instant unless `durationMs` is given. | **The former zoom-only limitation is LIFTED.** The exact-pin API has no pan-to method, but `setZoomTransformByPointPositions(positions, duration, scale, padding)` is an exact center+zoom when `scale` is explicit — verified in the 3.4.0 dist (`zoomInstance.getTransform`): `store.scaleX/scaleY` are linear slope-±1 space→screen maps, a single-point bbox is widened ±0.5 *symmetrically* (center preserved), and an explicit `scale` bypasses the fit math and `padding` entirely, yielding `translate(w/2 − scaleX(x)·k, h/2 − scaleY(y)·k).scale(k)` with `k = scale`. The adapter calls `setZoomTransformByPointPositions(Float32Array.of(x, y), durationMs ?? 0, zoom ?? getZoomLevel())`. | +| `setViewport({x, y, zoom})` — **real pan** | Centers space point `(x, y)` at exactly the requested (or current) zoom in one call; a follow-up `getViewport()` returns the same `{x, y, zoom}` (modulo cosmos' d3 `scaleExtent` clamp). A missing `x` or `y` is filled from the current viewport; zoom-only calls keep the `setZoomLevel` path (d3 `scaleTo` preserves the center). Instant unless `durationMs` is given. | The adapter retains `setZoomTransformByPointPositions(positions, duration, scale, padding)`, which gives an exact center+zoom when `scale` is explicit — verified originally in the 3.4.0 dist (`zoomInstance.getTransform`): `store.scaleX/scaleY` are linear slope-±1 space→screen maps, a single-point bbox is widened ±0.5 *symmetrically* (center preserved), and an explicit `scale` bypasses the fit math and `padding` entirely, yielding `translate(w/2 − scaleX(x)·k, h/2 − scaleY(y)·k).scale(k)` with `k = scale`. The adapter calls `setZoomTransformByPointPositions(Float32Array.of(x, y), durationMs ?? 0, zoom ?? getZoomLevel())`. | | viewport restore | Context-loss recovery now restores the full camera: the core replays the last stored `{x, y, zoom}` through `setViewport` after the scene commit, and the pan lands (previously only `zoom` was honored). | Supersedes the earlier zoom-only restore behavior. | ## GPU evidence policy diff --git a/packages/engine-cosmos/package.json b/packages/engine-cosmos/package.json index 5e20934..2b0568c 100644 --- a/packages/engine-cosmos/package.json +++ b/packages/engine-cosmos/package.json @@ -9,6 +9,9 @@ "directory": "packages/engine-cosmos" }, "type": "module", + "engines": { + "node": ">=22" + }, "sideEffects": false, "files": [ "dist" @@ -31,11 +34,15 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@cosmos.gl/graph": "3.4.0", + "@cosmos.gl/graph": "3.5.1", + "@luma.gl/core": "~9.3.6", + "@luma.gl/engine": "~9.3.6", + "@luma.gl/shadertools": "~9.3.6", + "@luma.gl/webgl": "~9.3.6", "@modernrelay/orbit-core": "workspace:*" }, "devDependencies": { - "typescript": "^5.6.0", - "vitest": "^3.0.0" + "typescript": "^7.0.2", + "vitest": "^5.0.5" } } diff --git a/packages/engine-cosmos/src/CosmosEngine.ts b/packages/engine-cosmos/src/CosmosEngine.ts index 96d6791..1782026 100644 --- a/packages/engine-cosmos/src/CosmosEngine.ts +++ b/packages/engine-cosmos/src/CosmosEngine.ts @@ -102,7 +102,7 @@ import { RestoreDeadline } from './restoreDeadline'; type ViewportState = NonNullable>; /** - * Structural view of cosmos' `graph.store` — private in the 3.3.0 d.ts but a + * Structural view of cosmos' `graph.store` — private in the 3.5.0 d.ts but a * stable runtime field. `draggingPointIndex` is assigned right before cosmos * invokes `onDragStart` (verified in the dist), making it the authoritative * dragged-point source; `hoveredPoint` mirrors the public onPointMouseOver @@ -114,7 +114,7 @@ interface CosmosStoreLike { } /** - * Exact-pin 3.4.0 camera seam: private in the d.ts, but the runtime helper + * Exact-pin 3.5.0 camera seam: private in the d.ts, but the runtime helper * used by native fitView. It reads transition destinations while positions * animate and live GPU positions otherwise. Using the same helper keeps * the clamp decision and native fallback on the same coordinate snapshot. @@ -591,7 +591,9 @@ export class CosmosEngine implements GraphEngine { getPositions(): Float32Array | null { const graph = this.activeGraph; - return graph ? Float32Array.from(graph.getPointPositions()) : null; + // Without an `out` argument Cosmos allocates an owned snapshot. Core may + // overlay pinned coordinates, so never share/reuse a readback destination. + return graph ? graph.getPointPositionsArray() : null; } /** diff --git a/packages/engine-cosmos/test/context-loss.test.ts b/packages/engine-cosmos/test/context-loss.test.ts index 7649361..c6c286d 100644 --- a/packages/engine-cosmos/test/context-loss.test.ts +++ b/packages/engine-cosmos/test/context-loss.test.ts @@ -73,7 +73,7 @@ const h = vi.hoisted(() => { this.zoomLevel = value; } getZoomLevel(): number { return this.zoomLevel; } - getPointPositions(): number[] { return [1, 2, 3, 4]; } + getPointPositionsArray(): Float32Array { return Float32Array.of(1, 2, 3, 4); } screenToSpacePosition(p: [number, number]): [number, number] { return [p[0] * 2 - 5, p[1] * 2 - 5]; } diff --git a/packages/engine-cosmos/test/cosmos-engine.test.ts b/packages/engine-cosmos/test/cosmos-engine.test.ts index a2a4bb1..33ac7a7 100644 --- a/packages/engine-cosmos/test/cosmos-engine.test.ts +++ b/packages/engine-cosmos/test/cosmos-engine.test.ts @@ -98,6 +98,7 @@ const h = vi.hoisted(() => { getZoomLevel(): number { return this.zoomLevel; } pointPositions: number[] = [1, 2, 3, 4]; getPointPositions(): number[] { return this.pointPositions; } + getPointPositionsArray(): Float32Array { return Float32Array.from(this.pointPositions); } /** Native fit uses destination positions while a position transition runs. */ fitViewPositions: number[] | null = null; getFitViewPositions(): Float32Array { @@ -1182,6 +1183,25 @@ describe('CosmosEngine', () => { expect(engine.getViewport()).toEqual({ x: -5, y: -5, zoom: 5 }); }); + it('reads owned flat snapshots without boxing positions and preserves tombstones', async () => { + const { engine, graph } = await mounted(); + graph.pointPositions = [1, 2, NaN, NaN, 5, 6]; + const legacyRead = vi.spyOn(graph, 'getPointPositions').mockImplementation(() => { + throw new Error('number[] readback must not be used'); + }); + + const first = engine.getPositions(); + expect(first).toEqual(Float32Array.of(1, 2, NaN, NaN, 5, 6)); + // Core overlays pinned coordinates in its snapshot. That must not alter + // the engine's next read or get overwritten by a later source update. + first![0] = 99; + expect(engine.getPositions()).toEqual(Float32Array.of(1, 2, NaN, NaN, 5, 6)); + graph.pointPositions = [10, 20]; + expect(engine.getPositions()).toEqual(Float32Array.of(10, 20)); + expect(first).toEqual(Float32Array.of(99, 2, NaN, NaN, 5, 6)); + expect(legacyRead).not.toHaveBeenCalled(); + }); + // Real setViewport pan via setZoomTransformByPointPositions. The // derived formula (see the CosmosEngine module header): centering (x, y) at // zoom z is exactly setZoomTransformByPointPositions([x, y], duration, z); diff --git a/packages/omnigraph/README.md b/packages/omnigraph/README.md index 89296e5..185c27d 100644 --- a/packages/omnigraph/README.md +++ b/packages/omnigraph/README.md @@ -2,9 +2,12 @@ Optional Omnigraph data-source adapter for Orbit. Framework-agnostic: depends only on the framework-free ingestion/error surface of `@modernrelay/orbit-core` -and the official TypeScript SDK `@modernrelay/omnigraph` (0.9.x) — never on React, and +and the official TypeScript SDK `@modernrelay/omnigraph` (0.14.0) — never on React, and core never depends on it. +Requires Node.js 22+ for server/CLI use and the OmniGraph HTTP API contract `0.14`. +Upgrade the server and SDK together: 0.13 servers are rejected before graph reads. + ## The v1 rule > **v1 loads graphs via `og.export()`; queries only ever resolve ids** for search and @@ -52,10 +55,32 @@ const result = await source.load(instance /*, abortSignal */); (`datasetKey` = `og::`): edge lines arrive first (lexicographic table-key order) and pass straight through — core's pending-endpoint index links them as nodes land. Every append is awaited, and the atomic load has a finite whole-export byte budget (`maxPendingBytes`, 512 MiB by default); exceeding it aborts without publishing a partial -graph. Ids are namespaced through the codec, and wire encodings are normalized to -the query-path string forms. Byte progress and budgets use re-serialized UTF-8 NDJSON size, +graph. Ids are namespaced through the codec, and export values are normalized as +described below. Byte progress and budgets use re-serialized UTF-8 NDJSON size, including one line break per export row. +OmniGraph 0.14 exports physical identity at the top level: + +```json +{"type":"Signal","id":"signal-001","data":{"id":42,"title":"Latency spike"}} +{"edge":"Correlates","id":"edge-001","from":"signal-001","to":"signal-002","data":{"confidence":0.9}} +``` + +The node becomes `id: encodeSourceId('Signal', 'signal-001')` with +`attrs: { id: 42, title: 'Latency spike', 'orbit:type': 'Signal' }`. +Physical IDs never come from `data.id`; that field is an ordinary schema property. +Generated props contain only schema properties, retaining a declared `id` type and +nullability. Use `GraphNode.id` / `GraphEdge.id` for physical identity. + +`Date` calendar strings are retained, with signed years padded to ISO's six digits. +UTC `DateTime` strings from the server omit +their zone, so the adapter adds explicit UTC and canonical milliseconds +(`2024-01-01T12:00:00` → `2024-01-01T12:00:00.000Z`), including list elements. +Omitted nullable schema properties become explicit `null`, matching generated +`T | null` fields. Inline `base64:` blobs become data URIs; external URIs pass through. +Null list elements are retained, so generated `[T]` attributes use `(T | null)[]`. +Vectors retain `number[]`: the server rejects null vector elements. + The `target` is structural (`IngestTarget`: `beginIngest` + `getRevisions` + optional `getDiagnostics`) — deliberately decoupled from `GraphInstance`, which satisfies it structurally; so does any recorder or headless pipeline. @@ -63,9 +88,12 @@ it structurally; so does any recorder or headless pipeline. ## `sourceRevision` and drift The canonical `sourceRevision` is a hash of -`{ graphId, branch, headBefore, headAfter, schemaFingerprint }` — but `/export` is -branch-only (no snapshot isolation), so `headAfter` is only knowable after the stream, +`{ graphId, branch, headBefore, headAfter, schemaFingerprint }` (plus `typeNames` +for partial exports). `/export` accepts a branch and pins an internal snapshot, but +does not accept the caller's sampled head, so `headAfter` is only knowable after the stream, while core's `beginIngest` requires `sourceRevision` up front for a replace session. +Each head check requests a fresh commit-history page with `limit: 1` and reads its +captured `headCommitId`; it does not fetch the full history or follow continuation tokens. Resolution: under `'reject'` and `'retry-once'`, a session begins under the **provisional** revision (the canonical hash with `headAfter := headBefore`), the stream appends into it, @@ -105,21 +133,26 @@ const search = createOmnigraphSearchService({ branch: 'main', // default queryName: 'search-intel', // registry name; invoked as POST /queries/search-intel // params: (q, limit) => ({ q, limit }), // default — reshape for your query's params - typeOf: { $s: 'Signal' }, // REQUIRED: column → node type for the id encoding - // labelColumn: '$s.title', // default: the first string-valued column per row + typeOf: { s: 'Signal' }, // REQUIRED: result column → node type for the id encoding + // labelColumn: 's.title', // default: the first string-valued column per row }); const instance = createGraphInstance({ engine, services: { search } }); ``` +For the repository's `search_signals` fixture query, use `queryName: 'search_signals'` +and `params: (q) => ({ q })`: that query declares only `q` and has a fixed server +limit of 10. The adapter still caps returned results at the caller's requested limit. + Row mapping (override wholesale with `mapRow: (row) => SearchResult | null`, `null` skips): - **id** — Omnigraph ids are unique per type only and query rows carry no type discriminator, so the adapter **requires** a caller-supplied column→node-type mapping (`typeOf`): a record keyed by the bare-variable projection columns holding node structs - (`return { $s }` → `{ $s: 'Signal' }`; the first listed column present wins), or a + (`return { $s }` → `{ s: 'Signal' }`; the first listed column present wins), or a per-row function returning the type name (the row's first node-struct column supplies the - physical id). Every id is qualified via `encodeSourceId(nodeType, physicalId)` — it + physical `@id`). For example, `{ s: { '@id': 'signal-001', id: 42 } }` identifies + `signal-001`; its ordinary `id` property is not used. Every physical id is qualified via `encodeSourceId(nodeType, physicalId)` — it round-trips `decodeSourceId` and matches export-loaded node ids exactly. - **score** — a finite number in the row's `score` column (the score lane never doubles as a label). @@ -135,26 +168,35 @@ rethrow as plain `omnigraph:`-prefixed `Error`s; aborts surface as `AbortError`. > `activateSearchResult` classifies those as `'not-loaded'` — the host may remedy > that only by re-running export for the relevant types (query-path single-node fetch is > not implemented in v1). Constrain the stored query to the loaded types, or load the -> full graph, to avoid the mismatch. Discovery via `og.queries.list()` returns only the -> `mcp.expose == true` registry subset — invoking a known `queryName` works regardless. +> full graph, to avoid the mismatch. Discovery via `og.queries.list()` returns the +> full stored-query registry; MCP exposure does not restrict SDK discovery or invocation. ## Server-only entry — do not import from the browser `@modernrelay/orbit-omnigraph/server` (`createOmnigraphServerClient`) is the only -authenticated SDK construction and must stay server-side: `omnigraph-server` ships no CORS -configuration and uses static bearer tokens (secret material). Browser deployments +authenticated SDK construction supplied by this adapter and must stay server-side: +the helper accepts a static bearer token (secret material). Browser deployments pass a preconfigured safe same-origin/public client to `createOmnigraphSource` — the browser entry deliberately has no `baseUrl`/`token` option — and typically route reads through a proxy/BFF. A client-bundle exclusion gate (`scripts/pack-smoke.mjs`, `treeshake:omnigraph-client`) asserts the server entry never reaches a client bundle. +The SDK sends `Omnigraph-Http-Api: 0.14` and checks the matching response header, +including on streams and errors. It performs an unauthenticated `HEAD /healthz` +contract check before each graph request; `GET /healthz` is also public. A proxy +must preserve these methods and headers. Configure the server access policy to +permit the adapter's schema, commit, export, and stored-query reads; supplying a +static token alone does not grant every operation under the server's access policy. + ## Error surface SDK typed errors (`NetworkError`, `ConflictError`, …) never cross this package's public surface — failures rethrow as plain `Error`s with a stable `omnigraph:` message prefix. Cancellation (`AbortSignal`) surfaces as an `AbortError`; the session is aborted and the -graph left untouched. SDK/server `major.minor` version mismatches (`og.health()` vs the -SDK's pinned `SERVER_VERSION`) surface as a result warning, never a hard failure. +graph left untouched. This includes cancellation during contract discovery and +stored read-query invocation. Missing or mismatched HTTP contract headers fail closed +before ingestion can commit. A build-version `major.minor` mismatch (`og.health()` +vs the SDK's pinned `SERVER_VERSION`) warns only when the HTTP contract checks pass. ## Also in the box diff --git a/packages/omnigraph/package.json b/packages/omnigraph/package.json index f718599..a0ebbbd 100644 --- a/packages/omnigraph/package.json +++ b/packages/omnigraph/package.json @@ -9,6 +9,9 @@ "directory": "packages/omnigraph" }, "type": "module", + "engines": { + "node": ">=22" + }, "sideEffects": false, "files": [ "dist" @@ -39,11 +42,12 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@modernrelay/omnigraph": "0.10.0", + "@modernrelay/omnigraph": "0.14.0", "@modernrelay/orbit-core": "workspace:*" }, "devDependencies": { - "typescript": "^5.6.0", - "vitest": "^3.0.0" + "typescript": "^7.0.2", + "vitest": "^5.0.5", + "@types/node": "^26.6.5" } } diff --git a/packages/omnigraph/src/codegen-node-shims.d.ts b/packages/omnigraph/src/codegen-node-shims.d.ts deleted file mode 100644 index d07af72..0000000 --- a/packages/omnigraph/src/codegen-node-shims.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Minimal ambient declarations for the node builtins `codegen-cli.ts` (and - * the codegen tests) use. The workspace deliberately ships no `@types/node` - * (the package's runtime surface is browser-safe), so the CLI — the one - * node-only file besides the server entry — declares exactly the slice it - * needs. Shapes match the Node 18+ runtime. - */ - -declare module 'node:fs' { - export function readFileSync(path: string, encoding: 'utf8'): string; - export function writeFileSync(path: string, data: string): void; - export function mkdirSync(path: string, options?: { recursive?: boolean }): string | undefined; -} - -declare module 'node:path' { - export function dirname(path: string): string; - export function join(...parts: string[]): string; -} - -declare module 'node:url' { - export function fileURLToPath(url: string | URL): string; -} - -declare module 'node:process' { - interface WritableLike { - write(chunk: string): boolean; - } - const process: { - argv: string[]; - exitCode: number | undefined; - stdout: WritableLike; - stderr: WritableLike; - }; - export default process; -} diff --git a/packages/omnigraph/src/codegen.ts b/packages/omnigraph/src/codegen.ts index 75838b9..a544295 100644 --- a/packages/omnigraph/src/codegen.ts +++ b/packages/omnigraph/src/codegen.ts @@ -2,15 +2,14 @@ * `.pg` → TypeScript code generation. * * The `.pg` scalar set is closed, so typed attrs for the `N`/`E` generics - * generate mechanically: one interface per node/edge type, a `NodeAttrs` / + * generate mechanically: one props type per node/edge type, a `NodeAttrs` / * `EdgeAttrs` discriminated union on the adapter-injected `'orbit:type'` * field (namespaced so a schema's own `type` property emits as an ordinary * member), and a `TypeMap` lookup interface. * - * Generated shapes describe attrs **after** the adapter's wire normalization - * (the v1 loader rewrites export-path wire values to the query-path string - * forms before populating attrs — see `normalize.ts`), so one encoding holds - * regardless of read path: + * Generated shapes describe export-loaded attrs **after** the adapter's + * wire normalization (see `normalize.ts`). Physical ids live on GraphNode + * and GraphEdge, outside these attrs; a schema's own id property is ordinary data: * * `Date` → `string` (`'YYYY-MM-DD'`) * `DateTime` → `string` (ISO 8601, `'YYYY-MM-DDTHH:MM:SS.mmmZ'`) @@ -18,6 +17,7 @@ * `I64`/`U64` → `number` (beware silent rounding past ±2^53) * `F32`/`F64` → `number` * `Vector(n)` → `number[]` + * `[T]` → `(T | null)[]` (stored list elements can be null) * `Blob` → `string` (`data:` URI for inline blobs, stored URI refs verbatim) * `T?` → `T | null` * @@ -93,7 +93,7 @@ function tsType(type: PgType): string { case 'enum': return type.values.length === 0 ? 'string' : type.values.map(tsStringLiteral).join(' | '); case 'list': - return `${SCALAR_TS[type.element]}[]`; + return `(${SCALAR_TS[type.element]} | null)[]`; case 'unknown': return 'unknown'; } @@ -151,27 +151,14 @@ function emitPropsInterface( properties: readonly PgProperty[], ): void { lines.push(`/** Normalized attrs for ${kindLabel} type \`${typeName}\`. */`); - lines.push(`export interface ${interfaceName} {`); - if (!properties.some((p) => p.name === 'id')) { - lines.push( - ` /** Physical Omnigraph id — injected into every export line's \`data\`; unique per ${kindLabel} type only. */`, - ); - lines.push(' id: string;'); + if (properties.length === 0) { + lines.push(`export type ${interfaceName} = object;`, ''); + return; } + lines.push(`export interface ${interfaceName} {`); for (const prop of properties) { - if (prop.name === 'id') { - // Export normalization requires `data.id` to be a string regardless of - // a schema declaration. Emitting the declared wire scalar here (for - // example I64 -> number) would make generated attrs unsound. - lines.push( - ` /** Physical Omnigraph id — normalized as a required string regardless of its schema wire type. */`, - ); - lines.push(' id: string;'); - continue; - } - // Every schema property emits normally — including one named `type`: the - // adapter's discriminator lives at the namespaced ORBIT_TYPE_KEY, so - // there is nothing to shadow. + // Physical identity belongs to GraphNode/GraphEdge.id, outside attrs. + // Schema properties named `id` and `type` retain their declared types. emitProperty(lines, prop); } lines.push('}'); @@ -214,10 +201,11 @@ function headerBanner(fingerprintLine: string, extra: string | undefined): strin } lines.push( '//', - "// Shapes describe attrs AFTER the adapter's wire normalization (both read", - '// paths converge on the query-path string encodings):', - "// Date → 'YYYY-MM-DD' · DateTime → ISO 8601 · enum(...) → literal union", + "// Shapes describe export-loaded attrs AFTER the adapter's wire normalization:", + '// Physical entity ids live on GraphNode/GraphEdge, outside attrs.', + "// Date → 'YYYY-MM-DD' · DateTime → ISO 8601 UTC · enum(...) → literal union", '// I64/U64/F32/F64 → number · Vector(n) → number[] · T? → T | null', + '// [T] → (T | null)[] (null list elements are retained)', "// Blob → string ('data:' URI for inline blobs, stored URI for external)", '', ); @@ -230,11 +218,12 @@ function headerBanner(fingerprintLine: string, extra: string | undefined): strin /** * Generate a self-contained TypeScript module of typed attrs from a parsed - * `.pg` schema: one `Props` interface per node type, one + * `.pg` schema: one `Props` type per node type, one * `EdgeProps` per edge type (with an additional numeric suffix when * either preferred name is already used), `NodeAttrs`/`EdgeAttrs` discriminated unions on the * adapter-injected `'orbit:type'` field, and a `TypeMap` lookup interface with * `NodeTypeName`/`EdgeTypeName` key unions. + * Props with declared properties are interfaces; property-free props use `object`. * * Deterministic: identical input (schema + options) yields identical output. */ diff --git a/packages/omnigraph/src/idCodec.ts b/packages/omnigraph/src/idCodec.ts index 28cc33b..17f59fb 100644 --- a/packages/omnigraph/src/idCodec.ts +++ b/packages/omnigraph/src/idCodec.ts @@ -23,8 +23,8 @@ export interface DecodedSourceId { /** * Encode a `(kind, sourceId)` pair as a collision-proof orbit id. * - * - Nodes: `encodeSourceId(NodeType, data.id)` - * - Edges: `encodeSourceId(EdgeName, data.id)`; endpoints use + * - Nodes: `encodeSourceId(NodeType, id)` using the top-level export id + * - Edges: `encodeSourceId(EdgeName, id)` using the top-level export id; endpoints use * `encodeSourceId(endpointType, from|to)`. */ export function encodeSourceId(kind: string, sourceId: string): string { diff --git a/packages/omnigraph/src/loader.ts b/packages/omnigraph/src/loader.ts index 3a30f4b..176dccf 100644 --- a/packages/omnigraph/src/loader.ts +++ b/packages/omnigraph/src/loader.ts @@ -161,7 +161,8 @@ function isAbortError(err: unknown): boolean { * public surface; they rethrow as plain `Error`s with a stable prefix. * Abort rejections and this package's own errors pass through unchanged. */ -function mapError(err: unknown): unknown { +function mapError(err: unknown, signal?: AbortSignal): unknown { + throwIfAborted(signal); if (err instanceof OmnigraphError && !isAbortError(err)) { return new Error(`omnigraph: ${err.name} (status ${err.status}): ${err.message}`); } @@ -224,14 +225,15 @@ export function createOmnigraphSource(options: OmnigraphSourceOptions): Omnigrap : `og:${graphId}:${branch}:types=${typeNames.join(',')}`; async function newestHead(signal: AbortSignal | undefined): Promise { - const commits = await client.commits.list({ branch }, callOpts(signal)); - const newest = commits[0]; // SDK: most recent first - if (newest === undefined) { + // A fresh first page captures the current branch head. We only need that + // coordinate, not the full history or a continuation pinned to an old head. + const { headCommitId } = await client.commits.list({ branch, limit: 1 }, callOpts(signal)); + if (headCommitId == null) { throw new Error( `omnigraph: branch '${branch}' of graph '${graphId}' has no commits — nothing to export`, ); } - return newest.graphCommitId; + return headCommitId; } async function runAttempt( @@ -262,8 +264,8 @@ export function createOmnigraphSource(options: OmnigraphSourceOptions): Omnigrap for (const hazard of bigIntKeyWarnings(schema)) { pushUnique( warnings, - `omnigraph: ${hazard.type}.${hazard.property} is a 64-bit integer used as identity — ` + - `JSON parsing silently rounds values past ±2^53, which can collapse distinct ids`, + `omnigraph: ${hazard.type}.${hazard.property} is a 64-bit integer schema key — ` + + `JSON parsing silently rounds attribute values past ±2^53; physical ids remain exact strings`, ); } // NOTE: a schema-declared `type` property needs no warning — the @@ -493,7 +495,7 @@ export function createOmnigraphSource(options: OmnigraphSourceOptions): Omnigrap // the original failure wins } } - throw mapError(err); + throw mapError(err, signal); } finally { // Cancel the underlying NDJSON stream on any non-exhausted exit. try { @@ -507,13 +509,13 @@ export function createOmnigraphSource(options: OmnigraphSourceOptions): Omnigrap async function load(target: IngestTarget, signal?: AbortSignal): Promise { const warnings: string[] = []; - // Surface an SDK/server major.minor mismatch as a warning, never a hard - // failure. + // Surface build-version skew as a warning after the SDK verifies the + // HTTP API contract. Contract mismatches are hard failures. let serverVersion: string; try { serverVersion = (await client.health(callOpts(signal))).version; } catch (err) { - throw mapError(err); + throw mapError(err, signal); } const server = majorMinor(serverVersion); const sdk = majorMinor(SERVER_VERSION); @@ -533,7 +535,7 @@ export function createOmnigraphSource(options: OmnigraphSourceOptions): Omnigrap // Covers SDK errors thrown before the session/stream phase // (schema.get, commits.list); mapError is a no-op on already-mapped // or package-owned errors. - throw mapError(err); + throw mapError(err, signal); } if (outcome.kind === 'retry') continue; return { diff --git a/packages/omnigraph/src/normalize.ts b/packages/omnigraph/src/normalize.ts index 56bd574..90b77d1 100644 --- a/packages/omnigraph/src/normalize.ts +++ b/packages/omnigraph/src/normalize.ts @@ -10,22 +10,19 @@ * a schema's own `type` property passes through as ordinary data, * - edge endpoint types are resolved from the `.pg` schema because edge lines * carry bare `from`/`to` ids, - * - attr values are normalized to the query-path string forms so - * generated types and temporal dimensions see one encoding - * regardless of read path: - * * `Date` — export sends **days since Unix epoch** (number) → - * `'YYYY-MM-DD'` (UTC) - * * `DateTime` — export sends **epoch milliseconds** (number) → - * ISO 8601 (`'YYYY-MM-DDTHH:MM:SS.mmmZ'`) + * - attr values are normalized for generated types and temporal dimensions: + * * `Date` — export sends `'YYYY-MM-DD'`; signed years use ISO's six digits + * * `DateTime` — export sends a UTC string without a timezone suffix → + * ISO 8601 with explicit UTC (`'YYYY-MM-DDTHH:MM:SS.mmmZ'`) * * `Blob` — inline internal blobs arrive as `'base64:'` → * `'data:application/octet-stream;base64,'`; * external-URI refs pass through verbatim - * * everything else — verbatim. + * * missing nullable schema properties — explicit `null` + * * everything else — verbatim. Physical identity is top-level `id`; + * `data.id`, when present, is an ordinary user property. * - * Non-finite float sentinels (`'NaN'`/`'Infinity'`/`'-Infinity'`) are a - * **query-path-only** encoding: a non-finite stored float aborts `/export` - * server-side, so export-loaded data never contains the sentinels. - * This module therefore does NOT special-case them. + * The server rejects non-finite stored floats during export. Computed + * non-finite query values render as null; neither path uses string sentinels. */ import type { GraphEdge, GraphNode } from '@modernrelay/orbit-core'; @@ -56,7 +53,7 @@ export class UnknownEdgeTypeError extends Error { } } -/** An export line is structurally unusable (e.g. missing/non-string `data.id`). */ +/** An export line is structurally unusable (e.g. missing/non-string `id`). */ export class InvalidExportLineError extends Error { override readonly name = 'InvalidExportLineError'; constructor(message: string) { @@ -71,12 +68,14 @@ export class InvalidExportLineError extends Error { export interface NodeExportLine { kind: 'node'; type: string; + id: string; data: Record; } export interface EdgeExportLine { kind: 'edge'; edge: string; + id: string; from: string; to: string; data: Record; @@ -90,9 +89,10 @@ function isRecord(v: unknown): v is Record { /** * Classify one parsed export line using the adapter's wire shapes: - * - node line: `{"type": "", "data": {"id", …props}}` - * - edge line: `{"edge": "", "from": , "to": , "data": {"id", …props}}` - * Anything else is `{ kind: 'unknown' }`. + * - node line: `{"type": "", "id": , "data": {…props}}` + * - edge line: `{"edge": "", "id": , "from": , "to": , "data": {…props}}` + * Unknown envelopes return `{ kind: 'unknown' }`. Recognized entities without + * a physical identity reject instead of falling back to a user property. */ export function classifyExportLine(line: unknown): ClassifiedExportLine { if (!isRecord(line) || !isRecord(line['data'])) return { kind: 'unknown' }; @@ -102,10 +102,13 @@ export function classifyExportLine(line: unknown): ClassifiedExportLine { typeof line['from'] === 'string' && typeof line['to'] === 'string' ) { - return { kind: 'edge', edge: line['edge'], from: line['from'], to: line['to'], data }; + return { + kind: 'edge', edge: line['edge'], id: requireStringId(line, `Edge '${line['edge']}'`), + from: line['from'], to: line['to'], data, + }; } if (typeof line['type'] === 'string') { - return { kind: 'node', type: line['type'], data }; + return { kind: 'node', type: line['type'], id: requireStringId(line, `Node '${line['type']}'`), data }; } return { kind: 'unknown' }; } @@ -114,23 +117,12 @@ export function classifyExportLine(line: unknown): ClassifiedExportLine { // Value normalization // --------------------------------------------------------------------------- -const MS_PER_DAY = 86_400_000; - -/** Format an epoch-day count as `'YYYY-MM-DD'` (UTC). Handles negative days. */ -function formatEpochDay(days: number): string { - const d = new Date(days * MS_PER_DAY); - const t = d.getTime(); - if (!Number.isFinite(t)) return String(days); // out of Date range — leave a readable value - const y = d.getUTCFullYear(); - const year = - y < 0 - ? `-${String(-y).padStart(6, '0')}` - : y > 9999 - ? `+${String(y).padStart(6, '0')}` - : String(y).padStart(4, '0'); - const month = String(d.getUTCMonth() + 1).padStart(2, '0'); - const day = String(d.getUTCDate()).padStart(2, '0'); - return `${year}-${month}-${day}`; +/** Chrono uses -0001/+10000; ECMAScript ISO dates require -000001/+010000. */ +function isoYear(wireYear: string): string { + const year = Number(wireYear); + return year >= 0 && year <= 9999 + ? String(year).padStart(4, '0') + : `${year < 0 ? '-' : '+'}${String(Math.abs(year)).padStart(6, '0')}`; } function normalizeValue(type: PgType | undefined, value: unknown): unknown { @@ -138,12 +130,23 @@ function normalizeValue(type: PgType | undefined, value: unknown): unknown { if (typeof type === 'object' && type.kind === 'list' && Array.isArray(value)) { return value.map((item) => normalizeValue(type.element, item)); } - if (type === 'Date' && typeof value === 'number' && Number.isInteger(value)) { - return formatEpochDay(value); + if (type === 'Date') { + const date = typeof value === 'string' ? /^([+-]?\d{4,})(-\d{2}-\d{2})$/.exec(value) : null; + if (date === null) { + throw new InvalidExportLineError('Date export values must be calendar-date strings'); + } + return `${isoYear(date[1]!)}${date[2]}`; } - if (type === 'DateTime' && typeof value === 'number' && Number.isFinite(value)) { - const d = new Date(value); - return Number.isFinite(d.getTime()) ? d.toISOString() : value; + if (type === 'DateTime') { + // Arrow's timestamp spelling is UTC despite omitting the zone. Letting + // Date.parse consume it unchanged would use the consumer's local zone. + const timestamp = typeof value === 'string' + ? /^([+-]?\d{4,})(-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(?:\.(\d{1,3}))?$/.exec(value) + : null; + if (timestamp === null) { + throw new InvalidExportLineError('DateTime export values must be UTC timestamp strings without a timezone suffix'); + } + return `${isoYear(timestamp[1]!)}${timestamp[2]}.${(timestamp[3] ?? '').padEnd(3, '0')}Z`; } if (type === 'Blob' && typeof value === 'string' && value.startsWith('base64:')) { return `data:application/octet-stream;base64,${value.slice('base64:'.length)}`; @@ -151,36 +154,41 @@ function normalizeValue(type: PgType | undefined, value: unknown): unknown { return value; } -function propTypeMap(t: PgNodeType | PgEdgeType | undefined): ReadonlyMap { - const map = new Map(); - if (t) for (const p of t.properties as readonly PgProperty[]) map.set(p.name, p.type); +function propMap(t: PgNodeType | PgEdgeType | undefined): ReadonlyMap { + const map = new Map(); + if (t) for (const p of t.properties) map.set(p.name, p); return map; } function normalizeData( data: Record, - types: ReadonlyMap, + properties: ReadonlyMap, ): Record { const out: Record = {}; // Source data can carry '__proto__' as an own key (JSON.parse creates it); // defineProperty writes the own property, never the setter. for (const [k, v] of Object.entries(data)) { Object.defineProperty(out, k, { - value: normalizeValue(types.get(k), v), + value: normalizeValue(properties.get(k)?.type, v), enumerable: true, writable: true, configurable: true, }); } + for (const property of properties.values()) { + if (property.optional && !Object.prototype.hasOwnProperty.call(data, property.name)) { + Object.defineProperty(out, property.name, { value: null, enumerable: true, writable: true, configurable: true }); + } + } return out; } -function requireStringId(data: Record, what: string): string { - const id = data['id']; +function requireStringId(line: { id?: unknown }, what: string): string { + const id = line.id; if (typeof id !== 'string') { throw new InvalidExportLineError( - `${what} export line has ${id === undefined ? 'no' : 'a non-string'} 'data.id' — ` + - `cannot build a stable orbit id; data.id must be a string.`, + `${what} export line has ${id === undefined ? 'no' : 'a non-string'} top-level 'id' — ` + + `cannot build a stable orbit id; id must be a string, separate from user properties.`, ); } return id; @@ -206,35 +214,35 @@ export const ORBIT_TYPE_KEY = 'orbit:type'; /** * Normalize a node export line to a `GraphNode`: - * `id = encodeSourceId(type, data.id)`, `attrs = { …data, 'orbit:type' }` + * `id = encodeSourceId(type, id)`, `attrs = { …data, 'orbit:type' }` * with value normalization driven by the schema's property types. A node type * absent from the schema is tolerated — its attrs pass through verbatim * (identity never needs the schema on the node path). */ export function normalizeNode( - line: { type: string; data: Record }, + line: { type: string; id: string; data: Record }, schema: PgSchema, ): GraphNode { const nodeType = schema.nodes.find((n) => n.name === line.type); - const id = encodeSourceId(line.type, requireStringId(line.data, `Node '${line.type}'`)); + const id = encodeSourceId(line.type, requireStringId(line, `Node '${line.type}'`)); return { id, // The discriminator is adapter-owned identity metadata. It lands LAST so // a forward-compatible export field literally named `orbit:type` cannot // forge the value the generated attrs unions promise. - attrs: { ...normalizeData(line.data, propTypeMap(nodeType)), [ORBIT_TYPE_KEY]: line.type }, + attrs: { ...normalizeData(line.data, propMap(nodeType)), [ORBIT_TYPE_KEY]: line.type }, }; } /** * Normalize an edge export line to a `GraphEdge`: - * `id = encodeSourceId(edge, data.id)`; `source`/`target` namespace the bare + * `id = encodeSourceId(edge, id)`; `source`/`target` namespace the bare * `from`/`to` ids with the endpoint node types resolved from the schema. * Throws {@link UnknownEdgeTypeError} when the schema does not declare * the edge — endpoint identity cannot be constructed without it. */ export function normalizeEdge( - line: { edge: string; from: string; to: string; data: Record }, + line: { edge: string; id: string; from: string; to: string; data: Record }, schema: PgSchema, ): GraphEdge { const endpoints = edgeEndpointTypes(schema, line.edge); @@ -243,13 +251,13 @@ export function normalizeEdge( const edgeType = schema.edges.find((e) => e.name === line.edge) ?? schema.edges.find((e) => e.name.toLowerCase() === lower); - const id = encodeSourceId(line.edge, requireStringId(line.data, `Edge '${line.edge}'`)); + const id = encodeSourceId(line.edge, requireStringId(line, `Edge '${line.edge}'`)); return { id, source: encodeSourceId(endpoints.from, line.from), target: encodeSourceId(endpoints.to, line.to), // As on nodes, the adapter's resolved edge name lands last and always // wins the discriminator key; a source `type` property is ordinary data. - attrs: { ...normalizeData(line.data, propTypeMap(edgeType)), [ORBIT_TYPE_KEY]: line.edge }, + attrs: { ...normalizeData(line.data, propMap(edgeType)), [ORBIT_TYPE_KEY]: line.edge }, }; } diff --git a/packages/omnigraph/src/pgSchema.ts b/packages/omnigraph/src/pgSchema.ts index 1f5d30c..92f92bd 100644 --- a/packages/omnigraph/src/pgSchema.ts +++ b/packages/omnigraph/src/pgSchema.ts @@ -591,16 +591,16 @@ export interface BigIntKeyWarning { } /** - * Find `I64`/`U64` properties used as identity (`@key` or named `id`). The + * Find `I64`/`U64` properties used as schema keys (`@key`). The * HTTP path emits native JSON numbers even past ±2^53, where `JSON.parse` - * silently rounds them, so two distinct big-int ids can collapse. Surface - * these hazards before loading. + * silently rounds them. Physical entity ids are separate strings and stay + * exact; warn that key attributes themselves may lose precision. */ export function bigIntKeyWarnings(schema: PgSchema): BigIntKeyWarning[] { const out: BigIntKeyWarning[] = []; for (const t of [...schema.nodes, ...schema.edges]) { for (const p of t.properties) { - if ((p.type === 'I64' || p.type === 'U64') && (p.key || p.name === 'id')) { + if ((p.type === 'I64' || p.type === 'U64') && p.key) { out.push({ type: t.name, property: p.name }); } } diff --git a/packages/omnigraph/src/searchService.ts b/packages/omnigraph/src/searchService.ts index 07a9103..93744d8 100644 --- a/packages/omnigraph/src/searchService.ts +++ b/packages/omnigraph/src/searchService.ts @@ -37,13 +37,13 @@ import type { RequestContext, SearchResult, SearchService } from '@modernrelay/o import { encodeSourceId } from './idCodec'; /** One stored-query result row: projection column → value. Bare-variable - * projections (`return { $s }`) hold whole-node structs including `id`. */ + * projections (`return { $s }`) hold whole-node structs including `@id`. */ export type OmnigraphSearchRow = Record; /** * The required column→node-type mapping: * - * - a record `{ '$s': 'Signal' }` — the FIRST listed column present in a row + * - a record `{ s: 'Signal' }` — the FIRST listed column present in a row * with a node struct supplies the physical id, encoded under the mapped * type name; * - or a per-row function returning the node type name — the row's first @@ -109,13 +109,13 @@ function mapError(err: unknown): unknown { } /** A bare-variable projection value: a whole-node struct carrying its - * physical id (`return { $s }` yields `{ id,...props }`). */ -function isNodeStruct(value: unknown): value is { id: string } { + * physical id (`return { $s }` yields `s: { '@id': ..., ...props }`). */ +function isNodeStruct(value: unknown): value is { '@id': string } { return ( typeof value === 'object' && value !== null && !Array.isArray(value) && - typeof (value as { id?: unknown }).id === 'string' + typeof (value as { '@id'?: unknown })['@id'] === 'string' ); } @@ -161,17 +161,17 @@ function resolveIdentity( } for (const key of Object.keys(row)) { const value = row[key]; - if (isNodeStruct(value)) return { kind, sourceId: value.id }; + if (isNodeStruct(value)) return { kind, sourceId: value['@id'] }; } throw new Error( `omnigraph: '${queryName}' search row has no node-struct column (an object with a ` + - `string 'id') — project the matched entity bare (return { $s }) so its physical ` + + `string '@id') — project the matched entity bare (return { $s }) so its physical ` + `id is available`, ); } for (const [column, kind] of Object.entries(typeOf)) { const value = row[column]; - if (isNodeStruct(value)) return { kind, sourceId: value.id }; + if (isNodeStruct(value)) return { kind, sourceId: value['@id'] }; } throw new Error( `omnigraph: '${queryName}' search row has no node struct under the mapped column(s) ` + @@ -238,6 +238,10 @@ export function createOmnigraphSearchService>( try { response = await client.queries.invoke(queryName, input, { signal: ctx.signal }); } catch (err) { + // Stored-query POSTs can also mutate, so the SDK reports a dispatched + // cancellation conservatively. This service's contract is read-only; + // retain Orbit's AbortError surface when its caller cancelled. + throwIfAborted(ctx.signal, queryName); throw mapError(err); } throwIfAborted(ctx.signal, queryName); diff --git a/packages/omnigraph/src/server.ts b/packages/omnigraph/src/server.ts index 09d27ad..aef5fc4 100644 --- a/packages/omnigraph/src/server.ts +++ b/packages/omnigraph/src/server.ts @@ -3,8 +3,7 @@ * * This module is the ONLY place in the adapter where an authenticated * Omnigraph client is constructed. It must never be imported from browser - * code: `omnigraph-server` ships no CORS configuration and uses static - * bearer tokens (secret material), so browser deployments pass a + * code: this helper uses a static bearer token (secret material), so browser deployments pass a * preconfigured safe same-origin/public client to `createOmnigraphSource` * instead — typically routing reads through a proxy/BFF. The client-bundle * exclusion gate in `scripts/pack-smoke.mjs` checks the diff --git a/packages/omnigraph/src/types.ts b/packages/omnigraph/src/types.ts index bb038a8..46c5b45 100644 --- a/packages/omnigraph/src/types.ts +++ b/packages/omnigraph/src/types.ts @@ -118,8 +118,9 @@ export interface OmnigraphLoadResult { serverVersion: string; /** * Non-fatal observations: SDK/server major.minor mismatch, accepted - * drift, big-int identity hazards, and skipped unknown lines. Never - * hides a retry or accepted-drift decision. + * drift, big-int key attribute precision hazards, and skipped unknown + * lines. Never hides a retry or accepted-drift decision. HTTP API contract + * mismatches are fatal errors, not warnings. */ warnings: string[]; } diff --git a/packages/omnigraph/test/codegen.test.ts b/packages/omnigraph/test/codegen.test.ts index 37f9d92..d54842d 100644 --- a/packages/omnigraph/test/codegen.test.ts +++ b/packages/omnigraph/test/codegen.test.ts @@ -15,18 +15,29 @@ * has run the tests. */ +import { spawnSync } from 'node:child_process'; import { mkdirSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import ts from 'typescript'; import { describe, expect, it } from 'vitest'; import { generateTypes, generateTypesFromPgSource } from '../src/codegen'; -import { parsePgSchema, schemaFingerprint } from '../src/index'; +import { normalizeEdge, normalizeNode, parsePgSchema, schemaFingerprint } from '../src/index'; import committedDemoTypes from '../../../apps/demo/src/omnigraph-types.generated.ts?raw'; import demoPg from '../../../fixtures/omnigraph/cluster/demo.pg?raw'; +const TYPESCRIPT_CLI = fileURLToPath(new URL('./bin/tsc', import.meta.resolve('typescript/package.json'))); + +/** Exercise the installed compiler: TypeScript 7 no longer exposes createProgram. */ +function expectGeneratedTypesToCompile(path: string): void { + const result = spawnSync(process.execPath, [ + TYPESCRIPT_CLI, '--ignoreConfig', '--strict', '--noEmit', '--skipLibCheck', path, + ], { encoding: 'utf8', timeout: 30_000 }); + expect(result.error).toBeUndefined(); + expect({ status: result.status, output: result.stdout + result.stderr }).toEqual({ status: 0, output: '' }); +} + /** * Verbatim copy of the real fixture at * ~/code/omnigraph/crates/omnigraph/tests/fixtures/context.pg (server 0.8.x). @@ -127,6 +138,7 @@ const CONTEXT_EDGES = [ /** The body of `export interface { … }` in `out`. */ function interfaceBody(out: string, name: string): string { + if (out.includes(`export type ${name} = object;`)) return ''; const m = new RegExp(`export interface ${name} \\{\\n([\\s\\S]*?)\\n\\}`).exec(out); expect(m, `interface ${name} not found`).not.toBeNull(); return (m as RegExpExecArray)[1] as string; @@ -145,7 +157,7 @@ describe('generateTypesFromPgSource — real context.pg', () => { for (const n of CONTEXT_NODES) expect(out).toContain(`export interface ${n}Props {`); const actor = interfaceBody(out, 'ActorProps'); - expect(actor).toContain('id: string;'); // injected physical id + expect(actor).not.toContain('id:'); // physical identity lives on GraphNode expect(actor).toContain('slug: string;'); expect(actor).toContain('email: string | null;'); // String? @@ -161,10 +173,10 @@ describe('generateTypesFromPgSource — real context.pg', () => { expect(trace).toContain("normalized to 'YYYY-MM-DD'"); }); - it('emits edge props interfaces — empty ones still carry the physical id', () => { - for (const e of CONTEXT_EDGES) expect(out).toContain(`export interface ${e}EdgeProps {`); + it('emits property-free edge props as object types without injecting physical identity', () => { + for (const e of CONTEXT_EDGES) expect(out).toContain(`export type ${e}EdgeProps = object;`); const correlates = interfaceBody(out, 'CorrelatesEdgeProps'); - expect(correlates).toContain('id: string;'); + expect(correlates).not.toContain('id:'); // @unique(src, dst) is a constraint, not a property expect(correlates).not.toContain('src'); }); @@ -238,6 +250,28 @@ describe('demo.pg fixture — committed golden file', () => { }); describe('generateTypes — mapping edge cases', () => { + it('compiles normalized 0.14 attrs with user ids, nullable list elements, and property-free edges', () => { + const source = 'node Datum { id: I64? times: [DateTime]? } edge Link: Datum -> Datum'; + const schema = parsePgSchema(source); + const attrs = normalizeNode({ + type: 'Datum', id: 'physical', data: { id: 42, times: [null, '2024-01-01T12:00:00'] }, + }, schema).attrs; + const omitted = normalizeNode({ type: 'Datum', id: 'other', data: {} }, schema).attrs; + const edge = normalizeEdge({ edge: 'Link', id: 'edge', from: 'physical', to: 'other', data: {} }, schema).attrs; + const dir = fileURLToPath(new URL('./__generated__/', import.meta.url)); + mkdirSync(dir, { recursive: true }); + const path = join(dir, 'normalized.ts'); + writeFileSync(path, generateTypesFromPgSource(source) + ` +const node: NodeAttrs = ${JSON.stringify(attrs)}; +const omitted: NodeAttrs = ${JSON.stringify(omitted)}; +const edge: EdgeAttrs = ${JSON.stringify(edge)}; +// @ts-expect-error property-free attrs must still be objects +const invalid: LinkEdgeProps = 7; +void node; void omitted; void edge; void invalid; +`); + expectGeneratedTypesToCompile(path); + }); + it('disambiguates node/edge interface collisions in unions and TypeMap and compiles their distinct props', () => { const source = ` node Foo { slug: String @key } @@ -259,14 +293,13 @@ edge FooEdge: FooEdge -> FooEdgeEdge { value: String } mkdirSync(dir, { recursive: true }); const path = join(dir, 'collisions.ts'); writeFileSync(path, out + ` -const node: NodeAttrs = { 'orbit:type': 'FooEdge', id: 'n', slug: 'n', value: 's', node_only: true }; -const edge: EdgeAttrs = { 'orbit:type': 'Foo', id: 'e', value: 1, edge_only: 2 }; +const node: NodeAttrs = { 'orbit:type': 'FooEdge', slug: 'n', value: 's', node_only: true }; +const edge: EdgeAttrs = { 'orbit:type': 'Foo', value: 1, edge_only: 2 }; const nodeProps: TypeMap['nodes']['FooEdge'] = node; const edgeProps: TypeMap['edges']['Foo'] = edge; void nodeProps; void edgeProps; `); - const program = ts.createProgram([path], { strict: true, noEmit: true, skipLibCheck: true }); - expect(ts.getPreEmitDiagnostics(program).map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'))).toEqual([]); + expectGeneratedTypesToCompile(path); }); it('maps Vector(n), [T] lists, Bool, Blob, and unknown types', () => { @@ -285,7 +318,7 @@ node Embedding { expect(body).toContain('vec: number[];'); expect(body).toContain('/** `Vector(3)`. */'); expect(body).toContain('maybe_vec: number[] | null;'); - expect(body).toContain('tags: string[];'); + expect(body).toContain('tags: (string | null)[];'); expect(body).toContain('flag: boolean;'); expect(body).toContain('payload: string;'); // Exported Blob values normalize to strings. expect(body).toContain('weird: unknown;'); @@ -308,7 +341,7 @@ node Odd { expect(out).toContain("| ({ 'orbit:type': 'Odd' } & OddProps);"); }); - it('types every physical id as a required string regardless of its schema wire type', () => { + it('preserves the declared type and nullability of ordinary user id properties', () => { const out = generateTypesFromPgSource(` node NumericId { id: I64 @key @@ -319,10 +352,10 @@ edge OptionalNumericId: NumericId -> NumericId { `); const node = interfaceBody(out, 'NumericIdProps'); const edge = interfaceBody(out, 'OptionalNumericIdEdgeProps'); - expect(node.match(/^ {2}id: string;$/gm)).toHaveLength(1); - expect(edge.match(/^ {2}id: string;$/gm)).toHaveLength(1); - expect(node).not.toContain('id: number'); - expect(edge).not.toContain('id: number | null'); + expect(node.match(/^ {2}id: number;$/gm)).toHaveLength(1); + expect(edge.match(/^ {2}id: number \| null;$/gm)).toHaveLength(1); + expect(node).not.toContain('id: string'); + expect(edge).not.toContain('id: string'); }); it('collapses to never-unions and an empty TypeMap for an empty schema', () => { diff --git a/packages/omnigraph/test/loader.test.ts b/packages/omnigraph/test/loader.test.ts index e122d52..3e1fc62 100644 --- a/packages/omnigraph/test/loader.test.ts +++ b/packages/omnigraph/test/loader.test.ts @@ -6,7 +6,7 @@ * work. The ingest target is a REAL `createGraphInstance` over a FakeEngine. */ -import { Omnigraph, OmnigraphError } from '@modernrelay/omnigraph'; +import { HTTP_API_CONTRACT, HTTP_API_CONTRACT_HEADER, Omnigraph, OmnigraphError } from '@modernrelay/omnigraph'; import type { FetchLike } from '@modernrelay/omnigraph'; import { createGraphInstance, OrbitOperationError } from '@modernrelay/orbit-core'; import type { GraphInstance } from '@modernrelay/orbit-core'; @@ -52,10 +52,11 @@ const EXPECTED_FINGERPRINT = schemaFingerprint( /** The recorded commits body with the newest (head) commit id replaced. */ function commitsWithHead(head: string): string { - const parsed = JSON.parse(commitsBody) as { commits: Array> }; + const parsed = JSON.parse(commitsBody) as { commits: Array>; head_commit_id: string }; const newest = parsed.commits[0]; if (newest === undefined) throw new Error('recorded commits body is empty'); parsed.commits = [{ ...newest, graph_commit_id: head }, ...parsed.commits.slice(1)]; + parsed.head_commit_id = head; return JSON.stringify(parsed); } @@ -70,12 +71,12 @@ interface RecordedRequest { body: string | null; } -type Responder = (signal: AbortSignal | undefined) => Response; +type Responder = (signal: AbortSignal | undefined) => Response | Promise; /** A fresh JSON Response per call (Response bodies are single-use). */ function json(body: string, status = 200): Responder { return () => - new Response(body, { status, headers: { 'content-type': 'application/json' } }); + new Response(body, { status, headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' } }); } /** @@ -106,7 +107,7 @@ function ndjson(text: string): Responder { }); return new Response(stream, { status: 200, - headers: { 'content-type': 'application/x-ndjson' }, + headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/x-ndjson' }, }); }; } @@ -133,10 +134,13 @@ function replayFetch(routes: Record): body: typeof init?.body === 'string' ? init.body : null, }); const route = routes[key]; + if (route === undefined && key === 'HEAD /healthz') { + return new Response(null, { headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT } }); + } if (route === undefined) { return new Response(JSON.stringify({ error: `replayFetch: no recording for ${key}` }), { status: 404, - headers: { 'content-type': 'application/json' }, + headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' }, }); } const seen = counters.get(key) ?? 0; @@ -282,6 +286,33 @@ describe('partial-export identity includes typeNames', () => { }); describe('createOmnigraphSource().load — full export', () => { + it('samples bounded history pages without following their continuation', async () => { + const { instance, source, calls } = harness(recordedRoutes()); + + const result = await source.load(instance); + + expect(result.dataRef.headBefore).toBe(HEAD); + expect(result.dataRef.headAfter).toBe(HEAD); + const reads = calls.filter((call) => call.method === 'GET' && call.path === '/graphs/demo/commits'); + expect(reads).toHaveLength(2); // fresh samples before and after export + for (const read of reads) { + expect(Object.fromEntries(new URLSearchParams(read.search))).toEqual({ branch: 'main', limit: '1' }); + } + const page = JSON.parse(commitsBody) as { head_commit_id: string; next_page_token?: string }; + expect(page.head_commit_id).toBe(HEAD); + expect(page.next_page_token).toBeTruthy(); // older commits exist, but are unnecessary + }); + + it('rejects an empty history page before starting an export', async () => { + const { instance, source, calls } = harness(recordedRoutes({ + 'GET /graphs/demo/commits': json(JSON.stringify({ commits: [], head_commit_id: null })), + })); + + await expect(source.load(instance)).rejects.toThrow(/has no commits/); + expect(exportCalls(calls)).toEqual([]); + expect(instance.store.getState().revisions.model).toBe(0); + }); + it('streams the recorded export into a replace session; counts match the manifest', async () => { const progress: OmnigraphLoadProgress[] = []; const { instance, source, calls } = harness(recordedRoutes(), { @@ -355,7 +386,7 @@ describe('createOmnigraphSource().load — full export', () => { }); it('accounts for serialized UTF-8 bytes rather than UTF-16 string length', async () => { - const row = { type: 'Actor', data: { id: 'é', slug: 'é', name: 'Ada 😀' } }; + const row = { type: 'Actor', id: 'é', data: { slug: 'é', name: 'Ada 😀' } }; const body = `${JSON.stringify(row)}\n`; const utf8Bytes = new TextEncoder().encode(body).byteLength; const { instance, source } = harness( @@ -451,7 +482,7 @@ describe('source-revision drift policy', () => { const commitsAtCurrentHead: Responder = () => new Response(commitsWithHead(currentHead), { status: 200, - headers: { 'content-type': 'application/json' }, + headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' }, }); const schemaThenAdvance: Responder = (signal) => { const response = json(schemaBody)(signal); @@ -471,9 +502,13 @@ describe('source-revision drift policy', () => { await expect(source.load(instance)).rejects.toBeInstanceOf(OmnigraphDriftError); expect(calls.map(({ method, path }) => `${method} ${path}`)).toEqual([ 'GET /healthz', + 'HEAD /healthz', 'GET /graphs/demo/commits', + 'HEAD /healthz', 'GET /graphs/demo/schema', + 'HEAD /healthz', 'POST /graphs/demo/export', + 'HEAD /healthz', 'GET /graphs/demo/commits', ]); expect(instance.store.getState().revisions.model).toBe(0); @@ -541,7 +576,7 @@ describe('source-revision drift policy', () => { if (headReads === 2) currentModel = 3; // overlays raced the export stream return new Response(commitsBody, { status: 200, - headers: { 'content-type': 'application/json' }, + headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' }, }); }; const { source } = harness( @@ -599,7 +634,7 @@ describe('source-revision drift policy', () => { if (headReads === 2) currentSource = 'competing-replace'; // another replace landed return new Response(commitsBody, { status: 200, - headers: { 'content-type': 'application/json' }, + headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' }, }); }; const { source } = harness( @@ -742,28 +777,66 @@ describe('cancellation and error surface', () => { }); describe('server and SDK version mismatch surfacing', () => { + it.each([null, '0.12', '0.13'])('rejects a missing or incompatible discovery contract (%s) before export', async (contract) => { + const { instance, source, calls } = harness(recordedRoutes({ + 'HEAD /healthz': () => new Response(null, { + headers: contract === null ? {} : { [HTTP_API_CONTRACT_HEADER]: contract }, + }), + })); + await expect(source.load(instance)).rejects.toThrow(/^omnigraph: ApiContractError/); + expect(exportCalls(calls)).toEqual([]); + expect(instance.store.getState().revisions.model).toBe(0); + }); + + it('rejects a stream without its contract header before any graph is committed', async () => { + const { instance, source } = harness(recordedRoutes({ + 'POST /graphs/demo/export': () => new Response(exportBody, { + headers: { 'content-type': 'application/x-ndjson' }, + }), + })); + await expect(source.load(instance)).rejects.toThrow(/^omnigraph: ApiContractError/); + expect(instance.store.getState().revisions.model).toBe(0); + expect(instance.store.getState().nodeCount).toBe(0); + }); + + it('preserves AbortError when contract discovery is cancelled', async () => { + const controller = new AbortController(); + const { instance, source, calls } = harness(recordedRoutes({ + 'HEAD /healthz': (signal) => new Promise((_resolve, reject) => { + signal?.addEventListener('abort', () => reject(new DOMException('Aborted', 'AbortError')), { once: true }); + }), + })); + const pending = source.load(instance, controller.signal); + await new Promise((resolve) => setTimeout(resolve, 0)); + expect(calls.some((call) => call.method === 'HEAD')).toBe(true); + controller.abort(); + await expect(pending).rejects.toMatchObject({ name: 'AbortError' }); + expect(exportCalls(calls)).toEqual([]); + expect(instance.store.getState().revisions.model).toBe(0); + }); + it('the recorded fixture server and the SDK pin share major.minor — no warning', async () => { // The fixture is regenerated with the same server generation the SDK - // pins (currently 0.10.x) — a mismatch here means the pin and the + // pins (currently 0.14.x) — a mismatch here means the pin and the // fixture drifted apart and one of them needs regenerating/bumping. const { instance, source } = harness(recordedRoutes()); const result = await source.load(instance); expect(result.warnings).toEqual([]); }); - it('a different major.minor is a warning, never a hard failure', async () => { + it('different build metadata warns when the HTTP contract still matches', async () => { const { instance, source } = harness( recordedRoutes({ 'GET /healthz': json( - JSON.stringify({ status: 'ok', version: '0.11.0', internal_schema_version: 6 }), + JSON.stringify({ status: 'ok', version: '0.15.0', internal_schema_version: 16 }), ), }), ); const result = await source.load(instance); - expect(result.serverVersion).toBe('0.11.0'); - expect(result.warnings.some((w) => w.includes('0.11.0') && w.includes('0.10.0'))).toBe(true); + expect(result.serverVersion).toBe('0.15.0'); + expect(result.warnings.some((w) => w.includes('0.15.0') && w.includes('0.14.0'))).toBe(true); expect(instance.store.getState().nodeCount).toBe(NODE_TOTAL); // load still succeeded }); }); diff --git a/packages/omnigraph/test/normalize.test.ts b/packages/omnigraph/test/normalize.test.ts index a16ccf1..ec04bbb 100644 --- a/packages/omnigraph/test/normalize.test.ts +++ b/packages/omnigraph/test/normalize.test.ts @@ -1,3 +1,4 @@ +import type { ExportRecord } from '@modernrelay/omnigraph'; import { describe, expect, it } from 'vitest'; import { classifyExportLine, @@ -31,17 +32,18 @@ const SCHEMA = parsePgSchema(` describe('classifyExportLine export shapes', () => { it('classifies node lines', () => { - expect(classifyExportLine({ type: 'Event', data: { id: 'e1', slug: 'e1' } })).toEqual({ + expect(classifyExportLine({ type: 'Event', id: 'e1', data: { slug: 'e1' } })).toEqual({ kind: 'node', type: 'Event', - data: { id: 'e1', slug: 'e1' }, + id: 'e1', + data: { slug: 'e1' }, }); }); it('classifies edge lines', () => { expect( - classifyExportLine({ edge: 'Caused', from: 'e1', to: 'a1', data: { id: 'x' } }), - ).toEqual({ kind: 'edge', edge: 'Caused', from: 'e1', to: 'a1', data: { id: 'x' } }); + classifyExportLine({ edge: 'Caused', from: 'e1', to: 'a1', id: 'x', data: {} }), + ).toEqual({ kind: 'edge', edge: 'Caused', from: 'e1', to: 'a1', id: 'x', data: {} }); }); it.each([ @@ -50,21 +52,28 @@ describe('classifyExportLine export shapes', () => { ['array', [1, 2]], ['missing data', { type: 'Event' }], ['non-object data', { type: 'Event', data: 'x' }], - ['edge missing from/to', { edge: 'Caused', data: { id: 'x' } }], + ['edge missing from/to', { edge: 'Caused', id: 'x', data: {} }], ['non-string type', { type: 7, data: {} }], ['empty object', {}], ])('returns unknown for %s', (_label, line) => { expect(classifyExportLine(line)).toEqual({ kind: 'unknown' }); }); + + it.each([ + { type: 'Event', data: { id: 'user-id' } }, + { edge: 'Caused', from: 'e1', to: 'a1', data: { id: 'user-id' } }, + { type: 'Event', id: 42, data: {} }, + ])('rejects recognized entities without a top-level string identity', (line) => { + expect(() => classifyExportLine(line)).toThrow(InvalidExportLineError); + }); }); describe('normalizeNode identity and value normalization', () => { it("encodes id via the codec and injects attrs['orbit:type']", () => { - const node = normalizeNode({ type: 'Actor', data: { id: 'a1', slug: 'a1', name: 'Ada' } }, SCHEMA); + const node = normalizeNode({ type: 'Actor', id: 'a1', data: { slug: 'a1', name: 'Ada' } }, SCHEMA); expect(node.id).toBe(encodeSourceId('Actor', 'a1')); expect(node.attrs).toEqual({ [ORBIT_TYPE_KEY]: 'Actor', - id: 'a1', slug: 'a1', name: 'Ada', }); @@ -72,7 +81,7 @@ describe('normalizeNode identity and value normalization', () => { it("a source-declared 'type' property passes through UNTOUCHED alongside the discriminator", () => { const node = normalizeNode( - { type: 'Actor', data: { id: 'a1', slug: 'a1', name: 'Ada', type: 'investor' } }, + { type: 'Actor', id: 'a1', data: { slug: 'a1', name: 'Ada', type: 'investor' } }, SCHEMA, ); // The whole point of the namespaced key: no collision, no preservation @@ -80,7 +89,6 @@ describe('normalizeNode identity and value normalization', () => { expect(node.attrs).toEqual({ [ORBIT_TYPE_KEY]: 'Actor', // adapter-owned kind type: 'investor', // the schema's own property, verbatim - id: 'a1', slug: 'a1', name: 'Ada', }); @@ -90,7 +98,8 @@ describe('normalizeNode identity and value normalization', () => { const node = normalizeNode( { type: 'Actor', - data: { id: 'a1', slug: 'a1', type: 'investor', [ORBIT_TYPE_KEY]: 'Forged' }, + id: 'a1', + data: { slug: 'a1', type: 'investor', [ORBIT_TYPE_KEY]: 'Forged' }, }, SCHEMA, ); @@ -102,62 +111,97 @@ describe('normalizeNode identity and value normalization', () => { it('does not let exported data overwrite the adapter-owned node discriminator', () => { const node = normalizeNode( - { type: 'Event', data: { id: 'e1', slug: 'e1', [ORBIT_TYPE_KEY]: 'Actor' } }, + { type: 'Event', id: 'e1', data: { slug: 'e1', [ORBIT_TYPE_KEY]: 'Actor' } }, SCHEMA, ); expect((node.attrs as Record)[ORBIT_TYPE_KEY]).toBe('Event'); }); - it('normalizes Date day-numbers to YYYY-MM-DD (UTC)', () => { - const attrs = (day: number) => - normalizeNode({ type: 'Event', data: { id: 'e', day } }, SCHEMA).attrs as Record< + it('retains exported Date calendar strings', () => { + const attrs = (day: string) => + normalizeNode({ type: 'Event', id: 'e', data: { day } }, SCHEMA).attrs as Record< string, unknown >; - expect(attrs(0)['day']).toBe('1970-01-01'); // epoch day 0 - expect(attrs(-1)['day']).toBe('1969-12-31'); // negative days - expect(attrs(20000)['day']).toBe('2024-10-04'); - expect(attrs(19)['day']).toBe('1970-01-20'); + expect(attrs('1970-01-01')['day']).toBe('1970-01-01'); // epoch day 0 + expect(attrs('1969-12-31')['day']).toBe('1969-12-31'); // negative days + expect(attrs('2024-10-04')['day']).toBe('2024-10-04'); + expect(attrs('1970-01-20')['day']).toBe('1970-01-20'); + expect(attrs('-0001-01-01')['day']).toBe('-000001-01-01'); + expect(attrs('+10000-01-01')['day']).toBe('+010000-01-01'); }); - it('normalizes DateTime epoch-ms to ISO 8601', () => { + it('normalizes timezone-less UTC DateTime strings to explicit ISO 8601 UTC', () => { const node = normalizeNode( - { type: 'Event', data: { id: 'e', at: 1_700_000_000_123 } }, + { type: 'Event', id: 'e', data: { at: '2023-11-14T22:13:20.123' } }, SCHEMA, ); expect((node.attrs as Record)['at']).toBe('2023-11-14T22:13:20.123Z'); }); + it.each([ + ['2024-01-01T00:00:00', '2024-01-01T00:00:00.000Z'], + ['2024-01-01T00:00:00.1', '2024-01-01T00:00:00.100Z'], + ['2024-01-01T00:00:00.12', '2024-01-01T00:00:00.120Z'], + ['-0001-01-01T00:00:00', '-000001-01-01T00:00:00.000Z'], + ['+10000-01-01T00:00:00', '+010000-01-01T00:00:00.000Z'], + ])('normalizes server timestamp %s to a parseable UTC instant', (at, expected) => { + const node = normalizeNode({ type: 'Event', id: 'e', data: { at } }, SCHEMA); + expect(node.attrs!['at']).toBe(expected); + expect(new Date(node.attrs!['at'] as string).toISOString()).toBe(expected); + }); + + it.each(['day', 'at'])('rejects legacy numeric %s encoding', (property) => { + expect(() => normalizeNode({ type: 'Event', id: 'e', data: { [property]: 0 } }, SCHEMA)) + .toThrow(InvalidExportLineError); + }); + + it('uses physical ids separately from numeric user id properties on nodes and edges', () => { + const schema = parsePgSchema('node N { id: I64? } edge R: N -> N { id: U64? }'); + const lines = [ + { type: 'N', id: 'physical-node', data: { id: 42 } }, + { edge: 'R', id: 'physical-edge', from: 'physical-node', to: 'physical-node', data: { id: 7 } }, + ] satisfies ExportRecord[]; + const node = normalizeNode(lines[0] as Extract, schema); + const edge = normalizeEdge(lines[1] as Extract, schema); + expect(node.id).toBe(encodeSourceId('N', 'physical-node')); + expect(edge.id).toBe(encodeSourceId('R', 'physical-edge')); + expect(edge.source).toBe(node.id); + expect(node.attrs!['id']).toBe(42); + expect(edge.attrs!['id']).toBe(7); + expect(normalizeNode({ type: 'N', id: 'other', data: {} }, schema).attrs!['id']).toBeNull(); + }); + it.each(['node', 'edge'] as const)('normalizes scalar encodings inside %s list properties', (kind) => { const properties = 'days: [Date] times: [DateTime] payloads: [Blob] missing: [Date]? tags: [String]'; const schema = parsePgSchema(`node Event { ${properties} } edge Next: Event -> Event { ${properties} }`); const data = { - id: 'e', days: [0, -1], times: [0, 1000], missing: null, + days: ['1970-01-01', '1969-12-31', null], times: ['1970-01-01T00:00:00', '1970-01-01T00:00:01', null], payloads: ['base64:aGVsbG8=', 's3://bucket/key.bin'], tags: ['one', 'two'], }; const normalized = kind === 'node' - ? normalizeNode({ type: 'Event', data }, schema) - : normalizeEdge({ edge: 'Next', from: 'a', to: 'b', data }, schema); + ? normalizeNode({ type: 'Event', id: 'e', data }, schema) + : normalizeEdge({ edge: 'Next', id: 'e', from: 'a', to: 'b', data }, schema); expect(normalized.attrs).toMatchObject({ - days: ['1970-01-01', '1969-12-31'], - times: ['1970-01-01T00:00:00.000Z', '1970-01-01T00:00:01.000Z'], + days: ['1970-01-01', '1969-12-31', null], + times: ['1970-01-01T00:00:00.000Z', '1970-01-01T00:00:01.000Z', null], payloads: ['data:application/octet-stream;base64,aGVsbG8=', 's3://bucket/key.bin'], missing: null, tags: ['one', 'two'], }); - expect(data.days).toEqual([0, -1]); // normalization leaves source rows intact + expect(data.days).toEqual(['1970-01-01', '1969-12-31', null]); // normalization leaves source rows intact }); it('converts inline base64: blobs to data: URIs, leaves URI refs verbatim', () => { const inline = normalizeNode( - { type: 'Event', data: { id: 'e', payload: 'base64:aGVsbG8=' } }, + { type: 'Event', id: 'e', data: { payload: 'base64:aGVsbG8=' } }, SCHEMA, ); expect((inline.attrs as Record)['payload']).toBe( 'data:application/octet-stream;base64,aGVsbG8=', ); const ref = normalizeNode( - { type: 'Event', data: { id: 'e', payload: 's3://bucket/key.bin' } }, + { type: 'Event', id: 'e', data: { payload: 's3://bucket/key.bin' } }, SCHEMA, ); expect((ref.attrs as Record)['payload']).toBe('s3://bucket/key.bin'); @@ -167,14 +211,16 @@ describe('normalizeNode identity and value normalization', () => { const node = normalizeNode( { type: 'Event', - data: { id: 'e', day: null, status: 'open', weight: 0.5, mystery: 42 }, + id: 'e', + data: { day: null, status: 'open', weight: 0.5, mystery: 42 }, }, SCHEMA, ); expect(node.attrs).toEqual({ [ORBIT_TYPE_KEY]: 'Event', - id: 'e', day: null, + at: null, + payload: null, status: 'open', weight: 0.5, mystery: 42, @@ -182,17 +228,17 @@ describe('normalizeNode identity and value normalization', () => { }); it('tolerates node types absent from the schema (attrs verbatim)', () => { - const node = normalizeNode({ type: 'Ghost', data: { id: 'g', day: 20000 } }, SCHEMA); + const node = normalizeNode({ type: 'Ghost', id: 'g', data: { day: 20000 } }, SCHEMA); expect(node.id).toBe(encodeSourceId('Ghost', 'g')); // no schema info — no temporal normalization possible - expect(node.attrs).toEqual({ [ORBIT_TYPE_KEY]: 'Ghost', id: 'g', day: 20000 }); + expect(node.attrs).toEqual({ [ORBIT_TYPE_KEY]: 'Ghost', day: 20000 }); }); - it('throws a typed error when data.id is missing or non-string', () => { - expect(() => normalizeNode({ type: 'Event', data: { slug: 'e' } }, SCHEMA)).toThrow( + it('throws a typed error when top-level id is missing or non-string', () => { + expect(() => normalizeNode({ type: 'Event', data: { id: 'user-id', slug: 'e' } } as never, SCHEMA)).toThrow( InvalidExportLineError, ); - expect(() => normalizeNode({ type: 'Event', data: { id: 9007199254740993 } }, SCHEMA)).toThrow( + expect(() => normalizeNode({ type: 'Event', id: 42, data: {} } as never, SCHEMA)).toThrow( InvalidExportLineError, ); }); @@ -203,7 +249,7 @@ describe('normalizeEdge endpoint resolution', () => { edge: 'Caused', from: 'e1', to: 'a1', - data: { id: 'edge-1', strength: 0.9, linked_on: 20000 }, + id: 'edge-1', data: { strength: 0.9, linked_on: '2024-10-04' }, }; it('namespaces edge id and endpoint ids with schema-resolved types', () => { @@ -217,7 +263,6 @@ describe('normalizeEdge endpoint resolution', () => { const edge = normalizeEdge(line, SCHEMA); expect(edge.attrs).toEqual({ [ORBIT_TYPE_KEY]: 'Caused', - id: 'edge-1', strength: 0.9, linked_on: '2024-10-04', }); @@ -236,10 +281,10 @@ describe('normalizeEdge endpoint resolution', () => { it('throws UnknownEdgeTypeError for edge names the schema does not declare', () => { expect(() => - normalizeEdge({ edge: 'Nope', from: 'a', to: 'b', data: { id: 'x' } }, SCHEMA), + normalizeEdge({ edge: 'Nope', from: 'a', to: 'b', id: 'x', data: {} }, SCHEMA), ).toThrow(UnknownEdgeTypeError); try { - normalizeEdge({ edge: 'Nope', from: 'a', to: 'b', data: { id: 'x' } }, SCHEMA); + normalizeEdge({ edge: 'Nope', from: 'a', to: 'b', id: 'x', data: {} }, SCHEMA); } catch (err) { expect(err).toBeInstanceOf(UnknownEdgeTypeError); expect((err as UnknownEdgeTypeError).edgeName).toBe('Nope'); @@ -247,19 +292,19 @@ describe('normalizeEdge endpoint resolution', () => { } }); - it('throws a typed error when edge data.id is missing', () => { + it('throws a typed error when edge top-level id is missing', () => { expect(() => - normalizeEdge({ edge: 'Caused', from: 'e1', to: 'a1', data: {} }, SCHEMA), + normalizeEdge({ edge: 'Caused', from: 'e1', to: 'a1', data: {} } as never, SCHEMA), ).toThrow(InvalidExportLineError); }); }); describe('classify → normalize pipeline over a mixed NDJSON batch', () => { it('handles edge-first streams in lexicographic table-key order', () => { - const lines: unknown[] = [ - { edge: 'Caused', from: 'e1', to: 'a1', data: { id: 'c1' } }, - { type: 'Actor', data: { id: 'a1', slug: 'a1', name: 'Ada' } }, - { type: 'Event', data: { id: 'e1', slug: 'e1', day: 0 } }, + const lines: ExportRecord[] = [ + { edge: 'Caused', from: 'e1', to: 'a1', id: 'c1', data: {} }, + { type: 'Actor', id: 'a1', data: { slug: 'a1', name: 'Ada' } }, + { type: 'Event', id: 'e1', data: { slug: 'e1', day: '1970-01-01' } }, ]; const nodes = []; const edges = []; diff --git a/packages/omnigraph/test/pg-schema.test.ts b/packages/omnigraph/test/pg-schema.test.ts index b252611..a990a09 100644 --- a/packages/omnigraph/test/pg-schema.test.ts +++ b/packages/omnigraph/test/pg-schema.test.ts @@ -360,7 +360,7 @@ describe('schemaFingerprint revision stamp', () => { }); describe('bigIntKeyWarnings for the ≥2^53 hazard', () => { - it('flags I64/U64 properties that are @key or named id', () => { + it('flags I64/U64 schema keys, not ordinary properties named id', () => { const schema = parsePgSchema(` node Account { acct_num: I64 @key @@ -378,7 +378,6 @@ describe('bigIntKeyWarnings for the ≥2^53 hazard', () => { `); expect(bigIntKeyWarnings(schema)).toEqual([ { type: 'Account', property: 'acct_num' }, - { type: 'Device', property: 'id' }, ]); }); diff --git a/packages/omnigraph/test/raw.d.ts b/packages/omnigraph/test/raw.d.ts index de6b5bc..15bb174 100644 --- a/packages/omnigraph/test/raw.d.ts +++ b/packages/omnigraph/test/raw.d.ts @@ -1,7 +1,6 @@ /** * Vite `?raw` imports (used by loader.test.ts to load the recorded HTTP - * fixtures as verbatim text without node:fs — the workspace deliberately - * ships no @types/node). + * fixtures as verbatim text). */ declare module '*?raw' { const content: string; diff --git a/packages/omnigraph/test/recorded-fixtures.test.ts b/packages/omnigraph/test/recorded-fixtures.test.ts index 49ed22a..0802b43 100644 --- a/packages/omnigraph/test/recorded-fixtures.test.ts +++ b/packages/omnigraph/test/recorded-fixtures.test.ts @@ -1,10 +1,42 @@ import { describe, expect, it } from 'vitest'; +import type { ExportRecord, Schema } from '@modernrelay/omnigraph'; import demoPg from '../../../fixtures/omnigraph/cluster/demo.pg?raw'; import schemaBody from '../../../fixtures/omnigraph/recorded/schema.json?raw'; +import exportBody from '../../../fixtures/omnigraph/recorded/export.ndjson?raw'; +import { classifyExportLine, normalizeNode, parsePgSchema } from '../src/index'; describe('recorded Omnigraph wire fixtures', () => { it('keeps the schema response in the server serializer format', () => { - expect(schemaBody).toBe(JSON.stringify({ schema_source: demoPg })); + const recorded = JSON.parse(schemaBody) as { + schema_source: Schema['schemaSource']; + system_columns: Schema['systemColumns']; + catalogue_source: Schema['catalogueSource']; + }; + expect(recorded).toEqual({ + schema_source: demoPg, + system_columns: { id: '__id', src: '__src', dst: '__dst' }, + // 0.14 exposes the virtual engine catalogue separately. It must not + // be merged into the user graph schema consumed by Orbit's parser. + catalogue_source: expect.stringContaining('node @Engine'), + }); + expect(schemaBody).toBe(JSON.stringify(recorded)); + }); + + it('preserves physical identity and numeric user ids from actual 0.14 exports', () => { + const records = exportBody.trim().split('\n').map((line) => JSON.parse(line) as ExportRecord); + for (const record of records) { + expect(typeof record.id).toBe('string'); + expect(classifyExportLine(record).kind).not.toBe('unknown'); + } + const signal = records.find((record) => 'type' in record && record.type === 'Signal' && record.id === 'signal-001'); + expect(signal).toBeDefined(); + const classified = classifyExportLine(signal); + expect(classified.kind).toBe('node'); + if (classified.kind !== 'node') throw new Error('recorded Signal missing'); + const normalized = normalizeNode(classified, parsePgSchema(demoPg)); + expect(normalized.attrs!['id']).toBe(1); + expect(normalized.attrs!['source']).toBeNull(); // omitted nullable wire property + expect(normalized.attrs!['observed_at']).toBe('2017-06-09'); }); }); diff --git a/packages/omnigraph/test/search-service.test.ts b/packages/omnigraph/test/search-service.test.ts index abf7232..6633034 100644 --- a/packages/omnigraph/test/search-service.test.ts +++ b/packages/omnigraph/test/search-service.test.ts @@ -6,7 +6,7 @@ * through a REAL `createGraphInstance` loaded by the REAL export loader. */ -import { Omnigraph, OmnigraphError } from '@modernrelay/omnigraph'; +import { HTTP_API_CONTRACT, HTTP_API_CONTRACT_HEADER, Omnigraph, OmnigraphError } from '@modernrelay/omnigraph'; import type { FetchLike } from '@modernrelay/omnigraph'; import { createGraphInstance, createRequestContext } from '@modernrelay/orbit-core'; import type { RequestContextHandle, SearchResult } from '@modernrelay/orbit-core'; @@ -29,6 +29,7 @@ import commitsBody from '../../../fixtures/omnigraph/recorded/commits.json?raw'; import exportPartialBody from '../../../fixtures/omnigraph/recorded/export-partial.ndjson?raw'; import healthBody from '../../../fixtures/omnigraph/recorded/health.json?raw'; import schemaBody from '../../../fixtures/omnigraph/recorded/schema.json?raw'; +import searchBody from '../../../fixtures/omnigraph/recorded/search.json?raw'; // --------------------------------------------------------------------------- // replayFetch — doctored HTTP through the real SDK (loader.test.ts pattern, @@ -47,7 +48,7 @@ type Responder = (signal: AbortSignal | undefined) => Response | Promise - new Response(body, { status, headers: { 'content-type': 'application/json' } }); + new Response(body, { status, headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' } }); } /** Never resolves; rejects with AbortError when the request signal fires. */ @@ -67,7 +68,7 @@ function hanging(): Responder { /** Stream `text` as NDJSON in one chunk (enough realism for the loader leg). */ function ndjson(text: string): Responder { return () => - new Response(text, { status: 200, headers: { 'content-type': 'application/x-ndjson' } }); + new Response(text, { status: 200, headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/x-ndjson' } }); } function replayFetch(routes: Record): { @@ -85,10 +86,13 @@ function replayFetch(routes: Record): { hadSignal: init?.signal !== undefined && init.signal !== null, }); const responder = routes[`${method} ${url.pathname}`]; + if (responder === undefined && method === 'HEAD' && url.pathname === '/healthz') { + return new Response(null, { headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT } }); + } if (responder === undefined) { return new Response( JSON.stringify({ error: `replayFetch: no recording for ${method} ${url.pathname}` }), - { status: 404, headers: { 'content-type': 'application/json' } }, + { status: 404, headers: { [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT, 'content-type': 'application/json' } }, ); } return responder(init?.signal ?? undefined); @@ -124,7 +128,7 @@ function harness( client, graphId: 'demo', queryName: QUERY, - typeOf: { $s: 'Signal' }, + typeOf: { s: 'Signal' }, ...opts, }); return { service, calls: replay.calls }; @@ -197,11 +201,20 @@ describe('createOmnigraphSearchService — invocation', () => { // --------------------------------------------------------------------------- describe('row mapping', () => { + it('maps the actual 0.14 stored-query recording through the real SDK', async () => { + const { service } = harness({ + 'POST /graphs/demo/queries/search_signals': json(searchBody), + }, { queryName: 'search_signals', params: (q) => ({ q }) }); + await expect(service.search('Signal 1:', { limit: 10 }, context().context)).resolves.toEqual([ + { id: encodeSourceId('Signal', 'signal-001'), label: 'Signal 1: search admission' }, + ]); + }); + it('encodes type-qualified ids that round-trip through decodeSourceId and maps score and label', async () => { const rows = [ - { $s: { id: 'signal-001', slug: 'signal-001' }, score: 7.5, '$s.title': 'Alpha spike' }, - { $s: { id: 'signal-002', slug: 'signal-002' }, '$s.title': 'Beta drift' }, // no score column - { $s: { id: 'signal-003', slug: 'signal-003' }, score: 'high' }, // non-numeric score, no string column + { s: { '@id': 'signal-001', slug: 'signal-001' }, score: 7.5, 's.title': 'Alpha spike' }, + { s: { '@id': 'signal-002', slug: 'signal-002' }, 's.title': 'Beta drift' }, // no score column + { s: { '@id': 'signal-003', slug: 'signal-003' }, score: 'high' }, // non-numeric score, no string column ]; const { service } = harness({ [INVOKE_ROUTE]: json(readEnvelope(rows)) }); @@ -217,11 +230,11 @@ describe('row mapping', () => { it('labelColumn overrides the first-string-column default', async () => { const rows = [ - { $s: { id: 'signal-004' }, '$s.title': 'Title wins by order', '$s.slug': 'slug-004' }, + { s: { '@id': 'signal-004' }, 's.title': 'Title wins by order', 's.slug': 'slug-004' }, ]; const { service } = harness( { [INVOKE_ROUTE]: json(readEnvelope(rows)) }, - { labelColumn: '$s.slug' }, + { labelColumn: 's.slug' }, ); const results = await service.search('slug', { limit: 5 }, context().context); @@ -230,12 +243,12 @@ describe('row mapping', () => { it('a column→type record maps the first listed column carrying a node struct', async () => { const rows = [ - { $s: { id: 'signal-005' }, $a: { id: 'actor-001' } }, // $s listed first → Signal wins - { $a: { id: 'actor-002' } }, // only $a present → Actor + { s: { '@id': 'signal-005' }, a: { '@id': 'actor-001' } }, // s listed first → Signal wins + { a: { '@id': 'actor-002' } }, // only a present → Actor ]; const { service } = harness( { [INVOKE_ROUTE]: json(readEnvelope(rows)) }, - { typeOf: { $s: 'Signal', $a: 'Actor' } }, + { typeOf: { s: 'Signal', a: 'Actor' } }, ); const results = await service.search('mixed', { limit: 5 }, context().context); @@ -246,7 +259,7 @@ describe('row mapping', () => { }); it('a typeOf function names the type per row; the first node-struct column supplies the id', async () => { - const rows = [{ score: 1.25, $t: { id: 'trace-001' } }]; + const rows = [{ score: 1.25, t: { '@id': 'trace-001' } }]; const { service } = harness( { [INVOKE_ROUTE]: json(readEnvelope(rows)) }, { typeOf: () => 'Trace' }, @@ -258,16 +271,16 @@ describe('row mapping', () => { it('mapRow fully overrides the default mapping; null skips the row', async () => { const rows = [ - { $s: { id: 'signal-006' } }, - { $s: { id: 'signal-007' } }, + { s: { '@id': 'signal-006' } }, + { s: { '@id': 'signal-007' } }, ]; const { service } = harness( { [INVOKE_ROUTE]: json(readEnvelope(rows)) }, { mapRow: (row) => { - const struct = row['$s'] as { id: string }; - if (struct.id === 'signal-006') return null; - return { id: encodeSourceId('Signal', struct.id), label: 'custom', score: 0.5 }; + const struct = row['s'] as { '@id': string }; + if (struct['@id'] === 'signal-006') return null; + return { id: encodeSourceId('Signal', struct['@id']), label: 'custom', score: 0.5 }; }, }, ); @@ -279,7 +292,7 @@ describe('row mapping', () => { }); it('caps results at the requested limit even when the query returns more', async () => { - const rows = [1, 2, 3, 4].map((n) => ({ $s: { id: `signal-00${n}` } })); + const rows = [1, 2, 3, 4].map((n) => ({ s: { '@id': `signal-00${n}` } })); const { service } = harness({ [INVOKE_ROUTE]: json(readEnvelope(rows)) }); const results = await service.search('many', { limit: 2 }, context().context); @@ -287,7 +300,7 @@ describe('row mapping', () => { }); it('a row without a node struct under the mapped columns is a hard error', async () => { - const rows = [{ score: 3, '$s.title': 'no struct projected' }]; + const rows = [{ score: 3, 's.title': 'no struct projected' }]; const { service } = harness({ [INVOKE_ROUTE]: json(readEnvelope(rows)) }); await expect(service.search('bad', { limit: 5 }, context().context)).rejects.toThrow( @@ -295,6 +308,22 @@ describe('row mapping', () => { ); }); + it('uses @id even when a query struct contains an ordinary id property', async () => { + const { service } = harness({ + [INVOKE_ROUTE]: json(readEnvelope([{ s: { '@id': 'physical', id: 'user-id' } }])), + }); + await expect(service.search('identity', { limit: 5 }, context().context)) + .resolves.toEqual([{ id: encodeSourceId('Signal', 'physical') }]); + }); + + it('does not mistake an ordinary id property for a projected node identity', async () => { + const { service } = harness({ + [INVOKE_ROUTE]: json(readEnvelope([{ s: { id: 'user-id' } }])), + }); + await expect(service.search('identity', { limit: 5 }, context().context)) + .rejects.toThrow(/no node struct/); + }); + it('a stored MUTATION envelope (no rows) is a hard error', async () => { const changeEnvelope = JSON.stringify({ affected_nodes: 1, @@ -341,6 +370,28 @@ describe('error surface and cancellation', () => { await expect(pending).rejects.toMatchObject({ name: 'AbortError' }); }); + it('abort during contract discovery remains AbortError and never invokes the query', async () => { + const { service, calls } = harness({ 'HEAD /healthz': hanging() }); + const handle = context(); + const pending = service.search('alpha', { limit: 5 }, handle.context); + await new Promise((resolve) => setTimeout(resolve, 0)); + expect(calls).toHaveLength(1); + handle.abort(); + await expect(pending).rejects.toMatchObject({ name: 'AbortError' }); + expect(invokeCalls(calls)).toEqual([]); + }); + + it.each([null, '0.12'])('rejects a missing or incompatible HTTP contract (%s) before invoking', async (contract) => { + const { service, calls } = harness({ + 'HEAD /healthz': () => new Response(null, { + headers: contract === null ? {} : { [HTTP_API_CONTRACT_HEADER]: contract }, + }), + }); + await expect(service.search('alpha', { limit: 5 }, context().context)) + .rejects.toThrow(/^omnigraph: ApiContractError/); + expect(invokeCalls(calls)).toEqual([]); + }); + it('an already-aborted context rejects without a network call', async () => { const { service, calls } = harness({ [INVOKE_ROUTE]: json(readEnvelope([])) }); const handle = context(); @@ -363,8 +414,8 @@ describe('real core integration with partial-load results', () => { // Signal table; actor-001 belongs to the UNLOADED Actor table (the stored // query searches the whole branch server-side). const searchRows = [ - { $s: { id: 'signal-001', slug: 'signal-001' }, score: 9.1, '$s.title': 'Signal 1' }, - { $a: { id: 'actor-001', slug: 'actor-001' }, score: 4.2, '$a.name': 'Søren Nguyễn' }, + { s: { '@id': 'signal-001', slug: 'signal-001' }, score: 9.1, 's.title': 'Signal 1' }, + { a: { '@id': 'actor-001', slug: 'actor-001' }, score: 4.2, 'a.name': 'Søren Nguyễn' }, ]; const replay = replayFetch({ 'GET /healthz': json(healthBody), @@ -378,7 +429,7 @@ describe('real core integration with partial-load results', () => { client, graphId: 'demo', queryName: QUERY, - typeOf: { $s: 'Signal', $a: 'Actor' }, + typeOf: { s: 'Signal', a: 'Actor' }, }); const instance = createGraphInstance({ engine: () => new FakeEngine(), diff --git a/packages/omnigraph/test/server-entry.test.ts b/packages/omnigraph/test/server-entry.test.ts index 6869c11..3fc9f15 100644 --- a/packages/omnigraph/test/server-entry.test.ts +++ b/packages/omnigraph/test/server-entry.test.ts @@ -5,7 +5,7 @@ * `treeshake:omnigraph-client` gate in scripts/pack-smoke.mjs.) */ -import { Omnigraph } from '@modernrelay/omnigraph'; +import { HTTP_API_CONTRACT, HTTP_API_CONTRACT_HEADER, Omnigraph } from '@modernrelay/omnigraph'; import type { FetchLike } from '@modernrelay/omnigraph'; import { describe, expect, it } from 'vitest'; @@ -14,16 +14,22 @@ import type { OmnigraphSourceOptions } from '../src/index'; import { createOmnigraphServerClient } from '../src/server'; describe('createOmnigraphServerClient in the server-only entry', () => { - it('constructs a real SDK client that authenticates with the bearer token', async () => { - const seen: Array<{ url: string; auth: string | null }> = []; + it('authenticates graph requests while contract discovery and health remain public', async () => { + const seen: Array<{ url: string; method: string; auth: string | null; contract: string | null }> = []; const fetch: FetchLike = async (input, init) => { + const url = input instanceof Request ? input.url : String(input); + const method = init?.method ?? 'GET'; seen.push({ - url: input instanceof Request ? input.url : String(input), + url, + method, auth: new Headers(init?.headers).get('authorization'), + contract: new Headers(init?.headers).get(HTTP_API_CONTRACT_HEADER), }); return new Response( - JSON.stringify({ status: 'ok', version: '0.8.1', internal_schema_version: 4 }), - { status: 200, headers: { 'content-type': 'application/json' } }, + method === 'HEAD' ? null : JSON.stringify(url.endsWith('/schema') + ? { schema_source: 'node Actor { slug: String @key }' } + : { status: 'ok', version: '0.14.0', internal_schema_version: 16 }), + { status: 200, headers: { 'content-type': 'application/json', [HTTP_API_CONTRACT_HEADER]: HTTP_API_CONTRACT } }, ); }; @@ -35,9 +41,12 @@ describe('createOmnigraphServerClient in the server-only entry', () => { expect(client).toBeInstanceOf(Omnigraph); const health = await client.health(); - expect(health.version).toBe('0.8.1'); + expect(health.version).toBe('0.14.0'); + await client.graph('demo').schema.get(); expect(seen).toEqual([ - { url: 'http://og.internal:8080/healthz', auth: 'Bearer secret-token' }, + { url: 'http://og.internal:8080/healthz', method: 'GET', auth: null, contract: '0.14' }, + { url: 'http://og.internal:8080/healthz', method: 'HEAD', auth: null, contract: '0.14' }, + { url: 'http://og.internal:8080/graphs/demo/schema', method: 'GET', auth: 'Bearer secret-token', contract: '0.14' }, ]); }); }); diff --git a/packages/omnigraph/tsconfig.json b/packages/omnigraph/tsconfig.json index 7680f99..9241f01 100644 --- a/packages/omnigraph/tsconfig.json +++ b/packages/omnigraph/tsconfig.json @@ -1,4 +1,7 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"] + }, "include": ["src", "test"] } diff --git a/packages/react/package.json b/packages/react/package.json index 5d5b35d..0dffff7 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -108,13 +108,13 @@ "react-dom": ">=18" }, "devDependencies": { - "@testing-library/react": "^16.0.0", - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "jsdom": "^26.0.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "typescript": "^5.6.0", - "vitest": "^3.0.0" + "@testing-library/react": "^16.3.3", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "jsdom": "^30.1.3", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "typescript": "^7.0.2", + "vitest": "^5.0.5" } } diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index adde44d..f31f4de 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -8,7 +8,7 @@ export { Graph } from './Graph'; export type { GraphProps, GraphHandle } from './Graph'; export { GraphProvider } from './GraphProvider'; -export type { GraphProviderProps } from './GraphProvider'; +export type { AnyGraphInstance, GraphProviderProps } from './GraphProvider'; // Overlays: rendered by internally; exported so hosts composing // directly can reuse them. diff --git a/packages/react/test/graph.test.tsx b/packages/react/test/graph.test.tsx index 5fe1c45..63e7cfc 100644 --- a/packages/react/test/graph.test.tsx +++ b/packages/react/test/graph.test.tsx @@ -5,6 +5,7 @@ import { describe, expect, it, vi } from 'vitest'; import { act, render, screen } from '@testing-library/react'; import { StrictMode, createRef } from 'react'; +import type { ReactElement } from 'react'; import type { AcceptedEdge, DimensionSpec, @@ -450,7 +451,7 @@ describe('', () => { }); it('click injection delivers the caller node object and updates useGraphSelection', async () => { - function SelectionProbe(): JSX.Element { + function SelectionProbe(): ReactElement { // v0.3: useGraphSelection returns the full namespaced SelectionState. const selection = useGraphSelection(); return
{selection.nodeIds.join(',')}
; @@ -504,7 +505,7 @@ describe('', () => { }); it('edge callbacks receive typed AcceptedEdge payloads and drive useGraphEdgeHover', async () => { - function EdgeHoverProbe(): JSX.Element { + function EdgeHoverProbe(): ReactElement { const edgeId = useGraphEdgeHover(); return
{edgeId ?? 'none'}
; } @@ -545,7 +546,7 @@ describe('', () => { }); it('drag callbacks receive typed payloads; drag end pins the node and updates useGraphPins', async () => { - function PinsProbe(): JSX.Element { + function PinsProbe(): ReactElement { const pins = useGraphPins(); return (
@@ -639,7 +640,7 @@ describe('', () => { }); it('subgraph prop hard-scopes the scene, diffs structurally, and null clears', async () => { - function ScopeProbe(): JSX.Element { + function ScopeProbe(): ReactElement { const scope = useGraphScope(); return
{scope === null ? 'full' : scope.seedIds.join(',')}
; } @@ -712,7 +713,7 @@ describe('', () => { }); it('handle expandNode/retractExpansion round-trip through the local service and pendingExpansions', async () => { - function PendingProbe(): JSX.Element { + function PendingProbe(): ReactElement { const pending = useGraphPendingExpansions(); return
{[...pending].join(',')}
; } @@ -753,7 +754,7 @@ describe('', () => { }); it('handle beginIngest/removeOverlay drive a overlay session; useGraphOverlays tracks it', async () => { - function OverlaysProbe(): JSX.Element { + function OverlaysProbe(): ReactElement { const overlays = useGraphOverlays(); return
{overlays.join(',')}
; } @@ -971,7 +972,7 @@ describe(' filter/crossfilter props + history handle', () => { }); it('handle undo/redo delegate: a recorded selection mutation round-trips; useGraphHistory is live', async () => { - function HistoryProbe(): JSX.Element { + function HistoryProbe(): ReactElement { const history = useGraphHistory(); return {`${history.undoDepth}/${history.redoDepth}`}; } diff --git a/packages/react/test/legend.test.tsx b/packages/react/test/legend.test.tsx index ae776b8..3a23a2f 100644 --- a/packages/react/test/legend.test.tsx +++ b/packages/react/test/legend.test.tsx @@ -9,6 +9,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'; import { createRef } from 'react'; +import type { ReactElement } from 'react'; import type { GraphSnapshot, MetricColumn, Scale } from '@modernrelay/orbit-core'; import { FakeEngine } from '@modernrelay/orbit-core/testing'; import { Graph, useGraphTheme } from '../src/index'; @@ -309,7 +310,7 @@ describe('', () => { }); describe('useGraphTheme', () => { - function ThemeProbe(): JSX.Element { + function ThemeProbe(): ReactElement { const theme = useGraphTheme(); return
{`${theme.background}|${theme.nodeDefault}`}
; } diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index c57de73..706d670 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ - esbuild: { jsx: 'automatic' }, + oxc: { jsx: { runtime: 'automatic' } }, test: { environment: 'jsdom', include: ['test/**/*.test.{ts,tsx}'], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aebf2cc..45e54d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.15.0 + version: 12.15.0 + +packages: + + '@pnpm/exe.android-arm64@12.15.0': + resolution: {integrity: sha512-eVCqmscY70LGvgRzu3mi8IBWBFGix+a6mNZoWmXxESsBdeiKEF9xQSuaeel10yn+zI7TXy2jlI63vFLzETk+aQ==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.15.0': + resolution: {integrity: sha512-Gx/WbkFcdUFUg8g8AShezcS9EiQxfYvdAm2hfKLO8sfJmJvKOCt5fzlgHWDzmGhoclibgW+tUGZ/KF4F4wOTCA==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.15.0': + resolution: {integrity: sha512-N0ZykiDWCvqSBJvt71j7cSoBR993FqvYZFtmpCtqvW3pguiI+NAgraLPA5OTwu5mV+/d8hYpVcPktJA3xFDLtA==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.15.0': + resolution: {integrity: sha512-7Ntr2HlBUxzwWOg7NwDxCbRW/3vXuqKO+hcXm+w3SBi9rrHY53li1wLqWVT7Gjxd+lVEHM1QJZo6WJEGFU8C6A==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.15.0': + resolution: {integrity: sha512-btOiyL7fL7W4uQGH0aqFai2TNC3IoKcZ7gNHBVbEFZt2dWrnrD0SufL3iGs3fLlmb4OtuU35uf4Zpr9V9Jh9mA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.15.0': + resolution: {integrity: sha512-pNC38k+O+90FOjbPNSnw0E7apq1PKTmz3fFe1amn+lys/U5kL++uzir8bRiho8ONcyA3d9EU7wdqcY0DKkj+JA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.15.0': + resolution: {integrity: sha512-qML/8aCXslh8td/w4U+HJNqUcZ2+m6EfTbWScIzZRmyPsRFN+xB4LP1U/hymxc1iSJiKtG56HJx2fvUErWFIGw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.15.0': + resolution: {integrity: sha512-tjRDUUl7RCJ6T/6eoNPxOqkwU4Mzi5RtTXmSAxujyz37OTwwsMU7Ps087Zk4gHcUvRSeyF40ZFsew3vtE+nmUA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.15.0': + resolution: {integrity: sha512-bF1uBWEfbwaeryz6lIiaJ8AWD082otZfvzGX5l+6LZRpRwUEpJHUsJrORaYP5/cNMv5ZR2p6TvvcJcQzwtDzmw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.15.0': + resolution: {integrity: sha512-zKMhIzsexYMToeLmqV5jPsvV/f9vwsJb2kUH2NFYzalbxImeBrlA4kL7GwF8gD4pagV6jYYcJb8RjbZIdjHptg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.15.0': + resolution: {integrity: sha512-A9J0Jg0Rdx+qQU4qXtwyST5tto9IOu1zi4fDk35nbc6DWahggbcKtFvZPKFwL2qgUXGXOX//hXv6z/sp6emO8A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.15.0': + resolution: {integrity: sha512-yc+QlZR+9+nr29J4fRzhMoapgxTBDndq/+peyoq1XUufnQFnfbXUMFudDIKzHi545linGqmOmXfn0NoufNgcOg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.15.0': + resolution: {integrity: sha512-fPXZxuY1VclkOga9bc53qNCXcegfeoBR8+Ue+AospDwKzuGGSHll0oDxkLfkmpjyRqpe7bH5DyQPYp/xSMaIVA==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.15.0': + resolution: {integrity: sha512-nrd+Tp1We1DGj4DGG5Bea9lZNh9y1PjlLBdEwdInS4D0h0UIDtM7JaGGGDJhNzIwcHASyihWI7HLV+dtG+fhYg==} + cpu: [x64] + os: [win32] + + pnpm@12.15.0: + resolution: {integrity: sha512-s5UdbW/0qfE9x89WzSjSuOs328ycaOUuHhGRhz6p+CoBcoerULqtxczElPA2xnwOR+sTYIwvo29HcRth6hKOYQ==} + engines: {node: '>=18'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.15.0': + optional: true + + '@pnpm/exe.android-x64@12.15.0': + optional: true + + '@pnpm/exe.darwin-arm64@12.15.0': + optional: true + + '@pnpm/exe.darwin-x64@12.15.0': + optional: true + + '@pnpm/exe.freebsd-x64@12.15.0': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.15.0': + optional: true + + '@pnpm/exe.linux-arm64@12.15.0': + optional: true + + '@pnpm/exe.linux-ppc64@12.15.0': + optional: true + + '@pnpm/exe.linux-riscv64@12.15.0': + optional: true + + '@pnpm/exe.linux-s390x@12.15.0': + optional: true + + '@pnpm/exe.linux-x64-musl@12.15.0': + optional: true + + '@pnpm/exe.linux-x64@12.15.0': + optional: true + + '@pnpm/exe.win32-arm64@12.15.0': + optional: true + + '@pnpm/exe.win32-x64@12.15.0': + optional: true + + pnpm@12.15.0: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.15.0 + '@pnpm/exe.android-x64': 12.15.0 + '@pnpm/exe.darwin-arm64': 12.15.0 + '@pnpm/exe.darwin-x64': 12.15.0 + '@pnpm/exe.freebsd-x64': 12.15.0 + '@pnpm/exe.linux-arm64': 12.15.0 + '@pnpm/exe.linux-arm64-musl': 12.15.0 + '@pnpm/exe.linux-ppc64': 12.15.0 + '@pnpm/exe.linux-riscv64': 12.15.0 + '@pnpm/exe.linux-s390x': 12.15.0 + '@pnpm/exe.linux-x64': 12.15.0 + '@pnpm/exe.linux-x64-musl': 12.15.0 + '@pnpm/exe.win32-arm64': 12.15.0 + '@pnpm/exe.win32-x64': 12.15.0 + +--- lockfileVersion: '9.0' settings: @@ -12,35 +170,35 @@ importers: specifier: ^0.18.5 version: 0.18.5 '@changesets/cli': - specifier: ^2.31.1 - version: 2.31.1(@types/node@25.9.5) + specifier: ^3.0.3 + version: 3.0.3 esbuild: - specifier: ^0.28.1 - version: 0.28.1 + specifier: ^0.28.2 + version: 0.28.2 eslint: - specifier: ^10.7.0 - version: 10.7.0 + specifier: ^10.13.0 + version: 10.13.0(supports-color@7.2.0) publint: - specifier: ^0.3.21 - version: 0.3.21 + specifier: ^0.3.25 + version: 0.3.25 tsup: - specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.20)(typescript@5.9.3) + specifier: ^9.0.0 + version: 9.0.0(postcss@8.5.31)(typescript@6.0.3)(yaml@2.9.1) typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.65.0 - version: 8.65.0(eslint@10.7.0)(typescript@5.9.3) + specifier: ^8.72.0 + version: 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) vitest: - specifier: ^3.0.0 - version: 3.2.7(@types/node@25.9.5)(jsdom@26.1.0) + specifier: ^5.0.5 + version: 5.0.5(@types/node@25.9.9)(jsdom@30.1.3)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) apps/demo: dependencies: '@modernrelay/omnigraph': - specifier: 0.10.0 - version: 0.10.0 + specifier: 0.14.0 + version: 0.14.0 '@modernrelay/orbit-core': specifier: workspace:* version: link:../../packages/core @@ -57,49 +215,61 @@ importers: specifier: workspace:* version: link:../../packages/react react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.3.1 + version: 19.3.1 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.3.1 + version: 19.3.1(react@19.3.1) devDependencies: '@axe-core/playwright': - specifier: ^4.12.1 - version: 4.12.1(playwright-core@1.61.1) + specifier: ^4.14.0 + version: 4.14.0(playwright-core@1.64.1) '@playwright/test': - specifier: ^1.49.0 - version: 1.61.1 + specifier: ^1.64.1 + version: 1.64.1 '@types/react': - specifier: ^18.3.0 - version: 18.3.31 + specifier: ^19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.31) + specifier: ^19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': - specifier: ^4.3.0 - version: 4.7.0(vite@6.4.3(@types/node@25.9.5)) + specifier: ^6.1.2 + version: 6.1.2(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vite: - specifier: ^6.0.0 - version: 6.4.3(@types/node@25.9.5) + specifier: ^8.3.5 + version: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) apps/spike: dependencies: '@cosmos.gl/graph': - specifier: 3.4.0 - version: 3.4.0 + specifier: 3.5.1 + version: 3.5.1(@luma.gl/core@9.3.6)(@luma.gl/engine@9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)))(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6))(@luma.gl/webgl@9.3.6(@luma.gl/core@9.3.6)) + '@luma.gl/core': + specifier: ~9.3.6 + version: 9.3.6 + '@luma.gl/engine': + specifier: ~9.3.6 + version: 9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)) + '@luma.gl/shadertools': + specifier: ~9.3.6 + version: 9.3.6(@luma.gl/core@9.3.6) + '@luma.gl/webgl': + specifier: ~9.3.6 + version: 9.3.6(@luma.gl/core@9.3.6) devDependencies: '@playwright/test': - specifier: ^1.49.0 - version: 1.61.1 + specifier: ^1.64.1 + version: 1.64.1 typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vite: - specifier: ^6.0.0 - version: 6.4.3(@types/node@25.9.5) + specifier: ^8.3.5 + version: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) apps/storybook: dependencies: @@ -113,49 +283,52 @@ importers: specifier: workspace:* version: link:../../packages/react react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.3.1 + version: 19.3.1 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.3.1 + version: 19.3.1(react@19.3.1) devDependencies: '@storybook/addon-docs': - specifier: 10.5.10 - version: 10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5)) + specifier: 10.6.3 + version: 10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1)) '@storybook/react-vite': - specifier: 10.5.10 - version: 10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(typescript@5.9.3)(vite@6.4.3(@types/node@25.9.5)) + specifier: 10.6.3 + version: 10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rollup@4.65.0)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))(supports-color@7.2.0)(typescript@7.0.2)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) '@types/react': - specifier: ^18.3.0 - version: 18.3.31 + specifier: ^19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.31) + specifier: ^19.3.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': - specifier: ^4.3.0 - version: 4.7.0(vite@6.4.3(@types/node@25.9.5)) + specifier: ^6.1.2 + version: 6.1.2(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) storybook: - specifier: 10.5.10 - version: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) + specifier: 10.6.3 + version: 10.6.3(@types/react@19.3.0)(react@19.3.1) typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vite: - specifier: ^6.0.0 - version: 6.4.3(@types/node@25.9.5) + specifier: ^8.3.5 + version: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) packages/core: dependencies: zustand: - specifier: ^5.0.0 - version: 5.0.14(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) + specifier: ^5.0.16 + version: 5.0.16(@types/react@19.3.0)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1)) devDependencies: + '@types/node': + specifier: ^26.6.5 + version: 26.6.5 typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: - specifier: ^3.0.0 - version: 3.2.7(@types/node@25.9.5)(jsdom@26.1.0) + specifier: ^5.0.5 + version: 5.0.5(@types/node@26.6.5)(jsdom@30.1.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1)) packages/data: dependencies: @@ -167,46 +340,61 @@ importers: specifier: ^21.2.0 version: 21.2.0 hyparquet: - specifier: ^1.26.2 - version: 1.26.2 + specifier: ^1.31.5 + version: 1.31.5 typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: - specifier: ^3.0.0 - version: 3.2.7(@types/node@25.9.5)(jsdom@26.1.0) + specifier: ^5.0.5 + version: 5.0.5(@types/node@25.9.9)(jsdom@30.1.3)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) packages/engine-cosmos: dependencies: '@cosmos.gl/graph': - specifier: 3.4.0 - version: 3.4.0 + specifier: 3.5.1 + version: 3.5.1(@luma.gl/core@9.3.6)(@luma.gl/engine@9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)))(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6))(@luma.gl/webgl@9.3.6(@luma.gl/core@9.3.6)) + '@luma.gl/core': + specifier: ~9.3.6 + version: 9.3.6 + '@luma.gl/engine': + specifier: ~9.3.6 + version: 9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)) + '@luma.gl/shadertools': + specifier: ~9.3.6 + version: 9.3.6(@luma.gl/core@9.3.6) + '@luma.gl/webgl': + specifier: ~9.3.6 + version: 9.3.6(@luma.gl/core@9.3.6) '@modernrelay/orbit-core': specifier: workspace:* version: link:../core devDependencies: typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: - specifier: ^3.0.0 - version: 3.2.7(@types/node@25.9.5)(jsdom@26.1.0) + specifier: ^5.0.5 + version: 5.0.5(@types/node@25.9.9)(jsdom@30.1.3)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) packages/omnigraph: dependencies: '@modernrelay/omnigraph': - specifier: 0.10.0 - version: 0.10.0 + specifier: 0.14.0 + version: 0.14.0 '@modernrelay/orbit-core': specifier: workspace:* version: link:../core devDependencies: + '@types/node': + specifier: ^26.6.5 + version: 26.6.5 typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: - specifier: ^3.0.0 - version: 3.2.7(@types/node@25.9.5)(jsdom@26.1.0) + specifier: ^5.0.5 + version: 5.0.5(@types/node@26.6.5)(jsdom@30.1.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1)) packages/react: dependencies: @@ -215,37 +403,37 @@ importers: version: link:../core devDependencies: '@testing-library/react': - specifier: ^16.0.0 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^16.3.3 + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@types/react': - specifier: ^18.3.0 - version: 18.3.31 + specifier: ^19.3.0 + version: 19.3.0 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.31) + specifier: ^19.3.0 + version: 19.3.0(@types/react@19.3.0) jsdom: - specifier: ^26.0.0 - version: 26.1.0 + specifier: ^30.1.3 + version: 30.1.3 react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.3.1 + version: 19.3.1 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.3.1 + version: 19.3.1(react@19.3.1) typescript: - specifier: ^5.6.0 - version: 5.9.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: - specifier: ^3.0.0 - version: 3.2.7(@types/node@25.9.5)(jsdom@26.1.0) + specifier: ^5.0.5 + version: 5.0.5(@types/node@25.9.9)(jsdom@30.1.3)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) packages: '@adobe/css-tools@4.5.0': resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} - '@andrewbranch/untar.js@1.0.3': - resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + '@andrewbranch/untar.js@1.0.4': + resolution: {integrity: sha512-pVXSwPsLuw8IGLo2Di0EaOfsk+ntVvpkk942J/sHYIkwvtKUakEcPh7HBgZ6tuimgzKSEHgCvO4XgQ05DEbwDw==} '@arethetypeswrong/cli@0.18.5': resolution: {integrity: sha512-gM+8vRsQOD/Uc7EnBedUhkG5OCsDWE4uoak5QvomGpMpaky0Eh41p04nIMgrWb8EOmqZUJGc6zz9hsP6E56R7g==} @@ -256,11 +444,17 @@ packages: resolution: {integrity: sha512-9ytjzGwxjm9Uz7I9avfbt5vlQt6uk9uRRESzJjqrznl6WKvI6dwYTo+vJ3U02Wrq/mR3iql/PzhvHhKdJIAjDQ==} engines: {node: '>=20'} - '@asamuzakjp/css-color@3.2.0': - resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@asamuzakjp/css-color@7.1.7': + resolution: {integrity: sha512-Q7ioeear07HwixdIitIn9KS1LZi97CEDFCSjPNm9v+y8KNbsu9q4Lrd4zUQW4faED+E7qxvfeVnbNRW46wFKuw==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - '@axe-core/playwright@4.12.1': - resolution: {integrity: sha512-rMd7xriptqKpP+w5265i4Hdkv2X5kbu6uiBi/B2I7uf3hieRBM3qDCfaKPtxfiYb2mKXfF+yLODJwIx+Jv1GDw==} + '@asamuzakjp/dom-selector@10.0.4': + resolution: {integrity: sha512-A6f1nKy99I6tyoK82U6kBHvQQZmdHmTmPzJYPY/0eaOW0r8/qPmEOwjGHs+hL/vCgOwQTupu4LT1XtXNUuDruA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + '@axe-core/playwright@4.14.0': + resolution: {integrity: sha512-SGUhG5PIHd2eMdpgBF2PyQLOhX+qyDR2PT4cmoS4Qk2ak+jX/rrSvst9l0PGv5WTHolKpUMvVmoHpr4cZgf1RQ==} + engines: {node: '>=22.12.0'} peerDependencies: playwright-core: '>= 1.0.0' @@ -276,8 +470,8 @@ packages: resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.29.7': @@ -298,10 +492,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} @@ -314,136 +504,161 @@ packages: resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + '@babel/helpers@7.29.10': + resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.29.7': - resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.29.7': - resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} engines: {node: '>=6.9.0'} '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + '@babel/traverse@7.29.10': + resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@braidai/lang@1.1.2': resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} - '@changesets/apply-release-plan@7.1.1': - resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + '@bramus/specificity@2.4.3': + resolution: {integrity: sha512-0GEz8qJWokkUVYQYRukmkSHIFNoBH8QTreeHrAFbvz1XFYc3Y+puhMs8PQ5x8GNugiC2l5jvDBXKLbBIByeSBw==} + hasBin: true + + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - '@changesets/assemble-release-plan@6.0.10': - resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + '@changesets/apply-release-plan@8.1.1': + resolution: {integrity: sha512-nk2Hbq3M9NeHMdaIRBDvawKrQJzXB9sGyBUE5yWnIKtvdcNCPj75zBekJYr0gTT2ecJH3eFeTrc8eisPImcv0Q==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/cli@2.31.1': - resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} - hasBin: true + '@changesets/assemble-release-plan@7.0.0': + resolution: {integrity: sha512-oEW8BxdA604kGGtDSCiHr5w9Tv4UWe9I2k61IBNZzCOE1kbYaJj4v+lFQNgcEZFkUc2pV/+hASErGDvpJOZCTg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/config@3.1.4': - resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + '@changesets/changelog-git@1.0.0': + resolution: {integrity: sha512-3Dst2Ime2Op5nd4XmWJLPIgp11ZFqJqSkVug9izK6TDcIV4YlhPS4ECbEVR+eGI0bk0r1ItogD4j2Oli87bJrA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/cli@3.0.3': + resolution: {integrity: sha512-L1i67bMfkK6iC/kDejuNO4pFgTRcWIObsD6Qof2woP1I4M8tj17DGlcpRaTzTv1DYSP5EMwWdEtR8X0Pj5Jg3Q==} + engines: {node: ^22.11 || ^24 || >=26, npm: '>=10.9.0', pnpm: '>=10.0.0', yarn: '>=4.5.2'} + hasBin: true + + '@changesets/config@4.0.1': + resolution: {integrity: sha512-PxpxSQLQSLDjceAgRq+4FWlU+HflDIw03mmPVipxoQx9xrXFUjmqTy3SE+n/2t+DqPdpPiLWVr5NRiLZvjyLwg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-dependents-graph@2.1.4': - resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + '@changesets/errors@1.0.0': + resolution: {integrity: sha512-ElN/mEzn6zmETgjwf5MclCMa9ef59sAR0lfO8VSYIsiRvbC2FbLB/92EoYw10Sl0kGixxHFiJZUSv7dA+YpR8g==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-release-plan@4.0.16': - resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + '@changesets/format@0.1.2': + resolution: {integrity: sha512-Caez5XtNXCFS/G5bwyav3wuXL0tMxVd2ZGbaumWbzN08tyzO21asCw7JZhNtVsAZDCvDRUzZN+Iit9SyRITSYA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + '@changesets/get-dependents-graph@3.0.0': + resolution: {integrity: sha512-ji/t5wFA1zREKXRUePE6Qi+Qu2UgxCeSSGQrphezwvQZrp49B7sJ+8+wvM0tA7zPeSxYKCojDy3WWgrl+s+awg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + '@changesets/git@4.0.1': + resolution: {integrity: sha512-6vWpIAC4LkpmlqaIu37ViT5enyd9+uBwAiGqCGhASvkSHBgx4PrtTGXWTMFYpDmZbjgyonyVgMciPrW4MqtJsA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + '@changesets/parse@1.0.0': + resolution: {integrity: sha512-P0iaMb9p9CRYZiTgAllEIF9AUMQHIy1G72tKlcIqJp61icZSsKQNiOPdxAMZG8m/DvZwt/oz5xEbTpike//dWg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/parse@0.4.3': - resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + '@changesets/pre@3.0.0': + resolution: {integrity: sha512-Zm/6YliV/a2oeWTqHJf6KxLrQwgcK1i/BRDl2m0EKZvbnxV5fG9QRhwJJGshjsZTUTS6dkfURQ2K6aAvgNw/3Q==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + '@changesets/read@1.0.1': + resolution: {integrity: sha512-nzvSC6RcTiWf/dsuwZFXpLzGGsRHYCL68U3uHV7srsulU93aVWY7u2GEJiDZ+4GIIElfaW5EqtKC0UHroY+LTQ==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/read@0.6.7': - resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + '@changesets/should-skip-package@1.0.0': + resolution: {integrity: sha512-pwqoJmbONn1XgXmZXPEExgAaT+HdZLjALFTDgIm+PnS5KeO2nLtzA2/Q+4aMFY14kFMuXKG30MObhvDzWgzDgg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + '@changesets/types@7.0.0': + resolution: {integrity: sha512-c5GoiQyt3pxiXjrWSNoP8/GRf4kG+VnKzovx1OQM8dYYALlSwgedmkPmJ+ZqGxqwg9D3Bkj85Uo4KLd5BN3A0w==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + '@changesets/write@1.0.1': + resolution: {integrity: sha512-q/ThtP9gcnEP6xlv7LrY26C2mHqdGBti/MmOVngt/M/oIGYkssmQGxPK9WzBNt2juVcH/vml2WQ+ra8LXYOTaA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@cosmos.gl/graph@3.4.0': - resolution: {integrity: sha512-qxpkXKIVxy7F/ulE5LSfFU3dP3DLsMijnXI7OwmNamDwHrSFPm4yMhCdVBDkj7RTAeRO4k7bAO6FLeVSwBZSeQ==} - engines: {node: '>=18.0.0', npm: '>=7.0.0'} + '@cosmos.gl/graph@3.5.1': + resolution: {integrity: sha512-PBXR+afmdVHExEtY7353pifxST2+Mm80V+MA4L/A5WQHpLKXlqyHtM+mdrNwBNzjl1HgwZuM4G3Yk7objREysw==} + engines: {node: '>=22.0.0'} + peerDependencies: + '@luma.gl/core': ~9.3.0 + '@luma.gl/engine': ~9.3.0 + '@luma.gl/shadertools': ~9.3.0 + '@luma.gl/webgl': ~9.3.0 - '@csstools/color-helpers@5.1.0': - resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} - engines: {node: '>=18'} + '@csstools/color-helpers@6.1.2': + resolution: {integrity: sha512-grhRy3OKmniaAEKXMjua5z/EODX0MSqBGjunw8+j/3HQjOnahs2AGhvEOIYVUWcU6ScApbhLhVrQTX8XqrMrow==} + engines: {node: '>=20.19.0'} - '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} + '@csstools/css-calc@3.4.3': + resolution: {integrity: sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.2 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-color-parser@3.1.0': - resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} - engines: {node: '>=18'} + '@csstools/css-color-parser@4.2.6': + resolution: {integrity: sha512-iiPQ3iRWwnJkeEn6RIu6SJPr7hYrLz6XZ9s/QZl+2/LI5KQVjpl2fdmDSZKuD4xP6GMmMPgHFFXg6k1Wkz0Trg==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.2 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + '@csstools/css-parser-algorithms@4.0.2': + resolution: {integrity: sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.1.15': + resolution: {integrity: sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.2': + resolution: {integrity: sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==} + engines: {node: '>=20.19.0'} '@emnapi/core@1.11.0': resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} @@ -463,476 +678,164 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -945,8 +848,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -957,10 +860,19 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@exodus/bytes@1.16.0': + resolution: {integrity: sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -981,15 +893,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0': resolution: {integrity: sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==} peerDependencies: @@ -1009,12 +912,21 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@loaderkit/resolve@1.0.6': resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==} @@ -1037,11 +949,17 @@ packages: peerDependencies: '@luma.gl/core': ~9.3.0 - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@3.1.0': + resolution: {integrity: sha512-BcSqCyKhBVZ5YkSzOiheMCV41kqAFptW6xGqYSTjkVTl9XQpr+pqHhwgGCOHQtjDCv7Is6EFyA14Sm5GVbVABA==} + engines: {node: '>=20.0.0'} - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/get-packages@3.1.0': + resolution: {integrity: sha512-0TbBVyvPrP7xGYBI/cP8UP+yl/z+HtbTttAD7FMAJgn/kXOTwh5/60TsqP9ZYY710forNfyV0N8P/IE/ujGZJg==} + engines: {node: '>=20.0.0'} + + '@manypkg/tools@2.1.2': + resolution: {integrity: sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==} + engines: {node: '>=20.0.0'} '@math.gl/core@4.1.0': resolution: {integrity: sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==} @@ -1055,29 +973,24 @@ packages: '@types/react': '>=16' react: '>=16' - '@modernrelay/omnigraph@0.10.0': - resolution: {integrity: sha512-v2iRkfMw4N5MI6V8LHlRDeNZtdyu2otTk+cZpvG/e26BcGVrvWvs0K2M6W9HifvXKk3cm6z9eNyuW9azYQzbIQ==} + '@modernrelay/omnigraph@0.14.0': + resolution: {integrity: sha512-IkRUBcnWIv3ZO7ugELl42tEN+wgD4wzYb0xMbZCDTey/0WgkOQUz+58oCseW2qD511r8Qx+0Th52AhLuPG4Now==} engines: {node: '>=22'} - '@napi-rs/wasm-runtime@1.2.3': - resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/wasm-runtime@1.2.5': + resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 - '@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-parser/binding-android-arm-eabi@0.127.0': resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1208,6 +1121,9 @@ packages: '@oxc-project/types@0.127.0': resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.155.0': + resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} + '@oxc-resolver/binding-android-arm-eabi@11.21.2': resolution: {integrity: sha512-xQoCRv+gKax9KTdwdaQNnAFOai8neay7g3jExDIORzhbrejwGSJaZNTdOJHR5ziLg2joMxOCMOFMo4zuxza2uQ==} cpu: [arm] @@ -1311,29 +1227,129 @@ packages: cpu: [x64] os: [win32] - '@playwright/test@1.61.1': - resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} - engines: {node: '>=18'} + '@playwright/test@1.64.1': + resolution: {integrity: sha512-IaYGml/nSOiZWROfPtuIL7neuu9qDOZ3TNvNljUIrhDMxiGTgPjzj/g9p9RxpS2tSepPDRY+UwAaEeiKtUvIAg==} + engines: {node: '>=20'} hasBin: true - '@probe.gl/env@4.1.1': - resolution: {integrity: sha512-+68seNDMVsEegRB47pFA/Ws1Fjy8agcFYXxzorKToyPcD6zd+gZ5uhwoLd7TzsSw6Ydns//2KEszWn+EnNHTbA==} + '@pnpm/deps.graph-sequencer@1100.0.1': + resolution: {integrity: sha512-pOr5+q1fLYKwFN3LAJuGZEnfXDcQ73zqgDHMtGy+K+uIoUqyY+6MeDCWFwfu+4EFuq76I5EPFofoNAI+Bmmq4A==} + engines: {node: '>=22.13'} - '@probe.gl/log@4.1.1': - resolution: {integrity: sha512-kcZs9BT44pL7hS1OkRGKYRXI/SN9KejUlPD+BY40DguRLzdC5tLG/28WGMyfKdn/51GT4a0p+0P8xvDn1Ez+Kg==} + '@probe.gl/env@4.1.2': + resolution: {integrity: sha512-KIcdjrEiEZVIGX9nh7pZSmTMIKrd+wCb09gyXqpYYI4hs9WMqrQHvKZ7KD8ASutf6kwARwgd4WNQn8aucLSz3g==} - '@probe.gl/stats@4.1.1': - resolution: {integrity: sha512-4VpAyMHOqydSvPlEyHwXaE+AkIdR03nX+Qhlxsk2D/IW4OVmDZgIsvJB1cDzyEEtcfKcnaEbfXeiPgejBceT6g==} + '@probe.gl/log@4.1.2': + resolution: {integrity: sha512-2LqSq4CHhc/HJQasHMPOzA6c7rprlGz8CCREGebo19jxcuKdvXQo0DEmlfId076U6UldMp6jGhWvDHEFLX111Q==} - '@publint/pack@0.1.5': - resolution: {integrity: sha512-edgyN2pP07uXiP4tJs0s8KVmU8M8i60YPbbI0/WDeok1mIJHRXz+CgD8I0nelwDkoCh3EWL/G5kGfbuHjsdbvw==} + '@probe.gl/stats@4.1.2': + resolution: {integrity: sha512-Hqc0UIHd0IZ2+JbovzTz7lYG7CY9D8yCB81zyP92Zl9UDSPcw2cLbTySW14keAQeAo1sjGjUw0+KHxr0Y2h/hA==} + + '@publint/pack@0.1.7': + resolution: {integrity: sha512-4EDEmvxWtgsCnnVeBvtFIFZtUhPPt1+bA9JrSwU4Sa//6oKtzCSlGGXYJr44OD9aGISymbieJ4mCKHUygUDU+g==} engines: {node: '>=18'} - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/binding-android-arm-eabi@1.2.15': + resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.15': + resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.15': + resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.15': + resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.15': + resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.15': + resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.15': + resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.15': + resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.15': + resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.15': + resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.15': + resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.15': + resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] - '@rollup/pluginutils@5.4.0': - resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + '@rolldown/binding-win32-x64-msvc@1.2.15': + resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/pluginutils@5.5.1': + resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1341,141 +1357,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.62.2': - resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + '@rollup/rollup-android-arm-eabi@4.65.0': + resolution: {integrity: sha512-t2AnVba25baFdq7gczzS13JyVcdubLVbFX1X04mxrggDrTQPUXNv3XM0k9H1hr5tqvg7AVvtQ720QHAj0iYqhg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.62.2': - resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + '@rollup/rollup-android-arm64@4.65.0': + resolution: {integrity: sha512-dNONUaEwPGhl/nuO2KV8VABWlcjYyU6KtZGN8dQv5OS5JU7JSCxPijVNKXbRJd0iuTzTiJ4TjPt/4bbvDRNiMQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.62.2': - resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + '@rollup/rollup-darwin-arm64@4.65.0': + resolution: {integrity: sha512-zWQqUH+9zavr2Bxuzfpuv2SIF3X31cr58TvSQC9o1GhpOvkqRwr60GkZdQcudyT/BEgdpdSafjgd2I13MbTL7g==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.62.2': - resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + '@rollup/rollup-darwin-x64@4.65.0': + resolution: {integrity: sha512-RQYreBFWtO4//hIuOaZkYUnF/lPU4lz35dveDimDshWCJvVisVtJ/shmT9bkXK8wFJY+FJF89X6F3Cq1qI3LCw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.62.2': - resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + '@rollup/rollup-freebsd-arm64@4.65.0': + resolution: {integrity: sha512-A0NfMj6Cuh/9BE5k3awJKv6HoxFVXIcLAb6SZqAMoxUHPA1ZNNK4RsGuUPD/vL7nEAm9LG+ZzXWWTrnC0XtkpA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.62.2': - resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + '@rollup/rollup-freebsd-x64@4.65.0': + resolution: {integrity: sha512-BI6/H7q3aP0I7S7GOrjyxTjgEJlSnovXE38+bdxBpuKN6z+d//uF+T+VQ3Q7ltJL/71p17ufartARX9Ja5gOGQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + '@rollup/rollup-linux-arm-gnueabihf@4.65.0': + resolution: {integrity: sha512-W1vUprf09RWaVWnsFP1vlUkEWJzTZlpObOEAYZXt9Fq0UVAOYEkeGr7wBX7McKqqIQskXdBnpiOMgwPujordgA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + '@rollup/rollup-linux-arm-musleabihf@4.65.0': + resolution: {integrity: sha512-s8QTcZWgrl9haFzEGIqyE5BWyo89pFDGLMBFZ752WYxk8DJwNU/O1X6pZgPw829d9/sm6CCHyrMP3aurt76p1Q==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.62.2': - resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + '@rollup/rollup-linux-arm64-gnu@4.65.0': + resolution: {integrity: sha512-ke1f6dLRzkqveyjjF2fkEwQYZvxHtNNwjegY8nJrwcO0Bdqr8CzFO/pKE0Bns13cx0qz2Ba2Y0Hs3dSwMdnHxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.62.2': - resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + '@rollup/rollup-linux-arm64-musl@4.65.0': + resolution: {integrity: sha512-926SMeUcy4y18Rz/w2aJiUKOnyAnm6czg72bXkQEaeemsll+Wr0hnsjb2BGRpHvWgwAMYy5ACJCotbvfLCfj0A==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.62.2': - resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + '@rollup/rollup-linux-loong64-gnu@4.65.0': + resolution: {integrity: sha512-6T7JNRP1hc4hqF2dUsEoVLOt9K8tmODoCLldtQRYnrddGGQY8Gqe2pM/qMMUo7EMowpP7oa2N95k0/8sYK/ipw==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.62.2': - resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + '@rollup/rollup-linux-loong64-musl@4.65.0': + resolution: {integrity: sha512-SImGFl1Je5kpyAgOCPONVT7h6ASV8mAUwGRjY7eZvVjPg//PfHOXgI+P241RF/+HqsA4PP3qD527ysWFKNQyhQ==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + '@rollup/rollup-linux-ppc64-gnu@4.65.0': + resolution: {integrity: sha512-XeDTbmPF1Yu5asfXGPrMkWoxTDhgryQbmw5Q1+R582O51VNCk23J6f2pDrsAp5YkneBVBwtExx6ZGOb9D2aQ6A==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.62.2': - resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + '@rollup/rollup-linux-ppc64-musl@4.65.0': + resolution: {integrity: sha512-VS55JUI/1nsljmV/jfqNkLZXFw8uMO8nNlfoHmSevNf6fO3neuhyDvx9dv3c/Ytt8r/431SL8Qax1dpYvOMZTg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + '@rollup/rollup-linux-riscv64-gnu@4.65.0': + resolution: {integrity: sha512-Vblw84TbX7RS4la1Y4+yQ7aore/oSyaNtFbppuBr5Vs/4LfBeXKq9dIfoExw6zOvRERqd2rRAjnZRaMhH/0x5w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.62.2': - resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + '@rollup/rollup-linux-riscv64-musl@4.65.0': + resolution: {integrity: sha512-7+gHjtONvKgwR9InTKFaLq53f6YzBJkgeMRBENdWTsQr+spahGqQm8HF5aXpq8i4JaRrOqYyv6Zn1WltDTxaZQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.62.2': - resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + '@rollup/rollup-linux-s390x-gnu@4.65.0': + resolution: {integrity: sha512-KvNDC0J6s4vVHhtJ6KrDXU0Er0au/hmRIBq/+1maCV8TseGupeKizq0bWcrbp2HE1T8xoknvN0Q/KZ/YF0qX3w==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.62.2': - resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + '@rollup/rollup-linux-x64-gnu@4.65.0': + resolution: {integrity: sha512-GExdD15WPvu/x/drELjVam7vX8EsPgvTMOa/iJL/p/4m/oOqzbb7JXZg8fXR4hlXtg/sF2zyTZ3bR0AEtEMlhQ==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.62.2': - resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + '@rollup/rollup-linux-x64-musl@4.65.0': + resolution: {integrity: sha512-8sT9PemIZfIMED4Vd4KGoOXVDj5CMSWNcGdbheRUx9TYS03yOWdT2Q0lXPyEyNBB9YTilwewIQKNIBk6Nxi0Kg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.62.2': - resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + '@rollup/rollup-openbsd-x64@4.65.0': + resolution: {integrity: sha512-pO6Ehi0jo5yE0R6PltKhJhv9mlIiyzBJk5N5NUF2OF6xtVKI+1bdXxj/rb0jGXy3hck1ELVT0QPY3tzkAm360w==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.62.2': - resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + '@rollup/rollup-openharmony-arm64@4.65.0': + resolution: {integrity: sha512-vo7N3/+cjjPDYr8vtxC+qSNgWa9sDvJ7g8N8R5SWqFY4WiNH1ULcAU70SKVyHeiIZOYYwNP9pTipmhN5sl1NPw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.62.2': - resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + '@rollup/rollup-win32-arm64-msvc@4.65.0': + resolution: {integrity: sha512-ArwvgFAbjKcDM7qqotZ4OVYf+UMT9xH2YzkCzK4+AuZSDihMlz1Ekoe4INwBVXzn2mnJzuIYOcSx07iTBijGRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.62.2': - resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + '@rollup/rollup-win32-ia32-msvc@4.65.0': + resolution: {integrity: sha512-QGMmK4/cxKE/36FoLMSHQBCyymv/eFTnsCvvsBF0rgmOvVbvX78VWZRerL3dHa77f4pM6Xcc2iGDhJ10w/svKQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.62.2': - resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + '@rollup/rollup-win32-x64-gnu@4.65.0': + resolution: {integrity: sha512-XfKYFWHIPs4HPODIMsGF1IKlS3H1e3WokUZIgpmn4+uNnZBlnRDDHEylNyazbQXwhMKZre68OjtRYbKqb5+j8w==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.62.2': - resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + '@rollup/rollup-win32-x64-msvc@4.65.0': + resolution: {integrity: sha512-wPWi++K4Bs1VR4XihOhfGi4IGX6Cub7FlerTf8X2v+2BtDHddgSqWCXwGD+h2yAe4/niIhNDwAltioOC+wEogQ==} cpu: [x64] os: [win32] @@ -1483,81 +1499,63 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@storybook/addon-docs@10.5.10': - resolution: {integrity: sha512-06JoK3/a7FWI/6GzuidJP9iHp1/Vejboe6lzS1jW+d8ItpecriBt+oXh1VNmUM7i7PjI6pZnet+j51QnLyeOoQ==} + '@storybook/addon-docs@10.6.3': + resolution: {integrity: sha512-365f712au4w/xvFqEKY6TIvTeGGAY7FKRB8zP4CFa3VSv9oyxHaq/ublFg4YDbCeRagppwl1PZ6k4+PoUor3+A==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.10 + storybook: ^10.6.3 peerDependenciesMeta: '@types/react': optional: true - '@storybook/builder-vite@10.5.10': - resolution: {integrity: sha512-O4GgIP0tKLRueom3EmU3OaBUHKjNYj+jkOvmTIkn3PYTiWVkCuHqSKEs4ADvRyaQuLH+peHhFe4JtkNC9KbtrQ==} + '@storybook/builder-vite@10.6.3': + resolution: {integrity: sha512-1+WCZZg/fPxxyHDB5sFKniFt9/4RFUIzoNqMujv+BLRROM+gQeyUHvdvoyZOZ51+P8ee+/PgnNKHjsTupV+nOA==} peerDependencies: - storybook: ^10.5.10 + storybook: ^10.6.3 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@storybook/csf-plugin@10.5.10': - resolution: {integrity: sha512-TaCLBrqVEr767+w58QDotDUiCTuE5cyRJuRcDlsKQyUIyGBv+lYD3lu8wBiVCYxgIjB/gu9HmqiC+0yx1rHzaw==} - peerDependencies: - esbuild: '*' - rollup: '*' - storybook: ^10.5.10 - vite: '*' - webpack: '*' - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@2.1.0': - resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} + '@storybook/icons@2.2.0': + resolution: {integrity: sha512-FpUB/xizIrV1ILhCIYFo+TtQNN9YEoLjfcnAW0JtOXL+BcM2aisSysI0B54JMWDnljriXySBHgN6ps4s9lb75A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/react-dom-shim@10.5.10': - resolution: {integrity: sha512-rbu62ILo/VE3iXKmu+kWXFpD1H1Lwi0f19q/x7JnDsD2dxKS9w5znLEqPIq2qxpzi/wjjIb2iUP1cRG1d/9W5A==} + '@storybook/react-dom-shim@10.6.3': + resolution: {integrity: sha512-cJUuPrieiTl06kzlgaU89iG+CtLAgUTt0Xdvm8qFT9yR2qwafSaswhwYWlZCNX4nWuOu7eK7uzWTwzKqyDBOWQ==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.10 + storybook: ^10.6.3 peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@storybook/react-vite@10.5.10': - resolution: {integrity: sha512-xOztxefUnqKeuyvcnjspqmlDnER4cExL+liltrpdXLPJVqfFNr9lgM49FyEPajzsUVG9W/vHJWjbaQGGu1UsYQ==} + '@storybook/react-vite@10.6.3': + resolution: {integrity: sha512-geWwLi9JnaRG2t9bYBfz+94skARzzXNT1Toaf0lk7Oog13rtNK7ay2pWNm9SP6/L2S7mEjoWu9+zHLpwxXvfIw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.10 + storybook: ^10.6.3 typescript: '>= 4.9.x' vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - '@storybook/react@10.5.10': - resolution: {integrity: sha512-4MBV5e1SXIMfPynLHzr+Mp0dwGv/FW1bklWAsS4ynBOAbC98W9p/I9vqBnUctsvE3BJkhzHQQyPwMHL5tTcHVA==} + '@storybook/react@10.6.3': + resolution: {integrity: sha512-3tfAkZNdUyx3I4IjM8dgbNWg4k0gj89Hi1MPiawfTybRRWhvnX2YqV9Ut4mrud7YzRv0v+U7+ZYEvj+maUPaow==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.10 + storybook: ^10.6.3 typescript: '>= 4.9.x' peerDependenciesMeta: '@types/react': @@ -1567,16 +1565,16 @@ packages: typescript: optional: true - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + '@testing-library/dom@10.4.2': + resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} engines: {node: '>=18'} '@testing-library/jest-dom@6.9.1': resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.3.2': - resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + '@testing-library/react@16.3.3': + resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -1590,14 +1588,14 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.6.6': - resolution: {integrity: sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==} + '@testing-library/user-event@14.6.8': + resolution: {integrity: sha512-vgSSqnANMnkcYR/vUNDbwS7aM3OErRLNUG8vCVVlj4oc6cKffUrccX7UAS5AmJQQNZTSibi9z5GvvRZ0aYgUCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1635,25 +1633,22 @@ packages: '@types/mdx@2.0.14': resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@25.9.9': + resolution: {integrity: sha512-b4e2xxj/yMeT2hNlD6x7zNFiQK2Dlmkb9CQ6v3/1G2RezKN4YS2lcEv8lzGm1mhs4f2lM4yNAMI/zUDBZBBt7w==} - '@types/node@25.9.5': - resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} + '@types/node@26.6.5': + resolution: {integrity: sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==} '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@types/react-dom@19.3.0': + resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} peerDependencies: - '@types/react': ^18.0.0 + '@types/react': ^19.3.0 - '@types/react@18.3.31': - resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + '@types/react@19.3.0': + resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -1661,82 +1656,209 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@typescript-eslint/eslint-plugin@8.65.0': - resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + '@typescript-eslint/eslint-plugin@8.72.0': + resolution: {integrity: sha512-aysKgysPX9XOv/dk95UkvUDe++Q3n3dJPG9CEWT3RUccxfkPJ+Qn6nhKPDhZXU6Ofo9kgwGWwKyQCnZIXTgngg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.72.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.72.0': + resolution: {integrity: sha512-0O+x3ynciD6zuXb1CKSu165haQV6ey53DKhHHUnujP7U+XlltJG+/keT0Xhd1HXCze+IHf7Tvt39ovyepX/LNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.65.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.65.0': - resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.72.0': + resolution: {integrity: sha512-bzHngBbmIgzj6TsTjVUCntGx6FFLgE7mPjpO0PzHycOaZHXqS43XnrkFIHRS16LLr/xO6FHSXG3GJFo/F4bSBQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.72.0': + resolution: {integrity: sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.72.0': + resolution: {integrity: sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.72.0': + resolution: {integrity: sha512-gEXxmmbSTSOVTC37IYYvremOM31v+UN2W772bJxmVYPhAOPSUxtacyb7wkm1EhkYKU6KzFJsdU44DCV4to0LWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.72.0': + resolution: {integrity: sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.72.0': + resolution: {integrity: sha512-gwLfFgWcw15tN2KXDCJvxEOQjPn+P3j/n3eSqkZ5sX4VpW9Cosodr+tWwBZRvJT3TcKx6HnPRGZMCNAiP1Xhug==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.72.0': + resolution: {integrity: sha512-0up3oArJZBYnzOaEXKo8DmI43QvMZyPoFEt9LWzRJcyl/RcJjfKKPebknN1VbTgXBf3M/KggUh5uUMdURLnseg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.72.0': + resolution: {integrity: sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] - '@typescript-eslint/project-service@8.65.0': - resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] - '@typescript-eslint/scope-manager@8.65.0': - resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] - '@typescript-eslint/tsconfig-utils@8.65.0': - resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] - '@typescript-eslint/type-utils@8.65.0': - resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] - '@typescript-eslint/types@8.65.0': - resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] - '@typescript-eslint/typescript-estree@8.65.0': - resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] - '@typescript-eslint/utils@8.65.0': - resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] - '@typescript-eslint/visitor-keys@8.65.0': - resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@6.1.2': + resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + oxc-transform-react: ^0.152.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + oxc-transform-react: + optional: true '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/expect@3.2.7': - resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} - - '@vitest/mocker@3.2.7': - resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + '@vitest/mocker@5.0.5': + resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + msw: ^2.4.9 || ^3.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true @@ -1746,27 +1868,15 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@3.2.7': - resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} - - '@vitest/runner@3.2.7': - resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} - - '@vitest/snapshot@3.2.7': - resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} - '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@3.2.7': - resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + '@vitest/spy@5.0.5': + resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@3.2.7': - resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} - '@webcontainer/env@1.1.1': resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} @@ -1775,22 +1885,14 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - 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'} @@ -1799,8 +1901,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -1818,59 +1920,48 @@ packages: resolution: {integrity: sha512-Hxe6Agq26gQOM954qpzYSllJBPJl+e16U5CkfuMUhLrNba+5nKkttIVlflaovN6oaTratqMGAO8H5u/aNhmHWQ==} hasBin: true - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + ast-types@0.16.3: + resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} engines: {node: '>=4'} - axe-core@4.12.1: - resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} + axe-core@4.14.0: + resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==} engines: {node: '>=4'} balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.44: - resolution: {integrity: sha512-T3ghW+sl/ZJ8w1v/yQx3qvJ9040DWoLBz8JT/CILbAKcFyG9b2MRe75v6W5uXjv6uH1lumK2Kv46y2zSkcej0Q==} + baseline-browser-mapping@2.11.30: + resolution: {integrity: sha512-YJs6Pz17RMNv8HoyKREtCY38E3BV1nPkWVmIb+XN1uHC1Vqt3KZCH/uJH9ZKRoiKb/icZ6tvehyee6RZNbFfRA==} engines: {node: '>=6.0.0'} hasBin: true - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} + bidi-js@1.1.0: + resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} - browserslist@4.28.6: - resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} + browserslist@4.29.4: + resolution: {integrity: sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + bundle-name@4.1.1: + resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} bundle-require@5.1.0: @@ -1879,17 +1970,24 @@ packages: peerDependencies: esbuild: '>=0.18' - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + cac@7.1.0: + resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} + engines: {node: '>=20.19.0'} - caniuse-lite@1.0.30001806: - resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + + caniuse-lite@1.0.30001819: + resolution: {integrity: sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1902,16 +2000,13 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@2.2.0: - resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -1957,13 +2052,13 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@4.6.0: - resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} - engines: {node: '>=18'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -2025,9 +2120,9 @@ packages: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@8.0.0: + resolution: {integrity: sha512-JQUCCK+/CAGbGGx618PlFZMXH81Jtj7t73CHv9dd/zVWvxgGT2zLFRjnKb+Ng46GIwcy+f7f88qd4duqllK+WQ==} + engines: {node: ^22.14.0 || >=24.0.0} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -2064,12 +2159,8 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} doctrine@3.0.0: @@ -2082,11 +2173,11 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dompurify@3.4.12: - resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} - electron-to-chromium@1.5.394: - resolution: {integrity: sha512-Wmt2Gm0o8JWBuGgmc4XZ0u9s1RaCRqhxP47phplmfg04+qypTUurpeJGP45A7Fhv7jdrrVH44PLlR9qXo37cVQ==} + electron-to-chromium@1.5.463: + resolution: {integrity: sha512-nVWNU6ltFjopvOdD44J4zoBkgO0M+WZiFKKFV7EjebOH9z0KNphk6bCEjplXtJofL21ARIuuwWOCsFkBVklm6w==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2094,17 +2185,13 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - empathic@2.0.1: - resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} engines: {node: '>=14'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} + entities@8.1.0: + resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} + engines: {node: '>=20.19.0'} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} @@ -2114,21 +2201,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} - engines: {node: '>=18'} - hasBin: true + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -2152,8 +2229,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.7.0: - resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + eslint@10.13.0: + resolution: {integrity: sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2197,24 +2274,23 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} - 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-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -2228,17 +2304,8 @@ packages: fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -2247,28 +2314,14 @@ packages: fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} flatbuffers@25.9.23: resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - - 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.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2292,10 +2345,6 @@ packages: gl-matrix@3.4.4: resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -2304,17 +2353,14 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -2322,41 +2368,34 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + html-encoding-sniffer@7.0.0: + resolution: {integrity: sha512-UikN5yr7xsCDAq87Or5or0PAlD3HJJOKVzM05az588WnpDJ4Ux7a2A53Qi6gofGg2/EtvF/H4hCi/TXfCW4Y6w==} + engines: {node: ^22.13.0 || >=24.0.0} - human-id@4.2.0: - resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} + human-id@4.2.2: + resolution: {integrity: sha512-Z+8unD6em/MJwyrkWQ2M3wygRGI1+MztbutiNwk1DCuEPXOZRWGjtcMPZYP1exY9iNZMhd7ZOSMQSo9WYtiQRw==} hasBin: true - hyparquet@1.26.2: - resolution: {integrity: sha512-6qjyK7R2tZ4vnYP1J8NpcCeDPK1UIYk3xh5XgtQUnUM1iwkYbvI6Mz3xtmpMd6AfCCeoUoJVbEq29k5GReZRWA==} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.7.3: - resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} - engines: {node: '>=0.10.0'} + hyparquet@1.31.5: + resolution: {integrity: sha512-KPVfaxW8xOiO2/4fjeiBfFNEXhGVw9tfcb9ha2iNZdJ3J/yBjEwIeAnTyyuhllFFTb9YO9wg0DfRAOnm6KCvBg==} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + ignore@7.0.13: + resolution: {integrity: sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q==} engines: {node: '>= 4'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2369,8 +2408,8 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + is-core-module@2.17.0: + resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==} engines: {node: '>= 0.4'} is-docker@3.0.0: @@ -2395,21 +2434,9 @@ packages: engines: {node: '>=14.16'} hasBin: true - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -2417,6 +2444,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -2424,22 +2454,11 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - 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 - - jsdom@26.1.0: - resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} - engines: {node: '>=18'} + jsdom@30.1.3: + resolution: {integrity: sha512-hQMUPvRgN7KxsfIytDQji7bimuJeRQa6Qo5+iuiZQk5CafeRxLIA10/cG5YCBFNpD9RO3oqIiN4CO1Y44kxqXg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} peerDependencies: - canvas: ^3.0.0 + canvas: ^3.2.3 peerDependenciesMeta: canvas: optional: true @@ -2449,17 +2468,14 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-with-bigint@3.5.10: - resolution: {integrity: sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==} + json-with-bigint@3.5.12: + resolution: {integrity: sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==} json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -2469,18 +2485,92 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + launch-editor@2.14.2: + resolution: {integrity: sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.4: + resolution: {integrity: sha512-zJZyBmQhArDRefuWTypZxwDpFDIYmrj8ypSBvwGD5P13Y95s6DjzKgu4DVdGbeQa5PDEsAOCAPNk4X+QOR006w==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -2490,29 +2580,15 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.5.2: - resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -2525,6 +2601,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.3: + resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} + marked-terminal@7.3.0: resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} engines: {node: '>=16.0.0'} @@ -2536,20 +2615,15 @@ packages: engines: {node: '>= 16'} hasBin: true - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} minimist@1.2.8: @@ -2572,8 +2646,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2584,17 +2658,18 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} - node-releases@2.0.51: - resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + node-releases@2.0.60: + resolution: {integrity: sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==} engines: {node: '>=18'} - nwsapi@2.2.24: - resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} @@ -2603,9 +2678,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxc-parser@0.127.0: resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2613,39 +2685,16 @@ packages: oxc-resolver@11.21.2: resolution: {integrity: sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==} - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - - package-manager-detector@1.8.0: - resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + package-manager-detector@1.9.0: + resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -2656,8 +2705,8 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -2674,10 +2723,6 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2688,18 +2733,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -2707,14 +2744,14 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.61.1: - resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} - engines: {node: '>=18'} + playwright-core@1.64.1: + resolution: {integrity: sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==} + engines: {node: '>=20'} hasBin: true - playwright@1.61.1: - resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} - engines: {node: '>=18'} + playwright@1.64.1: + resolution: {integrity: sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==} + engines: {node: '>=20'} hasBin: true postcss-load-config@6.0.1: @@ -2735,25 +2772,20 @@ packages: yaml: optional: true - postcss@8.5.20: - resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==} + postcss@8.5.31: + resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - publint@0.3.21: - resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==} + publint@0.3.25: + resolution: {integrity: sha512-WMMbn/d7JqRlfXQL/JUI4n5skC8cJ5WVr8/wT5mmiYWkUdENkZr1I5rgs2+dQPVRgoJd+JRYtB46MTsuDylw9g==} engines: {node: '>=18'} hasBin: true @@ -2761,11 +2793,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} random@4.1.0: resolution: {integrity: sha512-6Ajb7XmMSE9EFAMGC3kg9mvE7fGlBip25mYYuSMzw/uUSrmGilvZo2qwX3RnTRjwXkwkS+4swse9otZ92VjAtQ==} @@ -2776,33 +2806,25 @@ packages: peerDependencies: typescript: '>= 4.3.x' - react-docgen@8.0.3: - resolution: {integrity: sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==} + react-docgen@8.0.4: + resolution: {integrity: sha512-gIYjtVTU4NCWZnb/LXVSWfClZXnjzX3+xxi69Tkfu4YsmYuqiOk8giLkKt/WwxWqh+U66CTh8Kqbha1uPv8/qQ==} engines: {node: ^20.9.0 || >=22} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} peerDependencies: - react: ^18.3.1 + react: ^19.3.1 react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} engines: {node: '>=0.10.0'} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} recast@0.23.21: resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} @@ -2816,47 +2838,43 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + 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'} - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + resolve@1.22.13: + resolution: {integrity: sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==} engines: {node: '>= 0.4'} hasBin: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown@1.2.15: + resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - rollup@4.62.2: - resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + rollup@4.65.0: + resolution: {integrity: sha512-QVCvQUTGDN6JRwi3jVGCY3H4aTHvi9rX0LyoBMkGUvdh/Z6O51CzcLz85BWZaTCDGhl6ySGqYZs+xI1jmPqGcw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} seedrandom@3.0.5: resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} @@ -2878,47 +2896,30 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + shell-quote@1.12.0: + resolution: {integrity: sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==} + engines: {node: '>= 0.4'} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - - storybook@10.5.10: - resolution: {integrity: sha512-Rz8k9ejFHsi7lbtJTaxZlhCUz4GkbJIKEoKDjXeLfr/ZhXip73E6keKxW0KH8iGeKiCqHAbJCV4YIQrxTOLiig==} + storybook@10.6.3: + resolution: {integrity: sha512-lNBvcZFG44C98KvQHYzfq1O46m+sl94zY1+na5/9E3ihtNMbvpOgYyMFMIcWYUvOMo3OM4q9jzvB73KU20bU8w==} hasBin: true peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2952,9 +2953,6 @@ packages: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -2972,13 +2970,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2989,50 +2980,40 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinybench@6.2.2: + resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} + engines: {node: '>=20.0.0'} - tinyexec@1.2.4: - resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} - tldts-core@6.1.86: - resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + tldts-core@7.4.19: + resolution: {integrity: sha512-goNXV6Ho9TIOfpJZanTd6CKG5DyYgYAL+k+22T0SLh8l6+KHIfBUPFuePuSZv05UttIaaLmI9tb7TmGIdK5AkQ==} - tldts@6.1.86: - resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + tldts@7.4.19: + resolution: {integrity: sha512-48dH6aSpQnpbzDUc4vIQZ1VjB8tkK+e8c1yx05/SZK+rkssgjEOlxDd/yU8/a4vGYQ9vRgJr9dwMq9TJ0b3X2Q==} hasBin: true - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} engines: {node: '>=16'} - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} + tr46@7.0.0: + resolution: {integrity: sha512-BcDSDW+SIGWVOns1Zm6Yg91q9AEj7eaID0QDY9oIqJD1A8dscNwMcl9Sms2DeuWCNov1X0/oXanHGYQBSLwZsg==} + engines: {node: ^22.14.0 || >=24.0.0} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -3058,9 +3039,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.5.1: - resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} - engines: {node: '>=18'} + tsup@9.0.0: + resolution: {integrity: sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: '@microsoft/api-extractor': ^7.36.0 @@ -3081,8 +3062,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.65.0: - resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} + typescript-eslint@8.72.0: + resolution: {integrity: sha512-r26Fkc8As+mZvqp7SLsMmNFyYUup/6CjK7/eHBHmhOw6GH6n6YFxHVFrG0jN1c5CMpDzelLPxvgeCOzx7BjN+A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3093,31 +3074,39 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} + + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} + engines: {node: '>=22.19.0'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.3.4: + resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3125,8 +3114,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3134,36 +3123,34 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -3179,26 +3166,39 @@ packages: yaml: optional: true - vitest@3.2.7: - resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@5.0.5: + resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.7 - '@vitest/ui': 3.2.7 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.5 + '@vitest/browser-preview': 5.0.5 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.5 + '@vitest/coverage-v8': 5.0.5 + '@vitest/ui': 5.0.5 happy-dom: '*' jsdom: '*' + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -3207,38 +3207,33 @@ packages: jsdom: optional: true - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@6.0.0: + resolution: {integrity: sha512-4Nsy8K5Tr6SPDH9jhKJOHf7ChDrc1zufZTVSF7x72hwuEXBqxqk9G6cK+K2NRUtB3iELRJqjXb4JPDMBjMTl2Q==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} - whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} + whatwg-url@17.3.0: + resolution: {integrity: sha512-KwOAJrpf+GTgBvcBQJcP38sMF0DsQKdwtG+TxM2pW44P6E5k0hDbWrDmyuJDIF0Uef0aQq0ZoJs+5oI+k8ddhg==} + engines: {node: ^22.14.0 || >=24.0.0} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} hasBin: true word-wrap@1.2.5: @@ -3249,8 +3244,8 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - ws@8.21.1: - resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3279,6 +3274,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -3291,8 +3291,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zustand@5.0.14: - resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} + zustand@5.0.16: + resolution: {integrity: sha512-Uv7e327ihlCfayfja3hDc0M64Upev1LWBKpRobdK4NyovDDPeeX4imWXc/wzC1yc6fkYPoAY/ncKVPAs2jrtQw==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -3313,7 +3313,7 @@ snapshots: '@adobe/css-tools@4.5.0': {} - '@andrewbranch/untar.js@1.0.3': {} + '@andrewbranch/untar.js@1.0.4': {} '@arethetypeswrong/cli@0.18.5': dependencies: @@ -3327,27 +3327,34 @@ snapshots: '@arethetypeswrong/core@0.18.5': dependencies: - '@andrewbranch/untar.js': 1.0.3 + '@andrewbranch/untar.js': 1.0.4 '@loaderkit/resolve': 1.0.6 cjs-module-lexer: 1.4.3 fflate: 0.8.3 - lru-cache: 11.5.2 + lru-cache: 11.5.3 semver: 7.8.5 typescript: 5.6.1-rc validate-npm-package-name: 5.0.1 - '@asamuzakjp/css-color@3.2.0': + '@asamuzakjp/css-color@7.1.7': + dependencies: + '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-color-parser': 4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 + lru-cache: 11.5.3 + + '@asamuzakjp/dom-selector@10.0.4': dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 10.4.3 + bidi-js: 1.1.0 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.3 - '@axe-core/playwright@4.12.1(playwright-core@1.61.1)': + '@axe-core/playwright@4.14.0(playwright-core@1.64.1)': dependencies: - axe-core: 4.12.1 - playwright-core: 1.61.1 + axe-core: 4.14.0 + playwright-core: 1.64.1 '@babel/code-frame@7.29.7': dependencies: @@ -3357,30 +3364,30 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helpers': 7.29.10 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.10(supports-color@7.2.0) + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.29.7': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -3389,229 +3396,206 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.6 + browserslist: 4.29.4 lru-cache: 5.1.1 semver: 6.3.1 '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.10(supports-color@7.2.0) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.10(supports-color@7.2.0) transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-string-parser@7.29.7': {} '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.29.7': + '@babel/helpers@7.29.10': dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - - '@babel/parser@7.29.7': - dependencies: - '@babel/types': 7.29.7 - - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.8 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + '@babel/parser@7.29.9': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.8 - '@babel/runtime@7.29.7': {} + '@babel/runtime@7.29.10': {} '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.10(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - debug: 4.4.3 + '@babel/types': 7.29.8 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': + '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 '@braidai/lang@1.1.2': {} - '@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 + '@bramus/specificity@2.4.3': + dependencies: + css-tree: 3.2.1 + + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + + '@changesets/apply-release-plan@8.1.1': + dependencies: + '@changesets/config': 4.0.1 + '@changesets/format': 0.1.2 + '@changesets/git': 4.0.1 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + import-meta-resolve: 4.2.0 + jsonc-parser: 3.3.1 semver: 7.8.5 - '@changesets/assemble-release-plan@6.0.10': + '@changesets/assemble-release-plan@7.0.0': 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 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 semver: 7.8.5 - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/cli@2.31.1(@types/node@25.9.5)': - 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@25.9.5) - '@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 + '@changesets/changelog-git@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + + '@changesets/cli@3.0.3': + dependencies: + '@changesets/apply-release-plan': 8.1.1 + '@changesets/assemble-release-plan': 7.0.0 + '@changesets/changelog-git': 1.0.0 + '@changesets/config': 4.0.1 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/git': 4.0.1 + '@changesets/pre': 3.0.0 + '@changesets/read': 1.0.1 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@changesets/write': 1.0.1 + '@clack/prompts': 1.8.1 + '@manypkg/get-packages': 3.1.0 + '@pnpm/deps.graph-sequencer': 1100.0.1 + cac: 7.1.0 + import-meta-resolve: 4.2.0 + launch-editor: 2.14.2 + package-manager-detector: 1.9.0 semver: 7.8.5 - spawndamnit: 3.0.1 - term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' + tinyexec: 1.3.1 - '@changesets/config@3.1.4': + '@changesets/config@4.0.1': 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/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.7 - '@changesets/errors@0.2.0': + '@changesets/errors@1.0.0': {} + + '@changesets/format@0.1.2': dependencies: - extendable-error: 0.1.7 + package-manager-detector: 1.9.0 + tinyexec: 1.3.1 - '@changesets/get-dependents-graph@2.1.4': + '@changesets/get-dependents-graph@3.0.0': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 + '@changesets/types': 7.0.0 semver: 7.8.5 - '@changesets/get-release-plan@4.0.16': + '@changesets/git@4.0.1': 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/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.7 + tinyexec: 1.3.1 - '@changesets/get-version-range-type@0.4.0': {} - - '@changesets/git@3.0.4': + '@changesets/parse@1.0.0': 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/types': 7.0.0 + yaml: 2.9.1 - '@changesets/logger@0.1.1': + '@changesets/pre@3.0.0': dependencies: - picocolors: 1.1.1 + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 - '@changesets/parse@0.4.3': + '@changesets/read@1.0.1': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 4.3.0 + '@changesets/git': 4.0.1 + '@changesets/parse': 1.0.0 + '@changesets/types': 7.0.0 - '@changesets/pre@2.0.2': + '@changesets/should-skip-package@1.0.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@changesets/types': 7.0.0 - '@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/types@7.0.0': {} - '@changesets/should-skip-package@0.1.2': + '@changesets/write@1.0.1': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@changesets/format': 0.1.2 + '@changesets/types': 7.0.0 + human-id: 4.2.2 - '@changesets/types@4.1.0': {} - - '@changesets/types@6.1.0': {} + '@clack/core@1.5.1': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 - '@changesets/write@0.4.0': + '@clack/prompts@1.8.1': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.2.0 - prettier: 2.8.8 + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 '@colors/colors@1.5.0': optional: true - '@cosmos.gl/graph@3.4.0': + '@cosmos.gl/graph@3.5.1(@luma.gl/core@9.3.6)(@luma.gl/engine@9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)))(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6))(@luma.gl/webgl@9.3.6(@luma.gl/core@9.3.6))': dependencies: '@luma.gl/core': 9.3.6 '@luma.gl/engine': 9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)) @@ -3625,30 +3609,34 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dompurify: 3.4.12 + dompurify: 3.4.17 gl-bench: 1.0.42 gl-matrix: 3.4.4 random: 4.1.0 - '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@6.1.2': {} - '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-calc@3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-color-parser@4.2.6(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/color-helpers': 6.1.2 + '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-syntax-patches-for-csstree@1.1.15(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.2': {} '@emnapi/core@1.11.0': dependencies: @@ -3682,256 +3670,100 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/aix-ppc64@0.27.7': - optional: true - - '@esbuild/aix-ppc64@0.28.1': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.27.7': - optional: true - - '@esbuild/android-arm64@0.28.1': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-arm@0.27.7': - optional: true - - '@esbuild/android-arm@0.28.1': - optional: true - - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/android-x64@0.27.7': - optional: true - - '@esbuild/android-x64@0.28.1': - optional: true - - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.27.7': - optional: true - - '@esbuild/darwin-arm64@0.28.1': - optional: true - - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.27.7': - optional: true - - '@esbuild/darwin-x64@0.28.1': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.27.7': - optional: true - - '@esbuild/freebsd-arm64@0.28.1': - optional: true - - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.27.7': - optional: true - - '@esbuild/freebsd-x64@0.28.1': - optional: true - - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.27.7': - optional: true - - '@esbuild/linux-arm64@0.28.1': - optional: true - - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-arm@0.27.7': - optional: true - - '@esbuild/linux-arm@0.28.1': - optional: true - - '@esbuild/linux-ia32@0.25.12': - optional: true - - '@esbuild/linux-ia32@0.27.7': - optional: true - - '@esbuild/linux-ia32@0.28.1': - optional: true - - '@esbuild/linux-loong64@0.25.12': - optional: true - - '@esbuild/linux-loong64@0.27.7': - optional: true - - '@esbuild/linux-loong64@0.28.1': - optional: true - - '@esbuild/linux-mips64el@0.25.12': - optional: true - - '@esbuild/linux-mips64el@0.27.7': - optional: true - - '@esbuild/linux-mips64el@0.28.1': - optional: true - - '@esbuild/linux-ppc64@0.25.12': - optional: true - - '@esbuild/linux-ppc64@0.27.7': - optional: true - - '@esbuild/linux-ppc64@0.28.1': - optional: true - - '@esbuild/linux-riscv64@0.25.12': - optional: true - - '@esbuild/linux-riscv64@0.27.7': - optional: true - - '@esbuild/linux-riscv64@0.28.1': - optional: true - - '@esbuild/linux-s390x@0.25.12': - optional: true - - '@esbuild/linux-s390x@0.27.7': - optional: true - - '@esbuild/linux-s390x@0.28.1': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/linux-x64@0.27.7': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/linux-x64@0.28.1': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.28.1': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.28.1': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.28.1': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.28.1': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.28.1': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/sunos-x64@0.28.1': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-arm64@0.28.1': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-x64@0.28.2': optional: true - '@esbuild/win32-ia32@0.27.7': - optional: true - - '@esbuild/win32-ia32@0.28.1': - optional: true - - '@esbuild/win32-x64@0.25.12': - optional: true - - '@esbuild/win32-x64@0.27.7': - optional: true - - '@esbuild/win32-x64@0.28.1': - optional: true - - '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0)': + '@eslint-community/eslint-utils@4.10.1(eslint@10.13.0(supports-color@7.2.0))': dependencies: - eslint: 10.7.0 + eslint: 10.13.0(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.23.5(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -3941,11 +3773,13 @@ snapshots: '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.2': + '@eslint/plugin-kit@0.7.3': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 + '@exodus/bytes@1.16.0': {} + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -3962,24 +3796,17 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/external-editor@1.0.3(@types/node@25.9.5)': - dependencies: - chardet: 2.2.0 - iconv-lite: 0.7.3 - optionalDependencies: - '@types/node': 25.9.5 - - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@6.4.3(@types/node@25.9.5))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@7.0.2)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1))': dependencies: glob: 13.0.6 - react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 6.4.3(@types/node@25.9.5) + react-docgen-typescript: 2.4.0(typescript@7.0.2) + vite: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -3989,12 +3816,20 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} '@loaderkit/resolve@1.0.6': dependencies: @@ -4003,9 +3838,9 @@ snapshots: '@luma.gl/core@9.3.6': dependencies: '@math.gl/types': 4.1.0 - '@probe.gl/env': 4.1.1 - '@probe.gl/log': 4.1.1 - '@probe.gl/stats': 4.1.1 + '@probe.gl/env': 4.1.2 + '@probe.gl/log': 4.1.2 + '@probe.gl/stats': 4.1.2 '@types/offscreencanvas': 2019.7.3 '@luma.gl/engine@9.3.6(@luma.gl/core@9.3.6)(@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6))': @@ -4014,8 +3849,8 @@ snapshots: '@luma.gl/shadertools': 9.3.6(@luma.gl/core@9.3.6) '@math.gl/core': 4.1.0 '@math.gl/types': 4.1.0 - '@probe.gl/log': 4.1.1 - '@probe.gl/stats': 4.1.1 + '@probe.gl/log': 4.1.2 + '@probe.gl/stats': 4.1.2 '@luma.gl/shadertools@9.3.6(@luma.gl/core@9.3.6)': dependencies: @@ -4027,23 +3862,22 @@ snapshots: dependencies: '@luma.gl/core': 9.3.6 '@math.gl/types': 4.1.0 - '@probe.gl/env': 4.1.1 + '@probe.gl/env': 4.1.2 + + '@manypkg/find-root@3.1.0': + dependencies: + '@manypkg/tools': 2.1.2 - '@manypkg/find-root@1.1.0': + '@manypkg/get-packages@3.1.0': dependencies: - '@babel/runtime': 7.29.7 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + '@manypkg/find-root': 3.1.0 + '@manypkg/tools': 2.1.2 - '@manypkg/get-packages@1.1.3': + '@manypkg/tools@2.1.2': dependencies: - '@babel/runtime': 7.29.7 - '@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 + jju: 1.4.0 + tinyglobby: 0.2.17 + yaml: 2.9.1 '@math.gl/core@4.1.0': dependencies: @@ -4051,40 +3885,31 @@ snapshots: '@math.gl/types@4.1.0': {} - '@mdx-js/react@3.1.1(@types/react@18.3.31)(react@18.3.1)': + '@mdx-js/react@3.1.1(@types/react@19.3.0)(react@19.3.1)': dependencies: '@types/mdx': 2.0.14 - '@types/react': 18.3.31 - react: 18.3.1 + '@types/react': 19.3.0 + react: 19.3.1 + + '@modernrelay/omnigraph@0.14.0': {} - '@modernrelay/omnigraph@0.10.0': {} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': dependencies: '@emnapi/core': 1.11.0 '@emnapi/runtime': 1.11.0 - '@tybys/wasm-util': 0.10.3 + '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.3 + '@tybys/wasm-util': 0.10.4 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-parser/binding-android-arm-eabi@0.127.0': optional: true @@ -4137,7 +3962,7 @@ snapshots: dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true '@oxc-parser/binding-win32-arm64-msvc@0.127.0': @@ -4151,6 +3976,8 @@ snapshots: '@oxc-project/types@0.127.0': {} + '@oxc-project/types@0.155.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.21.2': optional: true @@ -4203,7 +4030,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.0 '@emnapi/runtime': 1.11.0 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) optional: true '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': @@ -4212,208 +4039,235 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.21.2': optional: true - '@playwright/test@1.61.1': + '@playwright/test@1.64.1': dependencies: - playwright: 1.61.1 + playwright: 1.64.1 + + '@pnpm/deps.graph-sequencer@1100.0.1': {} - '@probe.gl/env@4.1.1': {} + '@probe.gl/env@4.1.2': {} - '@probe.gl/log@4.1.1': + '@probe.gl/log@4.1.2': dependencies: - '@probe.gl/env': 4.1.1 + '@probe.gl/env': 4.1.2 - '@probe.gl/stats@4.1.1': {} + '@probe.gl/stats@4.1.2': {} - '@publint/pack@0.1.5': + '@publint/pack@0.1.7': dependencies: - tinyexec: 1.2.4 + tinyexec: 1.3.1 + + '@rolldown/binding-android-arm-eabi@1.2.15': + optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/binding-android-arm64@1.2.15': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.15': + optional: true + + '@rolldown/binding-darwin-x64@1.2.15': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.15': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.15': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.15': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.15': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.15': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.15': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.15': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.15': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.15': + optional: true + + '@rolldown/pluginutils@1.0.1': {} - '@rollup/pluginutils@5.4.0(rollup@4.62.2)': + '@rollup/pluginutils@5.5.1(rollup@4.65.0)': dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.5 + picomatch: 4.0.7 optionalDependencies: - rollup: 4.62.2 + rollup: 4.65.0 - '@rollup/rollup-android-arm-eabi@4.62.2': + '@rollup/rollup-android-arm-eabi@4.65.0': optional: true - '@rollup/rollup-android-arm64@4.62.2': + '@rollup/rollup-android-arm64@4.65.0': optional: true - '@rollup/rollup-darwin-arm64@4.62.2': + '@rollup/rollup-darwin-arm64@4.65.0': optional: true - '@rollup/rollup-darwin-x64@4.62.2': + '@rollup/rollup-darwin-x64@4.65.0': optional: true - '@rollup/rollup-freebsd-arm64@4.62.2': + '@rollup/rollup-freebsd-arm64@4.65.0': optional: true - '@rollup/rollup-freebsd-x64@4.62.2': + '@rollup/rollup-freebsd-x64@4.65.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + '@rollup/rollup-linux-arm-gnueabihf@4.65.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.62.2': + '@rollup/rollup-linux-arm-musleabihf@4.65.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.62.2': + '@rollup/rollup-linux-arm64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.62.2': + '@rollup/rollup-linux-arm64-musl@4.65.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.62.2': + '@rollup/rollup-linux-loong64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.62.2': + '@rollup/rollup-linux-loong64-musl@4.65.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.62.2': + '@rollup/rollup-linux-ppc64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.62.2': + '@rollup/rollup-linux-ppc64-musl@4.65.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.62.2': + '@rollup/rollup-linux-riscv64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.62.2': + '@rollup/rollup-linux-riscv64-musl@4.65.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.62.2': + '@rollup/rollup-linux-s390x-gnu@4.65.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.62.2': + '@rollup/rollup-linux-x64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-x64-musl@4.62.2': + '@rollup/rollup-linux-x64-musl@4.65.0': optional: true - '@rollup/rollup-openbsd-x64@4.62.2': + '@rollup/rollup-openbsd-x64@4.65.0': optional: true - '@rollup/rollup-openharmony-arm64@4.62.2': + '@rollup/rollup-openharmony-arm64@4.65.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.62.2': + '@rollup/rollup-win32-arm64-msvc@4.65.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.62.2': + '@rollup/rollup-win32-ia32-msvc@4.65.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.62.2': + '@rollup/rollup-win32-x64-gnu@4.65.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.62.2': + '@rollup/rollup-win32-x64-msvc@4.65.0': optional: true '@sindresorhus/is@4.6.0': {} - '@storybook/addon-docs@10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5))': + '@storybook/addon-docs@10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@18.3.31)(react@18.3.1) - '@storybook/csf-plugin': 10.5.10(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5)) - '@storybook/icons': 2.1.0(react@18.3.1) - '@storybook/react-dom-shim': 10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1)) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) + '@mdx-js/react': 3.1.1(@types/react@19.3.0)(react@19.3.1) + '@storybook/icons': 2.2.0(react@19.3.1) + '@storybook/react-dom-shim': 10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1)) + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + storybook: 10.6.3(@types/react@19.3.0)(react@19.3.1) ts-dedent: 2.3.0 + unplugin: 2.3.11 optionalDependencies: - '@types/react': 18.3.31 + '@types/react': 19.3.0 transitivePeerDependencies: - '@types/react-dom' - - esbuild - - rollup - - vite - - webpack - '@storybook/builder-vite@10.5.10(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5))': + '@storybook/builder-vite@10.6.3(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1))': dependencies: - '@storybook/csf-plugin': 10.5.10(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5)) - storybook: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) + storybook: 10.6.3(@types/react@19.3.0)(react@19.3.1) ts-dedent: 2.3.0 - vite: 6.4.3(@types/node@25.9.5) - transitivePeerDependencies: - - esbuild - - rollup - - webpack - - '@storybook/csf-plugin@10.5.10(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5))': - dependencies: - storybook: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) - unplugin: 2.3.11 - optionalDependencies: - esbuild: 0.28.1 - rollup: 4.62.2 - vite: 6.4.3(@types/node@25.9.5) + vite: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) '@storybook/global@5.0.0': {} - '@storybook/icons@2.1.0(react@18.3.1)': + '@storybook/icons@2.2.0(react@19.3.1)': dependencies: - react: 18.3.1 + react: 19.3.1 - '@storybook/react-dom-shim@10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))': + '@storybook/react-dom-shim@10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) + storybook: 10.6.3(@types/react@19.3.0)(react@19.3.1) optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - - '@storybook/react-vite@10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(typescript@5.9.3)(vite@6.4.3(@types/node@25.9.5))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@6.4.3(@types/node@25.9.5)) - '@rollup/pluginutils': 5.4.0(rollup@4.62.2) - '@storybook/builder-vite': 10.5.10(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(vite@6.4.3(@types/node@25.9.5)) - '@storybook/react': 10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(typescript@5.9.3) - empathic: 2.0.1 - magic-string: 0.30.21 - react: 18.3.1 - react-docgen: 8.0.3 - react-dom: 18.3.1(react@18.3.1) - resolve: 1.22.12 - storybook: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) + + '@storybook/react-vite@10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(rollup@4.65.0)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))(supports-color@7.2.0)(typescript@7.0.2)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@7.0.2)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) + '@rollup/pluginutils': 5.5.1(rollup@4.65.0) + '@storybook/builder-vite': 10.6.3(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) + '@storybook/react': 10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))(supports-color@7.2.0)(typescript@7.0.2) + empathic: 2.1.0 + magic-string: 1.4.3 + react: 19.3.1 + react-docgen: 8.0.4(supports-color@7.2.0) + react-dom: 19.3.1(react@19.3.1) + resolve: 1.22.13 + storybook: 10.6.3(@types/react@19.3.0)(react@19.3.1) tsconfig-paths: 4.2.0 - vite: 6.4.3(@types/node@25.9.5) + vite: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - '@types/react' - '@types/react-dom' - - esbuild - rollup - supports-color - - webpack - '@storybook/react@10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1))(typescript@5.9.3)': + '@storybook/react@10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1))(supports-color@7.2.0)(typescript@7.0.2)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.5.10(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1)) - react: 18.3.1 - react-docgen: 8.0.3 - react-docgen-typescript: 2.4.0(typescript@5.9.3) - react-dom: 18.3.1(react@18.3.1) - storybook: 10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1) + '@storybook/react-dom-shim': 10.6.3(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(storybook@10.6.3(@types/react@19.3.0)(react@19.3.1)) + react: 19.3.1 + react-docgen: 8.0.4(supports-color@7.2.0) + react-docgen-typescript: 2.4.0(typescript@7.0.2) + react-dom: 19.3.1(react@19.3.1) + storybook: 10.6.3(@types/react@19.3.0)(react@19.3.1) optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) - typescript: 5.9.3 + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@testing-library/dom@10.4.1': + '@testing-library/dom@10.4.2': dependencies: '@babel/code-frame': 7.29.7 - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.29.10 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -4424,27 +4278,27 @@ snapshots: '@testing-library/jest-dom@6.9.1': dependencies: '@adobe/css-tools': 4.5.0 - aria-query: 5.3.0 + aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)': dependencies: - '@babel/runtime': 7.29.7 - '@testing-library/dom': 10.4.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@babel/runtime': 7.29.10 + '@testing-library/dom': 10.4.2 + react: 19.3.1 + react-dom: 19.3.1(react@19.3.1) optionalDependencies: - '@types/react': 18.3.31 - '@types/react-dom': 18.3.7(@types/react@18.3.31) + '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@testing-library/user-event@14.6.6(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.8(@testing-library/dom@10.4.2)': dependencies: - '@testing-library/dom': 10.4.1 + '@testing-library/dom': 10.4.2 - '@tybys/wasm-util@0.10.3': + '@tybys/wasm-util@0.10.4': dependencies: tslib: 2.8.1 optional: true @@ -4453,24 +4307,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/chai@5.2.3': dependencies: @@ -4489,23 +4343,22 @@ snapshots: '@types/mdx@2.0.14': {} - '@types/node@12.20.55': {} - - '@types/node@25.9.5': + '@types/node@25.9.9': dependencies: undici-types: 7.24.6 - '@types/offscreencanvas@2019.7.3': {} + '@types/node@26.6.5': + dependencies: + undici-types: 8.9.0 - '@types/prop-types@15.7.15': {} + '@types/offscreencanvas@2019.7.3': {} - '@types/react-dom@18.3.7(@types/react@18.3.31)': + '@types/react-dom@19.3.0(@types/react@19.3.0)': dependencies: - '@types/react': 18.3.31 + '@types/react': 19.3.0 - '@types/react@18.3.31': + '@types/react@19.3.0': dependencies: - '@types/prop-types': 15.7.15 csstype: 3.2.3 '@types/resolve@1.20.6': {} @@ -4513,108 +4366,161 @@ snapshots: '@types/trusted-types@2.0.7': optional: true - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.72.0(@typescript-eslint/parser@8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 10.7.0 - ignore: 7.0.6 + '@typescript-eslint/parser': 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.72.0 + '@typescript-eslint/type-utils': 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.72.0 + eslint: 10.13.0(supports-color@7.2.0) + ignore: 7.0.13 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.72.0 + '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/typescript-estree': 8.72.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.72.0 + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.13.0(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.72.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.72.0(typescript@6.0.3) + '@typescript-eslint/types': 8.72.0 + debug: 4.4.3(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.72.0': + dependencies: + '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/visitor-keys': 8.72.0 + + '@typescript-eslint/tsconfig-utils@8.72.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/typescript-estree': 8.72.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.13.0(supports-color@7.2.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.72.0': {} + + '@typescript-eslint/typescript-estree@8.72.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.72.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.72.0(typescript@6.0.3) + '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/visitor-keys': 8.72.0 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.72.0 + '@typescript-eslint/types': 8.72.0 + '@typescript-eslint/typescript-estree': 8.72.0(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.13.0(supports-color@7.2.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3 - eslint: 10.7.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/visitor-keys@8.72.0': + dependencies: + '@typescript-eslint/types': 8.72.0 + eslint-visitor-keys: 5.0.1 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true - '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) - '@typescript-eslint/types': 8.65.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript/typescript-linux-x64@7.0.2': + optional: true - '@typescript-eslint/scope-manager@8.65.0': - dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true - '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true - '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) - debug: 4.4.3 - eslint: 10.7.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true - '@typescript-eslint/types@8.65.0': {} + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true - '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript/typescript-sunos-x64@7.0.2': + optional: true - '@typescript-eslint/utils@8.65.0(eslint@10.7.0)(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - eslint: 10.7.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript/typescript-win32-arm64@7.0.2': + optional: true - '@typescript-eslint/visitor-keys@8.65.0': - dependencies: - '@typescript-eslint/types': 8.65.0 - eslint-visitor-keys: 5.0.1 + '@typescript/typescript-win32-x64@7.0.2': + optional: true - '@vitejs/plugin-react@4.7.0(vite@6.4.3(@types/node@25.9.5))': + '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1))': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.4.3(@types/node@25.9.5) - transitivePeerDependencies: - - supports-color + '@rolldown/pluginutils': 1.0.1 + vite: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) '@vitest/expect@3.2.4': dependencies: @@ -4624,49 +4530,33 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/expect@3.2.7': + '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1))': dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.7 - '@vitest/utils': 3.2.7 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.5 + estree-walker: 3.0.3 + magic-string: 1.4.3 + optionalDependencies: + vite: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) - '@vitest/mocker@3.2.7(vite@6.4.3(@types/node@25.9.5))': + '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1))': dependencies: - '@vitest/spy': 3.2.7 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.5 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.4.3 optionalDependencies: - vite: 6.4.3(@types/node@25.9.5) + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1) '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.2.7': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/runner@3.2.7': - dependencies: - '@vitest/utils': 3.2.7 - pathe: 2.0.3 - strip-literal: 3.1.0 - - '@vitest/snapshot@3.2.7': - dependencies: - '@vitest/pretty-format': 3.2.7 - magic-string: 0.30.21 - pathe: 2.0.3 - '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.4 + tinyspy: 4.0.6 - '@vitest/spy@3.2.7': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@5.0.5': {} '@vitest/utils@3.2.4': dependencies: @@ -4674,21 +4564,13 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vitest/utils@3.2.7': - dependencies: - '@vitest/pretty-format': 3.2.7 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - '@webcontainer/env@1.1.1': {} - acorn-jsx@5.3.2(acorn@8.17.0): + acorn-jsx@5.3.2(acorn@8.19.0): dependencies: - acorn: 8.17.0 + acorn: 8.19.0 - acorn@8.17.0: {} - - agent-base@7.1.4: {} + acorn@8.19.0: {} ajv@6.15.0: dependencies: @@ -4697,15 +4579,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.4.0: {} ansi-styles@4.3.0: dependencies: @@ -4717,67 +4597,65 @@ snapshots: apache-arrow@21.2.0: dependencies: - '@types/node': 25.9.5 + '@types/node': 25.9.9 flatbuffers: 25.9.23 - json-with-bigint: 3.5.10 + json-with-bigint: 3.5.12 tslib: 2.8.1 - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - aria-query@5.3.0: dependencies: dequal: 2.0.3 - array-union@2.1.0: {} + aria-query@5.3.2: {} assertion-error@2.0.1: {} - ast-types@0.16.1: + ast-types@0.16.3: dependencies: tslib: 2.8.1 - axe-core@4.12.1: {} + axe-core@4.14.0: {} balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.44: {} + baseline-browser-mapping@2.11.30: {} - better-path-resolve@1.0.0: + bidi-js@1.1.0: dependencies: - is-windows: 1.0.2 + require-from-string: 2.0.2 - brace-expansion@5.0.7: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.28.6: + browserslist@4.29.4: dependencies: - baseline-browser-mapping: 2.10.44 - caniuse-lite: 1.0.30001806 - electron-to-chromium: 1.5.394 - node-releases: 2.0.51 - update-browserslist-db: 1.2.3(browserslist@4.28.6) + baseline-browser-mapping: 2.11.30 + caniuse-lite: 1.0.30001819 + electron-to-chromium: 1.5.463 + node-releases: 2.0.60 + update-browserslist-db: 1.3.4(browserslist@4.29.4) - bundle-name@4.1.0: + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 - bundle-require@5.1.0(esbuild@0.27.7): + bundle-require@5.1.0(esbuild@0.28.2): dependencies: - esbuild: 0.27.7 + esbuild: 0.28.2 load-tsconfig: 0.2.5 - cac@6.7.14: {} + cac@7.1.0: {} + + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 - caniuse-lite@1.0.30001806: {} + caniuse-lite@1.0.30001819: {} chai@5.3.3: dependencies: @@ -4787,6 +4665,8 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chai@6.3.0: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -4796,13 +4676,11 @@ snapshots: char-regex@1.0.2: {} - chardet@2.2.0: {} - check-error@2.1.3: {} - chokidar@4.0.3: + chokidar@5.0.0: dependencies: - readdirp: 4.1.2 + readdirp: 5.1.1 cjs-module-lexer@1.4.3: {} @@ -4849,12 +4727,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css.escape@1.5.1: {} - - cssstyle@4.6.0: + css-tree@3.2.1: dependencies: - '@asamuzakjp/css-color': 3.2.0 - rrweb-cssom: 0.8.0 + mdn-data: 2.27.1 + source-map-js: 1.2.2 + + css.escape@1.5.1: {} csstype@3.2.3: {} @@ -4916,14 +4794,18 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - data-urls@5.0.0: + data-urls@8.0.0: dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 + whatwg-mimetype: 5.0.0 + whatwg-url: 17.3.0 + transitivePeerDependencies: + - '@noble/hashes' - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 decimal.js@10.6.0: {} @@ -4935,18 +4817,14 @@ snapshots: default-browser@5.5.1: dependencies: - bundle-name: 4.1.0 + bundle-name: 4.1.1 default-browser-id: 5.0.1 define-lazy-prop@3.0.0: {} dequal@2.0.3: {} - detect-indent@6.1.0: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + detect-libc@2.1.2: {} doctrine@3.0.0: dependencies: @@ -4956,117 +4834,54 @@ snapshots: dom-accessibility-api@0.6.3: {} - dompurify@3.4.12: + dompurify@3.4.17: optionalDependencies: '@types/trusted-types': 2.0.7 - electron-to-chromium@1.5.394: {} + electron-to-chromium@1.5.463: {} emoji-regex@8.0.0: {} emojilib@2.4.0: {} - empathic@2.0.1: {} - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 + empathic@2.1.0: {} - entities@6.0.1: {} + entities@8.1.0: {} environment@1.1.0: {} es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.3.2: {} - esbuild@0.25.12: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 - - esbuild@0.28.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} @@ -5083,21 +4898,21 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.7.0: + eslint@10.13.0(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 + '@eslint/config-array': 0.23.5(supports-color@7.2.0) + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 + '@eslint/plugin-kit': 0.7.3 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -5105,14 +4920,14 @@ snapshots: esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 11.1.5 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -5120,8 +4935,8 @@ snapshots: espree@11.2.0: dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) + acorn: 8.19.0 + acorn-jsx: 5.3.2(acorn@8.19.0) eslint-visitor-keys: 5.0.1 esprima@4.0.1: {} @@ -5146,44 +4961,31 @@ snapshots: expect-type@1.4.0: {} - 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-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.20.1: + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: dependencies: - reusify: 1.1.0 + fast-string-width: 3.0.2 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 fflate@0.8.3: {} - file-entry-cache@8.0.0: + file-entry-cache@11.1.5: dependencies: - flat-cache: 4.0.1 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + flat-cache: 6.1.23 find-up@5.0.0: dependencies: @@ -5194,31 +4996,17 @@ snapshots: dependencies: magic-string: 0.30.21 mlly: 1.8.2 - rollup: 4.62.2 + rollup: 4.65.0 - flat-cache@4.0.1: + flat-cache@6.1.23: dependencies: - flatted: 3.4.2 - keyv: 4.5.4 + cacheable: 2.5.0 + flatted: 3.4.4 + hookified: 1.15.1 flatbuffers@25.9.23: {} - flatted@3.4.2: {} - - 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.2: - optional: true + flatted@3.4.4: {} fsevents@2.3.3: optional: true @@ -5233,72 +5021,47 @@ snapshots: gl-matrix@3.4.4: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 glob@13.0.6: dependencies: - minimatch: 10.2.5 + minimatch: 10.2.6 minipass: 7.1.3 path-scurry: 2.0.2 - 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 - - graceful-fs@4.2.11: {} - has-flag@4.0.0: {} + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + hasown@2.0.4: dependencies: function-bind: 1.1.2 highlight.js@10.7.3: {} - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 + hookified@1.15.1: {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + hookified@2.2.0: {} - https-proxy-agent@7.0.6: + html-encoding-sniffer@7.0.0: dependencies: - agent-base: 7.1.4 - debug: 4.4.3 + '@exodus/bytes': 1.16.0 transitivePeerDependencies: - - supports-color - - human-id@4.2.0: {} + - '@noble/hashes' - hyparquet@1.26.2: {} - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 + human-id@4.2.2: {} - iconv-lite@0.7.3: - dependencies: - safer-buffer: 2.1.2 + hyparquet@1.31.5: {} ignore@5.3.2: {} - ignore@7.0.6: {} + ignore@7.0.13: {} + + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} @@ -5306,7 +5069,7 @@ snapshots: internmap@2.0.3: {} - is-core-module@2.16.2: + is-core-module@2.17.0: dependencies: hasown: 2.0.4 @@ -5324,116 +5087,133 @@ snapshots: dependencies: is-docker: 3.0.0 - is-number@7.0.0: {} - is-potential-custom-element-name@1.0.1: {} - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - - is-windows@1.0.2: {} - is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 isexe@2.0.0: {} + jju@1.4.0: {} + joycon@3.1.1: {} js-tokens@4.0.0: {} - 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 - - jsdom@26.1.0: + jsdom@30.1.3: dependencies: - cssstyle: 4.6.0 - data-urls: 5.0.0 + '@asamuzakjp/css-color': 7.1.7 + '@asamuzakjp/dom-selector': 10.0.4 + '@bramus/specificity': 2.4.3 + '@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1) + '@exodus/bytes': 1.16.0 + css-tree: 3.2.1 + data-urls: 8.0.0 decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + html-encoding-sniffer: 7.0.0 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.24 - parse5: 7.3.0 - rrweb-cssom: 0.8.0 + lru-cache: 11.5.3 + parse5: 8.0.1 saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 5.1.2 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 - ws: 8.21.1 + tough-cookie: 6.0.2 + undici: 8.12.3 + w3c-xmlserializer: 6.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 17.3.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + - '@noble/hashes' jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - json-with-bigint@3.5.10: {} + json-with-bigint@3.5.12: {} json5@2.2.3: {} jsonc-parser@3.3.1: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 - keyv@4.5.4: + launch-editor@2.14.2: dependencies: - json-buffer: 3.0.1 + picocolors: 1.1.1 + shell-quote: 1.12.0 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@3.1.3: {} + lightningcss-android-arm64@1.33.0: + optional: true - lines-and-columns@1.2.4: {} + lightningcss-darwin-arm64@1.33.0: + optional: true - load-tsconfig@0.2.5: {} + lightningcss-darwin-x64@1.33.0: + optional: true - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 + lightningcss-freebsd-x64@1.33.0: + optional: true - locate-path@6.0.0: + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: dependencies: - p-locate: 5.0.0 + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + lilconfig@3.1.4: {} - lodash.startcase@4.4.0: {} + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} - loose-envify@1.4.0: + locate-path@6.0.0: dependencies: - js-tokens: 4.0.0 + p-locate: 5.0.0 loupe@3.2.1: {} - lru-cache@10.4.3: {} - - lru-cache@11.5.2: {} + lru-cache@11.5.3: {} lru-cache@5.1.1: dependencies: @@ -5443,12 +5223,16 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.4.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 marked-terminal@7.3.0(marked@9.1.6): dependencies: ansi-escapes: 7.3.0 - ansi-regex: 6.2.2 + ansi-regex: 6.4.0 chalk: 5.6.2 cli-highlight: 2.1.11 cli-table3: 0.6.5 @@ -5458,18 +5242,13 @@ snapshots: marked@9.1.6: {} - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 + mdn-data@2.27.1: {} min-indent@1.0.1: {} - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.12 minimist@1.2.8: {} @@ -5477,7 +5256,7 @@ snapshots: mlly@1.8.2: dependencies: - acorn: 8.17.0 + acorn: 8.19.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.4 @@ -5492,7 +5271,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.16: {} + nanoid@3.3.20: {} natural-compare@1.4.0: {} @@ -5503,12 +5282,12 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-releases@2.0.51: {} - - nwsapi@2.2.24: {} + node-releases@2.0.60: {} object-assign@4.1.1: {} + obug@3.0.0: {} + open@10.2.0: dependencies: default-browser: 5.5.1 @@ -5525,8 +5304,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - outdent@0.5.0: {} - oxc-parser@0.127.0: dependencies: '@oxc-project/types': 0.127.0 @@ -5574,35 +5351,15 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.21.2 '@oxc-resolver/binding-win32-x64-msvc': 11.21.2 - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-map@2.1.0: {} - - p-try@2.2.0: {} - - package-manager-detector@0.2.11: - dependencies: - quansync: 0.2.11 - - package-manager-detector@1.8.0: {} + package-manager-detector@1.9.0: {} parse5-htmlparser2-tree-adapter@6.0.1: dependencies: @@ -5612,9 +5369,9 @@ snapshots: parse5@6.0.1: {} - parse5@7.3.0: + parse5@8.0.1: dependencies: - entities: 6.0.1 + entities: 8.1.0 path-exists@4.0.0: {} @@ -5624,22 +5381,16 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.2 + lru-cache: 11.5.3 minipass: 7.1.3 - path-type@4.0.0: {} - pathe@2.0.3: {} pathval@2.0.1: {} picocolors@1.1.1: {} - picomatch@2.3.2: {} - - picomatch@4.0.5: {} - - pify@4.0.1: {} + picomatch@4.0.7: {} pirates@4.0.7: {} @@ -5649,98 +5400,83 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - playwright-core@1.61.1: {} + playwright-core@1.64.1: {} - playwright@1.61.1: + playwright@1.64.1: dependencies: - playwright-core: 1.61.1 - optionalDependencies: - fsevents: 2.3.2 + playwright-core: 1.64.1 - postcss-load-config@6.0.1(postcss@8.5.20): + postcss-load-config@6.0.1(postcss@8.5.31)(yaml@2.9.1): dependencies: - lilconfig: 3.1.3 + lilconfig: 3.1.4 optionalDependencies: - postcss: 8.5.20 + postcss: 8.5.31 + yaml: 2.9.1 - postcss@8.5.20: + postcss@8.5.31: dependencies: - nanoid: 3.3.16 + nanoid: 3.3.20 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 prelude-ls@1.2.1: {} - prettier@2.8.8: {} - pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - publint@0.3.21: + publint@0.3.25: dependencies: - '@publint/pack': 0.1.5 - package-manager-detector: 1.8.0 + '@publint/pack': 0.1.7 + package-manager-detector: 1.9.0 picocolors: 1.1.1 sade: 1.8.1 punycode@2.3.1: {} - quansync@0.2.11: {} - - queue-microtask@1.2.3: {} + qified@0.10.1: + dependencies: + hookified: 2.2.0 random@4.1.0: dependencies: seedrandom: 3.0.5 - react-docgen-typescript@2.4.0(typescript@5.9.3): + react-docgen-typescript@2.4.0(typescript@7.0.2): dependencies: - typescript: 5.9.3 + typescript: 7.0.2 - react-docgen@8.0.3: + react-docgen@8.0.4(supports-color@7.2.0): dependencies: - '@babel/core': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/traverse': 7.29.10(supports-color@7.2.0) + '@babel/types': 7.29.8 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.12 + resolve: 1.22.13 strip-indent: 4.1.1 transitivePeerDependencies: - supports-color - react-dom@18.3.1(react@18.3.1): + react-dom@19.3.1(react@19.3.1): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.3.1 + scheduler: 0.28.0 react-is@17.0.2: {} - react-refresh@0.17.0: {} - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - 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 + react@19.3.1: {} - readdirp@4.1.2: {} + readdirp@5.1.1: {} recast@0.23.21: dependencies: - ast-types: 0.16.1 + ast-types: 0.16.3 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 @@ -5753,69 +5489,81 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-from@5.0.0: {} - resolve@1.22.12: + resolve@1.22.13: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.2 + is-core-module: 2.17.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - - rollup@4.62.2: + rolldown@1.2.15: + dependencies: + '@oxc-project/types': 0.155.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.15 + '@rolldown/binding-android-arm64': 1.2.15 + '@rolldown/binding-darwin-arm64': 1.2.15 + '@rolldown/binding-darwin-x64': 1.2.15 + '@rolldown/binding-freebsd-x64': 1.2.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.15 + '@rolldown/binding-linux-arm64-gnu': 1.2.15 + '@rolldown/binding-linux-arm64-musl': 1.2.15 + '@rolldown/binding-linux-ppc64-gnu': 1.2.15 + '@rolldown/binding-linux-s390x-gnu': 1.2.15 + '@rolldown/binding-linux-x64-gnu': 1.2.15 + '@rolldown/binding-linux-x64-musl': 1.2.15 + '@rolldown/binding-openharmony-arm64': 1.2.15 + '@rolldown/binding-win32-arm64-msvc': 1.2.15 + '@rolldown/binding-win32-x64-msvc': 1.2.15 + + rollup@4.65.0: dependencies: '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.62.2 - '@rollup/rollup-android-arm64': 4.62.2 - '@rollup/rollup-darwin-arm64': 4.62.2 - '@rollup/rollup-darwin-x64': 4.62.2 - '@rollup/rollup-freebsd-arm64': 4.62.2 - '@rollup/rollup-freebsd-x64': 4.62.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 - '@rollup/rollup-linux-arm-musleabihf': 4.62.2 - '@rollup/rollup-linux-arm64-gnu': 4.62.2 - '@rollup/rollup-linux-arm64-musl': 4.62.2 - '@rollup/rollup-linux-loong64-gnu': 4.62.2 - '@rollup/rollup-linux-loong64-musl': 4.62.2 - '@rollup/rollup-linux-ppc64-gnu': 4.62.2 - '@rollup/rollup-linux-ppc64-musl': 4.62.2 - '@rollup/rollup-linux-riscv64-gnu': 4.62.2 - '@rollup/rollup-linux-riscv64-musl': 4.62.2 - '@rollup/rollup-linux-s390x-gnu': 4.62.2 - '@rollup/rollup-linux-x64-gnu': 4.62.2 - '@rollup/rollup-linux-x64-musl': 4.62.2 - '@rollup/rollup-openbsd-x64': 4.62.2 - '@rollup/rollup-openharmony-arm64': 4.62.2 - '@rollup/rollup-win32-arm64-msvc': 4.62.2 - '@rollup/rollup-win32-ia32-msvc': 4.62.2 - '@rollup/rollup-win32-x64-gnu': 4.62.2 - '@rollup/rollup-win32-x64-msvc': 4.62.2 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.65.0 + '@rollup/rollup-android-arm64': 4.65.0 + '@rollup/rollup-darwin-arm64': 4.65.0 + '@rollup/rollup-darwin-x64': 4.65.0 + '@rollup/rollup-freebsd-arm64': 4.65.0 + '@rollup/rollup-freebsd-x64': 4.65.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.65.0 + '@rollup/rollup-linux-arm-musleabihf': 4.65.0 + '@rollup/rollup-linux-arm64-gnu': 4.65.0 + '@rollup/rollup-linux-arm64-musl': 4.65.0 + '@rollup/rollup-linux-loong64-gnu': 4.65.0 + '@rollup/rollup-linux-loong64-musl': 4.65.0 + '@rollup/rollup-linux-ppc64-gnu': 4.65.0 + '@rollup/rollup-linux-ppc64-musl': 4.65.0 + '@rollup/rollup-linux-riscv64-gnu': 4.65.0 + '@rollup/rollup-linux-riscv64-musl': 4.65.0 + '@rollup/rollup-linux-s390x-gnu': 4.65.0 + '@rollup/rollup-linux-x64-gnu': 4.65.0 + '@rollup/rollup-linux-x64-musl': 4.65.0 + '@rollup/rollup-openbsd-x64': 4.65.0 + '@rollup/rollup-openharmony-arm64': 4.65.0 + '@rollup/rollup-win32-arm64-msvc': 4.65.0 + '@rollup/rollup-win32-ia32-msvc': 4.65.0 + '@rollup/rollup-win32-x64-gnu': 4.65.0 + '@rollup/rollup-win32-x64-msvc': 4.65.0 fsevents: 2.3.3 - rrweb-cssom@0.8.0: {} - run-applescript@7.1.0: {} - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - sade@1.8.1: dependencies: mri: 1.2.0 - safer-buffer@2.1.2: {} - saxes@6.0.0: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.28.0: {} seedrandom@3.0.5: {} @@ -5829,55 +5577,41 @@ snapshots: shebang-regex@3.0.0: {} - siginfo@2.0.0: {} + shell-quote@1.12.0: {} - signal-exit@4.1.0: {} + sisteransi@1.0.5: {} skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 - slash@3.0.0: {} - - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} source-map@0.6.1: {} - source-map@0.7.6: {} - - spawndamnit@3.0.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - sprintf-js@1.0.3: {} - - stackback@0.0.2: {} - - std-env@3.10.0: {} + std-env@4.3.0: {} - storybook@10.5.10(@types/react@18.3.31)(prettier@2.8.8)(react@18.3.1): + storybook@10.6.3(@types/react@19.3.0)(react@19.3.1): dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.1.0(react@18.3.1) - '@testing-library/dom': 10.4.1 + '@storybook/icons': 2.2.0(react@19.3.1) + '@testing-library/dom': 10.4.2 '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) + '@testing-library/user-event': 14.6.8(@testing-library/dom@10.4.2) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 '@webcontainer/env': 1.1.1 - esbuild: 0.28.1 + esbuild: 0.28.2 jsonc-parser: 3.3.1 open: 10.2.0 oxc-parser: 0.127.0 oxc-resolver: 11.21.2 recast: 0.23.21 semver: 7.8.5 - use-sync-external-store: 1.6.0(react@18.3.1) - ws: 8.21.1 + use-sync-external-store: 1.7.0(react@19.3.1) + ws: 8.22.0 optionalDependencies: - '@types/react': 18.3.31 - prettier: 2.8.8 + '@types/react': 19.3.0 transitivePeerDependencies: - bufferutil - react @@ -5901,10 +5635,6 @@ snapshots: strip-indent@4.1.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -5926,10 +5656,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: {} - - term-size@2.2.1: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -5940,46 +5666,38 @@ snapshots: tiny-invariant@1.3.3: {} - tinybench@2.9.0: {} + tinybench@6.2.2: {} - tinyexec@0.3.2: {} - - tinyexec@1.2.4: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - - tinypool@1.1.1: {} + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyrainbow@2.0.0: {} - tinyspy@4.0.4: {} + tinyspy@4.0.6: {} - tldts-core@6.1.86: {} - - tldts@6.1.86: - dependencies: - tldts-core: 6.1.86 + tldts-core@7.4.19: {} - to-regex-range@5.0.1: + tldts@7.4.19: dependencies: - is-number: 7.0.0 + tldts-core: 7.4.19 - tough-cookie@5.1.2: + tough-cookie@6.0.2: dependencies: - tldts: 6.1.86 + tldts: 7.4.19 - tr46@5.1.1: + tr46@7.0.0: dependencies: punycode: 2.3.1 tree-kill@1.2.2: {} - ts-api-utils@2.5.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 5.9.3 + typescript: 6.0.3 ts-dedent@2.3.0: {} @@ -5993,31 +5711,30 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(postcss@8.5.20)(typescript@5.9.3): + tsup@9.0.0(postcss@8.5.31)(typescript@6.0.3)(yaml@2.9.1): dependencies: - bundle-require: 5.1.0(esbuild@0.27.7) - cac: 6.7.14 - chokidar: 4.0.3 + bundle-require: 5.1.0(esbuild@0.28.2) + cac: 7.1.0 + chokidar: 5.0.0 consola: 3.4.2 - debug: 4.4.3 - esbuild: 0.27.7 + esbuild: 0.28.2 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 + obug: 3.0.0 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.20) + postcss-load-config: 6.0.1(postcss@8.5.31)(yaml@2.9.1) resolve-from: 5.0.0 - rollup: 4.62.2 - source-map: 0.7.6 + rollup: 4.65.0 + source-map-js: 1.2.2 sucrase: 3.35.1 - tinyexec: 0.3.2 + tinyexec: 1.3.1 tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.20 - typescript: 5.9.3 + postcss: 8.5.31 + typescript: 6.0.3 transitivePeerDependencies: - jiti - - supports-color - tsx - yaml @@ -6025,39 +5742,64 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.65.0(eslint@10.7.0)(typescript@5.9.3): + typescript-eslint@8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) - eslint: 10.7.0 - typescript: 5.9.3 + '@typescript-eslint/eslint-plugin': 8.72.0(@typescript-eslint/parser@8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.72.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.0(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.13.0(supports-color@7.2.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color typescript@5.6.1-rc: {} - typescript@5.9.3: {} + typescript@6.0.3: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 ufo@1.6.4: {} undici-types@7.24.6: {} - unicode-emoji-modifier-base@1.0.0: {} + undici-types@8.9.0: {} - universalify@0.1.2: {} + undici@8.12.3: {} + + unicode-emoji-modifier-base@1.0.0: {} unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.17.0 - picomatch: 4.0.5 + acorn: 8.19.0 + picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.2.3(browserslist@4.28.6): + update-browserslist-db@1.3.4(browserslist@4.29.4): dependencies: - browserslist: 4.28.6 + browserslist: 4.29.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -6065,114 +5807,105 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@18.3.1): + use-sync-external-store@1.7.0(react@19.3.1): dependencies: - react: 18.3.1 + react: 19.3.1 validate-npm-package-name@5.0.1: {} - vite-node@3.2.4(@types/node@25.9.5): + vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1): dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.3(@types/node@25.9.5) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.31 + rolldown: 1.2.15 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 25.9.9 + esbuild: 0.28.2 + fsevents: 2.3.3 + yaml: 2.9.1 - vite@6.4.3(@types/node@25.9.5): + vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1): dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - postcss: 8.5.20 - rollup: 4.62.2 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.31 + rolldown: 1.2.15 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.5 + '@types/node': 26.6.5 + esbuild: 0.28.2 fsevents: 2.3.3 + yaml: 2.9.1 - vitest@3.2.7(@types/node@25.9.5)(jsdom@26.1.0): + vitest@5.0.5(@types/node@25.9.9)(jsdom@30.1.3)(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@6.4.3(@types/node@25.9.5)) - '@vitest/pretty-format': 3.2.7 - '@vitest/runner': 3.2.7 - '@vitest/snapshot': 3.2.7 - '@vitest/spy': 3.2.7 - '@vitest/utils': 3.2.7 - chai: 5.3.3 - debug: 4.4.3 + '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1)) + chai: 6.3.0 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.5 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 + magic-string: 1.4.3 + obug: 3.0.0 + picomatch: 4.0.7 + std-env: 4.3.0 + tinybench: 6.2.2 + tinyexec: 1.3.1 tinyglobby: 0.2.17 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.4.3(@types/node@25.9.5) - vite-node: 3.2.4(@types/node@25.9.5) - why-is-node-running: 2.3.0 + vite: 8.3.5(@types/node@25.9.9)(esbuild@0.28.2)(yaml@2.9.1) + why-is-node-running: 3.2.1 optionalDependencies: - '@types/node': 25.9.5 - jsdom: 26.1.0 + '@types/node': 25.9.9 + jsdom: 30.1.3 + transitivePeerDependencies: + - msw + + vitest@5.0.5(@types/node@26.6.5)(jsdom@30.1.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1)): + dependencies: + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1)) + chai: 6.3.0 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 1.4.3 + obug: 3.0.0 + picomatch: 4.0.7 + std-env: 4.3.0 + tinybench: 6.2.2 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(yaml@2.9.1) + why-is-node-running: 3.2.1 + optionalDependencies: + '@types/node': 26.6.5 + jsdom: 30.1.3 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - w3c-xmlserializer@5.0.0: + w3c-xmlserializer@6.0.0: dependencies: xml-name-validator: 5.0.0 - webidl-conversions@7.0.0: {} + webidl-conversions@8.0.1: {} webpack-virtual-modules@0.6.2: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: {} - whatwg-url@14.2.0: + whatwg-url@17.3.0: dependencies: - tr46: 5.1.1 - webidl-conversions: 7.0.0 + '@exodus/bytes': 1.16.0 + tr46: 7.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' which@2.0.2: dependencies: isexe: 2.0.0 - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 + why-is-node-running@3.2.1: {} word-wrap@1.2.5: {} @@ -6182,7 +5915,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - ws@8.21.1: {} + ws@8.22.0: {} wsl-utils@0.1.0: dependencies: @@ -6196,6 +5929,8 @@ snapshots: yallist@3.1.1: {} + yaml@2.9.1: {} + yargs-parser@20.2.9: {} yargs@16.2.2: @@ -6210,8 +5945,8 @@ snapshots: yocto-queue@0.1.0: {} - zustand@5.0.14(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): + zustand@5.0.16(@types/react@19.3.0)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1)): optionalDependencies: - '@types/react': 18.3.31 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + '@types/react': 19.3.0 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6f00273..9db45c0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,10 @@ packages: - packages/* - apps/* + +# Explicitly requested SDK release, verified against the matching 0.14 server. +minimumReleaseAgeExclude: + - '@modernrelay/omnigraph@0.14.0' + +allowBuilds: + esbuild: true diff --git a/scripts/omnigraph-fixture.mjs b/scripts/omnigraph-fixture.mjs index 25c285f..d47f81a 100644 --- a/scripts/omnigraph-fixture.mjs +++ b/scripts/omnigraph-fixture.mjs @@ -1,94 +1,66 @@ #!/usr/bin/env node /** - * omnigraph-fixture.mjs — regenerates the real-data Omnigraph fixtures under - * fixtures/omnigraph/ (see fixtures/omnigraph/README.md). + * Regenerate genuine OmniGraph 0.14 HTTP recordings from a fresh temporary + * cluster. Existing stores are never opened or deleted. Use --serve to keep + * the seeded fixture running for the demo/live tests without rewriting files. * - * What it does, end to end: - * 1. Recreates the local cluster graph from fixtures/omnigraph/cluster/ - * (`omnigraph cluster import` + `cluster apply` — apply CREATES - * cluster/graphs/demo.omni from demo.pg). Graph state is wiped first so - * every run starts from the same empty graph. - * 2. Generates deterministic seed data (seeded PRNG, no wall-clock input): - * 300 nodes across 5 types + 500 edges across 6 types, including hostile - * strings (script-tag payload, quotes/backslashes), non-ASCII text, and - * dates spanning 2015–2026. Written to fixtures/omnigraph/seed.ndjson in - * the `omnigraph load` line format: - * node {"type":"","data":{...}} - * edge {"edge":"","from":"","to":"","data":{...}} - * Every edge carries an explicit deterministic data.id so `--mode merge` - * is a true upsert (idempotent re-runs; no @card violations). - * 3. Boots `omnigraph-server --cluster... --unauthenticated` on 127.0.0.1:8199, - * waits for /healthz, and records the raw HTTP responses (verbatim bytes, - * via curl) for exactly the requests the @modernrelay/omnigraph SDK 0.10.x - * issues (graph-scoped paths are prefixed /graphs/): - * recorded/health.json GET /healthz - * recorded/schema.json GET /graphs/demo/schema - * recorded/commits.json GET /graphs/demo/commits?branch=main - * recorded/snapshot.json GET /graphs/demo/snapshot - * recorded/export.ndjson POST /graphs/demo/export body {} - * recorded/export-partial.ndjson POST /graphs/demo/export body {"type_names":["Correlates","Signal"]} - * then kills the server. - * 4. Writes recorded/manifest.json (recordedAt, serverVersion, graphId, - * branch, headBefore/headAfter around the export, per-table rowCounts, - * and the verified edge-before-node export line ordering). - * - * Requirements: the `omnigraph` CLI and `omnigraph-server` binaries (0.10.x) - * on PATH, plus curl. When the binaries are absent the script prints a SKIP - * message and exits 0 — CI never regenerates fixtures; it consumes the - * committed recordings. - * - * Usage: node scripts/omnigraph-fixture.mjs - * Idempotent: re-running produces the same seed data and equivalent - * recordings (commit ids/timestamps differ per run; row data does not). + * OMNIGRAPH_BIN and OMNIGRAPH_SERVER_BIN select separately installed binaries; + * the CLI and server must both be exactly 0.14.0. No global installation or + * production service is changed. See fixtures/omnigraph/README.md. */ - import { spawn, spawnSync } from 'node:child_process'; -import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'; +import { once } from 'node:events'; +import { cpSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { createServer } from 'node:net'; +import { tmpdir } from 'node:os'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const FIXTURE_DIR = path.join(ROOT, 'fixtures', 'omnigraph'); -const CLUSTER_DIR = path.join(FIXTURE_DIR, 'cluster'); const RECORDED_DIR = path.join(FIXTURE_DIR, 'recorded'); -const SEED_FILE = path.join(FIXTURE_DIR, 'seed.ndjson'); -const STORE = path.join(CLUSTER_DIR, 'graphs', 'demo.omni'); - +const CLI = process.env.OMNIGRAPH_BIN || 'omnigraph'; +const SERVER = process.env.OMNIGRAPH_SERVER_BIN || 'omnigraph-server'; +const VERSION = '0.14.0'; +const CONTRACT = '0.14'; +const HEADER = 'Omnigraph-Http-Api'; const GRAPH_ID = 'demo'; const BRANCH = 'main'; -const ACTOR = 'fixture-bot'; -const BIND = '127.0.0.1:8199'; +const PORT = Number(process.env.OMNIGRAPH_FIXTURE_PORT || 8199); +const BIND = `127.0.0.1:${PORT}`; const BASE = `http://${BIND}`; -// Header the SDK's transport sends on every request. -const ACCEPT = 'Accept: application/json, application/x-ndjson'; +const SERVE = process.argv.includes('--serve'); -// ── helpers ────────────────────────────────────────────────────────────────── - -function hasBinary(bin, args) { - const r = spawnSync(bin, args, { stdio: 'ignore' }); - return !r.error; +function run(cmd, args, env = process.env) { + const result = spawnSync(cmd, args, { cwd: ROOT, env, encoding: 'utf8', timeout: 60000, maxBuffer: 16 * 1024 * 1024 }); + if (result.error) throw result.error; + if (result.status !== 0) throw new Error(`${cmd} ${args.join(' ')} exited ${result.status}\n${result.stdout}\n${result.stderr}`); + return result.stdout; } -function run(cmd, args, opts = {}) { - const r = spawnSync(cmd, args, { cwd: ROOT, encoding: 'utf8', ...opts }); - if (r.error) throw r.error; - if (r.status !== 0) { - throw new Error( - `${cmd} ${args.join(' ')} exited ${r.status}\nstdout: ${r.stdout}\nstderr: ${r.stderr}`, - ); - } - return r.stdout; +async function request(route, init = {}) { + const response = await fetch(`${BASE}${route}`, { + ...init, + headers: { Accept: 'application/json, application/x-ndjson', [HEADER]: CONTRACT, ...init.headers }, + signal: AbortSignal.timeout(10000), + }); + if (response.headers.get(HEADER) !== CONTRACT) throw new Error(`${route}: missing ${HEADER}: ${CONTRACT}`); + const body = await response.text(); + if (!response.ok) throw new Error(`${route}: HTTP ${response.status} ${body}`); + return { body, status: response.status, apiContract: response.headers.get(HEADER) }; } -/** curl the server and return the raw response body (verbatim bytes). */ -function curl(args) { - return run('curl', ['-sS', '--fail-with-body', ...args]); +async function requireFreePort() { + const probe = createServer(); + probe.listen(PORT, '127.0.0.1'); + await once(probe, 'listening'); + await new Promise((resolve, reject) => probe.close((error) => error ? reject(error) : resolve())); } -function record(file, body) { - if (!body || body.length === 0) throw new Error(`refusing to record empty body for ${file}`); - writeFileSync(path.join(RECORDED_DIR, file), body); - console.log(` recorded/${file} (${Buffer.byteLength(body)} bytes)`); +function newestCommitId(body) { + const id = JSON.parse(body).head_commit_id; + if (typeof id !== 'string') throw new Error('commits response had no head'); + return id; } /** mulberry32 — tiny deterministic PRNG; the fixed seed makes seed.ndjson stable. */ @@ -118,8 +90,8 @@ function generateSeed() { const lines = []; const node = (type, data) => lines.push(JSON.stringify({ type, data })); - const edge = (name, from, to, data) => - lines.push(JSON.stringify({ edge: name, from, to, ...(data ? { data } : {}) })); + const edge = (name, from, to, { id, ...data }) => + lines.push(JSON.stringify({ edge: name, id, from, to, data })); // -- nodes (300 total) ------------------------------------------------------ const firstNames = [ @@ -198,6 +170,8 @@ function generateSeed() { const strength = i === 1 ? 0 : i === 2 ? 1e-9 : Math.round(rand() * 1e6) / 1e6; node('Signal', { + // Schema-owned id is ordinary nullable data, not the row identity. + id: i % 3 === 0 ? null : i, slug, title: `Signal ${i}: ${pick(topics)}`, body: rand() < 0.45 ? null : `Market movement around ${pick(topics)}.`, @@ -246,7 +220,7 @@ function generateSeed() { for (let i = 1; i <= 70; i++) { edge('Triggered', pick(signals), pick(decisions), { id: `trig-${pad(i, 4)}` }); } - // Correlates 50 — @unique(src, dst): deduped pairs, no self-loops. + // Correlates 50 — @unique(@src, @dst): deduped pairs, no self-loops. const seen = new Set(); let corr = 0; while (corr < 50) { @@ -264,159 +238,129 @@ function generateSeed() { return lines.join('\n') + '\n'; } -// ── pipeline ───────────────────────────────────────────────────────────────── - -async function waitForHealth(timeoutMs = 20000) { - const deadline = Date.now() + timeoutMs; - while (Date.now() < deadline) { - const r = spawnSync('curl', ['-sf', `${BASE}/healthz`], { encoding: 'utf8' }); - if (r.status === 0 && r.stdout.includes('"ok"')) return; - await new Promise((res) => setTimeout(res, 250)); - } - throw new Error(`omnigraph-server did not become healthy on ${BASE} within ${timeoutMs}ms`); -} - -function newestCommitId(commitsJson) { - const parsed = JSON.parse(commitsJson); - const first = parsed.commits?.[0]; // newest first - if (!first?.graph_commit_id) throw new Error('commits response had no commits'); - return first.graph_commit_id; -} +// ── Fresh local cluster, served load, and wire recordings ───────────────────── async function main() { - if (!hasBinary('omnigraph', ['version']) || !hasBinary('omnigraph-server', ['--help'])) { - console.log( - 'SKIP: omnigraph / omnigraph-server binaries not found on PATH — ' + - 'fixture regeneration needs them (see fixtures/omnigraph/README.md). ' + - 'The committed recordings remain authoritative.', - ); - return; - } - - // 1. Recreate the graph from the declarative cluster config. - console.log('== cluster: wiping graph state and re-applying config =='); - rmSync(path.join(CLUSTER_DIR, 'graphs'), { recursive: true, force: true }); - rmSync(path.join(CLUSTER_DIR, '__cluster'), { recursive: true, force: true }); - run('omnigraph', ['cluster', 'validate', '--config', CLUSTER_DIR]); - // Cluster control commands stopped accepting --as (omnigraph >= 0.9: the - // actor flag applies to direct-engine/actor-bound operations only). - run('omnigraph', ['cluster', 'import', '--config', CLUSTER_DIR, '--json']); - run('omnigraph', ['cluster', 'apply', '--config', CLUSTER_DIR, '--json']); - if (!existsSync(STORE)) throw new Error(`cluster apply did not create ${STORE}`); - - // 2. Seed data. - console.log('== seed: generating deterministic data and loading =='); - const seed = generateSeed(); - writeFileSync(SEED_FILE, seed); - const loadOut = run('omnigraph', [ - 'load', '--data', SEED_FILE, '--mode', 'merge', - '--store', STORE, '--as', ACTOR, '--json', - ]); - const loaded = JSON.parse(loadOut); - // 0.10 CLI reports per-table arrays; pre-0.10 had top-level totals. - const sumTables = (tables) => - (tables ?? []).reduce((total, t) => total + (t.entities_loaded ?? 0), 0); - const nodesLoaded = loaded.nodes_loaded ?? sumTables(loaded.nodes); - const edgesLoaded = loaded.edges_loaded ?? sumTables(loaded.edges); - console.log(` loaded ${nodesLoaded} nodes, ${edgesLoaded} edges`); - if (nodesLoaded !== 300 || edgesLoaded !== 500) { - throw new Error(`unexpected load counts: ${loadOut}`); + if (process.argv.slice(2).some((arg) => arg !== '--serve')) throw new Error('Usage: node scripts/omnigraph-fixture.mjs [--serve]'); + if (!Number.isInteger(PORT) || PORT < 1 || PORT > 65535) throw new Error('Invalid OMNIGRAPH_FIXTURE_PORT'); + const version = JSON.parse(run(CLI, ['version', '--json'])); + if (version.version !== VERSION || version.http_contract !== CONTRACT || version.protocols?.target !== 2) { + throw new Error(`Fixture regeneration requires OmniGraph ${VERSION}; set OMNIGRAPH_BIN and OMNIGRAPH_SERVER_BIN to the pinned release.`); } - - // 3. Serve and record. - console.log(`== server: booting on ${BIND} ==`); - mkdirSync(RECORDED_DIR, { recursive: true }); - const server = spawn( - 'omnigraph-server', - ['--cluster', CLUSTER_DIR, '--unauthenticated', '--bind', BIND], - { cwd: ROOT, stdio: 'ignore' }, - ); + run(SERVER, ['--help']); + await requireFreePort(); + const cluster = mkdtempSync(path.join(tmpdir(), 'orbit-omnigraph-014-')); + const shutdown = new AbortController(); + const stop = () => shutdown.abort(); + process.once('SIGINT', stop); + process.once('SIGTERM', stop); + let server; + let serverClosed; + let serverLog = ''; try { - await waitForHealth(); - const g = (p) => `${BASE}/graphs/${GRAPH_ID}${p}`; // SDK graph-scoped routing - - const health = curl(['-H', ACCEPT, `${BASE}/healthz`]); - record('health.json', health); - - record('schema.json', curl(['-H', ACCEPT, g('/schema')])); - - // Branch head before the export stream… - const commitsBefore = curl(['-H', ACCEPT, g(`/commits?branch=${BRANCH}`)]); - record('commits.json', commitsBefore); - - const snapshot = curl(['-H', ACCEPT, g('/snapshot')]); - record('snapshot.json', snapshot); - - // Full export — SDK: og.export → POST /export with body {}. - const exportFull = curl([ - '-X', 'POST', g('/export'), - '-H', 'Content-Type: application/json', '-H', ACCEPT, '-d', '{}', - ]); - record('export.ndjson', exportFull); - - // Partial export by type — SDK: og.export({ typeNames: [...] }) → snake_cased body. - const exportPartial = curl([ - '-X', 'POST', g('/export'), - '-H', 'Content-Type: application/json', '-H', ACCEPT, - '-d', '{"type_names":["Correlates","Signal"]}', - ]); - record('export-partial.ndjson', exportPartial); - - // …and after it (equal heads produce a stable sourceRevision). - const commitsAfter = curl(['-H', ACCEPT, g(`/commits?branch=${BRANCH}`)]); - - // 4. Verify + manifest. - console.log('== verify: export ordering and manifest =='); - const exportLines = exportFull.trimEnd().split('\n'); - const lastEdgeIdx = exportLines.reduce((acc, l, i) => (l.startsWith('{"edge"') ? i : acc), -1); - const firstNodeIdx = exportLines.findIndex((l) => l.startsWith('{"type"')); - if (lastEdgeIdx === -1 || firstNodeIdx === -1 || lastEdgeIdx > firstNodeIdx) { - throw new Error( - `export ordering violated: expected all edge:* lines before node:* lines ` + - `(lastEdge=${lastEdgeIdx}, firstNode=${firstNodeIdx})`, - ); + // Isolate the final 0.14 target configuration from any operator defaults or + // credentials on the host. Loopback access is explicitly anonymous. + const operatorHome = path.join(cluster, 'operator'); + mkdirSync(operatorHome); + writeFileSync(path.join(operatorHome, 'config.yaml'), [ + 'version: 1', 'targets:', ' fixture:', ' kind: server', + ` endpoint: ${BASE}`, ' auth: { provider: anonymous }', '', + ].join('\n')); + const runCli = (args) => run(CLI, args, { ...process.env, OMNIGRAPH_HOME: operatorHome }); + runCli(['config', 'validate']); + for (const file of ['cluster.yaml', 'demo.pg', 'queries.gq']) cpSync(path.join(FIXTURE_DIR, 'cluster', file), path.join(cluster, file)); + console.log(`Preparing fresh OmniGraph ${VERSION} fixture in ${cluster}`); + runCli(['cluster', 'validate', '--config', cluster, '--json']); + runCli(['lint', '--schema', path.join(cluster, 'demo.pg'), '--query', path.join(cluster, 'queries.gq'), '--json']); + runCli(['cluster', 'plan', '--target', cluster, '--config', cluster, '--json']); + const applied = JSON.parse(runCli(['cluster', 'apply', '--target', cluster, '--config', cluster, '--as', 'fixture-bot', '--json'])); + if (applied.status !== 'complete') throw new Error('Fixture bootstrap did not finish'); + // This uniquely-owned local root has no other readers/writers. The synchronous + // apply process has exited after durable completion, so no native I/O remains. + // Release only its observed exact retained lock before starting the server. + const observed = JSON.parse(runCli(['cluster', 'observe', '--target', cluster, '--config', cluster, '--json'])); + const lock = observed.state_observations?.lock_id; + if (typeof lock !== 'string') throw new Error('Expected the completed bootstrap writer lock'); + runCli(['cluster', 'force-unlock', lock, '--target', cluster, '--json']); + + server = spawn(SERVER, ['--cluster', cluster, '--unauthenticated', '--bind', BIND], { cwd: ROOT, stdio: ['ignore', 'pipe', 'pipe'] }); + serverClosed = once(server, 'close'); + for (const output of [server.stdout, server.stderr]) output.on('data', (chunk) => { serverLog = (serverLog + chunk).slice(-16000); }); + const deadline = Date.now() + 20000; + while (true) { + if (server.exitCode !== null || server.signalCode !== null) throw new Error(`Fixture server exited: ${serverLog}`); + try { await request('/readyz'); break; } catch (error) { + if (Date.now() > deadline) throw new Error(`Fixture did not become ready: ${error}\n${serverLog}`); + await new Promise((resolve) => setTimeout(resolve, 150)); + } } - if (exportLines.length !== 800) { - throw new Error(`expected 800 export lines (300 nodes + 500 edges), got ${exportLines.length}`); + const health = await request('/healthz'); + if (JSON.parse(health.body).version !== VERSION) throw new Error(`Expected server ${VERSION}, got ${health.body}`); + const discovery = await request('/healthz', { method: 'HEAD' }); + const seed = generateSeed(); + const seedPath = path.join(cluster, 'seed.ndjson'); + writeFileSync(seedPath, seed); + const loaded = JSON.parse(runCli(['load', '--data', seedPath, '--mode', 'merge', '--target', 'fixture', '--graph', GRAPH_ID, '--json'])); + const total = (tables) => (tables ?? []).reduce((sum, table) => sum + table.entities_loaded, 0); + if (total(loaded.nodes) !== 300 || total(loaded.edges) !== 500) throw new Error(`Unexpected load counts: ${JSON.stringify(loaded)}`); + console.log(`FIXTURE_READY ${BASE} · 300 nodes · 500 edges`); + if (SERVE) { + await Promise.race([ + new Promise((resolve) => { if (shutdown.signal.aborted) resolve(); else shutdown.signal.addEventListener('abort', resolve, { once: true }); }), + serverClosed.then(() => { throw new Error(`Fixture server exited unexpectedly: ${serverLog}`); }), + ]); + return; } - const snap = JSON.parse(snapshot); - // 0.10 renamed snapshot `tables` (table_key/row_count) to `datasets` - // (entity_kind + type_name / entity_count); keys keep the old - // ':' form either way. - const snapEntries = snap.datasets ?? snap.tables ?? []; - const rowCounts = Object.fromEntries( - snapEntries.map((t) => [ - t.table_key ?? `${t.entity_kind}:${t.type_name}`, - t.row_count ?? t.entity_count, - ]), - ); + const graph = (route) => `/graphs/${GRAPH_ID}${route}`; + const json = (body) => ({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); + const schema = await request(graph('/schema')); + const commits = await request(graph(`/commits?branch=${BRANCH}&limit=1`)); + const snapshot = await request(graph('/snapshot')); + const full = await request(graph('/export'), json({})); + const partial = await request(graph('/export'), json({ type_names: ['Correlates', 'Signal'] })); + const search = await request(graph('/queries/search_signals'), json({ branch: BRANCH, params: { q: 'Signal 1:' } })); + const after = await request(graph(`/commits?branch=${BRANCH}&limit=1`)); + const lines = full.body.trimEnd().split('\n').map((line) => JSON.parse(line)); + const firstNode = lines.findIndex((line) => line.type !== undefined); + if (lines.length !== 800 || firstNode !== 500 || lines.slice(firstNode).some((line) => line.edge !== undefined)) throw new Error('Expected 500 edge lines followed by 300 node lines'); + if (lines.some((line) => typeof line.id !== 'string')) throw new Error('Export is missing top-level entity identity'); + if (newestCommitId(commits.body) !== newestCommitId(after.body)) throw new Error('Fixture head moved during recording'); + const hit = JSON.parse(search.body).rows?.[0]?.s; + if (hit?.['@id'] !== 'signal-001' || hit?.id !== 1) throw new Error(`Search identity contract changed: ${search.body}`); const manifest = { - recordedAt: new Date().toISOString(), - serverVersion: JSON.parse(health).version, - graphId: GRAPH_ID, - branch: BRANCH, - headBefore: newestCommitId(commitsBefore), - headAfter: newestCommitId(commitsAfter), - rowCounts, - exportLineCount: exportLines.length, - edgeLinesBeforeNodeLines: true, - notes: - 'Raw HTTP bodies recorded verbatim from omnigraph-server against the requests ' + - 'the @modernrelay/omnigraph SDK issues (graph-scoped paths under /graphs/demo). ' + - 'export.ndjson streams tables in lexicographic table-key order, so all edge:* ' + - 'lines precede node:* lines (verified). headBefore == headAfter: the branch was ' + - 'quiescent across the export, the stable case for the source revision stamp.', + recordedAt: new Date().toISOString(), serverVersion: VERSION, httpApiContract: CONTRACT, + graphId: GRAPH_ID, branch: BRANCH, + headBefore: newestCommitId(commits.body), headAfter: newestCommitId(after.body), + rowCounts: Object.fromEntries(JSON.parse(snapshot.body).datasets.map((table) => [`${table.entity_kind}:${table.type_name}`, table.entity_count])), + exportLineCount: lines.length, edgeLinesBeforeNodeLines: true, + notes: 'Verbatim OmniGraph 0.14.0 HTTP bodies from a fresh isolated local cluster. Identity is top-level id in export and @id in query node values; nullable data properties are omitted. The branch was quiescent during recording.', }; - record('manifest.json', JSON.stringify(manifest, null, 2) + '\n'); - - console.log('OK: fixtures regenerated'); + mkdirSync(RECORDED_DIR, { recursive: true }); + const recordings = { + 'health.json': health.body, 'schema.json': schema.body, 'commits.json': commits.body, + 'snapshot.json': snapshot.body, 'export.ndjson': full.body, 'export-partial.ndjson': partial.body, + 'search.json': search.body, + 'http.json': JSON.stringify({ requestHeader: { [HEADER]: CONTRACT }, discovery: { method: 'HEAD', path: '/healthz', status: discovery.status, responseHeader: { [HEADER]: discovery.apiContract } } }, null, 2) + '\n', + 'manifest.json': JSON.stringify(manifest, null, 2) + '\n', + }; + for (const [file, body] of Object.entries(recordings)) { + if (!body) throw new Error(`Refusing empty recording ${file}`); + writeFileSync(path.join(RECORDED_DIR, file), body); + console.log(`Recorded ${file} (${Buffer.byteLength(body)} bytes)`); + } + writeFileSync(path.join(FIXTURE_DIR, 'seed.ndjson'), seed); + console.log('OK: OmniGraph 0.14 fixtures regenerated'); } finally { - server.kill('SIGTERM'); + process.removeListener('SIGINT', stop); + process.removeListener('SIGTERM', stop); + if (server !== undefined && server.exitCode === null && server.signalCode === null) { + server.kill('SIGTERM'); + const timeout = setTimeout(() => server.kill('SIGKILL'), 10000); + try { await serverClosed; } finally { clearTimeout(timeout); } + } + rmSync(cluster, { recursive: true, force: true }); } } -main().catch((err) => { - console.error(err); - process.exitCode = 1; -}); +main().catch((error) => { console.error(error); process.exitCode = 1; }); diff --git a/scripts/pack-smoke.mjs b/scripts/pack-smoke.mjs index 074104e..b2a8b69 100644 --- a/scripts/pack-smoke.mjs +++ b/scripts/pack-smoke.mjs @@ -14,6 +14,7 @@ * (h) tree-shake/lazy-load fixtures bundled against the temp install * (i) `.smoke/report.json` summarizing every gate * (j) the packed inline worker asset is self-contained + * (k) inferred consumer declarations use publicly accessible package types */ import { execFileSync } from 'node:child_process'; import { @@ -173,6 +174,7 @@ try { ...pkgs.map((p) => p.tarball), 'react', 'react-dom', + `@types/react@${pkgs.find((p) => p.name === '@modernrelay/orbit-react').manifest.devDependencies['@types/react']}`, ], { cwd: consumerDir }, ); @@ -198,6 +200,29 @@ for (const pkg of pkgs) { } } +// ---------------------------------------------------- (k) declaration consumer +try { + const fixture = 'public-types.ts'; + copyFileSync(path.join(ROOT, 'fixtures', 'declarations', fixture), path.join(consumerDir, fixture)); + // Workspaces use the native compiler; the root TypeScript package exists + // only for build tools that still require its legacy JavaScript API. + const compiler = path.join(ROOT, 'packages', 'core', 'node_modules', 'typescript', 'bin', 'tsc'); + run(process.execPath, [ + compiler, + '--ignoreConfig', + '--strict', + '--target', 'ES2022', + '--module', 'NodeNext', + '--declaration', + '--emitDeclarationOnly', + '--outDir', 'declarations', + fixture, + ], { cwd: consumerDir }); + pass('declarations:public-inferred-types'); +} catch (err) { + fail('declarations:public-inferred-types', errText(err)); +} + // ---------------------------------------------------------------- (f) publint for (const pkg of pkgs) { const gateName = `publint:${pkg.name}`; diff --git a/scripts/probe-node.mjs b/scripts/probe-node.mjs index 1aec059..f683623 100644 --- a/scripts/probe-node.mjs +++ b/scripts/probe-node.mjs @@ -5,8 +5,8 @@ * Writes probe records in the same shape as the Playwright GPU probes * (meta.browser: 'node') into apps/spike/results/records/: * - node-import-safety: `await import('@cosmos.gl/graph')` succeeds in Node - * - range-updates: static scan of dist/index.d.ts — all buffer setters are - * full-array, no ranged variants (offset/count) exist + * - range-updates: inventory of full-buffer setters used by the adapter and + * sparse live-position/pin setters, which are not EngineCommit range channels * - post-draw-frames: static scan of config.d.ts — no draw/render-phase * callback exists (only simulation/transition/interaction hooks) */ @@ -86,33 +86,48 @@ const records = []; const dtsHash = sha256(dtsPath); // Public setter signatures on the Graph class (4-space indented members). - const setterRe = /^ {4}(set[A-Za-z0-9]+)\(([^)]*)\)/gm; + // End at the return type so union-array parentheses and multiline object + // parameters (e.g. setViewTransform) remain intact in the inventory. + const setterRe = /^ {4}(set[A-Za-z0-9]+)\(([\s\S]*?)\): [^\n]+;/gm; const setters = []; - const rangedVariants = []; for (const match of dts.matchAll(setterRe)) { const [, name, params] = match; setters.push({ name, params: params.replace(/\s+/g, ' ').trim() }); - if (/\b(offset|startIndex|count|range|fromIndex|toIndex)\b/i.test(params)) { - rangedVariants.push(name); - } } - const pass = setters.length > 0 && rangedVariants.length === 0; + const bufferSetterNames = [ + 'setPointPositions', 'setPointColors', 'setPointSizes', 'setLinks', + 'setLinkColors', 'setLinkWidths', 'setImageData', 'setPointImageIndices', + 'setPointClusters', 'setClusterPositions', + ]; + const bufferSetters = setters.filter(({ name }) => bufferSetterNames.includes(name)); + const rangedVariants = bufferSetters.filter(({ params }) => + /\b(offset|startIndex|count|range|fromIndex|toIndex)\b/i.test(params), + ); + const sparsePositionSetters = setters.filter(({ name }) => + ['setPointPosition', 'setPointPositionsByIndices'].includes(name), + ); + const sparsePinSetters = setters.filter(({ name }) => name === 'setPinnedPoint'); + const pass = bufferSetters.length === bufferSetterNames.length && rangedVariants.length === 0 + && sparsePositionSetters.length === 2 && sparsePinSetters.length === 1; records.push( makeRecord({ capability: 'range-updates', expected: - 'Every buffer setter (setPointPositions, setPointColors, setLinks, ...) takes a full ' + - 'array; no ranged/partial-update variants (offset/count parameters) exist, so orbit ' + - 'must re-upload whole buffers on every change.', + 'The buffer setters used for Orbit EngineCommit take full arrays without offset/count ' + + 'parameters. Cosmos 3.5 also provides sparse live-position and pin setters; the adapter ' + + 'does not translate EngineCommit range channels to those APIs (rangeUpdates remains []).', observed: { rangeUpdates: [], setterCount: setters.length, setters, + bufferSettersUsedByAdapter: bufferSetters, + sparsePositionSetters, + sparsePinSetters, rangedVariantsFound: rangedVariants, dtsSha256: dtsHash, }, pass, - notes: `Static scan of the resolved dist/index.d.ts (sha256 ${dtsHash}). All ${setters.length} set* signatures on the Graph class take full arrays; none declare offset/count/range parameters.`, + notes: `Static scan of the resolved dist/index.d.ts (sha256 ${dtsHash}). The ${bufferSetters.length} buffer setters used by the adapter have no offset/count/range parameters. Sparse position writes change live GPU state, not the input roster; wiring them into atomic commits requires a separate adapter change. setPinnedPoint is a per-index pin toggle, not a buffer range upload.`, }), ); }