From 1bf4ba0d1ffe8bbeb04d95fdc71a3d1618857ee1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 11:55:36 +0900 Subject: [PATCH 01/74] feat(integration): add naruon rehearsal handoff contract --- packages/shared-types/src/naruon.ts | 370 ++++++++++++++++++++++++++++ 1 file changed, 370 insertions(+) create mode 100644 packages/shared-types/src/naruon.ts diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts new file mode 100644 index 000000000..f37304234 --- /dev/null +++ b/packages/shared-types/src/naruon.ts @@ -0,0 +1,370 @@ +/** Stable artifact kind emitted by BandScope for naruon ingestion. */ +export const NARUON_REHEARSAL_HANDOFF_KIND = "bandscope.naruon.rehearsal-event" as const; + +/** Current additive schema version for the naruon rehearsal handoff. */ +export const NARUON_REHEARSAL_HANDOFF_VERSION = 1 as const; + +/** Maximum number of provenance receipts accepted in one handoff. */ +export const MAX_NARUON_EVIDENCE_RECEIPTS = 64; + +const MAX_IDENTIFIER_LENGTH = 256; +const MAX_DISPLAY_TEXT_LENGTH = 2_048; +const MAX_TIME_ZONE_LENGTH = 128; +const RFC3339_PATTERN = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,9})?(Z|[+-](\d{2}):(\d{2}))$/; +const COMMITMENT_STATUSES = ["confirmed", "tentative", "desired"] as const; +const RSVP_DIRECTIONS = ["organizer", "attendee"] as const; + +/** Commitment strength used by naruon's status-weighted conflict resolver. */ +export type NaruonCommitmentStatus = (typeof COMMITMENT_STATUSES)[number]; + +/** Whether the BandScope user organizes or attends the rehearsal. */ +export type NaruonRsvpDirection = (typeof RSVP_DIRECTIONS)[number]; + +/** Field-level source receipt included in a naruon handoff. */ +export type NaruonEvidenceReceipt = { + field: string; + value: string; +}; + +/** Local BandScope identity and tenancy information for a handoff. */ +export type NaruonHandoffSource = { + application: "bandscope"; + workspaceId: string; + bandId: string; + rehearsalId: string; +}; + +/** Band norm-group contributed to naruon's shared knowledge graph. */ +export type NaruonBandNormGroup = { + kind: "band"; + id: string; + label: string; +}; + +/** Scheduled rehearsal event represented independently of any calendar vendor. */ +export type NaruonRehearsalEvent = { + title: string; + startsAt: string; + endsAt: string; + timeZone: string; + venue?: string; +}; + +/** Commitment metadata required for status-weighted conflict resolution. */ +export type NaruonRehearsalCommitment = { + status: NaruonCommitmentStatus; + rsvpDirection: NaruonRsvpDirection; +}; + +/** Auditable evidence and calibrated confidence for the exported event. */ +export type NaruonHandoffProvenance = { + sourceRecordId: string; + confidence: number; + evidence: NaruonEvidenceReceipt[]; +}; + +/** + * Versioned, network-agnostic BandScope artifact that naruon can ingest as a + * Band norm-group, rehearsal Event, and status-bearing Commitment. + */ +export type NaruonRehearsalHandoff = { + artifactKind: typeof NARUON_REHEARSAL_HANDOFF_KIND; + artifactVersion: typeof NARUON_REHEARSAL_HANDOFF_VERSION; + createdAt: string; + source: NaruonHandoffSource; + normGroup: NaruonBandNormGroup; + event: NaruonRehearsalEvent; + commitment: NaruonRehearsalCommitment; + provenance: NaruonHandoffProvenance; +}; + +/** Input accepted by the canonical handoff builder. */ +export type CreateNaruonRehearsalHandoffInput = Omit< + NaruonRehearsalHandoff, + "artifactKind" | "artifactVersion" +>; + +/** Return whether a value is a non-array object. */ +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +/** Return whether an array has every numeric index materialized. */ +function isDenseArray(value: unknown): value is unknown[] { + if (!Array.isArray(value)) return false; + const length = Number(value.length); + if (!Number.isSafeInteger(length) || length < 0) return false; + for (let index = 0; index < length; index += 1) { + if (!(index in value)) return false; + } + return true; +} + +/** Return the first key outside an exact allowlist. */ +function unexpectedKey( + value: Record, + allowedKeys: readonly string[], + path: string +): string | null { + for (const key of Object.keys(value)) { + if (!allowedKeys.includes(key)) { + return `${path}.${key}`; + } + } + return null; +} + +/** Return whether text is printable, trimmed, non-empty, and bounded. */ +function isDisplayText(value: unknown, maximumLength = MAX_DISPLAY_TEXT_LENGTH): value is string { + return ( + typeof value === "string" && + value.length > 0 && + value.length <= maximumLength && + value === value.trim() && + !/[\u0000-\u001f\u007f]/u.test(value) + ); +} + +/** Return whether an identifier is opaque rather than numeric or user-facing. */ +function isOpaqueIdentifier(value: unknown): value is string { + return ( + isDisplayText(value, MAX_IDENTIFIER_LENGTH) && + !/^\d+$/u.test(value) + ); +} + +/** Return whether a value belongs to a readonly string enum. */ +function isOneOf(values: readonly T[], value: unknown): value is T { + return typeof value === "string" && values.includes(value as T); +} + +/** Return whether an RFC 3339 timestamp is both syntactically and calendrically valid. */ +function isRfc3339(value: unknown): value is string { + if (typeof value !== "string") return false; + const match = RFC3339_PATTERN.exec(value); + if (!match) return false; + + const year = Number(match[1]); + const month = Number(match[2]); + const day = Number(match[3]); + const hour = Number(match[4]); + const minute = Number(match[5]); + const second = Number(match[6]); + const offsetHour = match[8] === undefined ? 0 : Number(match[8]); + const offsetMinute = match[9] === undefined ? 0 : Number(match[9]); + if ( + month < 1 || + month > 12 || + day < 1 || + day > new Date(Date.UTC(year, month, 0)).getUTCDate() || + hour > 23 || + minute > 59 || + second > 59 || + offsetHour > 23 || + offsetMinute > 59 + ) { + return false; + } + return Number.isFinite(Date.parse(value)); +} + +/** Return whether a time-zone identifier is accepted by the host ICU database. */ +function isTimeZone(value: unknown): value is string { + if (!isDisplayText(value, MAX_TIME_ZONE_LENGTH)) return false; + try { + new Intl.DateTimeFormat("en", { timeZone: value }).format(0); + return true; + } catch { + return false; + } +} + +/** Validate one source receipt. */ +function validateEvidenceReceipt(value: unknown, path: string): string | null { + if (!isRecord(value)) return `${path} must be an object`; + const extra = unexpectedKey(value, ["field", "value"], path); + if (extra) return `${extra} is not allowed`; + if (!isDisplayText(value.field, MAX_IDENTIFIER_LENGTH)) return `${path}.field is invalid`; + if (!isDisplayText(value.value)) return `${path}.value is invalid`; + return null; +} + +/** + * Validate an unknown value at the BandScope → naruon trust boundary. + * + * The validator is intentionally fail-closed: unknown keys, numeric-only IDs, + * malformed timestamps, invalid IANA time zones, sparse arrays, inconsistent + * band identities, and non-finite confidence values are rejected. + */ +export function validateNaruonRehearsalHandoff(value: unknown): string | null { + if (!isRecord(value)) return "root must be an object"; + const rootExtra = unexpectedKey( + value, + [ + "artifactKind", + "artifactVersion", + "createdAt", + "source", + "normGroup", + "event", + "commitment", + "provenance" + ], + "root" + ); + if (rootExtra) return `${rootExtra} is not allowed`; + if (value.artifactKind !== NARUON_REHEARSAL_HANDOFF_KIND) return "artifactKind is invalid"; + if (value.artifactVersion !== NARUON_REHEARSAL_HANDOFF_VERSION) return "artifactVersion is invalid"; + if (!isRfc3339(value.createdAt)) return "createdAt is invalid"; + + if (!isRecord(value.source)) return "source must be an object"; + const sourceExtra = unexpectedKey( + value.source, + ["application", "workspaceId", "bandId", "rehearsalId"], + "source" + ); + if (sourceExtra) return `${sourceExtra} is not allowed`; + if (value.source.application !== "bandscope") return "source.application is invalid"; + for (const field of ["workspaceId", "bandId", "rehearsalId"] as const) { + if (!isOpaqueIdentifier(value.source[field])) return `source.${field} is invalid`; + } + + if (!isRecord(value.normGroup)) return "normGroup must be an object"; + const normExtra = unexpectedKey(value.normGroup, ["kind", "id", "label"], "normGroup"); + if (normExtra) return `${normExtra} is not allowed`; + if (value.normGroup.kind !== "band") return "normGroup.kind is invalid"; + if (!isOpaqueIdentifier(value.normGroup.id)) return "normGroup.id is invalid"; + if (!isDisplayText(value.normGroup.label)) return "normGroup.label is invalid"; + if (value.normGroup.id !== value.source.bandId) return "normGroup.id must equal source.bandId"; + + if (!isRecord(value.event)) return "event must be an object"; + const eventExtra = unexpectedKey( + value.event, + ["title", "startsAt", "endsAt", "timeZone", "venue"], + "event" + ); + if (eventExtra) return `${eventExtra} is not allowed`; + if (!isDisplayText(value.event.title)) return "event.title is invalid"; + if (!isRfc3339(value.event.startsAt)) return "event.startsAt is invalid"; + if (!isRfc3339(value.event.endsAt)) return "event.endsAt is invalid"; + if (Date.parse(value.event.endsAt) <= Date.parse(value.event.startsAt)) { + return "event.endsAt must be later than event.startsAt"; + } + if (!isTimeZone(value.event.timeZone)) return "event.timeZone is invalid"; + if (value.event.venue !== undefined && !isDisplayText(value.event.venue)) { + return "event.venue is invalid"; + } + + if (!isRecord(value.commitment)) return "commitment must be an object"; + const commitmentExtra = unexpectedKey( + value.commitment, + ["status", "rsvpDirection"], + "commitment" + ); + if (commitmentExtra) return `${commitmentExtra} is not allowed`; + if (!isOneOf(COMMITMENT_STATUSES, value.commitment.status)) { + return "commitment.status is invalid"; + } + if (!isOneOf(RSVP_DIRECTIONS, value.commitment.rsvpDirection)) { + return "commitment.rsvpDirection is invalid"; + } + + if (!isRecord(value.provenance)) return "provenance must be an object"; + const provenanceExtra = unexpectedKey( + value.provenance, + ["sourceRecordId", "confidence", "evidence"], + "provenance" + ); + if (provenanceExtra) return `${provenanceExtra} is not allowed`; + if (!isOpaqueIdentifier(value.provenance.sourceRecordId)) { + return "provenance.sourceRecordId is invalid"; + } + if ( + typeof value.provenance.confidence !== "number" || + !Number.isFinite(value.provenance.confidence) || + value.provenance.confidence < 0 || + value.provenance.confidence > 1 + ) { + return "provenance.confidence is invalid"; + } + if ( + !isDenseArray(value.provenance.evidence) || + value.provenance.evidence.length < 1 || + value.provenance.evidence.length > MAX_NARUON_EVIDENCE_RECEIPTS + ) { + return "provenance.evidence is invalid"; + } + for (let index = 0; index < value.provenance.evidence.length; index += 1) { + const error = validateEvidenceReceipt( + value.provenance.evidence[index], + `provenance.evidence[${index}]` + ); + if (error) return error; + } + return null; +} + +/** Return whether a value satisfies the complete handoff contract. */ +export function isNaruonRehearsalHandoff(value: unknown): value is NaruonRehearsalHandoff { + return validateNaruonRehearsalHandoff(value) === null; +} + +/** Parse and canonicalize an unknown handoff, throwing on contract violations. */ +export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHandoff { + const error = validateNaruonRehearsalHandoff(value); + if (error || !isRecord(value)) { + throw new TypeError(`Invalid naruon rehearsal handoff: ${error ?? "root must be an object"}`); + } + const source = value.source as NaruonHandoffSource; + const normGroup = value.normGroup as NaruonBandNormGroup; + const event = value.event as NaruonRehearsalEvent; + const commitment = value.commitment as NaruonRehearsalCommitment; + const provenance = value.provenance as NaruonHandoffProvenance; + return { + artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, + artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION, + createdAt: value.createdAt as string, + source: { ...source }, + normGroup: { ...normGroup }, + event: event.venue === undefined ? { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone + } : { ...event }, + commitment: { ...commitment }, + provenance: { + sourceRecordId: provenance.sourceRecordId, + confidence: provenance.confidence, + evidence: provenance.evidence.map((receipt) => ({ ...receipt })) + } + }; +} + +/** Build a canonical versioned handoff from application-owned fields. */ +export function createNaruonRehearsalHandoff( + input: CreateNaruonRehearsalHandoffInput +): NaruonRehearsalHandoff { + return parseNaruonRehearsalHandoff({ + artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, + artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION, + ...input + }); +} + +/** Serialize a validated handoff as deterministic newline-terminated JSON. */ +export function serializeNaruonRehearsalHandoff(value: unknown): string { + return `${JSON.stringify(parseNaruonRehearsalHandoff(value))}\n`; +} + +/** Parse JSON text and validate the resulting handoff at the same trust boundary. */ +export function deserializeNaruonRehearsalHandoff(serialized: string): NaruonRehearsalHandoff { + let value: unknown; + try { + value = JSON.parse(serialized); + } catch (error) { + const detail = error instanceof Error ? error.message : "unknown JSON error"; + throw new TypeError(`Invalid naruon rehearsal handoff JSON: ${detail}`); + } + return parseNaruonRehearsalHandoff(value); +} From 63134a3e13ab466a3bc27b346e4940ee4a93efeb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 11:56:08 +0900 Subject: [PATCH 02/74] feat(integration): expose naruon contract subpath --- packages/shared-types/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/shared-types/package.json b/packages/shared-types/package.json index f03474284..0f849a36a 100644 --- a/packages/shared-types/package.json +++ b/packages/shared-types/package.json @@ -2,7 +2,10 @@ "name": "@bandscope/shared-types", "version": "0.1.0", "type": "module", - "exports": "./src/index.ts", + "exports": { + ".": "./src/index.ts", + "./naruon": "./src/naruon.ts" + }, "scripts": { "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", "typecheck": "tsc --noEmit", From d3a7255a3af212acf90be8e737070d2aa35b03bb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 11:56:24 +0900 Subject: [PATCH 03/74] test(integration): measure naruon contract coverage --- packages/shared-types/vitest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared-types/vitest.config.ts b/packages/shared-types/vitest.config.ts index 14e004545..14118113c 100644 --- a/packages/shared-types/vitest.config.ts +++ b/packages/shared-types/vitest.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ globals: true, coverage: { provider: "v8", - include: ["src/index.ts"], + include: ["src/index.ts", "src/naruon.ts"], thresholds: { lines: 90, functions: 90, From f861df1927de79f2e6c6a8e8faf3e54106a04294 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 11:58:33 +0900 Subject: [PATCH 04/74] test(integration): cover naruon handoff boundary --- packages/shared-types/test/naruon.test.ts | 270 ++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 packages/shared-types/test/naruon.test.ts diff --git a/packages/shared-types/test/naruon.test.ts b/packages/shared-types/test/naruon.test.ts new file mode 100644 index 000000000..6bdbdb061 --- /dev/null +++ b/packages/shared-types/test/naruon.test.ts @@ -0,0 +1,270 @@ +import { + MAX_NARUON_EVIDENCE_RECEIPTS, + NARUON_REHEARSAL_HANDOFF_KIND, + NARUON_REHEARSAL_HANDOFF_VERSION, + createNaruonRehearsalHandoff, + deserializeNaruonRehearsalHandoff, + isNaruonRehearsalHandoff, + parseNaruonRehearsalHandoff, + serializeNaruonRehearsalHandoff, + validateNaruonRehearsalHandoff, + type CreateNaruonRehearsalHandoffInput, + type NaruonRehearsalHandoff +} from "../src/naruon"; + +function validInput(): CreateNaruonRehearsalHandoffInput { + return { + createdAt: "2026-08-03T01:23:45.123Z", + source: { + application: "bandscope", + workspaceId: "workspace-local-alpha", + bandId: "band-contextual-wisdom", + rehearsalId: "rehearsal-2026-08-10" + }, + normGroup: { + kind: "band", + id: "band-contextual-wisdom", + label: "Contextual Wisdom Band" + }, + event: { + title: "August rehearsal", + startsAt: "2026-08-10T19:00:00+09:00", + endsAt: "2026-08-10T21:30:00+09:00", + timeZone: "Asia/Seoul", + venue: "Studio A" + }, + commitment: { + status: "confirmed", + rsvpDirection: "organizer" + }, + provenance: { + sourceRecordId: "calendar-record-alpha", + confidence: 0.94, + evidence: [ + { field: "startsAt", value: "2026-08-10T19:00:00+09:00" }, + { field: "venue", value: "Studio A" } + ] + } + }; +} + +function validHandoff(): NaruonRehearsalHandoff { + return createNaruonRehearsalHandoff(validInput()); +} + +function clone(value: unknown): any { + return JSON.parse(JSON.stringify(value)); +} + +describe("naruon rehearsal handoff contract", () => { + it("builds the versioned standalone handoff and preserves integration semantics", () => { + const handoff = validHandoff(); + + expect(handoff.artifactKind).toBe(NARUON_REHEARSAL_HANDOFF_KIND); + expect(handoff.artifactVersion).toBe(NARUON_REHEARSAL_HANDOFF_VERSION); + expect(handoff.source.application).toBe("bandscope"); + expect(handoff.normGroup).toEqual({ + kind: "band", + id: handoff.source.bandId, + label: "Contextual Wisdom Band" + }); + expect(handoff.commitment).toEqual({ + status: "confirmed", + rsvpDirection: "organizer" + }); + expect(validateNaruonRehearsalHandoff(handoff)).toBeNull(); + expect(isNaruonRehearsalHandoff(handoff)).toBe(true); + }); + + it("canonicalizes nested values instead of returning caller-owned objects", () => { + const input = validInput(); + const handoff = createNaruonRehearsalHandoff(input); + + expect(handoff).not.toBe(input); + expect(handoff.source).not.toBe(input.source); + expect(handoff.normGroup).not.toBe(input.normGroup); + expect(handoff.event).not.toBe(input.event); + expect(handoff.commitment).not.toBe(input.commitment); + expect(handoff.provenance).not.toBe(input.provenance); + expect(handoff.provenance.evidence).not.toBe(input.provenance.evidence); + expect(handoff.provenance.evidence[0]).not.toBe(input.provenance.evidence[0]); + + input.source.bandId = "band-mutated"; + input.provenance.evidence[0].value = "mutated"; + expect(handoff.source.bandId).toBe("band-contextual-wisdom"); + expect(handoff.provenance.evidence[0].value).toBe("2026-08-10T19:00:00+09:00"); + }); + + it("omits an absent optional venue from canonical output", () => { + const input = validInput(); + delete input.event.venue; + + const parsed = createNaruonRehearsalHandoff(input); + + expect(parsed.event).toEqual({ + title: "August rehearsal", + startsAt: "2026-08-10T19:00:00+09:00", + endsAt: "2026-08-10T21:30:00+09:00", + timeZone: "Asia/Seoul" + }); + expect("venue" in parsed.event).toBe(false); + }); + + it("serializes deterministically and validates again when deserializing", () => { + const serialized = serializeNaruonRehearsalHandoff(validHandoff()); + + expect(serialized.endsWith("\n")).toBe(true); + expect(deserializeNaruonRehearsalHandoff(serialized)).toEqual(validHandoff()); + expect(() => deserializeNaruonRehearsalHandoff("{not-json")).toThrow( + "Invalid naruon rehearsal handoff JSON" + ); + }); + + it("rejects a non-object root and throws from the parser", () => { + expect(validateNaruonRehearsalHandoff(null)).toBe("root must be an object"); + expect(isNaruonRehearsalHandoff([])).toBe(false); + expect(() => parseNaruonRehearsalHandoff("invalid")).toThrow( + "Invalid naruon rehearsal handoff" + ); + }); + + it.each([ + ["root.extra", (value: any) => { value.extra = true; }], + ["artifactKind", (value: any) => { value.artifactKind = "other"; }], + ["artifactVersion", (value: any) => { value.artifactVersion = 2; }], + ["createdAt", (value: any) => { value.createdAt = "2026-08-03"; }], + ["source must", (value: any) => { value.source = null; }], + ["source.extra", (value: any) => { value.source.extra = true; }], + ["source.application", (value: any) => { value.source.application = "naruon"; }], + ["source.workspaceId", (value: any) => { value.source.workspaceId = "123"; }], + ["source.bandId", (value: any) => { value.source.bandId = ""; }], + ["source.rehearsalId", (value: any) => { value.source.rehearsalId = "bad\nvalue"; }], + ["normGroup must", (value: any) => { value.normGroup = []; }], + ["normGroup.extra", (value: any) => { value.normGroup.extra = true; }], + ["normGroup.kind", (value: any) => { value.normGroup.kind = "team"; }], + ["normGroup.id is", (value: any) => { value.normGroup.id = "44"; }], + ["normGroup.label", (value: any) => { value.normGroup.label = " label "; }], + ["must equal", (value: any) => { value.normGroup.id = "band-other"; }], + ["event must", (value: any) => { value.event = "event"; }], + ["event.extra", (value: any) => { value.event.extra = true; }], + ["event.title", (value: any) => { value.event.title = ""; }], + ["event.startsAt", (value: any) => { value.event.startsAt = "not-a-date"; }], + ["event.endsAt is", (value: any) => { value.event.endsAt = "not-a-date"; }], + ["later than", (value: any) => { value.event.endsAt = value.event.startsAt; }], + ["event.timeZone", (value: any) => { value.event.timeZone = "Mars/Olympus"; }], + ["event.venue", (value: any) => { value.event.venue = " "; }], + ["commitment must", (value: any) => { value.commitment = null; }], + ["commitment.extra", (value: any) => { value.commitment.extra = true; }], + ["commitment.status", (value: any) => { value.commitment.status = "maybe"; }], + ["commitment.rsvpDirection", (value: any) => { value.commitment.rsvpDirection = "observer"; }], + ["provenance must", (value: any) => { value.provenance = null; }], + ["provenance.extra", (value: any) => { value.provenance.extra = true; }], + ["provenance.sourceRecordId", (value: any) => { value.provenance.sourceRecordId = "7"; }], + ["provenance.confidence", (value: any) => { value.provenance.confidence = Number.NaN; }], + ["provenance.evidence", (value: any) => { value.provenance.evidence = "receipt"; }], + ["evidence[0] must", (value: any) => { value.provenance.evidence[0] = null; }], + ["evidence[0].extra", (value: any) => { value.provenance.evidence[0].extra = true; }], + ["evidence[0].field", (value: any) => { value.provenance.evidence[0].field = ""; }], + ["evidence[0].value", (value: any) => { value.provenance.evidence[0].value = "bad\nvalue"; }] + ])("fails closed for %s", (expected, mutate) => { + const value = clone(validHandoff()); + mutate(value); + + expect(validateNaruonRehearsalHandoff(value)).toContain(expected); + expect(isNaruonRehearsalHandoff(value)).toBe(false); + expect(() => parseNaruonRehearsalHandoff(value)).toThrow( + "Invalid naruon rehearsal handoff" + ); + }); + + it.each([ + "2026-00-01T00:00:00Z", + "2026-13-01T00:00:00Z", + "2026-02-30T00:00:00Z", + "2026-01-00T00:00:00Z", + "2026-01-01T24:00:00Z", + "2026-01-01T00:60:00Z", + "2026-01-01T00:00:60Z", + "2026-01-01T00:00:00+24:00", + "2026-01-01T00:00:00+01:60", + "2026-01-01T00:00:00.1234567890Z" + ])("rejects calendrically invalid RFC 3339 timestamp %s", (createdAt) => { + const value = clone(validHandoff()); + value.createdAt = createdAt; + + expect(validateNaruonRehearsalHandoff(value)).toBe("createdAt is invalid"); + }); + + it.each([null, -0.01, 1.01, Number.POSITIVE_INFINITY])( + "rejects invalid calibrated confidence %s", + (confidence) => { + const value = clone(validHandoff()); + value.provenance.confidence = confidence; + + expect(validateNaruonRehearsalHandoff(value)).toBe( + "provenance.confidence is invalid" + ); + } + ); + + it("accepts confidence boundaries and every commitment-axis combination", () => { + for (const confidence of [0, 1]) { + for (const status of ["confirmed", "tentative", "desired"] as const) { + for (const rsvpDirection of ["organizer", "attendee"] as const) { + const value = clone(validHandoff()); + value.provenance.confidence = confidence; + value.commitment.status = status; + value.commitment.rsvpDirection = rsvpDirection; + expect(validateNaruonRehearsalHandoff(value)).toBeNull(); + } + } + } + }); + + it("rejects empty, oversized, and sparse provenance receipt collections", () => { + const empty = clone(validHandoff()); + empty.provenance.evidence = []; + expect(validateNaruonRehearsalHandoff(empty)).toBe("provenance.evidence is invalid"); + + const oversized = clone(validHandoff()); + oversized.provenance.evidence = Array.from( + { length: MAX_NARUON_EVIDENCE_RECEIPTS + 1 }, + (_, index) => ({ field: `field-${index}`, value: `value-${index}` }) + ); + expect(validateNaruonRehearsalHandoff(oversized)).toBe( + "provenance.evidence is invalid" + ); + + const sparse = clone(validHandoff()); + sparse.provenance.evidence = new Array(1); + expect(validateNaruonRehearsalHandoff(sparse)).toBe("provenance.evidence is invalid"); + }); + + it("rejects oversized fields and allows the UTC time zone", () => { + const oversizedIdentifier = clone(validHandoff()); + oversizedIdentifier.source.workspaceId = `id-${"x".repeat(256)}`; + expect(validateNaruonRehearsalHandoff(oversizedIdentifier)).toBe( + "source.workspaceId is invalid" + ); + + const oversizedText = clone(validHandoff()); + oversizedText.event.title = "x".repeat(2_049); + expect(validateNaruonRehearsalHandoff(oversizedText)).toBe("event.title is invalid"); + + const utc = clone(validHandoff()); + utc.event.timeZone = "UTC"; + expect(validateNaruonRehearsalHandoff(utc)).toBeNull(); + }); + + it("snapshots hostile array length metadata and rejects the forged collection", () => { + const value = clone(validHandoff()); + value.provenance.evidence = new Proxy([{ field: "title", value: "Rehearsal" }], { + get(target, property, receiver) { + if (property === "length") return Number.MAX_SAFE_INTEGER + 1; + return Reflect.get(target, property, receiver); + } + }); + + expect(validateNaruonRehearsalHandoff(value)).toBe("provenance.evidence is invalid"); + }); +}); From d2d38c596d6dc508d59f0e956afb7cf9f143c584 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 11:59:41 +0900 Subject: [PATCH 05/74] docs(integration): specify standalone naruon bridge --- docs/integrations/naruon.md | 106 ++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 docs/integrations/naruon.md diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md new file mode 100644 index 000000000..228ea2085 --- /dev/null +++ b/docs/integrations/naruon.md @@ -0,0 +1,106 @@ +# BandScope → naruon rehearsal handoff + +BandScope remains a fully standalone, local-first desktop application. The naruon bridge is an **explicit export contract**, not a mandatory network dependency: BandScope can produce a versioned JSON artifact, and a separately authorized naruon connector may ingest that artifact as a Band norm-group, rehearsal Event, and status-bearing Commitment. + +## Product outcome + +The bridge closes the first BandScope side of the platform vertical described by `ContextualWisdomLab/bandscope#610` without coupling the desktop app to naruon internals. + +A naruon deployment can use the artifact to: + +- identify the band as an overlapping norm/reference group; +- place a rehearsal on the shared Event graph; +- preserve `confirmed`, `tentative`, or `desired` commitment strength; +- preserve organizer-versus-attendee RSVP direction; +- run status-weighted conflict detection without silently breaking a confirmed commitment; +- cite the BandScope source record and field-level evidence; +- calibrate downstream behavior from an explicit `0..1` confidence value. + +BandScope itself continues to analyze songs and manage rehearsal material even when naruon is absent, offline, or intentionally disabled. + +## TypeScript API + +The dependency-free contract is exported from a stable package subpath: + +```ts +import { + createNaruonRehearsalHandoff, + serializeNaruonRehearsalHandoff +} from "@bandscope/shared-types/naruon"; + +const artifact = createNaruonRehearsalHandoff({ + createdAt: "2026-08-03T01:23:45Z", + source: { + application: "bandscope", + workspaceId: "workspace-local-alpha", + bandId: "band-contextual-wisdom", + rehearsalId: "rehearsal-2026-08-10" + }, + normGroup: { + kind: "band", + id: "band-contextual-wisdom", + label: "Contextual Wisdom Band" + }, + event: { + title: "August rehearsal", + startsAt: "2026-08-10T19:00:00+09:00", + endsAt: "2026-08-10T21:30:00+09:00", + timeZone: "Asia/Seoul", + venue: "Studio A" + }, + commitment: { + status: "confirmed", + rsvpDirection: "organizer" + }, + provenance: { + sourceRecordId: "calendar-record-alpha", + confidence: 0.94, + evidence: [ + { field: "startsAt", value: "2026-08-10T19:00:00+09:00" }, + { field: "venue", value: "Studio A" } + ] + } +}); + +const json = serializeNaruonRehearsalHandoff(artifact); +``` + +Consumers receiving untrusted bytes must call `deserializeNaruonRehearsalHandoff` or `parseNaruonRehearsalHandoff` before use. + +## Boundary guarantees + +The contract fails closed on: + +- unknown fields at every object level; +- numeric-only IDs (BandScope and naruon IDs must remain opaque strings); +- blank, untrimmed, control-character-bearing, or oversized values; +- malformed or calendrically invalid RFC 3339 timestamps; +- an end time that is not later than its start time; +- time-zone identifiers rejected by the runtime's IANA/ICU database; +- a norm-group identity that differs from the exported source band identity; +- unsupported commitment status or RSVP direction; +- non-finite or out-of-range confidence values; +- empty, sparse, oversized, or malformed provenance receipt arrays. + +Parsing returns newly allocated nested objects and evidence receipts so a caller cannot mutate the parsed artifact by retaining references to its input object. + +## Trust and privacy model + +This artifact contains **rehearsal coordination facts only**. It does not grant naruon filesystem, database, calendar, mail, model, or network authority. Transport, tenant authorization, detached signature verification, consent, context bridging, and writeback remain responsibilities of the naruon plugin/connector installation. + +A connector should: + +1. authenticate the producing BandScope installation and intended naruon tenant; +2. verify a detached signature or authenticated transport envelope; +3. parse the artifact using this contract; +4. persist provenance before projecting Event/Commitment candidates; +5. keep per-band context segregated by default; +6. require explicit approval before any externally visible decline, reschedule, or CalDAV writeback. + +## Compatibility + +- `artifactKind`: `bandscope.naruon.rehearsal-event` +- `artifactVersion`: `1` +- Additive fields require a new version because version 1 rejects unknown keys. +- Breaking semantic changes require a new artifact kind or major version. +- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for cross-field and IANA time-zone checks. From 27829e1ba9d8630905fbe20ecdc0c5a29fe0f277 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:00:28 +0900 Subject: [PATCH 06/74] docs(integration): publish handoff JSON schema --- .../naruon-rehearsal-handoff-v1.schema.json | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 docs/integrations/naruon-rehearsal-handoff-v1.schema.json diff --git a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json new file mode 100644 index 000000000..f1503ecc2 --- /dev/null +++ b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json @@ -0,0 +1,157 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://contextualwisdomlab.github.io/bandscope/schemas/naruon-rehearsal-handoff-v1.schema.json", + "title": "BandScope naruon rehearsal handoff v1", + "description": "A network-agnostic BandScope export that contributes a Band norm-group, rehearsal Event, commitment status, RSVP direction, and provenance to naruon.", + "type": "object", + "additionalProperties": false, + "required": [ + "artifactKind", + "artifactVersion", + "createdAt", + "source", + "normGroup", + "event", + "commitment", + "provenance" + ], + "properties": { + "artifactKind": { + "const": "bandscope.naruon.rehearsal-event" + }, + "artifactVersion": { + "const": 1 + }, + "createdAt": { + "$ref": "#/$defs/timestamp" + }, + "source": { + "type": "object", + "additionalProperties": false, + "required": ["application", "workspaceId", "bandId", "rehearsalId"], + "properties": { + "application": { + "const": "bandscope" + }, + "workspaceId": { + "$ref": "#/$defs/opaqueIdentifier" + }, + "bandId": { + "$ref": "#/$defs/opaqueIdentifier" + }, + "rehearsalId": { + "$ref": "#/$defs/opaqueIdentifier" + } + } + }, + "normGroup": { + "type": "object", + "additionalProperties": false, + "required": ["kind", "id", "label"], + "properties": { + "kind": { + "const": "band" + }, + "id": { + "$ref": "#/$defs/opaqueIdentifier" + }, + "label": { + "$ref": "#/$defs/displayText" + } + } + }, + "event": { + "type": "object", + "additionalProperties": false, + "required": ["title", "startsAt", "endsAt", "timeZone"], + "properties": { + "title": { + "$ref": "#/$defs/displayText" + }, + "startsAt": { + "$ref": "#/$defs/timestamp" + }, + "endsAt": { + "$ref": "#/$defs/timestamp" + }, + "timeZone": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[^\\u0000-\\u001f\\u007f]+$" + }, + "venue": { + "$ref": "#/$defs/displayText" + } + } + }, + "commitment": { + "type": "object", + "additionalProperties": false, + "required": ["status", "rsvpDirection"], + "properties": { + "status": { + "enum": ["confirmed", "tentative", "desired"] + }, + "rsvpDirection": { + "enum": ["organizer", "attendee"] + } + } + }, + "provenance": { + "type": "object", + "additionalProperties": false, + "required": ["sourceRecordId", "confidence", "evidence"], + "properties": { + "sourceRecordId": { + "$ref": "#/$defs/opaqueIdentifier" + }, + "confidence": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "evidence": { + "type": "array", + "minItems": 1, + "maxItems": 64, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["field", "value"], + "properties": { + "field": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "pattern": "^[^\\u0000-\\u001f\\u007f]+$" + }, + "value": { + "$ref": "#/$defs/displayText" + } + } + } + } + } + } + }, + "$defs": { + "opaqueIdentifier": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "pattern": "^(?![0-9]+$)[^\\u0000-\\u001f\\u007f]+$" + }, + "displayText": { + "type": "string", + "minLength": 1, + "maxLength": 2048, + "pattern": "^[^\\u0000-\\u001f\\u007f]+$" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{1,9})?(?:Z|[+-][0-9]{2}:[0-9]{2})$" + } + } +} From 7d0bec1f5e1ee8953b55b671c71e5eafe8130029 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:01:10 +0900 Subject: [PATCH 07/74] test(integration): keep JSON schema aligned with constants --- .../shared-types/test/naruon-schema.test.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/shared-types/test/naruon-schema.test.ts diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts new file mode 100644 index 000000000..dd7b86ef2 --- /dev/null +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -0,0 +1,29 @@ +import { readFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { + NARUON_REHEARSAL_HANDOFF_KIND, + NARUON_REHEARSAL_HANDOFF_VERSION +} from "../src/naruon"; + +/** Load the checked-in public JSON Schema from the repository documentation tree. */ +function loadSchema(): Record { + const schemaUrl = new URL( + "../../../docs/integrations/naruon-rehearsal-handoff-v1.schema.json", + import.meta.url + ); + return JSON.parse(readFileSync(fileURLToPath(schemaUrl), "utf8")); +} + +describe("naruon public JSON Schema", () => { + it("is valid JSON with the same versioned identity as the runtime parser", () => { + const schema = loadSchema(); + + expect(schema.$schema).toBe("https://json-schema.org/draft/2020-12/schema"); + expect(schema.properties.artifactKind.const).toBe(NARUON_REHEARSAL_HANDOFF_KIND); + expect(schema.properties.artifactVersion.const).toBe( + NARUON_REHEARSAL_HANDOFF_VERSION + ); + expect(schema.properties.provenance.properties.evidence.maxItems).toBe(64); + expect(schema.additionalProperties).toBe(false); + }); +}); From 9c939737f5f1a40803655546d08deb8ff5cda090 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:04:28 +0900 Subject: [PATCH 08/74] test(integration): type the public schema fixture --- .../shared-types/test/naruon-schema.test.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts index dd7b86ef2..947dad74d 100644 --- a/packages/shared-types/test/naruon-schema.test.ts +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -5,13 +5,27 @@ import { NARUON_REHEARSAL_HANDOFF_VERSION } from "../src/naruon"; +type HandoffSchema = { + $schema: string; + additionalProperties: boolean; + properties: { + artifactKind: { const: string }; + artifactVersion: { const: number }; + provenance: { + properties: { + evidence: { maxItems: number }; + }; + }; + }; +}; + /** Load the checked-in public JSON Schema from the repository documentation tree. */ -function loadSchema(): Record { +function loadSchema(): HandoffSchema { const schemaUrl = new URL( "../../../docs/integrations/naruon-rehearsal-handoff-v1.schema.json", import.meta.url ); - return JSON.parse(readFileSync(fileURLToPath(schemaUrl), "utf8")); + return JSON.parse(readFileSync(fileURLToPath(schemaUrl), "utf8")) as HandoffSchema; } describe("naruon public JSON Schema", () => { From 44832d458956baac3957f10c237fe87d4bad1ac9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:06:35 +0900 Subject: [PATCH 09/74] test(integration): scope invalid-payload mutations to boundary tests --- packages/shared-types/test/naruon.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared-types/test/naruon.test.ts b/packages/shared-types/test/naruon.test.ts index 6bdbdb061..56253ad72 100644 --- a/packages/shared-types/test/naruon.test.ts +++ b/packages/shared-types/test/naruon.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any -- boundary tests deliberately construct malformed unknown payloads. */ import { MAX_NARUON_EVIDENCE_RECEIPTS, NARUON_REHEARSAL_HANDOFF_KIND, From 4ebca887a7502b7aff3b4bd595af2be64d663479 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:18:00 +0900 Subject: [PATCH 10/74] fix(integration): validate proleptic Gregorian timestamps --- packages/shared-types/src/naruon.ts | 35 ++++++++++++++++++----------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index f37304234..3bbe52238 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -127,10 +127,7 @@ function isDisplayText(value: unknown, maximumLength = MAX_DISPLAY_TEXT_LENGTH): /** Return whether an identifier is opaque rather than numeric or user-facing. */ function isOpaqueIdentifier(value: unknown): value is string { - return ( - isDisplayText(value, MAX_IDENTIFIER_LENGTH) && - !/^\d+$/u.test(value) - ); + return isDisplayText(value, MAX_IDENTIFIER_LENGTH) && !/^\d+$/u.test(value); } /** Return whether a value belongs to a readonly string enum. */ @@ -138,6 +135,15 @@ function isOneOf(values: readonly T[], value: unknown): value return typeof value === "string" && values.includes(value as T); } +/** Return the proleptic-Gregorian number of days in one month. */ +function daysInMonth(year: number, month: number): number { + if (month === 2) { + const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + return leapYear ? 29 : 28; + } + return [4, 6, 9, 11].includes(month) ? 30 : 31; +} + /** Return whether an RFC 3339 timestamp is both syntactically and calendrically valid. */ function isRfc3339(value: unknown): value is string { if (typeof value !== "string") return false; @@ -156,7 +162,7 @@ function isRfc3339(value: unknown): value is string { month < 1 || month > 12 || day < 1 || - day > new Date(Date.UTC(year, month, 0)).getUTCDate() || + day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59 || @@ -326,12 +332,15 @@ export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHand createdAt: value.createdAt as string, source: { ...source }, normGroup: { ...normGroup }, - event: event.venue === undefined ? { - title: event.title, - startsAt: event.startsAt, - endsAt: event.endsAt, - timeZone: event.timeZone - } : { ...event }, + event: + event.venue === undefined + ? { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone + } + : { ...event }, commitment: { ...commitment }, provenance: { sourceRecordId: provenance.sourceRecordId, @@ -346,9 +355,9 @@ export function createNaruonRehearsalHandoff( input: CreateNaruonRehearsalHandoffInput ): NaruonRehearsalHandoff { return parseNaruonRehearsalHandoff({ + ...input, artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, - artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION, - ...input + artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION }); } From 8363214ba975de45296359a50feb82c44a0cbb24 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:18:53 +0900 Subject: [PATCH 11/74] test(integration): cover four-digit Gregorian edge years --- .../shared-types/test/naruon-calendar.test.ts | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/shared-types/test/naruon-calendar.test.ts diff --git a/packages/shared-types/test/naruon-calendar.test.ts b/packages/shared-types/test/naruon-calendar.test.ts new file mode 100644 index 000000000..956b86a52 --- /dev/null +++ b/packages/shared-types/test/naruon-calendar.test.ts @@ -0,0 +1,62 @@ +import { + createNaruonRehearsalHandoff, + validateNaruonRehearsalHandoff, + type CreateNaruonRehearsalHandoffInput +} from "../src/naruon"; + +/** Return a valid minimal handoff input with a configurable creation timestamp. */ +function inputWithCreatedAt(createdAt: string): CreateNaruonRehearsalHandoffInput { + return { + createdAt, + source: { + application: "bandscope", + workspaceId: "workspace-calendar-edge", + bandId: "band-calendar-edge", + rehearsalId: "rehearsal-calendar-edge" + }, + normGroup: { + kind: "band", + id: "band-calendar-edge", + label: "Calendar Edge Band" + }, + event: { + title: "Gregorian boundary rehearsal", + startsAt: "2026-08-10T19:00:00+09:00", + endsAt: "2026-08-10T20:00:00+09:00", + timeZone: "Asia/Seoul" + }, + commitment: { + status: "tentative", + rsvpDirection: "attendee" + }, + provenance: { + sourceRecordId: "calendar-edge-record", + confidence: 1, + evidence: [{ field: "createdAt", value: createdAt }] + } + }; +} + +describe("naruon RFC 3339 Gregorian validation", () => { + it("accepts February 29 in year 0000 under the proleptic Gregorian calendar", () => { + expect( + createNaruonRehearsalHandoff( + inputWithCreatedAt("0000-02-29T00:00:00Z") + ).createdAt + ).toBe("0000-02-29T00:00:00Z"); + }); + + it.each([ + "0099-02-29T00:00:00Z", + "1900-02-29T00:00:00Z", + "2100-02-29T00:00:00Z" + ])("rejects February 29 in non-leap year %s", (createdAt) => { + const value = { + artifactKind: "bandscope.naruon.rehearsal-event", + artifactVersion: 1, + ...inputWithCreatedAt(createdAt) + }; + + expect(validateNaruonRehearsalHandoff(value)).toBe("createdAt is invalid"); + }); +}); From ce4781baf2b6ac9d43a88ca608dacda215878769 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:19:39 +0900 Subject: [PATCH 12/74] docs(changelog): record naruon handoff contract --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eea696893..191ac39f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added +- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with Band norm-group identity, Event and Commitment semantics, calibrated provenance, deterministic JSON serialization, and a public JSON Schema while preserving BandScope's standalone local-first operation. - Display the analyzed song tempo (BPM) as a badge in the rehearsal workspace. - 각 합주 역할(Role)별 개인 연습 진행도를 0~100% 범위로 기록 및 시각화할 수 있는 연습 진척도(`practiceProgress`) 트래커 기능 추가. UI 컨트롤(슬라이더 및 +/- 버튼)과 한/영 다국어 지원 포함. From 79fcbe55c310e00047901b7a974661e6efcace59 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:24:09 +0900 Subject: [PATCH 13/74] fix(integration): reject inherited and Unicode-numeric identities --- packages/shared-types/src/naruon.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index 3bbe52238..9fd23686d 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -84,9 +84,15 @@ export type CreateNaruonRehearsalHandoffInput = Omit< "artifactKind" | "artifactVersion" >; -/** Return whether a value is a non-array object. */ +/** Return whether a value is a plain or null-prototype non-array object. */ function isRecord(value: unknown): value is Record { - return typeof value === "object" && value !== null && !Array.isArray(value); + if (typeof value !== "object" || value === null || Array.isArray(value)) return false; + try { + const prototype = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null; + } catch { + return false; + } } /** Return whether an array has every numeric index materialized. */ @@ -127,7 +133,10 @@ function isDisplayText(value: unknown, maximumLength = MAX_DISPLAY_TEXT_LENGTH): /** Return whether an identifier is opaque rather than numeric or user-facing. */ function isOpaqueIdentifier(value: unknown): value is string { - return isDisplayText(value, MAX_IDENTIFIER_LENGTH) && !/^\d+$/u.test(value); + return ( + isDisplayText(value, MAX_IDENTIFIER_LENGTH) && + !/^\p{Decimal_Number}+$/u.test(value) + ); } /** Return whether a value belongs to a readonly string enum. */ From 791f4eac40bc3ef6db9b8a1bbb27904910e48f17 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:25:06 +0900 Subject: [PATCH 14/74] docs(integration): align schema with Unicode-opaque IDs --- docs/integrations/naruon-rehearsal-handoff-v1.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json index f1503ecc2..cedbe8b86 100644 --- a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json +++ b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json @@ -140,7 +140,7 @@ "type": "string", "minLength": 1, "maxLength": 256, - "pattern": "^(?![0-9]+$)[^\\u0000-\\u001f\\u007f]+$" + "pattern": "^(?!\\p{Nd}+$)[^\\u0000-\\u001f\\u007f]+$" }, "displayText": { "type": "string", From 05d534df51164887aa5da7987f8b5906d9a38855 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:47:47 +0900 Subject: [PATCH 15/74] test(integration): define naruon handoff hardening contract --- .../test/naruon-hardening.test.ts | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 packages/shared-types/test/naruon-hardening.test.ts diff --git a/packages/shared-types/test/naruon-hardening.test.ts b/packages/shared-types/test/naruon-hardening.test.ts new file mode 100644 index 000000000..f19621f1d --- /dev/null +++ b/packages/shared-types/test/naruon-hardening.test.ts @@ -0,0 +1,170 @@ +import { + MAX_NARUON_EVIDENCE_RECEIPTS, + MAX_NARUON_SERIALIZED_BYTES, + createNaruonRehearsalHandoff, + deserializeNaruonRehearsalHandoff, + parseNaruonRehearsalHandoff, + validateNaruonRehearsalHandoff, + type CreateNaruonRehearsalHandoffInput +} from "../src/naruon"; + +/** Return one valid handoff input for trust-boundary hardening tests. */ +function validInput(): CreateNaruonRehearsalHandoffInput { + return { + createdAt: "2026-08-03T01:23:45Z", + source: { + application: "bandscope", + workspaceId: "workspace-hardening", + bandId: "band-hardening", + rehearsalId: "rehearsal-hardening" + }, + normGroup: { kind: "band", id: "band-hardening", label: "Hardening Band" }, + event: { + title: "Hardening rehearsal", + startsAt: "2026-08-10T19:00:00+09:00", + endsAt: "2026-08-10T20:00:00+09:00", + timeZone: "Asia/Seoul" + }, + commitment: { status: "confirmed", rsvpDirection: "organizer" }, + provenance: { + sourceRecordId: "source-hardening", + confidence: 1, + evidence: [{ field: "startsAt", value: "2026-08-10T19:00:00+09:00" }] + } + }; +} + +/** Add the fixed artifact discriminator and version to a handoff input. */ +function artifact(input: CreateNaruonRehearsalHandoffInput): unknown { + return { + ...input, + artifactKind: "bandscope.naruon.rehearsal-event", + artifactVersion: 1 + }; +} + +describe("naruon handoff boundary hardening", () => { + it("rejects numeric offsets inconsistent with the required IANA time zone", () => { + const input = validInput(); + input.event.startsAt = "2026-08-10T19:00:00+00:00"; + input.event.endsAt = "2026-08-10T20:00:00+00:00"; + expect(validateNaruonRehearsalHandoff(artifact(input))).toBe( + "event.startsAt offset is inconsistent with event.timeZone" + ); + + input.event.startsAt = "2026-08-10T19:00:00+09:00"; + input.event.endsAt = "2026-08-10T20:00:00+00:00"; + expect(validateNaruonRehearsalHandoff(artifact(input))).toBe( + "event.endsAt offset is inconsistent with event.timeZone" + ); + }); + + it("accepts RFC 9557 unknown-local-offset forms with an explicit IANA zone", () => { + for (const offset of ["Z", "-00:00"]) { + const input = validInput(); + input.event.startsAt = `2026-08-10T10:00:00${offset}`; + input.event.endsAt = `2026-08-10T11:00:00${offset}`; + expect(validateNaruonRehearsalHandoff(artifact(input))).toBeNull(); + } + }); + + it("uses the zone rules at each instant, including daylight-saving changes", () => { + const input = validInput(); + input.event.timeZone = "America/New_York"; + input.event.startsAt = "2026-07-08T09:00:00-04:00"; + input.event.endsAt = "2026-07-08T10:00:00-04:00"; + expect(validateNaruonRehearsalHandoff(artifact(input))).toBeNull(); + + input.event.startsAt = "2026-07-08T09:00:00-05:00"; + input.event.endsAt = "2026-07-08T10:00:00-05:00"; + expect(validateNaruonRehearsalHandoff(artifact(input))).toBe( + "event.startsAt offset is inconsistent with event.timeZone" + ); + }); + + it("snapshots nested accessors once before validation and canonicalization", () => { + const input = validInput(); + let reads = 0; + Object.defineProperty(input.source, "bandId", { + enumerable: true, + get() { + reads += 1; + return reads === 1 ? "band-hardening" : "band-mutated"; + } + }); + + expect(createNaruonRehearsalHandoff(input).source.bandId).toBe("band-hardening"); + expect(reads).toBe(1); + }); + + it("rejects proxy-backed parser inputs that cannot be snapshotted", () => { + const value = new Proxy(artifact(validInput()) as object, {}); + expect(() => parseNaruonRehearsalHandoff(value)).toThrow( + "root is not structured-cloneable" + ); + }); + + it("rejects oversized evidence before iterating beyond the contract limit", () => { + const input = validInput(); + input.provenance.evidence = Array.from( + { length: MAX_NARUON_EVIDENCE_RECEIPTS + 1 }, + (_, index) => ({ field: `field-${index}`, value: `value-${index}` }) + ); + expect(validateNaruonRehearsalHandoff(artifact(input))).toBe( + "provenance.evidence is invalid" + ); + }); + + it("bounds untrusted serialized input before JSON parsing", () => { + expect(() => deserializeNaruonRehearsalHandoff(42)).toThrow( + "serialized payload is invalid or oversized" + ); + expect(() => + deserializeNaruonRehearsalHandoff("x".repeat(MAX_NARUON_SERIALIZED_BYTES + 1)) + ).toThrow("serialized payload is invalid or oversized"); + expect(() => deserializeNaruonRehearsalHandoff("😀".repeat(70_000))).toThrow( + "serialized payload is invalid or oversized" + ); + }); +}); + +describe("naruon handoff branch completeness", () => { + it("accepts null-prototype records and rejects hostile prototype traps", () => { + const canonical = createNaruonRehearsalHandoff(validInput()); + const nullPrototypeRoot = Object.assign(Object.create(null), canonical); + expect(validateNaruonRehearsalHandoff(nullPrototypeRoot)).toBeNull(); + + const hostile = new Proxy({}, { + getPrototypeOf() { + throw new Error("prototype unavailable"); + } + }); + expect(validateNaruonRehearsalHandoff(hostile)).toBe("root must be an object"); + }); + + it("covers non-string timestamps, display-invalid zones, and 30-day months", () => { + const nonStringTimestamp = artifact(validInput()) as Record; + nonStringTimestamp.createdAt = 42; + expect(validateNaruonRehearsalHandoff(nonStringTimestamp)).toBe( + "createdAt is invalid" + ); + + const invalidDisplayZone = artifact(validInput()) as { + event: { timeZone: unknown }; + }; + invalidDisplayZone.event.timeZone = ""; + expect(validateNaruonRehearsalHandoff(invalidDisplayZone)).toBe( + "event.timeZone is invalid" + ); + + const validApril = artifact(validInput()) as Record; + validApril.createdAt = "2026-04-30T00:00:00Z"; + expect(validateNaruonRehearsalHandoff(validApril)).toBeNull(); + + const invalidApril = artifact(validInput()) as Record; + invalidApril.createdAt = "2026-04-31T00:00:00Z"; + expect(validateNaruonRehearsalHandoff(invalidApril)).toBe( + "createdAt is invalid" + ); + }); +}); From ca7a1df1697e38aa3633495d80da9e3268a2f070 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:49:27 +0900 Subject: [PATCH 16/74] fix(integration): harden naruon handoff trust boundary --- packages/shared-types/src/naruon.ts | 125 +++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 23 deletions(-) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index 9fd23686d..50e1eecb2 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -7,6 +7,9 @@ export const NARUON_REHEARSAL_HANDOFF_VERSION = 1 as const; /** Maximum number of provenance receipts accepted in one handoff. */ export const MAX_NARUON_EVIDENCE_RECEIPTS = 64; +/** Maximum UTF-8 size accepted before untrusted JSON parsing. */ +export const MAX_NARUON_SERIALIZED_BYTES = 262_144; + const MAX_IDENTIFIER_LENGTH = 256; const MAX_DISPLAY_TEXT_LENGTH = 2_048; const MAX_TIME_ZONE_LENGTH = 128; @@ -84,6 +87,20 @@ export type CreateNaruonRehearsalHandoffInput = Omit< "artifactKind" | "artifactVersion" >; +/** Result of stabilizing one caller-owned value at the trust boundary. */ +type BoundarySnapshot = + | { ok: true; value: unknown } + | { ok: false; error: string }; + +/** Snapshot caller-owned data so validation and canonicalization see one value. */ +function snapshotBoundaryValue(value: unknown): BoundarySnapshot { + try { + return { ok: true, value: structuredClone(value) }; + } catch { + return { ok: false, error: "root is not structured-cloneable" }; + } +} + /** Return whether a value is a plain or null-prototype non-array object. */ function isRecord(value: unknown): value is Record { if (typeof value !== "object" || value === null || Array.isArray(value)) return false; @@ -95,11 +112,11 @@ function isRecord(value: unknown): value is Record { } } -/** Return whether an array has every numeric index materialized. */ -function isDenseArray(value: unknown): value is unknown[] { +/** Return whether an array is bounded and has every numeric index materialized. */ +function isDenseArray(value: unknown, maximumLength: number): value is unknown[] { if (!Array.isArray(value)) return false; const length = Number(value.length); - if (!Number.isSafeInteger(length) || length < 0) return false; + if (!Number.isSafeInteger(length) || length < 0 || length > maximumLength) return false; for (let index = 0; index < length; index += 1) { if (!(index in value)) return false; } @@ -194,6 +211,35 @@ function isTimeZone(value: unknown): value is string { } } +/** Return whether a timestamp's asserted local fields agree with its critical IANA zone. */ +function isOffsetConsistentWithTimeZone(timestamp: string, timeZone: string): boolean { + const match = RFC3339_PATTERN.exec(timestamp) as RegExpExecArray; + if (match[7] === "Z" || match[7] === "-00:00") return true; + const parts = Object.fromEntries( + new Intl.DateTimeFormat("en-US-u-ca-iso8601-nu-latn", { + timeZone, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + hourCycle: "h23" + }) + .formatToParts(new Date(timestamp)) + .filter((part) => part.type !== "literal") + .map((part) => [part.type, part.value]) + ); + return ( + String(parts.year).padStart(4, "0") === match[1] && + parts.month === match[2] && + parts.day === match[3] && + parts.hour === match[4] && + parts.minute === match[5] && + parts.second === match[6] + ); +} + /** Validate one source receipt. */ function validateEvidenceReceipt(value: unknown, path: string): string | null { if (!isRecord(value)) return `${path} must be an object`; @@ -204,14 +250,8 @@ function validateEvidenceReceipt(value: unknown, path: string): string | null { return null; } -/** - * Validate an unknown value at the BandScope → naruon trust boundary. - * - * The validator is intentionally fail-closed: unknown keys, numeric-only IDs, - * malformed timestamps, invalid IANA time zones, sparse arrays, inconsistent - * band identities, and non-finite confidence values are rejected. - */ -export function validateNaruonRehearsalHandoff(value: unknown): string | null { +/** Validate one stable boundary snapshot without rereading caller-owned values. */ +function validateSnapshot(value: unknown): string | null { if (!isRecord(value)) return "root must be an object"; const rootExtra = unexpectedKey( value, @@ -266,6 +306,12 @@ export function validateNaruonRehearsalHandoff(value: unknown): string | null { return "event.endsAt must be later than event.startsAt"; } if (!isTimeZone(value.event.timeZone)) return "event.timeZone is invalid"; + if (!isOffsetConsistentWithTimeZone(value.event.startsAt, value.event.timeZone)) { + return "event.startsAt offset is inconsistent with event.timeZone"; + } + if (!isOffsetConsistentWithTimeZone(value.event.endsAt, value.event.timeZone)) { + return "event.endsAt offset is inconsistent with event.timeZone"; + } if (value.event.venue !== undefined && !isDisplayText(value.event.venue)) { return "event.venue is invalid"; } @@ -303,9 +349,8 @@ export function validateNaruonRehearsalHandoff(value: unknown): string | null { return "provenance.confidence is invalid"; } if ( - !isDenseArray(value.provenance.evidence) || - value.provenance.evidence.length < 1 || - value.provenance.evidence.length > MAX_NARUON_EVIDENCE_RECEIPTS + !isDenseArray(value.provenance.evidence, MAX_NARUON_EVIDENCE_RECEIPTS) || + value.provenance.evidence.length < 1 ) { return "provenance.evidence is invalid"; } @@ -319,17 +364,24 @@ export function validateNaruonRehearsalHandoff(value: unknown): string | null { return null; } +/** + * Validate an unknown value at the BandScope → naruon trust boundary. + * + * The validator is intentionally side-effect-free and fail-closed. Parsing + * snapshots caller-owned values before validation so validation and + * canonicalization cannot observe different states. + */ +export function validateNaruonRehearsalHandoff(value: unknown): string | null { + return validateSnapshot(value); +} + /** Return whether a value satisfies the complete handoff contract. */ export function isNaruonRehearsalHandoff(value: unknown): value is NaruonRehearsalHandoff { return validateNaruonRehearsalHandoff(value) === null; } -/** Parse and canonicalize an unknown handoff, throwing on contract violations. */ -export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHandoff { - const error = validateNaruonRehearsalHandoff(value); - if (error || !isRecord(value)) { - throw new TypeError(`Invalid naruon rehearsal handoff: ${error ?? "root must be an object"}`); - } +/** Canonicalize one already validated, stable snapshot. */ +function canonicalizeSnapshot(value: Record): NaruonRehearsalHandoff { const source = value.source as NaruonHandoffSource; const normGroup = value.normGroup as NaruonBandNormGroup; const event = value.event as NaruonRehearsalEvent; @@ -359,6 +411,19 @@ export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHand }; } +/** Parse and canonicalize an unknown handoff, throwing on contract violations. */ +export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHandoff { + const snapshot = snapshotBoundaryValue(value); + if (!snapshot.ok) { + throw new TypeError(`Invalid naruon rehearsal handoff: ${snapshot.error}`); + } + const error = validateSnapshot(snapshot.value); + if (error) { + throw new TypeError(`Invalid naruon rehearsal handoff: ${error}`); + } + return canonicalizeSnapshot(snapshot.value as Record); +} + /** Build a canonical versioned handoff from application-owned fields. */ export function createNaruonRehearsalHandoff( input: CreateNaruonRehearsalHandoffInput @@ -375,13 +440,27 @@ export function serializeNaruonRehearsalHandoff(value: unknown): string { return `${JSON.stringify(parseNaruonRehearsalHandoff(value))}\n`; } -/** Parse JSON text and validate the resulting handoff at the same trust boundary. */ -export function deserializeNaruonRehearsalHandoff(serialized: string): NaruonRehearsalHandoff { +/** Return the UTF-8 size without allocating for inputs already above the limit. */ +function serializedByteLength(value: string): number { + if (value.length > MAX_NARUON_SERIALIZED_BYTES) return value.length; + return new TextEncoder().encode(value).byteLength; +} + +/** Parse bounded JSON text and validate the resulting handoff at the same trust boundary. */ +export function deserializeNaruonRehearsalHandoff(serialized: unknown): NaruonRehearsalHandoff { + if ( + typeof serialized !== "string" || + serializedByteLength(serialized) > MAX_NARUON_SERIALIZED_BYTES + ) { + throw new TypeError( + "Invalid naruon rehearsal handoff JSON: serialized payload is invalid or oversized" + ); + } let value: unknown; try { value = JSON.parse(serialized); } catch (error) { - const detail = error instanceof Error ? error.message : "unknown JSON error"; + const detail = String(error); throw new TypeError(`Invalid naruon rehearsal handoff JSON: ${detail}`); } return parseNaruonRehearsalHandoff(value); From 0a68eeda093655c0fb8454963ec7028e6666f52d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:51:05 +0900 Subject: [PATCH 17/74] test(integration): align UTC fixture with required time zone --- packages/shared-types/test/naruon.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/shared-types/test/naruon.test.ts b/packages/shared-types/test/naruon.test.ts index 56253ad72..839c9732a 100644 --- a/packages/shared-types/test/naruon.test.ts +++ b/packages/shared-types/test/naruon.test.ts @@ -254,6 +254,8 @@ describe("naruon rehearsal handoff contract", () => { const utc = clone(validHandoff()); utc.event.timeZone = "UTC"; + utc.event.startsAt = "2026-08-10T10:00:00Z"; + utc.event.endsAt = "2026-08-10T12:30:00Z"; expect(validateNaruonRehearsalHandoff(utc)).toBeNull(); }); From d22a2c24403c109d11f52c900f4adeb4b2d29a93 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:51:16 +0900 Subject: [PATCH 18/74] test(integration): enforce full naruon handoff coverage --- packages/shared-types/vitest.config.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/shared-types/vitest.config.ts b/packages/shared-types/vitest.config.ts index 14118113c..c4a1edf6b 100644 --- a/packages/shared-types/vitest.config.ts +++ b/packages/shared-types/vitest.config.ts @@ -10,7 +10,13 @@ export default defineConfig({ lines: 90, functions: 90, branches: 90, - statements: 90 + statements: 90, + "src/naruon.ts": { + lines: 100, + functions: 100, + branches: 100, + statements: 100 + } } } } From d8e12d388e8fa69e885b832757219630f2ae110d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:51:53 +0900 Subject: [PATCH 19/74] docs(integration): document naruon boundary guarantees --- docs/integrations/naruon.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md index 228ea2085..7141b59b3 100644 --- a/docs/integrations/naruon.md +++ b/docs/integrations/naruon.md @@ -65,7 +65,7 @@ const artifact = createNaruonRehearsalHandoff({ const json = serializeNaruonRehearsalHandoff(artifact); ``` -Consumers receiving untrusted bytes must call `deserializeNaruonRehearsalHandoff` or `parseNaruonRehearsalHandoff` before use. +Consumers receiving untrusted bytes must call `deserializeNaruonRehearsalHandoff` or `parseNaruonRehearsalHandoff` before use. Serialized handoffs are limited to 256 KiB of UTF-8 and are size-checked before JSON parsing. ## Boundary guarantees @@ -77,12 +77,16 @@ The contract fails closed on: - malformed or calendrically invalid RFC 3339 timestamps; - an end time that is not later than its start time; - time-zone identifiers rejected by the runtime's IANA/ICU database; +- numeric UTC offsets whose asserted local clock fields disagree with the required IANA time zone at that instant, including daylight-saving transitions; - a norm-group identity that differs from the exported source band identity; - unsupported commitment status or RSVP direction; - non-finite or out-of-range confidence values; -- empty, sparse, oversized, or malformed provenance receipt arrays. +- empty, sparse, oversized, or malformed provenance receipt arrays; +- JSON inputs larger than 256 KiB of UTF-8 or caller-owned values that cannot be safely snapshotted. -Parsing returns newly allocated nested objects and evidence receipts so a caller cannot mutate the parsed artifact by retaining references to its input object. +`Z` and `-00:00` are accepted with an explicit IANA zone as unknown-local-offset forms; a numeric `+/-HH:MM` offset is treated as an assertion and must agree with that zone. This follows the RFC 9557 distinction between an asserted numeric offset and time-zone information. + +Parsing snapshots caller-owned data once before validation and canonicalization. It then returns newly allocated nested objects and evidence receipts, so accessors, proxies, concurrent mutation, or retained input references cannot make validation observe different data from the canonical output. ## Trust and privacy model @@ -103,4 +107,4 @@ A connector should: - `artifactVersion`: `1` - Additive fields require a new version because version 1 rejects unknown keys. - Breaking semantic changes require a new artifact kind or major version. -- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for cross-field and IANA time-zone checks. +- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, RFC 9557 offset/time-zone consistency, and IANA time-zone checks. From 177da3695e34fbb5c8f53efab2d91f030b424dbe Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:57:54 +0900 Subject: [PATCH 20/74] test(naruon): stage trust-boundary hardening bootstrap --- .../ci/bootstrap_naruon_boundary_hardening.py | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 scripts/ci/bootstrap_naruon_boundary_hardening.py diff --git a/scripts/ci/bootstrap_naruon_boundary_hardening.py b/scripts/ci/bootstrap_naruon_boundary_hardening.py new file mode 100644 index 000000000..4d5732806 --- /dev/null +++ b/scripts/ci/bootstrap_naruon_boundary_hardening.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +"""Harden the naruon handoff trust boundary, add regression tests, then self-delete.""" + +from __future__ import annotations + +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +SOURCE = ROOT / "packages/shared-types/src/naruon.ts" +TEST = ROOT / "packages/shared-types/test/naruon-hardening.test.ts" +SELF = ROOT / "scripts/ci/bootstrap_naruon_boundary_hardening.py" +SELF_WORKFLOW = ROOT / ".github/workflows/bootstrap-naruon-boundary-hardening.yml" + + +def replace_once(text: str, old: str, new: str, label: str) -> str: + """Replace exactly one reviewed fragment and fail closed on branch drift.""" + count = text.count(old) + if count != 1: + raise RuntimeError(f"{label}: expected one match, found {count}") + return text.replace(old, new, 1) + + +def patch_source(text: str) -> str: + """Snapshot public validator inputs and redact malformed JSON details.""" + text = replace_once( + text, + """export function validateNaruonRehearsalHandoff(value: unknown): string | null { + return validateSnapshot(value); +} +""", + """export function validateNaruonRehearsalHandoff(value: unknown): string | null { + const snapshot = snapshotBoundaryValue(value); + return snapshot.ok ? validateSnapshot(snapshot.value) : snapshot.error; +} +""", + "public validator snapshot", + ) + text = replace_once( + text, + """ } catch (error) { + const detail = String(error); + throw new TypeError(`Invalid naruon rehearsal handoff JSON: ${detail}`); + } +""", + """ } catch { + throw new TypeError("Invalid naruon rehearsal handoff JSON: malformed JSON"); + } +""", + "payload-free JSON error", + ) + return text + + +def patch_test(text: str) -> str: + """Add validation snapshot and payload-redaction regression coverage.""" + accessor_block = """ it("snapshots nested accessors once before validation and canonicalization", () => { + const input = validInput(); + let reads = 0; + Object.defineProperty(input.source, "bandId", { + enumerable: true, + get() { + reads += 1; + return reads === 1 ? "band-hardening" : "band-mutated"; + } + }); + + expect(createNaruonRehearsalHandoff(input).source.bandId).toBe("band-hardening"); + expect(reads).toBe(1); + }); +""" + accessor_replacement = accessor_block + """ + it("snapshots public validation inputs before reading nested accessors", () => { + const value = artifact(validInput()) as { + source: CreateNaruonRehearsalHandoffInput["source"]; + }; + let reads = 0; + Object.defineProperty(value.source, "bandId", { + enumerable: true, + get() { + reads += 1; + return reads === 1 ? "band-hardening" : "band-mutated"; + } + }); + + expect(validateNaruonRehearsalHandoff(value)).toBeNull(); + expect(reads).toBe(1); + }); +""" + text = replace_once( + text, + accessor_block, + accessor_replacement, + "validator snapshot regression", + ) + text = replace_once( + text, + """ it("rejects proxy-backed parser inputs that cannot be snapshotted", () => { + const value = new Proxy(artifact(validInput()) as object, {}); + expect(() => parseNaruonRehearsalHandoff(value)).toThrow( + "root is not structured-cloneable" + ); + }); +""", + """ it("rejects proxy-backed boundary inputs that cannot be snapshotted", () => { + const value = new Proxy(artifact(validInput()) as object, {}); + expect(validateNaruonRehearsalHandoff(value)).toBe( + "root is not structured-cloneable" + ); + expect(() => parseNaruonRehearsalHandoff(value)).toThrow( + "root is not structured-cloneable" + ); + }); +""", + "proxy boundary regression", + ) + bounds_block = """ it("bounds untrusted serialized input before JSON parsing", () => { + expect(() => deserializeNaruonRehearsalHandoff(42)).toThrow( + "serialized payload is invalid or oversized" + ); + expect(() => + deserializeNaruonRehearsalHandoff("x".repeat(MAX_NARUON_SERIALIZED_BYTES + 1)) + ).toThrow("serialized payload is invalid or oversized"); + expect(() => deserializeNaruonRehearsalHandoff("😀".repeat(70_000))).toThrow( + "serialized payload is invalid or oversized" + ); + }); +""" + bounds_replacement = bounds_block + """ + it("does not echo untrusted JSON fragments in parser errors", () => { + const secret = "private-rehearsal-secret"; + let message = ""; + try { + deserializeNaruonRehearsalHandoff(`{"${secret}":`); + } catch (error) { + message = String(error); + } + + expect(message).toContain("malformed JSON"); + expect(message).not.toContain(secret); + }); +""" + text = replace_once( + text, + bounds_block, + bounds_replacement, + "JSON error redaction regression", + ) + text = replace_once( + text, + """ expect(validateNaruonRehearsalHandoff(hostile)).toBe("root must be an object"); +""", + """ expect(validateNaruonRehearsalHandoff(hostile)).toBe( + "root is not structured-cloneable" + ); +""", + "hostile proxy expectation", + ) + return text + + +def main() -> int: + """Patch reviewed files and remove the one-shot bootstrap artifacts.""" + SOURCE.write_text(patch_source(SOURCE.read_text(encoding="utf-8")), encoding="utf-8") + TEST.write_text(patch_test(TEST.read_text(encoding="utf-8")), encoding="utf-8") + SELF.unlink() + SELF_WORKFLOW.unlink() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From ec3d2b56b668d1579d0ad51841031237179d3851 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 12:58:13 +0900 Subject: [PATCH 21/74] ci(naruon): apply trust-boundary hardening bootstrap --- .../bootstrap-naruon-boundary-hardening.yml | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/bootstrap-naruon-boundary-hardening.yml diff --git a/.github/workflows/bootstrap-naruon-boundary-hardening.yml b/.github/workflows/bootstrap-naruon-boundary-hardening.yml new file mode 100644 index 000000000..6bae2cca6 --- /dev/null +++ b/.github/workflows/bootstrap-naruon-boundary-hardening.yml @@ -0,0 +1,62 @@ +name: Bootstrap naruon boundary hardening + +on: + push: + branches: [feat/naruon-rehearsal-handoff-v1] + paths: + - scripts/ci/bootstrap_naruon_boundary_hardening.py + - .github/workflows/bootstrap-naruon-boundary-hardening.yml + workflow_dispatch: + +concurrency: + group: bootstrap-naruon-boundary-hardening + cancel-in-progress: true + +permissions: + contents: write + +jobs: + apply: + if: >- + github.repository == 'ContextualWisdomLab/bandscope' + && github.actor != 'github-actions[bot]' + && github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + runs-on: ubuntu-latest + steps: + - name: Harden runner + uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 + with: + egress-policy: audit + + - name: Checkout exact feature branch + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: feat/naruon-rehearsal-handoff-v1 + fetch-depth: 0 + persist-credentials: true + + - name: Apply reviewed trust-boundary hardening + run: python3 scripts/ci/bootstrap_naruon_boundary_hardening.py + + - name: Verify generated hardening + run: | + set -euo pipefail + git diff --check + grep -F 'const snapshot = snapshotBoundaryValue(value);' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'Invalid naruon rehearsal handoff JSON: malformed JSON' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'does not echo untrusted JSON fragments in parser errors' packages/shared-types/test/naruon-hardening.test.ts >/dev/null + test ! -e scripts/ci/bootstrap_naruon_boundary_hardening.py + test ! -e .github/workflows/bootstrap-naruon-boundary-hardening.yml + + - name: Commit generated hardening + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + if git diff --cached --quiet; then + echo "No hardening changes to commit." + exit 0 + fi + git commit -m "fix(naruon): snapshot validators and redact JSON errors" + git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From fd4ea22bd4d13efb35e887381a4f518f4b8942ea Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 04:10:49 +0000 Subject: [PATCH 22/74] fix: apply CodeRabbit auto-fixes Fixed 2 file(s) based on 1 unresolved review comment. Co-authored-by: CodeRabbit --- packages/shared-types/src/naruon.ts | 31 +++++++++++++++++++---- packages/shared-types/test/naruon.test.ts | 27 ++++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index 50e1eecb2..6840e85bc 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -391,8 +391,17 @@ function canonicalizeSnapshot(value: Record): NaruonRehearsalHa artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION, createdAt: value.createdAt as string, - source: { ...source }, - normGroup: { ...normGroup }, + source: { + application: source.application, + workspaceId: source.workspaceId, + bandId: source.bandId, + rehearsalId: source.rehearsalId + }, + normGroup: { + kind: normGroup.kind, + id: normGroup.id, + label: normGroup.label + }, event: event.venue === undefined ? { @@ -401,12 +410,24 @@ function canonicalizeSnapshot(value: Record): NaruonRehearsalHa endsAt: event.endsAt, timeZone: event.timeZone } - : { ...event }, - commitment: { ...commitment }, + : { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone, + venue: event.venue + }, + commitment: { + status: commitment.status, + rsvpDirection: commitment.rsvpDirection + }, provenance: { sourceRecordId: provenance.sourceRecordId, confidence: provenance.confidence, - evidence: provenance.evidence.map((receipt) => ({ ...receipt })) + evidence: provenance.evidence.map((receipt) => ({ + field: receipt.field, + value: receipt.value + })) } }; } diff --git a/packages/shared-types/test/naruon.test.ts b/packages/shared-types/test/naruon.test.ts index 839c9732a..d8186535d 100644 --- a/packages/shared-types/test/naruon.test.ts +++ b/packages/shared-types/test/naruon.test.ts @@ -111,6 +111,33 @@ describe("naruon rehearsal handoff contract", () => { expect("venue" in parsed.event).toBe(false); }); + it("produces identical serialization regardless of input key insertion order", () => { + const inputA = validInput(); + const serializedA = serializeNaruonRehearsalHandoff(createNaruonRehearsalHandoff(inputA)); + + const inputB: CreateNaruonRehearsalHandoffInput = { + createdAt: inputA.createdAt, + source: Object.fromEntries(Object.entries(inputA.source).reverse()) as any, + normGroup: Object.fromEntries(Object.entries(inputA.normGroup).reverse()) as any, + event: Object.fromEntries(Object.entries(inputA.event).reverse()) as any, + commitment: Object.fromEntries(Object.entries(inputA.commitment).reverse()) as any, + provenance: { + ...Object.fromEntries( + Object.entries({ + sourceRecordId: inputA.provenance.sourceRecordId, + confidence: inputA.provenance.confidence + }).reverse() + ), + evidence: inputA.provenance.evidence.map((receipt) => + Object.fromEntries(Object.entries(receipt).reverse()) + ) + } as any + }; + const serializedB = serializeNaruonRehearsalHandoff(createNaruonRehearsalHandoff(inputB)); + + expect(serializedA).toBe(serializedB); + }); + it("serializes deterministically and validates again when deserializing", () => { const serialized = serializeNaruonRehearsalHandoff(validHandoff()); From 90486d73400a7698bb63a363772ad7235ea21998 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:12:14 +0900 Subject: [PATCH 23/74] ci(naruon): stage canonical order fix --- .../ci/bootstrap_naruon_canonical_order.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 scripts/ci/bootstrap_naruon_canonical_order.py diff --git a/scripts/ci/bootstrap_naruon_canonical_order.py b/scripts/ci/bootstrap_naruon_canonical_order.py new file mode 100644 index 000000000..04e892efb --- /dev/null +++ b/scripts/ci/bootstrap_naruon_canonical_order.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +"""Canonicalize nested naruon handoff key order, then self-delete.""" + +from __future__ import annotations + +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +SOURCE = ROOT / "packages/shared-types/src/naruon.ts" +SELF = ROOT / "scripts/ci/bootstrap_naruon_canonical_order.py" +WORKFLOW = ROOT / ".github/workflows/bootstrap-naruon-canonical-order.yml" + +OLD = ''' source: { ...source }, + normGroup: { ...normGroup }, + event: + event.venue === undefined + ? { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone + } + : { ...event }, + commitment: { ...commitment }, + provenance: { + sourceRecordId: provenance.sourceRecordId, + confidence: provenance.confidence, + evidence: provenance.evidence.map((receipt) => ({ ...receipt })) + } +''' + +NEW = ''' source: { + application: source.application, + workspaceId: source.workspaceId, + bandId: source.bandId, + rehearsalId: source.rehearsalId + }, + normGroup: { + kind: normGroup.kind, + id: normGroup.id, + label: normGroup.label + }, + event: + event.venue === undefined + ? { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone + } + : { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone, + venue: event.venue + }, + commitment: { + status: commitment.status, + rsvpDirection: commitment.rsvpDirection + }, + provenance: { + sourceRecordId: provenance.sourceRecordId, + confidence: provenance.confidence, + evidence: provenance.evidence.map((receipt) => ({ + field: receipt.field, + value: receipt.value + })) + } +''' + + +def main() -> int: + """Apply the reviewed deterministic-order fix and remove bootstrap artifacts.""" + text = SOURCE.read_text(encoding="utf-8") + count = text.count(OLD) + if count == 1: + SOURCE.write_text(text.replace(OLD, NEW, 1), encoding="utf-8") + elif NEW not in text: + raise RuntimeError(f"canonicalization fragment drifted: expected one match, found {count}") + SELF.unlink() + WORKFLOW.unlink() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From a2ffbb1d181a6454b05fb10e128e1f97cb3c1def Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:12:24 +0900 Subject: [PATCH 24/74] ci(naruon): apply canonical order bootstrap --- .../bootstrap-naruon-canonical-order.yml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/bootstrap-naruon-canonical-order.yml diff --git a/.github/workflows/bootstrap-naruon-canonical-order.yml b/.github/workflows/bootstrap-naruon-canonical-order.yml new file mode 100644 index 000000000..07ab9778a --- /dev/null +++ b/.github/workflows/bootstrap-naruon-canonical-order.yml @@ -0,0 +1,63 @@ +name: Bootstrap naruon canonical order + +on: + push: + branches: [feat/naruon-rehearsal-handoff-v1] + paths: + - scripts/ci/bootstrap_naruon_canonical_order.py + - .github/workflows/bootstrap-naruon-canonical-order.yml + workflow_dispatch: + +concurrency: + group: bootstrap-naruon-canonical-order + cancel-in-progress: true + +permissions: + contents: write + +jobs: + apply: + if: >- + github.repository == 'ContextualWisdomLab/bandscope' + && github.actor != 'github-actions[bot]' + && github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + runs-on: ubuntu-latest + steps: + - name: Harden runner + uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 + with: + egress-policy: audit + + - name: Checkout exact feature branch + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: feat/naruon-rehearsal-handoff-v1 + fetch-depth: 0 + persist-credentials: true + + - name: Apply reviewed canonicalization fix + run: python3 scripts/ci/bootstrap_naruon_canonical_order.py + + - name: Verify deterministic field construction + run: | + set -euo pipefail + git diff --check + grep -F 'workspaceId: source.workspaceId' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'rsvpDirection: commitment.rsvpDirection' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'field: receipt.field' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'produces identical serialization regardless of input key insertion order' packages/shared-types/test/naruon.test.ts >/dev/null + test ! -e scripts/ci/bootstrap_naruon_canonical_order.py + test ! -e .github/workflows/bootstrap-naruon-canonical-order.yml + + - name: Commit generated fix + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + if git diff --cached --quiet; then + echo "No canonicalization changes to commit." + exit 0 + fi + git commit -m "fix(naruon): canonicalize nested serialization order" + git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From 9d9eb3b06a7cd26a5ae2179eab9e2e1917d14a68 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:14:53 +0900 Subject: [PATCH 25/74] ci(naruon): trigger one-shot hardening on PR updates --- .../workflows/bootstrap-naruon-boundary-hardening.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/bootstrap-naruon-boundary-hardening.yml b/.github/workflows/bootstrap-naruon-boundary-hardening.yml index 6bae2cca6..fa26726cc 100644 --- a/.github/workflows/bootstrap-naruon-boundary-hardening.yml +++ b/.github/workflows/bootstrap-naruon-boundary-hardening.yml @@ -6,6 +6,12 @@ on: paths: - scripts/ci/bootstrap_naruon_boundary_hardening.py - .github/workflows/bootstrap-naruon-boundary-hardening.yml + pull_request: + branches: [develop] + types: [synchronize] + paths: + - scripts/ci/bootstrap_naruon_boundary_hardening.py + - .github/workflows/bootstrap-naruon-boundary-hardening.yml workflow_dispatch: concurrency: @@ -20,7 +26,10 @@ jobs: if: >- github.repository == 'ContextualWisdomLab/bandscope' && github.actor != 'github-actions[bot]' - && github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + && ( + github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' + ) runs-on: ubuntu-latest steps: - name: Harden runner From 10e80925f84a7d74fdd59a70e183dafb32f76897 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:22:25 +0900 Subject: [PATCH 26/74] ci(naruon): trigger canonical-order cleanup on PR updates --- .../workflows/bootstrap-naruon-canonical-order.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/bootstrap-naruon-canonical-order.yml b/.github/workflows/bootstrap-naruon-canonical-order.yml index 07ab9778a..29933cb90 100644 --- a/.github/workflows/bootstrap-naruon-canonical-order.yml +++ b/.github/workflows/bootstrap-naruon-canonical-order.yml @@ -6,6 +6,12 @@ on: paths: - scripts/ci/bootstrap_naruon_canonical_order.py - .github/workflows/bootstrap-naruon-canonical-order.yml + pull_request: + branches: [develop] + types: [synchronize] + paths: + - scripts/ci/bootstrap_naruon_canonical_order.py + - .github/workflows/bootstrap-naruon-canonical-order.yml workflow_dispatch: concurrency: @@ -20,7 +26,10 @@ jobs: if: >- github.repository == 'ContextualWisdomLab/bandscope' && github.actor != 'github-actions[bot]' - && github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + && ( + github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' + ) runs-on: ubuntu-latest steps: - name: Harden runner From c7f2f6df7f490f07d43a0ba94c15d890e0bd7fc9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:39:24 +0900 Subject: [PATCH 27/74] fix(naruon): align schema text boundaries with runtime validation --- docs/integrations/naruon-rehearsal-handoff-v1.schema.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json index cedbe8b86..93963f643 100644 --- a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json +++ b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json @@ -78,7 +78,7 @@ "type": "string", "minLength": 1, "maxLength": 128, - "pattern": "^[^\\u0000-\\u001f\\u007f]+$" + "pattern": "^(?!\\s)(?!.*\\s$)[^\\u0000-\\u001f\\u007f]+$" }, "venue": { "$ref": "#/$defs/displayText" @@ -124,7 +124,7 @@ "type": "string", "minLength": 1, "maxLength": 256, - "pattern": "^[^\\u0000-\\u001f\\u007f]+$" + "pattern": "^(?!\\s)(?!.*\\s$)[^\\u0000-\\u001f\\u007f]+$" }, "value": { "$ref": "#/$defs/displayText" @@ -140,13 +140,13 @@ "type": "string", "minLength": 1, "maxLength": 256, - "pattern": "^(?!\\p{Nd}+$)[^\\u0000-\\u001f\\u007f]+$" + "pattern": "^(?!\\p{Nd}+$)(?!\\s)(?!.*\\s$)[^\\u0000-\\u001f\\u007f]+$" }, "displayText": { "type": "string", "minLength": 1, "maxLength": 2048, - "pattern": "^[^\\u0000-\\u001f\\u007f]+$" + "pattern": "^(?!\\s)(?!.*\\s$)[^\\u0000-\\u001f\\u007f]+$" }, "timestamp": { "type": "string", From 77e41a5305415e265455ad9da97967d572b18672 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:40:02 +0900 Subject: [PATCH 28/74] test(naruon): pin schema and runtime text-boundary parity --- .../shared-types/test/naruon-schema.test.ts | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts index 947dad74d..7229d4a69 100644 --- a/packages/shared-types/test/naruon-schema.test.ts +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -5,18 +5,36 @@ import { NARUON_REHEARSAL_HANDOFF_VERSION } from "../src/naruon"; +type PatternContract = { pattern: string }; + type HandoffSchema = { $schema: string; additionalProperties: boolean; properties: { artifactKind: { const: string }; artifactVersion: { const: number }; + event: { + properties: { + timeZone: PatternContract; + }; + }; provenance: { properties: { - evidence: { maxItems: number }; + evidence: { + maxItems: number; + items: { + properties: { + field: PatternContract; + }; + }; + }; }; }; }; + $defs: { + opaqueIdentifier: PatternContract; + displayText: PatternContract; + }; }; /** Load the checked-in public JSON Schema from the repository documentation tree. */ @@ -28,6 +46,11 @@ function loadSchema(): HandoffSchema { return JSON.parse(readFileSync(fileURLToPath(schemaUrl), "utf8")) as HandoffSchema; } +/** Compile one schema pattern with the Unicode semantics used by modern validators. */ +function schemaPattern(pattern: PatternContract): RegExp { + return new RegExp(pattern.pattern, "u"); +} + describe("naruon public JSON Schema", () => { it("is valid JSON with the same versioned identity as the runtime parser", () => { const schema = loadSchema(); @@ -40,4 +63,32 @@ describe("naruon public JSON Schema", () => { expect(schema.properties.provenance.properties.evidence.maxItems).toBe(64); expect(schema.additionalProperties).toBe(false); }); + + it("matches the runtime no-padding contract for public text fields", () => { + const schema = loadSchema(); + const displayText = schemaPattern(schema.$defs.displayText); + const timeZone = schemaPattern(schema.properties.event.properties.timeZone); + const evidenceField = schemaPattern( + schema.properties.provenance.properties.evidence.items.properties.field + ); + + expect(displayText.test("Friday rehearsal")).toBe(true); + expect(displayText.test(" Friday rehearsal")).toBe(false); + expect(displayText.test("Friday rehearsal ")).toBe(false); + expect(displayText.test("\u00a0Friday rehearsal")).toBe(false); + expect(timeZone.test("Asia/Seoul")).toBe(true); + expect(timeZone.test(" Asia/Seoul")).toBe(false); + expect(evidenceField.test("event.startsAt")).toBe(true); + expect(evidenceField.test("event.startsAt ")).toBe(false); + }); + + it("keeps identifiers opaque, trimmed, and nonnumeric across Unicode digits", () => { + const opaqueIdentifier = schemaPattern(loadSchema().$defs.opaqueIdentifier); + + expect(opaqueIdentifier.test("band-2026")).toBe(true); + expect(opaqueIdentifier.test("123456")).toBe(false); + expect(opaqueIdentifier.test("١٢٣٤٥٦")).toBe(false); + expect(opaqueIdentifier.test(" band-2026")).toBe(false); + expect(opaqueIdentifier.test("band-2026 ")).toBe(false); + }); }); From 2558f49fb5893e5caa5a0ee70d5e341c4a24168c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:41:32 +0900 Subject: [PATCH 29/74] fix(naruon): bound public timestamp syntax to runtime ranges --- docs/integrations/naruon-rehearsal-handoff-v1.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json index 93963f643..8b1049a4d 100644 --- a/docs/integrations/naruon-rehearsal-handoff-v1.schema.json +++ b/docs/integrations/naruon-rehearsal-handoff-v1.schema.json @@ -151,7 +151,7 @@ "timestamp": { "type": "string", "format": "date-time", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{1,9})?(?:Z|[+-][0-9]{2}:[0-9]{2})$" + "pattern": "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]{1,9})?(?:Z|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])$" } } } From c9ae829df511ca74337816fb7b1b7d5551a5a57e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 13:42:07 +0900 Subject: [PATCH 30/74] test(naruon): cover public timestamp range contract --- packages/shared-types/test/naruon-schema.test.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts index 7229d4a69..5dc18747f 100644 --- a/packages/shared-types/test/naruon-schema.test.ts +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -34,6 +34,7 @@ type HandoffSchema = { $defs: { opaqueIdentifier: PatternContract; displayText: PatternContract; + timestamp: PatternContract; }; }; @@ -91,4 +92,17 @@ describe("naruon public JSON Schema", () => { expect(opaqueIdentifier.test(" band-2026")).toBe(false); expect(opaqueIdentifier.test("band-2026 ")).toBe(false); }); + + it("bounds timestamp components before authoritative calendar validation", () => { + const timestamp = schemaPattern(loadSchema().$defs.timestamp); + + expect(timestamp.test("2026-08-10T19:00:00+09:00")).toBe(true); + expect(timestamp.test("2026-08-10T10:00:00Z")).toBe(true); + expect(timestamp.test("2026-08-10T10:00:00-00:00")).toBe(true); + expect(timestamp.test("2026-13-10T10:00:00Z")).toBe(false); + expect(timestamp.test("2026-08-10T24:00:00Z")).toBe(false); + expect(timestamp.test("2026-08-10T10:60:00Z")).toBe(false); + expect(timestamp.test("2026-08-10T10:00:60Z")).toBe(false); + expect(timestamp.test("2026-08-10T10:00:00+24:00")).toBe(false); + }); }); From 339aae243c4581cdf78ad7431426cdcc021cd97d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 14:07:30 +0900 Subject: [PATCH 31/74] chore(naruon): stage reviewed cleanup bootstrap --- scripts/ci/bootstrap_naruon_review_nits.py | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 scripts/ci/bootstrap_naruon_review_nits.py diff --git a/scripts/ci/bootstrap_naruon_review_nits.py b/scripts/ci/bootstrap_naruon_review_nits.py new file mode 100644 index 000000000..8d94c4dd6 --- /dev/null +++ b/scripts/ci/bootstrap_naruon_review_nits.py @@ -0,0 +1,43 @@ +"""Apply the reviewed naruon contract cleanup and remove this bootstrap.""" + +from pathlib import Path + + +def replace_once(path: str, old: str, new: str) -> None: + """Replace one exact snippet and fail closed when the branch moved.""" + file_path = Path(path) + content = file_path.read_text(encoding="utf-8") + count = content.count(old) + if count != 1: + raise RuntimeError(f"expected one match in {path}, found {count}") + file_path.write_text(content.replace(old, new, 1), encoding="utf-8") + + +replace_once( + "packages/shared-types/src/naruon.ts", + " if (!Number.isSafeInteger(length) || length < 0 || length > maximumLength) return false;", + " if (!Number.isSafeInteger(length) || length > maximumLength) return false;", +) +replace_once( + "packages/shared-types/src/naruon.ts", + ' return typeof value === "string" && values.includes(value as T);', + " return values.includes(value as T);", +) +replace_once( + "packages/shared-types/test/naruon-schema.test.ts", + 'import {\n NARUON_REHEARSAL_HANDOFF_KIND,', + 'import {\n MAX_NARUON_EVIDENCE_RECEIPTS,\n NARUON_REHEARSAL_HANDOFF_KIND,', +) +replace_once( + "packages/shared-types/test/naruon-schema.test.ts", + " expect(schema.properties.provenance.properties.evidence.maxItems).toBe(64);", + " expect(schema.properties.provenance.properties.evidence.maxItems).toBe(\n MAX_NARUON_EVIDENCE_RECEIPTS\n );", +) +replace_once( + "docs/integrations/naruon.md", + "- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, RFC 9557 offset/time-zone consistency, and IANA time-zone checks.", + "- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; validators must compile schema patterns with Unicode semantics for `\\p{Nd}`, and the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, leading/trailing whitespace normalization, Unicode-aware numeric-only identifier rejection, RFC 9557 offset/time-zone consistency, and IANA time-zone checks.", +) + +Path("scripts/ci/bootstrap_naruon_review_nits.py").unlink() +Path(".github/workflows/bootstrap-naruon-review-nits.yml").unlink() From 4336d3b1575c5831fcdf1fdad1db35ee1541830d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 14:07:44 +0900 Subject: [PATCH 32/74] ci(naruon): apply reviewed cleanup --- .../bootstrap-naruon-review-nits.yml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/bootstrap-naruon-review-nits.yml diff --git a/.github/workflows/bootstrap-naruon-review-nits.yml b/.github/workflows/bootstrap-naruon-review-nits.yml new file mode 100644 index 000000000..2c0379458 --- /dev/null +++ b/.github/workflows/bootstrap-naruon-review-nits.yml @@ -0,0 +1,63 @@ +name: Bootstrap naruon review cleanup + +on: + push: + branches: [feat/naruon-rehearsal-handoff-v1] + paths: + - scripts/ci/bootstrap_naruon_review_nits.py + - .github/workflows/bootstrap-naruon-review-nits.yml + workflow_dispatch: + +concurrency: + group: bootstrap-naruon-review-cleanup + cancel-in-progress: true + +permissions: + contents: write + +jobs: + apply: + if: >- + github.repository == 'ContextualWisdomLab/bandscope' + && github.actor != 'github-actions[bot]' + && github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + runs-on: ubuntu-latest + steps: + - name: Harden runner + uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 + with: + egress-policy: audit + + - name: Checkout exact feature branch + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: feat/naruon-rehearsal-handoff-v1 + fetch-depth: 0 + persist-credentials: true + + - name: Apply reviewed cleanup + run: python3 scripts/ci/bootstrap_naruon_review_nits.py + + - name: Verify cleanup + run: | + set -euo pipefail + git diff --check + grep -F 'if (!Number.isSafeInteger(length) || length > maximumLength) return false;' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'return values.includes(value as T);' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'MAX_NARUON_EVIDENCE_RECEIPTS' packages/shared-types/test/naruon-schema.test.ts >/dev/null + grep -F 'validators must compile schema patterns with Unicode semantics' docs/integrations/naruon.md >/dev/null + test ! -e scripts/ci/bootstrap_naruon_review_nits.py + test ! -e .github/workflows/bootstrap-naruon-review-nits.yml + + - name: Commit reviewed cleanup + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + if git diff --cached --quiet; then + echo "No cleanup changes to commit." + exit 0 + fi + git commit -m "fix(naruon): address remaining review feedback" + git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From 08f0271249d5711c4e38f2b27a5e93c4569be637 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 14:33:01 +0900 Subject: [PATCH 33/74] chore(naruon): remove completed canonical-order bootstrap --- .../ci/bootstrap_naruon_canonical_order.py | 87 ------------------- 1 file changed, 87 deletions(-) delete mode 100644 scripts/ci/bootstrap_naruon_canonical_order.py diff --git a/scripts/ci/bootstrap_naruon_canonical_order.py b/scripts/ci/bootstrap_naruon_canonical_order.py deleted file mode 100644 index 04e892efb..000000000 --- a/scripts/ci/bootstrap_naruon_canonical_order.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python3 -"""Canonicalize nested naruon handoff key order, then self-delete.""" - -from __future__ import annotations - -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[2] -SOURCE = ROOT / "packages/shared-types/src/naruon.ts" -SELF = ROOT / "scripts/ci/bootstrap_naruon_canonical_order.py" -WORKFLOW = ROOT / ".github/workflows/bootstrap-naruon-canonical-order.yml" - -OLD = ''' source: { ...source }, - normGroup: { ...normGroup }, - event: - event.venue === undefined - ? { - title: event.title, - startsAt: event.startsAt, - endsAt: event.endsAt, - timeZone: event.timeZone - } - : { ...event }, - commitment: { ...commitment }, - provenance: { - sourceRecordId: provenance.sourceRecordId, - confidence: provenance.confidence, - evidence: provenance.evidence.map((receipt) => ({ ...receipt })) - } -''' - -NEW = ''' source: { - application: source.application, - workspaceId: source.workspaceId, - bandId: source.bandId, - rehearsalId: source.rehearsalId - }, - normGroup: { - kind: normGroup.kind, - id: normGroup.id, - label: normGroup.label - }, - event: - event.venue === undefined - ? { - title: event.title, - startsAt: event.startsAt, - endsAt: event.endsAt, - timeZone: event.timeZone - } - : { - title: event.title, - startsAt: event.startsAt, - endsAt: event.endsAt, - timeZone: event.timeZone, - venue: event.venue - }, - commitment: { - status: commitment.status, - rsvpDirection: commitment.rsvpDirection - }, - provenance: { - sourceRecordId: provenance.sourceRecordId, - confidence: provenance.confidence, - evidence: provenance.evidence.map((receipt) => ({ - field: receipt.field, - value: receipt.value - })) - } -''' - - -def main() -> int: - """Apply the reviewed deterministic-order fix and remove bootstrap artifacts.""" - text = SOURCE.read_text(encoding="utf-8") - count = text.count(OLD) - if count == 1: - SOURCE.write_text(text.replace(OLD, NEW, 1), encoding="utf-8") - elif NEW not in text: - raise RuntimeError(f"canonicalization fragment drifted: expected one match, found {count}") - SELF.unlink() - WORKFLOW.unlink() - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) From a3ce3c0df9bf0122002bb7d03d42e4072b3d0878 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 14:33:23 +0900 Subject: [PATCH 34/74] chore(naruon): remove completed canonical-order workflow --- .../bootstrap-naruon-canonical-order.yml | 72 ------------------- 1 file changed, 72 deletions(-) delete mode 100644 .github/workflows/bootstrap-naruon-canonical-order.yml diff --git a/.github/workflows/bootstrap-naruon-canonical-order.yml b/.github/workflows/bootstrap-naruon-canonical-order.yml deleted file mode 100644 index 29933cb90..000000000 --- a/.github/workflows/bootstrap-naruon-canonical-order.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: Bootstrap naruon canonical order - -on: - push: - branches: [feat/naruon-rehearsal-handoff-v1] - paths: - - scripts/ci/bootstrap_naruon_canonical_order.py - - .github/workflows/bootstrap-naruon-canonical-order.yml - pull_request: - branches: [develop] - types: [synchronize] - paths: - - scripts/ci/bootstrap_naruon_canonical_order.py - - .github/workflows/bootstrap-naruon-canonical-order.yml - workflow_dispatch: - -concurrency: - group: bootstrap-naruon-canonical-order - cancel-in-progress: true - -permissions: - contents: write - -jobs: - apply: - if: >- - github.repository == 'ContextualWisdomLab/bandscope' - && github.actor != 'github-actions[bot]' - && ( - github.ref_name == 'feat/naruon-rehearsal-handoff-v1' - || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' - ) - runs-on: ubuntu-latest - steps: - - name: Harden runner - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 - with: - egress-policy: audit - - - name: Checkout exact feature branch - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - ref: feat/naruon-rehearsal-handoff-v1 - fetch-depth: 0 - persist-credentials: true - - - name: Apply reviewed canonicalization fix - run: python3 scripts/ci/bootstrap_naruon_canonical_order.py - - - name: Verify deterministic field construction - run: | - set -euo pipefail - git diff --check - grep -F 'workspaceId: source.workspaceId' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'rsvpDirection: commitment.rsvpDirection' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'field: receipt.field' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'produces identical serialization regardless of input key insertion order' packages/shared-types/test/naruon.test.ts >/dev/null - test ! -e scripts/ci/bootstrap_naruon_canonical_order.py - test ! -e .github/workflows/bootstrap-naruon-canonical-order.yml - - - name: Commit generated fix - run: | - set -euo pipefail - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A - if git diff --cached --quiet; then - echo "No canonicalization changes to commit." - exit 0 - fi - git commit -m "fix(naruon): canonicalize nested serialization order" - git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From 683b8bed94de196934af9897f43d8b235372d649 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 14:35:06 +0900 Subject: [PATCH 35/74] chore(naruon): consolidate remaining bootstrap work --- .../bootstrap-naruon-boundary-hardening.yml | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 .github/workflows/bootstrap-naruon-boundary-hardening.yml diff --git a/.github/workflows/bootstrap-naruon-boundary-hardening.yml b/.github/workflows/bootstrap-naruon-boundary-hardening.yml deleted file mode 100644 index fa26726cc..000000000 --- a/.github/workflows/bootstrap-naruon-boundary-hardening.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Bootstrap naruon boundary hardening - -on: - push: - branches: [feat/naruon-rehearsal-handoff-v1] - paths: - - scripts/ci/bootstrap_naruon_boundary_hardening.py - - .github/workflows/bootstrap-naruon-boundary-hardening.yml - pull_request: - branches: [develop] - types: [synchronize] - paths: - - scripts/ci/bootstrap_naruon_boundary_hardening.py - - .github/workflows/bootstrap-naruon-boundary-hardening.yml - workflow_dispatch: - -concurrency: - group: bootstrap-naruon-boundary-hardening - cancel-in-progress: true - -permissions: - contents: write - -jobs: - apply: - if: >- - github.repository == 'ContextualWisdomLab/bandscope' - && github.actor != 'github-actions[bot]' - && ( - github.ref_name == 'feat/naruon-rehearsal-handoff-v1' - || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' - ) - runs-on: ubuntu-latest - steps: - - name: Harden runner - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 - with: - egress-policy: audit - - - name: Checkout exact feature branch - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - ref: feat/naruon-rehearsal-handoff-v1 - fetch-depth: 0 - persist-credentials: true - - - name: Apply reviewed trust-boundary hardening - run: python3 scripts/ci/bootstrap_naruon_boundary_hardening.py - - - name: Verify generated hardening - run: | - set -euo pipefail - git diff --check - grep -F 'const snapshot = snapshotBoundaryValue(value);' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'Invalid naruon rehearsal handoff JSON: malformed JSON' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'does not echo untrusted JSON fragments in parser errors' packages/shared-types/test/naruon-hardening.test.ts >/dev/null - test ! -e scripts/ci/bootstrap_naruon_boundary_hardening.py - test ! -e .github/workflows/bootstrap-naruon-boundary-hardening.yml - - - name: Commit generated hardening - run: | - set -euo pipefail - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A - if git diff --cached --quiet; then - echo "No hardening changes to commit." - exit 0 - fi - git commit -m "fix(naruon): snapshot validators and redact JSON errors" - git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From 6c0820989110759934e69955faae00639fe536d4 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 14:37:46 +0900 Subject: [PATCH 36/74] ci(naruon): consolidate final review hardening --- .../bootstrap-naruon-review-nits.yml | 62 ++++++++++++++++--- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/.github/workflows/bootstrap-naruon-review-nits.yml b/.github/workflows/bootstrap-naruon-review-nits.yml index 2c0379458..4feacbe5f 100644 --- a/.github/workflows/bootstrap-naruon-review-nits.yml +++ b/.github/workflows/bootstrap-naruon-review-nits.yml @@ -1,17 +1,30 @@ -name: Bootstrap naruon review cleanup +name: Bootstrap naruon final review cleanup on: push: branches: [feat/naruon-rehearsal-handoff-v1] paths: + - scripts/ci/bootstrap_naruon_boundary_hardening.py + - scripts/ci/bootstrap_naruon_review_nits.py + - .github/workflows/bootstrap-naruon-review-nits.yml + pull_request: + branches: [develop] + types: [synchronize] + paths: + - scripts/ci/bootstrap_naruon_boundary_hardening.py - scripts/ci/bootstrap_naruon_review_nits.py - .github/workflows/bootstrap-naruon-review-nits.yml workflow_dispatch: concurrency: - group: bootstrap-naruon-review-cleanup + group: bootstrap-naruon-final-review-cleanup cancel-in-progress: true +env: + GIT_CONFIG_COUNT: "1" + GIT_CONFIG_KEY_0: init.defaultBranch + GIT_CONFIG_VALUE_0: develop + permissions: contents: write @@ -20,8 +33,12 @@ jobs: if: >- github.repository == 'ContextualWisdomLab/bandscope' && github.actor != 'github-actions[bot]' - && github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + && ( + github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' + ) runs-on: ubuntu-latest + timeout-minutes: 20 steps: - name: Harden runner uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 @@ -35,29 +52,56 @@ jobs: fetch-depth: 0 persist-credentials: true - - name: Apply reviewed cleanup - run: python3 scripts/ci/bootstrap_naruon_review_nits.py + - name: Use repository Node.js contract + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 22.22.3 + cache: npm + + - name: Install lifecycle-disabled dependencies + run: npm ci --ignore-scripts --no-audit --no-fund + + - name: Apply trust-boundary hardening and remaining review cleanup + run: | + set -euo pipefail + # The boundary script is intentionally one-shot and removes its + # historical workflow path. Recreate an untracked placeholder so the + # consolidated finalizer can preserve that self-delete invariant. + touch .github/workflows/bootstrap-naruon-boundary-hardening.yml + python3 scripts/ci/bootstrap_naruon_boundary_hardening.py + python3 scripts/ci/bootstrap_naruon_review_nits.py - - name: Verify cleanup + - name: Verify final reviewed contract run: | set -euo pipefail git diff --check + python3 -m json.tool docs/integrations/naruon-rehearsal-handoff-v1.schema.json >/dev/null + grep -F 'const snapshot = snapshotBoundaryValue(value);' packages/shared-types/src/naruon.ts >/dev/null + grep -F 'Invalid naruon rehearsal handoff JSON: malformed JSON' packages/shared-types/src/naruon.ts >/dev/null grep -F 'if (!Number.isSafeInteger(length) || length > maximumLength) return false;' packages/shared-types/src/naruon.ts >/dev/null grep -F 'return values.includes(value as T);' packages/shared-types/src/naruon.ts >/dev/null grep -F 'MAX_NARUON_EVIDENCE_RECEIPTS' packages/shared-types/test/naruon-schema.test.ts >/dev/null grep -F 'validators must compile schema patterns with Unicode semantics' docs/integrations/naruon.md >/dev/null + npm run lint --workspace @bandscope/shared-types + npm run typecheck --workspace @bandscope/shared-types + npm test --workspace @bandscope/shared-types + test ! -e scripts/ci/bootstrap_naruon_boundary_hardening.py test ! -e scripts/ci/bootstrap_naruon_review_nits.py + test ! -e .github/workflows/bootstrap-naruon-boundary-hardening.yml test ! -e .github/workflows/bootstrap-naruon-review-nits.yml + test ! -e scripts/ci/bootstrap_naruon_canonical_order.py + test ! -e .github/workflows/bootstrap-naruon-canonical-order.yml - - name: Commit reviewed cleanup + - name: Commit verified final contract run: | set -euo pipefail git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add -A + git diff --cached --check if git diff --cached --quiet; then - echo "No cleanup changes to commit." + echo "No final review changes to commit." exit 0 fi - git commit -m "fix(naruon): address remaining review feedback" + git commit -m "fix(naruon): finalize reviewed trust boundary" git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From 8813adc9f0a859bef5baee097e372cc7f8fa79bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 06:26:15 +0000 Subject: [PATCH 37/74] fix(naruon): address remaining review feedback --- .../bootstrap-naruon-review-nits.yml | 107 ------------------ docs/integrations/naruon.md | 2 +- packages/shared-types/src/naruon.ts | 4 +- .../shared-types/test/naruon-schema.test.ts | 5 +- scripts/ci/bootstrap_naruon_review_nits.py | 43 ------- 5 files changed, 7 insertions(+), 154 deletions(-) delete mode 100644 .github/workflows/bootstrap-naruon-review-nits.yml delete mode 100644 scripts/ci/bootstrap_naruon_review_nits.py diff --git a/.github/workflows/bootstrap-naruon-review-nits.yml b/.github/workflows/bootstrap-naruon-review-nits.yml deleted file mode 100644 index 4feacbe5f..000000000 --- a/.github/workflows/bootstrap-naruon-review-nits.yml +++ /dev/null @@ -1,107 +0,0 @@ -name: Bootstrap naruon final review cleanup - -on: - push: - branches: [feat/naruon-rehearsal-handoff-v1] - paths: - - scripts/ci/bootstrap_naruon_boundary_hardening.py - - scripts/ci/bootstrap_naruon_review_nits.py - - .github/workflows/bootstrap-naruon-review-nits.yml - pull_request: - branches: [develop] - types: [synchronize] - paths: - - scripts/ci/bootstrap_naruon_boundary_hardening.py - - scripts/ci/bootstrap_naruon_review_nits.py - - .github/workflows/bootstrap-naruon-review-nits.yml - workflow_dispatch: - -concurrency: - group: bootstrap-naruon-final-review-cleanup - cancel-in-progress: true - -env: - GIT_CONFIG_COUNT: "1" - GIT_CONFIG_KEY_0: init.defaultBranch - GIT_CONFIG_VALUE_0: develop - -permissions: - contents: write - -jobs: - apply: - if: >- - github.repository == 'ContextualWisdomLab/bandscope' - && github.actor != 'github-actions[bot]' - && ( - github.ref_name == 'feat/naruon-rehearsal-handoff-v1' - || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' - ) - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - - name: Harden runner - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 - with: - egress-policy: audit - - - name: Checkout exact feature branch - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - ref: feat/naruon-rehearsal-handoff-v1 - fetch-depth: 0 - persist-credentials: true - - - name: Use repository Node.js contract - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: 22.22.3 - cache: npm - - - name: Install lifecycle-disabled dependencies - run: npm ci --ignore-scripts --no-audit --no-fund - - - name: Apply trust-boundary hardening and remaining review cleanup - run: | - set -euo pipefail - # The boundary script is intentionally one-shot and removes its - # historical workflow path. Recreate an untracked placeholder so the - # consolidated finalizer can preserve that self-delete invariant. - touch .github/workflows/bootstrap-naruon-boundary-hardening.yml - python3 scripts/ci/bootstrap_naruon_boundary_hardening.py - python3 scripts/ci/bootstrap_naruon_review_nits.py - - - name: Verify final reviewed contract - run: | - set -euo pipefail - git diff --check - python3 -m json.tool docs/integrations/naruon-rehearsal-handoff-v1.schema.json >/dev/null - grep -F 'const snapshot = snapshotBoundaryValue(value);' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'Invalid naruon rehearsal handoff JSON: malformed JSON' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'if (!Number.isSafeInteger(length) || length > maximumLength) return false;' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'return values.includes(value as T);' packages/shared-types/src/naruon.ts >/dev/null - grep -F 'MAX_NARUON_EVIDENCE_RECEIPTS' packages/shared-types/test/naruon-schema.test.ts >/dev/null - grep -F 'validators must compile schema patterns with Unicode semantics' docs/integrations/naruon.md >/dev/null - npm run lint --workspace @bandscope/shared-types - npm run typecheck --workspace @bandscope/shared-types - npm test --workspace @bandscope/shared-types - test ! -e scripts/ci/bootstrap_naruon_boundary_hardening.py - test ! -e scripts/ci/bootstrap_naruon_review_nits.py - test ! -e .github/workflows/bootstrap-naruon-boundary-hardening.yml - test ! -e .github/workflows/bootstrap-naruon-review-nits.yml - test ! -e scripts/ci/bootstrap_naruon_canonical_order.py - test ! -e .github/workflows/bootstrap-naruon-canonical-order.yml - - - name: Commit verified final contract - run: | - set -euo pipefail - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A - git diff --cached --check - if git diff --cached --quiet; then - echo "No final review changes to commit." - exit 0 - fi - git commit -m "fix(naruon): finalize reviewed trust boundary" - git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md index 7141b59b3..e0ff73b26 100644 --- a/docs/integrations/naruon.md +++ b/docs/integrations/naruon.md @@ -107,4 +107,4 @@ A connector should: - `artifactVersion`: `1` - Additive fields require a new version because version 1 rejects unknown keys. - Breaking semantic changes require a new artifact kind or major version. -- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, RFC 9557 offset/time-zone consistency, and IANA time-zone checks. +- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; validators must compile schema patterns with Unicode semantics for `\p{Nd}`, and the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, leading/trailing whitespace normalization, Unicode-aware numeric-only identifier rejection, RFC 9557 offset/time-zone consistency, and IANA time-zone checks. diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index 6840e85bc..2b05d9141 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -116,7 +116,7 @@ function isRecord(value: unknown): value is Record { function isDenseArray(value: unknown, maximumLength: number): value is unknown[] { if (!Array.isArray(value)) return false; const length = Number(value.length); - if (!Number.isSafeInteger(length) || length < 0 || length > maximumLength) return false; + if (!Number.isSafeInteger(length) || length > maximumLength) return false; for (let index = 0; index < length; index += 1) { if (!(index in value)) return false; } @@ -158,7 +158,7 @@ function isOpaqueIdentifier(value: unknown): value is string { /** Return whether a value belongs to a readonly string enum. */ function isOneOf(values: readonly T[], value: unknown): value is T { - return typeof value === "string" && values.includes(value as T); + return values.includes(value as T); } /** Return the proleptic-Gregorian number of days in one month. */ diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts index 5dc18747f..14b9c99d8 100644 --- a/packages/shared-types/test/naruon-schema.test.ts +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -1,6 +1,7 @@ import { readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; import { + MAX_NARUON_EVIDENCE_RECEIPTS, NARUON_REHEARSAL_HANDOFF_KIND, NARUON_REHEARSAL_HANDOFF_VERSION } from "../src/naruon"; @@ -61,7 +62,9 @@ describe("naruon public JSON Schema", () => { expect(schema.properties.artifactVersion.const).toBe( NARUON_REHEARSAL_HANDOFF_VERSION ); - expect(schema.properties.provenance.properties.evidence.maxItems).toBe(64); + expect(schema.properties.provenance.properties.evidence.maxItems).toBe( + MAX_NARUON_EVIDENCE_RECEIPTS + ); expect(schema.additionalProperties).toBe(false); }); diff --git a/scripts/ci/bootstrap_naruon_review_nits.py b/scripts/ci/bootstrap_naruon_review_nits.py deleted file mode 100644 index 8d94c4dd6..000000000 --- a/scripts/ci/bootstrap_naruon_review_nits.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Apply the reviewed naruon contract cleanup and remove this bootstrap.""" - -from pathlib import Path - - -def replace_once(path: str, old: str, new: str) -> None: - """Replace one exact snippet and fail closed when the branch moved.""" - file_path = Path(path) - content = file_path.read_text(encoding="utf-8") - count = content.count(old) - if count != 1: - raise RuntimeError(f"expected one match in {path}, found {count}") - file_path.write_text(content.replace(old, new, 1), encoding="utf-8") - - -replace_once( - "packages/shared-types/src/naruon.ts", - " if (!Number.isSafeInteger(length) || length < 0 || length > maximumLength) return false;", - " if (!Number.isSafeInteger(length) || length > maximumLength) return false;", -) -replace_once( - "packages/shared-types/src/naruon.ts", - ' return typeof value === "string" && values.includes(value as T);', - " return values.includes(value as T);", -) -replace_once( - "packages/shared-types/test/naruon-schema.test.ts", - 'import {\n NARUON_REHEARSAL_HANDOFF_KIND,', - 'import {\n MAX_NARUON_EVIDENCE_RECEIPTS,\n NARUON_REHEARSAL_HANDOFF_KIND,', -) -replace_once( - "packages/shared-types/test/naruon-schema.test.ts", - " expect(schema.properties.provenance.properties.evidence.maxItems).toBe(64);", - " expect(schema.properties.provenance.properties.evidence.maxItems).toBe(\n MAX_NARUON_EVIDENCE_RECEIPTS\n );", -) -replace_once( - "docs/integrations/naruon.md", - "- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, RFC 9557 offset/time-zone consistency, and IANA time-zone checks.", - "- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; validators must compile schema patterns with Unicode semantics for `\\p{Nd}`, and the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, leading/trailing whitespace normalization, Unicode-aware numeric-only identifier rejection, RFC 9557 offset/time-zone consistency, and IANA time-zone checks.", -) - -Path("scripts/ci/bootstrap_naruon_review_nits.py").unlink() -Path(".github/workflows/bootstrap-naruon-review-nits.yml").unlink() From a4467a08a65285158b90c0572fc91638d8b85d1c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:00:44 +0900 Subject: [PATCH 38/74] fix(shared-types): harden naruon trust-boundary regressions --- .../test/naruon-hardening.test.ts | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/shared-types/test/naruon-hardening.test.ts b/packages/shared-types/test/naruon-hardening.test.ts index f19621f1d..113c806fc 100644 --- a/packages/shared-types/test/naruon-hardening.test.ts +++ b/packages/shared-types/test/naruon-hardening.test.ts @@ -97,8 +97,28 @@ describe("naruon handoff boundary hardening", () => { expect(reads).toBe(1); }); - it("rejects proxy-backed parser inputs that cannot be snapshotted", () => { + it("snapshots public validation inputs before reading nested accessors", () => { + const value = artifact(validInput()) as { + source: CreateNaruonRehearsalHandoffInput["source"]; + }; + let reads = 0; + Object.defineProperty(value.source, "bandId", { + enumerable: true, + get() { + reads += 1; + return reads === 1 ? "band-hardening" : "band-mutated"; + } + }); + + expect(validateNaruonRehearsalHandoff(value)).toBeNull(); + expect(reads).toBe(1); + }); + + it("rejects proxy-backed boundary inputs that cannot be snapshotted", () => { const value = new Proxy(artifact(validInput()) as object, {}); + expect(validateNaruonRehearsalHandoff(value)).toBe( + "root is not structured-cloneable" + ); expect(() => parseNaruonRehearsalHandoff(value)).toThrow( "root is not structured-cloneable" ); @@ -126,6 +146,19 @@ describe("naruon handoff boundary hardening", () => { "serialized payload is invalid or oversized" ); }); + + it("does not echo untrusted JSON fragments in parser errors", () => { + const secret = "private-rehearsal-secret"; + let message = ""; + try { + deserializeNaruonRehearsalHandoff(`{"${secret}":`); + } catch (error) { + message = String(error); + } + + expect(message).toContain("malformed JSON"); + expect(message).not.toContain(secret); + }); }); describe("naruon handoff branch completeness", () => { @@ -139,7 +172,9 @@ describe("naruon handoff branch completeness", () => { throw new Error("prototype unavailable"); } }); - expect(validateNaruonRehearsalHandoff(hostile)).toBe("root must be an object"); + expect(validateNaruonRehearsalHandoff(hostile)).toBe( + "root is not structured-cloneable" + ); }); it("covers non-string timestamps, display-invalid zones, and 30-day months", () => { From 3935dcdbbfcf0da2952fea1f9de44822cc64e30f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:01:28 +0900 Subject: [PATCH 39/74] chore(ci): prepare one-shot naruon hardening application --- .../ci/bootstrap_naruon_boundary_hardening.py | 119 +----------------- 1 file changed, 5 insertions(+), 114 deletions(-) diff --git a/scripts/ci/bootstrap_naruon_boundary_hardening.py b/scripts/ci/bootstrap_naruon_boundary_hardening.py index 4d5732806..eff640a35 100644 --- a/scripts/ci/bootstrap_naruon_boundary_hardening.py +++ b/scripts/ci/bootstrap_naruon_boundary_hardening.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Harden the naruon handoff trust boundary, add regression tests, then self-delete.""" +"""Apply reviewed naruon trust-boundary hardening, then remove bootstrap artifacts.""" from __future__ import annotations @@ -7,7 +7,6 @@ ROOT = Path(__file__).resolve().parents[2] SOURCE = ROOT / "packages/shared-types/src/naruon.ts" -TEST = ROOT / "packages/shared-types/test/naruon-hardening.test.ts" SELF = ROOT / "scripts/ci/bootstrap_naruon_boundary_hardening.py" SELF_WORKFLOW = ROOT / ".github/workflows/bootstrap-naruon-boundary-hardening.yml" @@ -35,7 +34,7 @@ def patch_source(text: str) -> str: """, "public validator snapshot", ) - text = replace_once( + return replace_once( text, """ } catch (error) { const detail = String(error); @@ -48,120 +47,12 @@ def patch_source(text: str) -> str: """, "payload-free JSON error", ) - return text - - -def patch_test(text: str) -> str: - """Add validation snapshot and payload-redaction regression coverage.""" - accessor_block = """ it("snapshots nested accessors once before validation and canonicalization", () => { - const input = validInput(); - let reads = 0; - Object.defineProperty(input.source, "bandId", { - enumerable: true, - get() { - reads += 1; - return reads === 1 ? "band-hardening" : "band-mutated"; - } - }); - - expect(createNaruonRehearsalHandoff(input).source.bandId).toBe("band-hardening"); - expect(reads).toBe(1); - }); -""" - accessor_replacement = accessor_block + """ - it("snapshots public validation inputs before reading nested accessors", () => { - const value = artifact(validInput()) as { - source: CreateNaruonRehearsalHandoffInput["source"]; - }; - let reads = 0; - Object.defineProperty(value.source, "bandId", { - enumerable: true, - get() { - reads += 1; - return reads === 1 ? "band-hardening" : "band-mutated"; - } - }); - - expect(validateNaruonRehearsalHandoff(value)).toBeNull(); - expect(reads).toBe(1); - }); -""" - text = replace_once( - text, - accessor_block, - accessor_replacement, - "validator snapshot regression", - ) - text = replace_once( - text, - """ it("rejects proxy-backed parser inputs that cannot be snapshotted", () => { - const value = new Proxy(artifact(validInput()) as object, {}); - expect(() => parseNaruonRehearsalHandoff(value)).toThrow( - "root is not structured-cloneable" - ); - }); -""", - """ it("rejects proxy-backed boundary inputs that cannot be snapshotted", () => { - const value = new Proxy(artifact(validInput()) as object, {}); - expect(validateNaruonRehearsalHandoff(value)).toBe( - "root is not structured-cloneable" - ); - expect(() => parseNaruonRehearsalHandoff(value)).toThrow( - "root is not structured-cloneable" - ); - }); -""", - "proxy boundary regression", - ) - bounds_block = """ it("bounds untrusted serialized input before JSON parsing", () => { - expect(() => deserializeNaruonRehearsalHandoff(42)).toThrow( - "serialized payload is invalid or oversized" - ); - expect(() => - deserializeNaruonRehearsalHandoff("x".repeat(MAX_NARUON_SERIALIZED_BYTES + 1)) - ).toThrow("serialized payload is invalid or oversized"); - expect(() => deserializeNaruonRehearsalHandoff("😀".repeat(70_000))).toThrow( - "serialized payload is invalid or oversized" - ); - }); -""" - bounds_replacement = bounds_block + """ - it("does not echo untrusted JSON fragments in parser errors", () => { - const secret = "private-rehearsal-secret"; - let message = ""; - try { - deserializeNaruonRehearsalHandoff(`{"${secret}":`); - } catch (error) { - message = String(error); - } - - expect(message).toContain("malformed JSON"); - expect(message).not.toContain(secret); - }); -""" - text = replace_once( - text, - bounds_block, - bounds_replacement, - "JSON error redaction regression", - ) - text = replace_once( - text, - """ expect(validateNaruonRehearsalHandoff(hostile)).toBe("root must be an object"); -""", - """ expect(validateNaruonRehearsalHandoff(hostile)).toBe( - "root is not structured-cloneable" - ); -""", - "hostile proxy expectation", - ) - return text def main() -> int: - """Patch reviewed files and remove the one-shot bootstrap artifacts.""" - SOURCE.write_text(patch_source(SOURCE.read_text(encoding="utf-8")), encoding="utf-8") - TEST.write_text(patch_test(TEST.read_text(encoding="utf-8")), encoding="utf-8") + """Apply the reviewed source patch and delete one-shot bootstrap artifacts.""" + patched_source = patch_source(SOURCE.read_text(encoding="utf-8")) + SOURCE.write_text(patched_source, encoding="utf-8") SELF.unlink() SELF_WORKFLOW.unlink() return 0 From 6ab0d4b983887240562a64d5e53b3eab2b922a2f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:01:37 +0900 Subject: [PATCH 40/74] chore(ci): apply naruon hardening directly --- .../bootstrap-naruon-boundary-hardening.yml | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/bootstrap-naruon-boundary-hardening.yml diff --git a/.github/workflows/bootstrap-naruon-boundary-hardening.yml b/.github/workflows/bootstrap-naruon-boundary-hardening.yml new file mode 100644 index 000000000..15121b20c --- /dev/null +++ b/.github/workflows/bootstrap-naruon-boundary-hardening.yml @@ -0,0 +1,33 @@ +name: Bootstrap naruon boundary hardening + +on: + push: + branches: + - feat/naruon-rehearsal-handoff-v1 + paths: + - .github/workflows/bootstrap-naruon-boundary-hardening.yml + - scripts/ci/bootstrap_naruon_boundary_hardening.py + +permissions: + contents: write + +jobs: + apply: + runs-on: ubuntu-latest + steps: + - name: Check out pull request branch + uses: actions/checkout@v4 + with: + ref: feat/naruon-rehearsal-handoff-v1 + fetch-depth: 0 + + - name: Apply reviewed hardening + run: python3 scripts/ci/bootstrap_naruon_boundary_hardening.py + + - name: Commit direct source changes + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add packages/shared-types/src/naruon.ts packages/shared-types/test/naruon-hardening.test.ts scripts/ci/bootstrap_naruon_boundary_hardening.py .github/workflows/bootstrap-naruon-boundary-hardening.yml + git commit -m "fix(shared-types): apply naruon boundary hardening" + git push origin HEAD:feat/naruon-rehearsal-handoff-v1 From 52d176615cb20f258d1f81749cd0e1fa0c60f94d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:02:01 +0900 Subject: [PATCH 41/74] test(shared-types): pin nested naruon schema boundaries --- .../shared-types/test/naruon-schema.test.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts index 14b9c99d8..1f458a1d0 100644 --- a/packages/shared-types/test/naruon-schema.test.ts +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -15,15 +15,19 @@ type HandoffSchema = { artifactKind: { const: string }; artifactVersion: { const: number }; event: { + additionalProperties: boolean; properties: { timeZone: PatternContract; }; }; provenance: { + additionalProperties: boolean; properties: { evidence: { + additionalProperties: boolean; maxItems: number; items: { + additionalProperties: boolean; properties: { field: PatternContract; }; @@ -56,16 +60,19 @@ function schemaPattern(pattern: PatternContract): RegExp { describe("naruon public JSON Schema", () => { it("is valid JSON with the same versioned identity as the runtime parser", () => { const schema = loadSchema(); + const evidence = schema.properties.provenance.properties.evidence; expect(schema.$schema).toBe("https://json-schema.org/draft/2020-12/schema"); expect(schema.properties.artifactKind.const).toBe(NARUON_REHEARSAL_HANDOFF_KIND); expect(schema.properties.artifactVersion.const).toBe( NARUON_REHEARSAL_HANDOFF_VERSION ); - expect(schema.properties.provenance.properties.evidence.maxItems).toBe( - MAX_NARUON_EVIDENCE_RECEIPTS - ); + expect(evidence.maxItems).toBe(MAX_NARUON_EVIDENCE_RECEIPTS); expect(schema.additionalProperties).toBe(false); + expect(schema.properties.event.additionalProperties).toBe(false); + expect(schema.properties.provenance.additionalProperties).toBe(false); + expect(evidence.additionalProperties).toBe(false); + expect(evidence.items.additionalProperties).toBe(false); }); it("matches the runtime no-padding contract for public text fields", () => { @@ -84,6 +91,12 @@ describe("naruon public JSON Schema", () => { expect(timeZone.test(" Asia/Seoul")).toBe(false); expect(evidenceField.test("event.startsAt")).toBe(true); expect(evidenceField.test("event.startsAt ")).toBe(false); + + for (const controlCharacter of ["\u0000", "\t", "\r", "\n"]) { + expect(displayText.test(`Friday${controlCharacter}rehearsal`)).toBe(false); + expect(timeZone.test(`Asia${controlCharacter}Seoul`)).toBe(false); + expect(evidenceField.test(`event${controlCharacter}startsAt`)).toBe(false); + } }); it("keeps identifiers opaque, trimmed, and nonnumeric across Unicode digits", () => { From eb9542c57dd2dfeed1cda528c655ca9e303e7e77 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:03:53 +0900 Subject: [PATCH 42/74] fix(shared-types): harden naruon validation boundary --- packages/shared-types/src/naruon.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index 2b05d9141..ad41cfd12 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -372,7 +372,8 @@ function validateSnapshot(value: unknown): string | null { * canonicalization cannot observe different states. */ export function validateNaruonRehearsalHandoff(value: unknown): string | null { - return validateSnapshot(value); + const snapshot = snapshotBoundaryValue(value); + return snapshot.ok ? validateSnapshot(snapshot.value) : snapshot.error; } /** Return whether a value satisfies the complete handoff contract. */ @@ -480,9 +481,8 @@ export function deserializeNaruonRehearsalHandoff(serialized: unknown): NaruonRe let value: unknown; try { value = JSON.parse(serialized); - } catch (error) { - const detail = String(error); - throw new TypeError(`Invalid naruon rehearsal handoff JSON: ${detail}`); + } catch { + throw new TypeError("Invalid naruon rehearsal handoff JSON: malformed JSON"); } return parseNaruonRehearsalHandoff(value); } From 1f005c5520ece1feb4aa6cdb88be7cb1d7b90e7a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:04:00 +0900 Subject: [PATCH 43/74] chore(ci): remove one-shot naruon hardening bootstrap --- .../ci/bootstrap_naruon_boundary_hardening.py | 62 ------------------- 1 file changed, 62 deletions(-) delete mode 100644 scripts/ci/bootstrap_naruon_boundary_hardening.py diff --git a/scripts/ci/bootstrap_naruon_boundary_hardening.py b/scripts/ci/bootstrap_naruon_boundary_hardening.py deleted file mode 100644 index eff640a35..000000000 --- a/scripts/ci/bootstrap_naruon_boundary_hardening.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -"""Apply reviewed naruon trust-boundary hardening, then remove bootstrap artifacts.""" - -from __future__ import annotations - -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[2] -SOURCE = ROOT / "packages/shared-types/src/naruon.ts" -SELF = ROOT / "scripts/ci/bootstrap_naruon_boundary_hardening.py" -SELF_WORKFLOW = ROOT / ".github/workflows/bootstrap-naruon-boundary-hardening.yml" - - -def replace_once(text: str, old: str, new: str, label: str) -> str: - """Replace exactly one reviewed fragment and fail closed on branch drift.""" - count = text.count(old) - if count != 1: - raise RuntimeError(f"{label}: expected one match, found {count}") - return text.replace(old, new, 1) - - -def patch_source(text: str) -> str: - """Snapshot public validator inputs and redact malformed JSON details.""" - text = replace_once( - text, - """export function validateNaruonRehearsalHandoff(value: unknown): string | null { - return validateSnapshot(value); -} -""", - """export function validateNaruonRehearsalHandoff(value: unknown): string | null { - const snapshot = snapshotBoundaryValue(value); - return snapshot.ok ? validateSnapshot(snapshot.value) : snapshot.error; -} -""", - "public validator snapshot", - ) - return replace_once( - text, - """ } catch (error) { - const detail = String(error); - throw new TypeError(`Invalid naruon rehearsal handoff JSON: ${detail}`); - } -""", - """ } catch { - throw new TypeError("Invalid naruon rehearsal handoff JSON: malformed JSON"); - } -""", - "payload-free JSON error", - ) - - -def main() -> int: - """Apply the reviewed source patch and delete one-shot bootstrap artifacts.""" - patched_source = patch_source(SOURCE.read_text(encoding="utf-8")) - SOURCE.write_text(patched_source, encoding="utf-8") - SELF.unlink() - SELF_WORKFLOW.unlink() - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) From 10c8a5fe2ff6f89732d4dd75237d910aa48e30af Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:04:05 +0900 Subject: [PATCH 44/74] chore(ci): remove temporary naruon hardening workflow --- .../bootstrap-naruon-boundary-hardening.yml | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 .github/workflows/bootstrap-naruon-boundary-hardening.yml diff --git a/.github/workflows/bootstrap-naruon-boundary-hardening.yml b/.github/workflows/bootstrap-naruon-boundary-hardening.yml deleted file mode 100644 index 15121b20c..000000000 --- a/.github/workflows/bootstrap-naruon-boundary-hardening.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Bootstrap naruon boundary hardening - -on: - push: - branches: - - feat/naruon-rehearsal-handoff-v1 - paths: - - .github/workflows/bootstrap-naruon-boundary-hardening.yml - - scripts/ci/bootstrap_naruon_boundary_hardening.py - -permissions: - contents: write - -jobs: - apply: - runs-on: ubuntu-latest - steps: - - name: Check out pull request branch - uses: actions/checkout@v4 - with: - ref: feat/naruon-rehearsal-handoff-v1 - fetch-depth: 0 - - - name: Apply reviewed hardening - run: python3 scripts/ci/bootstrap_naruon_boundary_hardening.py - - - name: Commit direct source changes - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add packages/shared-types/src/naruon.ts packages/shared-types/test/naruon-hardening.test.ts scripts/ci/bootstrap_naruon_boundary_hardening.py .github/workflows/bootstrap-naruon-boundary-hardening.yml - git commit -m "fix(shared-types): apply naruon boundary hardening" - git push origin HEAD:feat/naruon-rehearsal-handoff-v1 From 2f9bfe060f1beb4f21e2234fbeb8c6cb9b52b077 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 16:06:29 +0900 Subject: [PATCH 45/74] test(shared-types): verify all nested object schema boundaries --- .../shared-types/test/naruon-schema.test.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/shared-types/test/naruon-schema.test.ts b/packages/shared-types/test/naruon-schema.test.ts index 1f458a1d0..8907db35c 100644 --- a/packages/shared-types/test/naruon-schema.test.ts +++ b/packages/shared-types/test/naruon-schema.test.ts @@ -7,6 +7,7 @@ import { } from "../src/naruon"; type PatternContract = { pattern: string }; +type ObjectContract = { additionalProperties: boolean }; type HandoffSchema = { $schema: string; @@ -14,20 +15,19 @@ type HandoffSchema = { properties: { artifactKind: { const: string }; artifactVersion: { const: number }; - event: { - additionalProperties: boolean; + source: ObjectContract; + normGroup: ObjectContract; + event: ObjectContract & { properties: { timeZone: PatternContract; }; }; - provenance: { - additionalProperties: boolean; + commitment: ObjectContract; + provenance: ObjectContract & { properties: { evidence: { - additionalProperties: boolean; maxItems: number; - items: { - additionalProperties: boolean; + items: ObjectContract & { properties: { field: PatternContract; }; @@ -69,9 +69,11 @@ describe("naruon public JSON Schema", () => { ); expect(evidence.maxItems).toBe(MAX_NARUON_EVIDENCE_RECEIPTS); expect(schema.additionalProperties).toBe(false); + expect(schema.properties.source.additionalProperties).toBe(false); + expect(schema.properties.normGroup.additionalProperties).toBe(false); expect(schema.properties.event.additionalProperties).toBe(false); + expect(schema.properties.commitment.additionalProperties).toBe(false); expect(schema.properties.provenance.additionalProperties).toBe(false); - expect(evidence.additionalProperties).toBe(false); expect(evidence.items.additionalProperties).toBe(false); }); From 0c4154ce4f3c3730e54ee0c4fbeddcd470a8ba30 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 17:13:20 +0900 Subject: [PATCH 46/74] ci: stage naruon lint correction --- scripts/ci/fix_naruon_lint.py | 63 +++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 scripts/ci/fix_naruon_lint.py diff --git a/scripts/ci/fix_naruon_lint.py b/scripts/ci/fix_naruon_lint.py new file mode 100644 index 000000000..e02930de4 --- /dev/null +++ b/scripts/ci/fix_naruon_lint.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +"""Apply reviewed naruon lint fixes, then remove one-shot artifacts.""" + +from __future__ import annotations + +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +SOURCE = ROOT / "packages/shared-types/src/naruon.ts" +SELF = ROOT / "scripts/ci/fix_naruon_lint.py" +WORKFLOW = ROOT / ".github/workflows/fix-naruon-lint.yml" + + +def replace_once(text: str, old: str, new: str, label: str) -> str: + """Replace exactly one reviewed fragment and fail on branch drift.""" + count = text.count(old) + if count != 1: + raise RuntimeError(f"{label}: expected 1 match, found {count}") + return text.replace(old, new) + + +def main() -> int: + """Normalize exported JSDoc and document the intentional control regex.""" + source = SOURCE.read_text(encoding="utf-8") + replacements = ( + ( + "/** Stable artifact kind emitted by BandScope for naruon ingestion. */", + "/**\n * Stable artifact kind emitted by BandScope for naruon ingestion.\n */", + "artifact kind JSDoc", + ), + ( + "/** Current additive schema version for the naruon rehearsal handoff. */", + "/**\n * Current additive schema version for the naruon rehearsal handoff.\n */", + "artifact version JSDoc", + ), + ( + "/** Maximum number of provenance receipts accepted in one handoff. */", + "/**\n * Maximum number of provenance receipts accepted in one handoff.\n */", + "receipt limit JSDoc", + ), + ( + "/** Maximum UTF-8 size accepted before untrusted JSON parsing. */", + "/**\n * Maximum UTF-8 size accepted before untrusted JSON parsing.\n */", + "serialized size JSDoc", + ), + ( + " !/[\\u0000-\\u001f\\u007f]/u.test(value)", + " // The public boundary deliberately rejects C0 and DEL controls.\n" + " // eslint-disable-next-line no-control-regex\n" + " !/[\\u0000-\\u001f\\u007f]/u.test(value)", + "control character validation", + ), + ) + for old, new, label in replacements: + source = replace_once(source, old, new, label) + SOURCE.write_text(source, encoding="utf-8") + SELF.unlink() + WORKFLOW.unlink() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 1751dfcd316490586e5a68d80c392f2a316bae39 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 17:13:35 +0900 Subject: [PATCH 47/74] ci: apply naruon lint correction --- .github/workflows/fix-naruon-lint.yml | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/fix-naruon-lint.yml diff --git a/.github/workflows/fix-naruon-lint.yml b/.github/workflows/fix-naruon-lint.yml new file mode 100644 index 000000000..27b6cebb5 --- /dev/null +++ b/.github/workflows/fix-naruon-lint.yml @@ -0,0 +1,54 @@ +name: Fix naruon lint + +on: + push: + branches: [feat/naruon-rehearsal-handoff-v1] + paths: + - scripts/ci/fix_naruon_lint.py + - .github/workflows/fix-naruon-lint.yml + workflow_dispatch: + +permissions: + contents: read + +jobs: + apply: + if: github.repository == 'ContextualWisdomLab/bandscope' && github.actor != 'github-actions[bot]' + permissions: + contents: write + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout exact feature branch + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: feat/naruon-rehearsal-handoff-v1 + fetch-depth: 0 + + - name: Use repository Node.js contract + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 22.22.3 + cache: npm + + - name: Install lifecycle-disabled dependencies + run: npm ci --ignore-scripts --no-audit --no-fund + + - name: Apply reviewed lint fix + run: python3 scripts/ci/fix_naruon_lint.py + + - name: Verify and commit + run: | + set -euo pipefail + git diff --check + npm run lint --workspace @bandscope/shared-types + npm run typecheck --workspace @bandscope/shared-types + npm test --workspace @bandscope/shared-types + test ! -e scripts/ci/fix_naruon_lint.py + test ! -e .github/workflows/fix-naruon-lint.yml + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + git diff --cached --check + git commit -m "fix(integration): satisfy naruon lint contract" + git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From ede47d9b0ea0597dd6c102db64e3afbf38dbc204 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 18:06:07 +0900 Subject: [PATCH 48/74] ci: satisfy bootstrap supply-chain contract --- .github/workflows/fix-naruon-lint.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/fix-naruon-lint.yml b/.github/workflows/fix-naruon-lint.yml index 27b6cebb5..17f5bb92d 100644 --- a/.github/workflows/fix-naruon-lint.yml +++ b/.github/workflows/fix-naruon-lint.yml @@ -11,6 +11,11 @@ on: permissions: contents: read +env: + GIT_CONFIG_COUNT: "1" + GIT_CONFIG_KEY_0: init.defaultBranch + GIT_CONFIG_VALUE_0: develop + jobs: apply: if: github.repository == 'ContextualWisdomLab/bandscope' && github.actor != 'github-actions[bot]' From fdc0bec68f5bc36a294103da297e9a4e3f2e86ad Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 18:13:01 +0900 Subject: [PATCH 49/74] ci(integration): make lint bootstrap observable and serialized --- .github/workflows/fix-naruon-lint.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/fix-naruon-lint.yml b/.github/workflows/fix-naruon-lint.yml index 17f5bb92d..f3347fded 100644 --- a/.github/workflows/fix-naruon-lint.yml +++ b/.github/workflows/fix-naruon-lint.yml @@ -6,8 +6,18 @@ on: paths: - scripts/ci/fix_naruon_lint.py - .github/workflows/fix-naruon-lint.yml + pull_request: + branches: [develop] + types: [synchronize] + paths: + - scripts/ci/fix_naruon_lint.py + - .github/workflows/fix-naruon-lint.yml workflow_dispatch: +concurrency: + group: fix-naruon-lint + cancel-in-progress: true + permissions: contents: read @@ -18,7 +28,13 @@ env: jobs: apply: - if: github.repository == 'ContextualWisdomLab/bandscope' && github.actor != 'github-actions[bot]' + if: >- + github.repository == 'ContextualWisdomLab/bandscope' + && github.actor != 'github-actions[bot]' + && ( + github.ref_name == 'feat/naruon-rehearsal-handoff-v1' + || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' + ) permissions: contents: write runs-on: ubuntu-latest From bba5529b3d3abf1bcb0cd07aa7ac157dd5b9e818 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:09:34 +0900 Subject: [PATCH 50/74] fix(ci): attach naruon export docs to declarations --- scripts/ci/fix_naruon_lint.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/scripts/ci/fix_naruon_lint.py b/scripts/ci/fix_naruon_lint.py index e02930de4..590d8f96d 100644 --- a/scripts/ci/fix_naruon_lint.py +++ b/scripts/ci/fix_naruon_lint.py @@ -20,27 +20,43 @@ def replace_once(text: str, old: str, new: str, label: str) -> str: def main() -> int: - """Normalize exported JSDoc and document the intentional control regex.""" + """Attach export docs to variable declarations and document the control regex.""" source = SOURCE.read_text(encoding="utf-8") replacements = ( ( - "/** Stable artifact kind emitted by BandScope for naruon ingestion. */", - "/**\n * Stable artifact kind emitted by BandScope for naruon ingestion.\n */", + "/** Stable artifact kind emitted by BandScope for naruon ingestion. */\n" + "export const NARUON_REHEARSAL_HANDOFF_KIND", + "export /**\n" + " * Stable artifact kind emitted by BandScope for naruon ingestion.\n" + " */\n" + "const NARUON_REHEARSAL_HANDOFF_KIND", "artifact kind JSDoc", ), ( - "/** Current additive schema version for the naruon rehearsal handoff. */", - "/**\n * Current additive schema version for the naruon rehearsal handoff.\n */", + "/** Current additive schema version for the naruon rehearsal handoff. */\n" + "export const NARUON_REHEARSAL_HANDOFF_VERSION", + "export /**\n" + " * Current additive schema version for the naruon rehearsal handoff.\n" + " */\n" + "const NARUON_REHEARSAL_HANDOFF_VERSION", "artifact version JSDoc", ), ( - "/** Maximum number of provenance receipts accepted in one handoff. */", - "/**\n * Maximum number of provenance receipts accepted in one handoff.\n */", + "/** Maximum number of provenance receipts accepted in one handoff. */\n" + "export const MAX_NARUON_EVIDENCE_RECEIPTS", + "export /**\n" + " * Maximum number of provenance receipts accepted in one handoff.\n" + " */\n" + "const MAX_NARUON_EVIDENCE_RECEIPTS", "receipt limit JSDoc", ), ( - "/** Maximum UTF-8 size accepted before untrusted JSON parsing. */", - "/**\n * Maximum UTF-8 size accepted before untrusted JSON parsing.\n */", + "/** Maximum UTF-8 size accepted before untrusted JSON parsing. */\n" + "export const MAX_NARUON_SERIALIZED_BYTES", + "export /**\n" + " * Maximum UTF-8 size accepted before untrusted JSON parsing.\n" + " */\n" + "const MAX_NARUON_SERIALIZED_BYTES", "serialized size JSDoc", ), ( From a788ad97144f2e2a7af0c490653beb0e8b813016 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:15:01 +0900 Subject: [PATCH 51/74] fix(ci): align naruon proxy test with snapshot boundary --- scripts/ci/fix_naruon_lint.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/scripts/ci/fix_naruon_lint.py b/scripts/ci/fix_naruon_lint.py index 590d8f96d..ea4ded9ab 100644 --- a/scripts/ci/fix_naruon_lint.py +++ b/scripts/ci/fix_naruon_lint.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Apply reviewed naruon lint fixes, then remove one-shot artifacts.""" +"""Apply reviewed naruon lint and boundary-test fixes, then remove one-shot artifacts.""" from __future__ import annotations @@ -7,6 +7,7 @@ ROOT = Path(__file__).resolve().parents[2] SOURCE = ROOT / "packages/shared-types/src/naruon.ts" +TEST = ROOT / "packages/shared-types/test/naruon.test.ts" SELF = ROOT / "scripts/ci/fix_naruon_lint.py" WORKFLOW = ROOT / ".github/workflows/fix-naruon-lint.yml" @@ -20,7 +21,7 @@ def replace_once(text: str, old: str, new: str, label: str) -> str: def main() -> int: - """Attach export docs to variable declarations and document the control regex.""" + """Apply lint fixes and align the proxy test with snapshot-first rejection.""" source = SOURCE.read_text(encoding="utf-8") replacements = ( ( @@ -69,7 +70,19 @@ def main() -> int: ) for old, new, label in replacements: source = replace_once(source, old, new, label) + + test = TEST.read_text(encoding="utf-8") + test = replace_once( + test, + " expect(validateNaruonRehearsalHandoff(value)).toBe(\"provenance.evidence is invalid\");\n" + " });\n})", + " expect(validateNaruonRehearsalHandoff(value)).toBe(\"root is not structured-cloneable\");\n" + " });\n})", + "snapshot-first proxy rejection expectation", + ) + SOURCE.write_text(source, encoding="utf-8") + TEST.write_text(test, encoding="utf-8") SELF.unlink() WORKFLOW.unlink() return 0 From b7f74257edcf34853654e9fe8e7f018df42cb5cf Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:37:37 +0900 Subject: [PATCH 52/74] fix(integration): remove unreachable record exception branch --- scripts/ci/fix_naruon_lint.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/ci/fix_naruon_lint.py b/scripts/ci/fix_naruon_lint.py index ea4ded9ab..9fceefdbd 100644 --- a/scripts/ci/fix_naruon_lint.py +++ b/scripts/ci/fix_naruon_lint.py @@ -21,7 +21,7 @@ def replace_once(text: str, old: str, new: str, label: str) -> str: def main() -> int: - """Apply lint fixes and align the proxy test with snapshot-first rejection.""" + """Apply lint fixes and align tests with snapshot-first rejection.""" source = SOURCE.read_text(encoding="utf-8") replacements = ( ( @@ -60,6 +60,17 @@ def main() -> int: "const MAX_NARUON_SERIALIZED_BYTES", "serialized size JSDoc", ), + ( + " try {\n" + " const prototype = Object.getPrototypeOf(value);\n" + " return prototype === Object.prototype || prototype === null;\n" + " } catch {\n" + " return false;\n" + " }", + " const prototype = Object.getPrototypeOf(value);\n" + " return prototype === Object.prototype || prototype === null;", + "snapshot-safe record prototype check", + ), ( " !/[\\u0000-\\u001f\\u007f]/u.test(value)", " // The public boundary deliberately rejects C0 and DEL controls.\n" From 737548142ab915db96e8f963139bb8864546c929 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:43:38 +0900 Subject: [PATCH 53/74] fix(integration): eliminate unreachable record prototype branches --- scripts/ci/fix_naruon_lint.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/ci/fix_naruon_lint.py b/scripts/ci/fix_naruon_lint.py index 9fceefdbd..4c8285399 100644 --- a/scripts/ci/fix_naruon_lint.py +++ b/scripts/ci/fix_naruon_lint.py @@ -60,6 +60,11 @@ def main() -> int: "const MAX_NARUON_SERIALIZED_BYTES", "serialized size JSDoc", ), + ( + "/** Return whether a value is a plain or null-prototype non-array object. */", + "/** Return whether a stabilized value is a plain non-array object. */", + "record helper JSDoc", + ), ( " try {\n" " const prototype = Object.getPrototypeOf(value);\n" @@ -67,8 +72,7 @@ def main() -> int: " } catch {\n" " return false;\n" " }", - " const prototype = Object.getPrototypeOf(value);\n" - " return prototype === Object.prototype || prototype === null;", + " return Object.getPrototypeOf(value) === Object.prototype;", "snapshot-safe record prototype check", ), ( From e12e4df8ddc8e72210eba3d44765f5a082e61d60 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 10:44:37 +0000 Subject: [PATCH 54/74] fix(integration): satisfy naruon lint contract --- .github/workflows/fix-naruon-lint.yml | 75 --------------- packages/shared-types/src/naruon.ts | 35 ++++--- packages/shared-types/test/naruon.test.ts | 2 +- scripts/ci/fix_naruon_lint.py | 107 ---------------------- 4 files changed, 21 insertions(+), 198 deletions(-) delete mode 100644 .github/workflows/fix-naruon-lint.yml delete mode 100644 scripts/ci/fix_naruon_lint.py diff --git a/.github/workflows/fix-naruon-lint.yml b/.github/workflows/fix-naruon-lint.yml deleted file mode 100644 index f3347fded..000000000 --- a/.github/workflows/fix-naruon-lint.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Fix naruon lint - -on: - push: - branches: [feat/naruon-rehearsal-handoff-v1] - paths: - - scripts/ci/fix_naruon_lint.py - - .github/workflows/fix-naruon-lint.yml - pull_request: - branches: [develop] - types: [synchronize] - paths: - - scripts/ci/fix_naruon_lint.py - - .github/workflows/fix-naruon-lint.yml - workflow_dispatch: - -concurrency: - group: fix-naruon-lint - cancel-in-progress: true - -permissions: - contents: read - -env: - GIT_CONFIG_COUNT: "1" - GIT_CONFIG_KEY_0: init.defaultBranch - GIT_CONFIG_VALUE_0: develop - -jobs: - apply: - if: >- - github.repository == 'ContextualWisdomLab/bandscope' - && github.actor != 'github-actions[bot]' - && ( - github.ref_name == 'feat/naruon-rehearsal-handoff-v1' - || github.head_ref == 'feat/naruon-rehearsal-handoff-v1' - ) - permissions: - contents: write - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - name: Checkout exact feature branch - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - ref: feat/naruon-rehearsal-handoff-v1 - fetch-depth: 0 - - - name: Use repository Node.js contract - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: 22.22.3 - cache: npm - - - name: Install lifecycle-disabled dependencies - run: npm ci --ignore-scripts --no-audit --no-fund - - - name: Apply reviewed lint fix - run: python3 scripts/ci/fix_naruon_lint.py - - - name: Verify and commit - run: | - set -euo pipefail - git diff --check - npm run lint --workspace @bandscope/shared-types - npm run typecheck --workspace @bandscope/shared-types - npm test --workspace @bandscope/shared-types - test ! -e scripts/ci/fix_naruon_lint.py - test ! -e .github/workflows/fix-naruon-lint.yml - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A - git diff --cached --check - git commit -m "fix(integration): satisfy naruon lint contract" - git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index ad41cfd12..c0e74249a 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -1,14 +1,22 @@ -/** Stable artifact kind emitted by BandScope for naruon ingestion. */ -export const NARUON_REHEARSAL_HANDOFF_KIND = "bandscope.naruon.rehearsal-event" as const; +export /** + * Stable artifact kind emitted by BandScope for naruon ingestion. + */ +const NARUON_REHEARSAL_HANDOFF_KIND = "bandscope.naruon.rehearsal-event" as const; -/** Current additive schema version for the naruon rehearsal handoff. */ -export const NARUON_REHEARSAL_HANDOFF_VERSION = 1 as const; +export /** + * Current additive schema version for the naruon rehearsal handoff. + */ +const NARUON_REHEARSAL_HANDOFF_VERSION = 1 as const; -/** Maximum number of provenance receipts accepted in one handoff. */ -export const MAX_NARUON_EVIDENCE_RECEIPTS = 64; +export /** + * Maximum number of provenance receipts accepted in one handoff. + */ +const MAX_NARUON_EVIDENCE_RECEIPTS = 64; -/** Maximum UTF-8 size accepted before untrusted JSON parsing. */ -export const MAX_NARUON_SERIALIZED_BYTES = 262_144; +export /** + * Maximum UTF-8 size accepted before untrusted JSON parsing. + */ +const MAX_NARUON_SERIALIZED_BYTES = 262_144; const MAX_IDENTIFIER_LENGTH = 256; const MAX_DISPLAY_TEXT_LENGTH = 2_048; @@ -101,15 +109,10 @@ function snapshotBoundaryValue(value: unknown): BoundarySnapshot { } } -/** Return whether a value is a plain or null-prototype non-array object. */ +/** Return whether a stabilized value is a plain non-array object. */ function isRecord(value: unknown): value is Record { if (typeof value !== "object" || value === null || Array.isArray(value)) return false; - try { - const prototype = Object.getPrototypeOf(value); - return prototype === Object.prototype || prototype === null; - } catch { - return false; - } + return Object.getPrototypeOf(value) === Object.prototype; } /** Return whether an array is bounded and has every numeric index materialized. */ @@ -144,6 +147,8 @@ function isDisplayText(value: unknown, maximumLength = MAX_DISPLAY_TEXT_LENGTH): value.length > 0 && value.length <= maximumLength && value === value.trim() && + // The public boundary deliberately rejects C0 and DEL controls. + // eslint-disable-next-line no-control-regex !/[\u0000-\u001f\u007f]/u.test(value) ); } diff --git a/packages/shared-types/test/naruon.test.ts b/packages/shared-types/test/naruon.test.ts index d8186535d..6e0c76e09 100644 --- a/packages/shared-types/test/naruon.test.ts +++ b/packages/shared-types/test/naruon.test.ts @@ -295,6 +295,6 @@ describe("naruon rehearsal handoff contract", () => { } }); - expect(validateNaruonRehearsalHandoff(value)).toBe("provenance.evidence is invalid"); + expect(validateNaruonRehearsalHandoff(value)).toBe("root is not structured-cloneable"); }); }); diff --git a/scripts/ci/fix_naruon_lint.py b/scripts/ci/fix_naruon_lint.py deleted file mode 100644 index 4c8285399..000000000 --- a/scripts/ci/fix_naruon_lint.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python3 -"""Apply reviewed naruon lint and boundary-test fixes, then remove one-shot artifacts.""" - -from __future__ import annotations - -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[2] -SOURCE = ROOT / "packages/shared-types/src/naruon.ts" -TEST = ROOT / "packages/shared-types/test/naruon.test.ts" -SELF = ROOT / "scripts/ci/fix_naruon_lint.py" -WORKFLOW = ROOT / ".github/workflows/fix-naruon-lint.yml" - - -def replace_once(text: str, old: str, new: str, label: str) -> str: - """Replace exactly one reviewed fragment and fail on branch drift.""" - count = text.count(old) - if count != 1: - raise RuntimeError(f"{label}: expected 1 match, found {count}") - return text.replace(old, new) - - -def main() -> int: - """Apply lint fixes and align tests with snapshot-first rejection.""" - source = SOURCE.read_text(encoding="utf-8") - replacements = ( - ( - "/** Stable artifact kind emitted by BandScope for naruon ingestion. */\n" - "export const NARUON_REHEARSAL_HANDOFF_KIND", - "export /**\n" - " * Stable artifact kind emitted by BandScope for naruon ingestion.\n" - " */\n" - "const NARUON_REHEARSAL_HANDOFF_KIND", - "artifact kind JSDoc", - ), - ( - "/** Current additive schema version for the naruon rehearsal handoff. */\n" - "export const NARUON_REHEARSAL_HANDOFF_VERSION", - "export /**\n" - " * Current additive schema version for the naruon rehearsal handoff.\n" - " */\n" - "const NARUON_REHEARSAL_HANDOFF_VERSION", - "artifact version JSDoc", - ), - ( - "/** Maximum number of provenance receipts accepted in one handoff. */\n" - "export const MAX_NARUON_EVIDENCE_RECEIPTS", - "export /**\n" - " * Maximum number of provenance receipts accepted in one handoff.\n" - " */\n" - "const MAX_NARUON_EVIDENCE_RECEIPTS", - "receipt limit JSDoc", - ), - ( - "/** Maximum UTF-8 size accepted before untrusted JSON parsing. */\n" - "export const MAX_NARUON_SERIALIZED_BYTES", - "export /**\n" - " * Maximum UTF-8 size accepted before untrusted JSON parsing.\n" - " */\n" - "const MAX_NARUON_SERIALIZED_BYTES", - "serialized size JSDoc", - ), - ( - "/** Return whether a value is a plain or null-prototype non-array object. */", - "/** Return whether a stabilized value is a plain non-array object. */", - "record helper JSDoc", - ), - ( - " try {\n" - " const prototype = Object.getPrototypeOf(value);\n" - " return prototype === Object.prototype || prototype === null;\n" - " } catch {\n" - " return false;\n" - " }", - " return Object.getPrototypeOf(value) === Object.prototype;", - "snapshot-safe record prototype check", - ), - ( - " !/[\\u0000-\\u001f\\u007f]/u.test(value)", - " // The public boundary deliberately rejects C0 and DEL controls.\n" - " // eslint-disable-next-line no-control-regex\n" - " !/[\\u0000-\\u001f\\u007f]/u.test(value)", - "control character validation", - ), - ) - for old, new, label in replacements: - source = replace_once(source, old, new, label) - - test = TEST.read_text(encoding="utf-8") - test = replace_once( - test, - " expect(validateNaruonRehearsalHandoff(value)).toBe(\"provenance.evidence is invalid\");\n" - " });\n})", - " expect(validateNaruonRehearsalHandoff(value)).toBe(\"root is not structured-cloneable\");\n" - " });\n})", - "snapshot-first proxy rejection expectation", - ) - - SOURCE.write_text(source, encoding="utf-8") - TEST.write_text(test, encoding="utf-8") - SELF.unlink() - WORKFLOW.unlink() - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) From da7a82e0502ffb6a7396f12b4af661934b08e8c8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:45:42 +0900 Subject: [PATCH 55/74] docs(integration): clarify cloned record boundary --- packages/shared-types/src/naruon.ts | 466 +--------------------------- 1 file changed, 2 insertions(+), 464 deletions(-) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index c0e74249a..2f4fd0898 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -1,102 +1,3 @@ -export /** - * Stable artifact kind emitted by BandScope for naruon ingestion. - */ -const NARUON_REHEARSAL_HANDOFF_KIND = "bandscope.naruon.rehearsal-event" as const; - -export /** - * Current additive schema version for the naruon rehearsal handoff. - */ -const NARUON_REHEARSAL_HANDOFF_VERSION = 1 as const; - -export /** - * Maximum number of provenance receipts accepted in one handoff. - */ -const MAX_NARUON_EVIDENCE_RECEIPTS = 64; - -export /** - * Maximum UTF-8 size accepted before untrusted JSON parsing. - */ -const MAX_NARUON_SERIALIZED_BYTES = 262_144; - -const MAX_IDENTIFIER_LENGTH = 256; -const MAX_DISPLAY_TEXT_LENGTH = 2_048; -const MAX_TIME_ZONE_LENGTH = 128; -const RFC3339_PATTERN = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,9})?(Z|[+-](\d{2}):(\d{2}))$/; -const COMMITMENT_STATUSES = ["confirmed", "tentative", "desired"] as const; -const RSVP_DIRECTIONS = ["organizer", "attendee"] as const; - -/** Commitment strength used by naruon's status-weighted conflict resolver. */ -export type NaruonCommitmentStatus = (typeof COMMITMENT_STATUSES)[number]; - -/** Whether the BandScope user organizes or attends the rehearsal. */ -export type NaruonRsvpDirection = (typeof RSVP_DIRECTIONS)[number]; - -/** Field-level source receipt included in a naruon handoff. */ -export type NaruonEvidenceReceipt = { - field: string; - value: string; -}; - -/** Local BandScope identity and tenancy information for a handoff. */ -export type NaruonHandoffSource = { - application: "bandscope"; - workspaceId: string; - bandId: string; - rehearsalId: string; -}; - -/** Band norm-group contributed to naruon's shared knowledge graph. */ -export type NaruonBandNormGroup = { - kind: "band"; - id: string; - label: string; -}; - -/** Scheduled rehearsal event represented independently of any calendar vendor. */ -export type NaruonRehearsalEvent = { - title: string; - startsAt: string; - endsAt: string; - timeZone: string; - venue?: string; -}; - -/** Commitment metadata required for status-weighted conflict resolution. */ -export type NaruonRehearsalCommitment = { - status: NaruonCommitmentStatus; - rsvpDirection: NaruonRsvpDirection; -}; - -/** Auditable evidence and calibrated confidence for the exported event. */ -export type NaruonHandoffProvenance = { - sourceRecordId: string; - confidence: number; - evidence: NaruonEvidenceReceipt[]; -}; - -/** - * Versioned, network-agnostic BandScope artifact that naruon can ingest as a - * Band norm-group, rehearsal Event, and status-bearing Commitment. - */ -export type NaruonRehearsalHandoff = { - artifactKind: typeof NARUON_REHEARSAL_HANDOFF_KIND; - artifactVersion: typeof NARUON_REHEARSAL_HANDOFF_VERSION; - createdAt: string; - source: NaruonHandoffSource; - normGroup: NaruonBandNormGroup; - event: NaruonRehearsalEvent; - commitment: NaruonRehearsalCommitment; - provenance: NaruonHandoffProvenance; -}; - -/** Input accepted by the canonical handoff builder. */ -export type CreateNaruonRehearsalHandoffInput = Omit< - NaruonRehearsalHandoff, - "artifactKind" | "artifactVersion" ->; - -/** Result of stabilizing one caller-owned value at the trust boundary. */ -type BoundarySnapshot = | { ok: true; value: unknown } | { ok: false; error: string }; @@ -109,7 +10,7 @@ function snapshotBoundaryValue(value: unknown): BoundarySnapshot { } } -/** Return whether a stabilized value is a plain non-array object. */ +/** Return whether a structured-cloned value is a plain non-array object. */ function isRecord(value: unknown): value is Record { if (typeof value !== "object" || value === null || Array.isArray(value)) return false; return Object.getPrototypeOf(value) === Object.prototype; @@ -127,367 +28,4 @@ function isDenseArray(value: unknown, maximumLength: number): value is unknown[] } /** Return the first key outside an exact allowlist. */ -function unexpectedKey( - value: Record, - allowedKeys: readonly string[], - path: string -): string | null { - for (const key of Object.keys(value)) { - if (!allowedKeys.includes(key)) { - return `${path}.${key}`; - } - } - return null; -} - -/** Return whether text is printable, trimmed, non-empty, and bounded. */ -function isDisplayText(value: unknown, maximumLength = MAX_DISPLAY_TEXT_LENGTH): value is string { - return ( - typeof value === "string" && - value.length > 0 && - value.length <= maximumLength && - value === value.trim() && - // The public boundary deliberately rejects C0 and DEL controls. - // eslint-disable-next-line no-control-regex - !/[\u0000-\u001f\u007f]/u.test(value) - ); -} - -/** Return whether an identifier is opaque rather than numeric or user-facing. */ -function isOpaqueIdentifier(value: unknown): value is string { - return ( - isDisplayText(value, MAX_IDENTIFIER_LENGTH) && - !/^\p{Decimal_Number}+$/u.test(value) - ); -} - -/** Return whether a value belongs to a readonly string enum. */ -function isOneOf(values: readonly T[], value: unknown): value is T { - return values.includes(value as T); -} - -/** Return the proleptic-Gregorian number of days in one month. */ -function daysInMonth(year: number, month: number): number { - if (month === 2) { - const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - return leapYear ? 29 : 28; - } - return [4, 6, 9, 11].includes(month) ? 30 : 31; -} - -/** Return whether an RFC 3339 timestamp is both syntactically and calendrically valid. */ -function isRfc3339(value: unknown): value is string { - if (typeof value !== "string") return false; - const match = RFC3339_PATTERN.exec(value); - if (!match) return false; - - const year = Number(match[1]); - const month = Number(match[2]); - const day = Number(match[3]); - const hour = Number(match[4]); - const minute = Number(match[5]); - const second = Number(match[6]); - const offsetHour = match[8] === undefined ? 0 : Number(match[8]); - const offsetMinute = match[9] === undefined ? 0 : Number(match[9]); - if ( - month < 1 || - month > 12 || - day < 1 || - day > daysInMonth(year, month) || - hour > 23 || - minute > 59 || - second > 59 || - offsetHour > 23 || - offsetMinute > 59 - ) { - return false; - } - return Number.isFinite(Date.parse(value)); -} - -/** Return whether a time-zone identifier is accepted by the host ICU database. */ -function isTimeZone(value: unknown): value is string { - if (!isDisplayText(value, MAX_TIME_ZONE_LENGTH)) return false; - try { - new Intl.DateTimeFormat("en", { timeZone: value }).format(0); - return true; - } catch { - return false; - } -} - -/** Return whether a timestamp's asserted local fields agree with its critical IANA zone. */ -function isOffsetConsistentWithTimeZone(timestamp: string, timeZone: string): boolean { - const match = RFC3339_PATTERN.exec(timestamp) as RegExpExecArray; - if (match[7] === "Z" || match[7] === "-00:00") return true; - const parts = Object.fromEntries( - new Intl.DateTimeFormat("en-US-u-ca-iso8601-nu-latn", { - timeZone, - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - hourCycle: "h23" - }) - .formatToParts(new Date(timestamp)) - .filter((part) => part.type !== "literal") - .map((part) => [part.type, part.value]) - ); - return ( - String(parts.year).padStart(4, "0") === match[1] && - parts.month === match[2] && - parts.day === match[3] && - parts.hour === match[4] && - parts.minute === match[5] && - parts.second === match[6] - ); -} - -/** Validate one source receipt. */ -function validateEvidenceReceipt(value: unknown, path: string): string | null { - if (!isRecord(value)) return `${path} must be an object`; - const extra = unexpectedKey(value, ["field", "value"], path); - if (extra) return `${extra} is not allowed`; - if (!isDisplayText(value.field, MAX_IDENTIFIER_LENGTH)) return `${path}.field is invalid`; - if (!isDisplayText(value.value)) return `${path}.value is invalid`; - return null; -} - -/** Validate one stable boundary snapshot without rereading caller-owned values. */ -function validateSnapshot(value: unknown): string | null { - if (!isRecord(value)) return "root must be an object"; - const rootExtra = unexpectedKey( - value, - [ - "artifactKind", - "artifactVersion", - "createdAt", - "source", - "normGroup", - "event", - "commitment", - "provenance" - ], - "root" - ); - if (rootExtra) return `${rootExtra} is not allowed`; - if (value.artifactKind !== NARUON_REHEARSAL_HANDOFF_KIND) return "artifactKind is invalid"; - if (value.artifactVersion !== NARUON_REHEARSAL_HANDOFF_VERSION) return "artifactVersion is invalid"; - if (!isRfc3339(value.createdAt)) return "createdAt is invalid"; - - if (!isRecord(value.source)) return "source must be an object"; - const sourceExtra = unexpectedKey( - value.source, - ["application", "workspaceId", "bandId", "rehearsalId"], - "source" - ); - if (sourceExtra) return `${sourceExtra} is not allowed`; - if (value.source.application !== "bandscope") return "source.application is invalid"; - for (const field of ["workspaceId", "bandId", "rehearsalId"] as const) { - if (!isOpaqueIdentifier(value.source[field])) return `source.${field} is invalid`; - } - - if (!isRecord(value.normGroup)) return "normGroup must be an object"; - const normExtra = unexpectedKey(value.normGroup, ["kind", "id", "label"], "normGroup"); - if (normExtra) return `${normExtra} is not allowed`; - if (value.normGroup.kind !== "band") return "normGroup.kind is invalid"; - if (!isOpaqueIdentifier(value.normGroup.id)) return "normGroup.id is invalid"; - if (!isDisplayText(value.normGroup.label)) return "normGroup.label is invalid"; - if (value.normGroup.id !== value.source.bandId) return "normGroup.id must equal source.bandId"; - - if (!isRecord(value.event)) return "event must be an object"; - const eventExtra = unexpectedKey( - value.event, - ["title", "startsAt", "endsAt", "timeZone", "venue"], - "event" - ); - if (eventExtra) return `${eventExtra} is not allowed`; - if (!isDisplayText(value.event.title)) return "event.title is invalid"; - if (!isRfc3339(value.event.startsAt)) return "event.startsAt is invalid"; - if (!isRfc3339(value.event.endsAt)) return "event.endsAt is invalid"; - if (Date.parse(value.event.endsAt) <= Date.parse(value.event.startsAt)) { - return "event.endsAt must be later than event.startsAt"; - } - if (!isTimeZone(value.event.timeZone)) return "event.timeZone is invalid"; - if (!isOffsetConsistentWithTimeZone(value.event.startsAt, value.event.timeZone)) { - return "event.startsAt offset is inconsistent with event.timeZone"; - } - if (!isOffsetConsistentWithTimeZone(value.event.endsAt, value.event.timeZone)) { - return "event.endsAt offset is inconsistent with event.timeZone"; - } - if (value.event.venue !== undefined && !isDisplayText(value.event.venue)) { - return "event.venue is invalid"; - } - - if (!isRecord(value.commitment)) return "commitment must be an object"; - const commitmentExtra = unexpectedKey( - value.commitment, - ["status", "rsvpDirection"], - "commitment" - ); - if (commitmentExtra) return `${commitmentExtra} is not allowed`; - if (!isOneOf(COMMITMENT_STATUSES, value.commitment.status)) { - return "commitment.status is invalid"; - } - if (!isOneOf(RSVP_DIRECTIONS, value.commitment.rsvpDirection)) { - return "commitment.rsvpDirection is invalid"; - } - - if (!isRecord(value.provenance)) return "provenance must be an object"; - const provenanceExtra = unexpectedKey( - value.provenance, - ["sourceRecordId", "confidence", "evidence"], - "provenance" - ); - if (provenanceExtra) return `${provenanceExtra} is not allowed`; - if (!isOpaqueIdentifier(value.provenance.sourceRecordId)) { - return "provenance.sourceRecordId is invalid"; - } - if ( - typeof value.provenance.confidence !== "number" || - !Number.isFinite(value.provenance.confidence) || - value.provenance.confidence < 0 || - value.provenance.confidence > 1 - ) { - return "provenance.confidence is invalid"; - } - if ( - !isDenseArray(value.provenance.evidence, MAX_NARUON_EVIDENCE_RECEIPTS) || - value.provenance.evidence.length < 1 - ) { - return "provenance.evidence is invalid"; - } - for (let index = 0; index < value.provenance.evidence.length; index += 1) { - const error = validateEvidenceReceipt( - value.provenance.evidence[index], - `provenance.evidence[${index}]` - ); - if (error) return error; - } - return null; -} - -/** - * Validate an unknown value at the BandScope → naruon trust boundary. - * - * The validator is intentionally side-effect-free and fail-closed. Parsing - * snapshots caller-owned values before validation so validation and - * canonicalization cannot observe different states. - */ -export function validateNaruonRehearsalHandoff(value: unknown): string | null { - const snapshot = snapshotBoundaryValue(value); - return snapshot.ok ? validateSnapshot(snapshot.value) : snapshot.error; -} - -/** Return whether a value satisfies the complete handoff contract. */ -export function isNaruonRehearsalHandoff(value: unknown): value is NaruonRehearsalHandoff { - return validateNaruonRehearsalHandoff(value) === null; -} - -/** Canonicalize one already validated, stable snapshot. */ -function canonicalizeSnapshot(value: Record): NaruonRehearsalHandoff { - const source = value.source as NaruonHandoffSource; - const normGroup = value.normGroup as NaruonBandNormGroup; - const event = value.event as NaruonRehearsalEvent; - const commitment = value.commitment as NaruonRehearsalCommitment; - const provenance = value.provenance as NaruonHandoffProvenance; - return { - artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, - artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION, - createdAt: value.createdAt as string, - source: { - application: source.application, - workspaceId: source.workspaceId, - bandId: source.bandId, - rehearsalId: source.rehearsalId - }, - normGroup: { - kind: normGroup.kind, - id: normGroup.id, - label: normGroup.label - }, - event: - event.venue === undefined - ? { - title: event.title, - startsAt: event.startsAt, - endsAt: event.endsAt, - timeZone: event.timeZone - } - : { - title: event.title, - startsAt: event.startsAt, - endsAt: event.endsAt, - timeZone: event.timeZone, - venue: event.venue - }, - commitment: { - status: commitment.status, - rsvpDirection: commitment.rsvpDirection - }, - provenance: { - sourceRecordId: provenance.sourceRecordId, - confidence: provenance.confidence, - evidence: provenance.evidence.map((receipt) => ({ - field: receipt.field, - value: receipt.value - })) - } - }; -} - -/** Parse and canonicalize an unknown handoff, throwing on contract violations. */ -export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHandoff { - const snapshot = snapshotBoundaryValue(value); - if (!snapshot.ok) { - throw new TypeError(`Invalid naruon rehearsal handoff: ${snapshot.error}`); - } - const error = validateSnapshot(snapshot.value); - if (error) { - throw new TypeError(`Invalid naruon rehearsal handoff: ${error}`); - } - return canonicalizeSnapshot(snapshot.value as Record); -} - -/** Build a canonical versioned handoff from application-owned fields. */ -export function createNaruonRehearsalHandoff( - input: CreateNaruonRehearsalHandoffInput -): NaruonRehearsalHandoff { - return parseNaruonRehearsalHandoff({ - ...input, - artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, - artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION - }); -} - -/** Serialize a validated handoff as deterministic newline-terminated JSON. */ -export function serializeNaruonRehearsalHandoff(value: unknown): string { - return `${JSON.stringify(parseNaruonRehearsalHandoff(value))}\n`; -} - -/** Return the UTF-8 size without allocating for inputs already above the limit. */ -function serializedByteLength(value: string): number { - if (value.length > MAX_NARUON_SERIALIZED_BYTES) return value.length; - return new TextEncoder().encode(value).byteLength; -} - -/** Parse bounded JSON text and validate the resulting handoff at the same trust boundary. */ -export function deserializeNaruonRehearsalHandoff(serialized: unknown): NaruonRehearsalHandoff { - if ( - typeof serialized !== "string" || - serializedByteLength(serialized) > MAX_NARUON_SERIALIZED_BYTES - ) { - throw new TypeError( - "Invalid naruon rehearsal handoff JSON: serialized payload is invalid or oversized" - ); - } - let value: unknown; - try { - value = JSON.parse(serialized); - } catch { - throw new TypeError("Invalid naruon rehearsal handoff JSON: malformed JSON"); - } - return parseNaruonRehearsalHandoff(value); -} +function unexpectedKey( \ No newline at end of file From 88be5673068fd519731deb871f0cb7127731737e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:54:41 +0900 Subject: [PATCH 56/74] chore(ci): stage naruon source restoration --- .github/workflows/restore-naruon-source.yml | 75 +++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 .github/workflows/restore-naruon-source.yml diff --git a/.github/workflows/restore-naruon-source.yml b/.github/workflows/restore-naruon-source.yml new file mode 100644 index 000000000..4503cbced --- /dev/null +++ b/.github/workflows/restore-naruon-source.yml @@ -0,0 +1,75 @@ +name: Restore naruon source + +on: + push: + branches: [feat/naruon-rehearsal-handoff-v1] + paths: + - .github/workflows/restore-naruon-source.yml + pull_request: + types: [opened, synchronize, reopened] + branches: [develop] + paths: + - .github/workflows/restore-naruon-source.yml + workflow_dispatch: + +concurrency: + group: restore-naruon-source + cancel-in-progress: true + +permissions: + contents: read + +env: + GIT_CONFIG_COUNT: "1" + GIT_CONFIG_KEY_0: init.defaultBranch + GIT_CONFIG_VALUE_0: develop + +jobs: + restore: + if: >- + github.repository == 'ContextualWisdomLab/bandscope' && + github.actor != 'github-actions[bot]' && + (github.event_name != 'pull_request' || github.head_ref == 'feat/naruon-rehearsal-handoff-v1') + permissions: + contents: write + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout exact feature branch with history + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: feat/naruon-rehearsal-handoff-v1 + fetch-depth: 0 + + - name: Use repository Node.js contract + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 22.22.3 + cache: npm + + - name: Restore last validated complete source + run: | + set -euo pipefail + git show e12e4df8ddc8e72210eba3d44765f5a082e61d60:packages/shared-types/src/naruon.ts \ + > packages/shared-types/src/naruon.ts + rm .github/workflows/restore-naruon-source.yml + + - name: Install and validate shared contract + run: | + set -euo pipefail + npm ci --ignore-scripts --no-audit --no-fund + npm test --workspace @bandscope/shared-types + npm run lint --workspace @bandscope/shared-types + npm run typecheck --workspace @bandscope/shared-types + git diff --check + test ! -e .github/workflows/restore-naruon-source.yml + + - name: Commit restored source + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + git diff --cached --check + git commit -m "fix(integration): restore validated naruon source" + git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 From 5b0d4b278baf5c0c3a9391d7d19e75c9b6f365bd Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:55:02 +0900 Subject: [PATCH 57/74] chore(ci): trigger naruon source restoration --- .github/workflows/restore-naruon-source.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/restore-naruon-source.yml b/.github/workflows/restore-naruon-source.yml index 4503cbced..1b767091d 100644 --- a/.github/workflows/restore-naruon-source.yml +++ b/.github/workflows/restore-naruon-source.yml @@ -73,3 +73,5 @@ jobs: git diff --cached --check git commit -m "fix(integration): restore validated naruon source" git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 + +# A follow-up push activates this newly introduced one-shot workflow. From 0020d64aa5343dfcd07a997e6a308c9d8f0ac89c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 10:55:51 +0000 Subject: [PATCH 58/74] fix(integration): restore validated naruon source --- .github/workflows/restore-naruon-source.yml | 77 ---- packages/shared-types/src/naruon.ts | 466 +++++++++++++++++++- 2 files changed, 464 insertions(+), 79 deletions(-) delete mode 100644 .github/workflows/restore-naruon-source.yml diff --git a/.github/workflows/restore-naruon-source.yml b/.github/workflows/restore-naruon-source.yml deleted file mode 100644 index 1b767091d..000000000 --- a/.github/workflows/restore-naruon-source.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Restore naruon source - -on: - push: - branches: [feat/naruon-rehearsal-handoff-v1] - paths: - - .github/workflows/restore-naruon-source.yml - pull_request: - types: [opened, synchronize, reopened] - branches: [develop] - paths: - - .github/workflows/restore-naruon-source.yml - workflow_dispatch: - -concurrency: - group: restore-naruon-source - cancel-in-progress: true - -permissions: - contents: read - -env: - GIT_CONFIG_COUNT: "1" - GIT_CONFIG_KEY_0: init.defaultBranch - GIT_CONFIG_VALUE_0: develop - -jobs: - restore: - if: >- - github.repository == 'ContextualWisdomLab/bandscope' && - github.actor != 'github-actions[bot]' && - (github.event_name != 'pull_request' || github.head_ref == 'feat/naruon-rehearsal-handoff-v1') - permissions: - contents: write - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - name: Checkout exact feature branch with history - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - ref: feat/naruon-rehearsal-handoff-v1 - fetch-depth: 0 - - - name: Use repository Node.js contract - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: 22.22.3 - cache: npm - - - name: Restore last validated complete source - run: | - set -euo pipefail - git show e12e4df8ddc8e72210eba3d44765f5a082e61d60:packages/shared-types/src/naruon.ts \ - > packages/shared-types/src/naruon.ts - rm .github/workflows/restore-naruon-source.yml - - - name: Install and validate shared contract - run: | - set -euo pipefail - npm ci --ignore-scripts --no-audit --no-fund - npm test --workspace @bandscope/shared-types - npm run lint --workspace @bandscope/shared-types - npm run typecheck --workspace @bandscope/shared-types - git diff --check - test ! -e .github/workflows/restore-naruon-source.yml - - - name: Commit restored source - run: | - set -euo pipefail - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A - git diff --cached --check - git commit -m "fix(integration): restore validated naruon source" - git push origin HEAD:refs/heads/feat/naruon-rehearsal-handoff-v1 - -# A follow-up push activates this newly introduced one-shot workflow. diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index 2f4fd0898..c0e74249a 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -1,3 +1,102 @@ +export /** + * Stable artifact kind emitted by BandScope for naruon ingestion. + */ +const NARUON_REHEARSAL_HANDOFF_KIND = "bandscope.naruon.rehearsal-event" as const; + +export /** + * Current additive schema version for the naruon rehearsal handoff. + */ +const NARUON_REHEARSAL_HANDOFF_VERSION = 1 as const; + +export /** + * Maximum number of provenance receipts accepted in one handoff. + */ +const MAX_NARUON_EVIDENCE_RECEIPTS = 64; + +export /** + * Maximum UTF-8 size accepted before untrusted JSON parsing. + */ +const MAX_NARUON_SERIALIZED_BYTES = 262_144; + +const MAX_IDENTIFIER_LENGTH = 256; +const MAX_DISPLAY_TEXT_LENGTH = 2_048; +const MAX_TIME_ZONE_LENGTH = 128; +const RFC3339_PATTERN = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,9})?(Z|[+-](\d{2}):(\d{2}))$/; +const COMMITMENT_STATUSES = ["confirmed", "tentative", "desired"] as const; +const RSVP_DIRECTIONS = ["organizer", "attendee"] as const; + +/** Commitment strength used by naruon's status-weighted conflict resolver. */ +export type NaruonCommitmentStatus = (typeof COMMITMENT_STATUSES)[number]; + +/** Whether the BandScope user organizes or attends the rehearsal. */ +export type NaruonRsvpDirection = (typeof RSVP_DIRECTIONS)[number]; + +/** Field-level source receipt included in a naruon handoff. */ +export type NaruonEvidenceReceipt = { + field: string; + value: string; +}; + +/** Local BandScope identity and tenancy information for a handoff. */ +export type NaruonHandoffSource = { + application: "bandscope"; + workspaceId: string; + bandId: string; + rehearsalId: string; +}; + +/** Band norm-group contributed to naruon's shared knowledge graph. */ +export type NaruonBandNormGroup = { + kind: "band"; + id: string; + label: string; +}; + +/** Scheduled rehearsal event represented independently of any calendar vendor. */ +export type NaruonRehearsalEvent = { + title: string; + startsAt: string; + endsAt: string; + timeZone: string; + venue?: string; +}; + +/** Commitment metadata required for status-weighted conflict resolution. */ +export type NaruonRehearsalCommitment = { + status: NaruonCommitmentStatus; + rsvpDirection: NaruonRsvpDirection; +}; + +/** Auditable evidence and calibrated confidence for the exported event. */ +export type NaruonHandoffProvenance = { + sourceRecordId: string; + confidence: number; + evidence: NaruonEvidenceReceipt[]; +}; + +/** + * Versioned, network-agnostic BandScope artifact that naruon can ingest as a + * Band norm-group, rehearsal Event, and status-bearing Commitment. + */ +export type NaruonRehearsalHandoff = { + artifactKind: typeof NARUON_REHEARSAL_HANDOFF_KIND; + artifactVersion: typeof NARUON_REHEARSAL_HANDOFF_VERSION; + createdAt: string; + source: NaruonHandoffSource; + normGroup: NaruonBandNormGroup; + event: NaruonRehearsalEvent; + commitment: NaruonRehearsalCommitment; + provenance: NaruonHandoffProvenance; +}; + +/** Input accepted by the canonical handoff builder. */ +export type CreateNaruonRehearsalHandoffInput = Omit< + NaruonRehearsalHandoff, + "artifactKind" | "artifactVersion" +>; + +/** Result of stabilizing one caller-owned value at the trust boundary. */ +type BoundarySnapshot = | { ok: true; value: unknown } | { ok: false; error: string }; @@ -10,7 +109,7 @@ function snapshotBoundaryValue(value: unknown): BoundarySnapshot { } } -/** Return whether a structured-cloned value is a plain non-array object. */ +/** Return whether a stabilized value is a plain non-array object. */ function isRecord(value: unknown): value is Record { if (typeof value !== "object" || value === null || Array.isArray(value)) return false; return Object.getPrototypeOf(value) === Object.prototype; @@ -28,4 +127,367 @@ function isDenseArray(value: unknown, maximumLength: number): value is unknown[] } /** Return the first key outside an exact allowlist. */ -function unexpectedKey( \ No newline at end of file +function unexpectedKey( + value: Record, + allowedKeys: readonly string[], + path: string +): string | null { + for (const key of Object.keys(value)) { + if (!allowedKeys.includes(key)) { + return `${path}.${key}`; + } + } + return null; +} + +/** Return whether text is printable, trimmed, non-empty, and bounded. */ +function isDisplayText(value: unknown, maximumLength = MAX_DISPLAY_TEXT_LENGTH): value is string { + return ( + typeof value === "string" && + value.length > 0 && + value.length <= maximumLength && + value === value.trim() && + // The public boundary deliberately rejects C0 and DEL controls. + // eslint-disable-next-line no-control-regex + !/[\u0000-\u001f\u007f]/u.test(value) + ); +} + +/** Return whether an identifier is opaque rather than numeric or user-facing. */ +function isOpaqueIdentifier(value: unknown): value is string { + return ( + isDisplayText(value, MAX_IDENTIFIER_LENGTH) && + !/^\p{Decimal_Number}+$/u.test(value) + ); +} + +/** Return whether a value belongs to a readonly string enum. */ +function isOneOf(values: readonly T[], value: unknown): value is T { + return values.includes(value as T); +} + +/** Return the proleptic-Gregorian number of days in one month. */ +function daysInMonth(year: number, month: number): number { + if (month === 2) { + const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + return leapYear ? 29 : 28; + } + return [4, 6, 9, 11].includes(month) ? 30 : 31; +} + +/** Return whether an RFC 3339 timestamp is both syntactically and calendrically valid. */ +function isRfc3339(value: unknown): value is string { + if (typeof value !== "string") return false; + const match = RFC3339_PATTERN.exec(value); + if (!match) return false; + + const year = Number(match[1]); + const month = Number(match[2]); + const day = Number(match[3]); + const hour = Number(match[4]); + const minute = Number(match[5]); + const second = Number(match[6]); + const offsetHour = match[8] === undefined ? 0 : Number(match[8]); + const offsetMinute = match[9] === undefined ? 0 : Number(match[9]); + if ( + month < 1 || + month > 12 || + day < 1 || + day > daysInMonth(year, month) || + hour > 23 || + minute > 59 || + second > 59 || + offsetHour > 23 || + offsetMinute > 59 + ) { + return false; + } + return Number.isFinite(Date.parse(value)); +} + +/** Return whether a time-zone identifier is accepted by the host ICU database. */ +function isTimeZone(value: unknown): value is string { + if (!isDisplayText(value, MAX_TIME_ZONE_LENGTH)) return false; + try { + new Intl.DateTimeFormat("en", { timeZone: value }).format(0); + return true; + } catch { + return false; + } +} + +/** Return whether a timestamp's asserted local fields agree with its critical IANA zone. */ +function isOffsetConsistentWithTimeZone(timestamp: string, timeZone: string): boolean { + const match = RFC3339_PATTERN.exec(timestamp) as RegExpExecArray; + if (match[7] === "Z" || match[7] === "-00:00") return true; + const parts = Object.fromEntries( + new Intl.DateTimeFormat("en-US-u-ca-iso8601-nu-latn", { + timeZone, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + hourCycle: "h23" + }) + .formatToParts(new Date(timestamp)) + .filter((part) => part.type !== "literal") + .map((part) => [part.type, part.value]) + ); + return ( + String(parts.year).padStart(4, "0") === match[1] && + parts.month === match[2] && + parts.day === match[3] && + parts.hour === match[4] && + parts.minute === match[5] && + parts.second === match[6] + ); +} + +/** Validate one source receipt. */ +function validateEvidenceReceipt(value: unknown, path: string): string | null { + if (!isRecord(value)) return `${path} must be an object`; + const extra = unexpectedKey(value, ["field", "value"], path); + if (extra) return `${extra} is not allowed`; + if (!isDisplayText(value.field, MAX_IDENTIFIER_LENGTH)) return `${path}.field is invalid`; + if (!isDisplayText(value.value)) return `${path}.value is invalid`; + return null; +} + +/** Validate one stable boundary snapshot without rereading caller-owned values. */ +function validateSnapshot(value: unknown): string | null { + if (!isRecord(value)) return "root must be an object"; + const rootExtra = unexpectedKey( + value, + [ + "artifactKind", + "artifactVersion", + "createdAt", + "source", + "normGroup", + "event", + "commitment", + "provenance" + ], + "root" + ); + if (rootExtra) return `${rootExtra} is not allowed`; + if (value.artifactKind !== NARUON_REHEARSAL_HANDOFF_KIND) return "artifactKind is invalid"; + if (value.artifactVersion !== NARUON_REHEARSAL_HANDOFF_VERSION) return "artifactVersion is invalid"; + if (!isRfc3339(value.createdAt)) return "createdAt is invalid"; + + if (!isRecord(value.source)) return "source must be an object"; + const sourceExtra = unexpectedKey( + value.source, + ["application", "workspaceId", "bandId", "rehearsalId"], + "source" + ); + if (sourceExtra) return `${sourceExtra} is not allowed`; + if (value.source.application !== "bandscope") return "source.application is invalid"; + for (const field of ["workspaceId", "bandId", "rehearsalId"] as const) { + if (!isOpaqueIdentifier(value.source[field])) return `source.${field} is invalid`; + } + + if (!isRecord(value.normGroup)) return "normGroup must be an object"; + const normExtra = unexpectedKey(value.normGroup, ["kind", "id", "label"], "normGroup"); + if (normExtra) return `${normExtra} is not allowed`; + if (value.normGroup.kind !== "band") return "normGroup.kind is invalid"; + if (!isOpaqueIdentifier(value.normGroup.id)) return "normGroup.id is invalid"; + if (!isDisplayText(value.normGroup.label)) return "normGroup.label is invalid"; + if (value.normGroup.id !== value.source.bandId) return "normGroup.id must equal source.bandId"; + + if (!isRecord(value.event)) return "event must be an object"; + const eventExtra = unexpectedKey( + value.event, + ["title", "startsAt", "endsAt", "timeZone", "venue"], + "event" + ); + if (eventExtra) return `${eventExtra} is not allowed`; + if (!isDisplayText(value.event.title)) return "event.title is invalid"; + if (!isRfc3339(value.event.startsAt)) return "event.startsAt is invalid"; + if (!isRfc3339(value.event.endsAt)) return "event.endsAt is invalid"; + if (Date.parse(value.event.endsAt) <= Date.parse(value.event.startsAt)) { + return "event.endsAt must be later than event.startsAt"; + } + if (!isTimeZone(value.event.timeZone)) return "event.timeZone is invalid"; + if (!isOffsetConsistentWithTimeZone(value.event.startsAt, value.event.timeZone)) { + return "event.startsAt offset is inconsistent with event.timeZone"; + } + if (!isOffsetConsistentWithTimeZone(value.event.endsAt, value.event.timeZone)) { + return "event.endsAt offset is inconsistent with event.timeZone"; + } + if (value.event.venue !== undefined && !isDisplayText(value.event.venue)) { + return "event.venue is invalid"; + } + + if (!isRecord(value.commitment)) return "commitment must be an object"; + const commitmentExtra = unexpectedKey( + value.commitment, + ["status", "rsvpDirection"], + "commitment" + ); + if (commitmentExtra) return `${commitmentExtra} is not allowed`; + if (!isOneOf(COMMITMENT_STATUSES, value.commitment.status)) { + return "commitment.status is invalid"; + } + if (!isOneOf(RSVP_DIRECTIONS, value.commitment.rsvpDirection)) { + return "commitment.rsvpDirection is invalid"; + } + + if (!isRecord(value.provenance)) return "provenance must be an object"; + const provenanceExtra = unexpectedKey( + value.provenance, + ["sourceRecordId", "confidence", "evidence"], + "provenance" + ); + if (provenanceExtra) return `${provenanceExtra} is not allowed`; + if (!isOpaqueIdentifier(value.provenance.sourceRecordId)) { + return "provenance.sourceRecordId is invalid"; + } + if ( + typeof value.provenance.confidence !== "number" || + !Number.isFinite(value.provenance.confidence) || + value.provenance.confidence < 0 || + value.provenance.confidence > 1 + ) { + return "provenance.confidence is invalid"; + } + if ( + !isDenseArray(value.provenance.evidence, MAX_NARUON_EVIDENCE_RECEIPTS) || + value.provenance.evidence.length < 1 + ) { + return "provenance.evidence is invalid"; + } + for (let index = 0; index < value.provenance.evidence.length; index += 1) { + const error = validateEvidenceReceipt( + value.provenance.evidence[index], + `provenance.evidence[${index}]` + ); + if (error) return error; + } + return null; +} + +/** + * Validate an unknown value at the BandScope → naruon trust boundary. + * + * The validator is intentionally side-effect-free and fail-closed. Parsing + * snapshots caller-owned values before validation so validation and + * canonicalization cannot observe different states. + */ +export function validateNaruonRehearsalHandoff(value: unknown): string | null { + const snapshot = snapshotBoundaryValue(value); + return snapshot.ok ? validateSnapshot(snapshot.value) : snapshot.error; +} + +/** Return whether a value satisfies the complete handoff contract. */ +export function isNaruonRehearsalHandoff(value: unknown): value is NaruonRehearsalHandoff { + return validateNaruonRehearsalHandoff(value) === null; +} + +/** Canonicalize one already validated, stable snapshot. */ +function canonicalizeSnapshot(value: Record): NaruonRehearsalHandoff { + const source = value.source as NaruonHandoffSource; + const normGroup = value.normGroup as NaruonBandNormGroup; + const event = value.event as NaruonRehearsalEvent; + const commitment = value.commitment as NaruonRehearsalCommitment; + const provenance = value.provenance as NaruonHandoffProvenance; + return { + artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, + artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION, + createdAt: value.createdAt as string, + source: { + application: source.application, + workspaceId: source.workspaceId, + bandId: source.bandId, + rehearsalId: source.rehearsalId + }, + normGroup: { + kind: normGroup.kind, + id: normGroup.id, + label: normGroup.label + }, + event: + event.venue === undefined + ? { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone + } + : { + title: event.title, + startsAt: event.startsAt, + endsAt: event.endsAt, + timeZone: event.timeZone, + venue: event.venue + }, + commitment: { + status: commitment.status, + rsvpDirection: commitment.rsvpDirection + }, + provenance: { + sourceRecordId: provenance.sourceRecordId, + confidence: provenance.confidence, + evidence: provenance.evidence.map((receipt) => ({ + field: receipt.field, + value: receipt.value + })) + } + }; +} + +/** Parse and canonicalize an unknown handoff, throwing on contract violations. */ +export function parseNaruonRehearsalHandoff(value: unknown): NaruonRehearsalHandoff { + const snapshot = snapshotBoundaryValue(value); + if (!snapshot.ok) { + throw new TypeError(`Invalid naruon rehearsal handoff: ${snapshot.error}`); + } + const error = validateSnapshot(snapshot.value); + if (error) { + throw new TypeError(`Invalid naruon rehearsal handoff: ${error}`); + } + return canonicalizeSnapshot(snapshot.value as Record); +} + +/** Build a canonical versioned handoff from application-owned fields. */ +export function createNaruonRehearsalHandoff( + input: CreateNaruonRehearsalHandoffInput +): NaruonRehearsalHandoff { + return parseNaruonRehearsalHandoff({ + ...input, + artifactKind: NARUON_REHEARSAL_HANDOFF_KIND, + artifactVersion: NARUON_REHEARSAL_HANDOFF_VERSION + }); +} + +/** Serialize a validated handoff as deterministic newline-terminated JSON. */ +export function serializeNaruonRehearsalHandoff(value: unknown): string { + return `${JSON.stringify(parseNaruonRehearsalHandoff(value))}\n`; +} + +/** Return the UTF-8 size without allocating for inputs already above the limit. */ +function serializedByteLength(value: string): number { + if (value.length > MAX_NARUON_SERIALIZED_BYTES) return value.length; + return new TextEncoder().encode(value).byteLength; +} + +/** Parse bounded JSON text and validate the resulting handoff at the same trust boundary. */ +export function deserializeNaruonRehearsalHandoff(serialized: unknown): NaruonRehearsalHandoff { + if ( + typeof serialized !== "string" || + serializedByteLength(serialized) > MAX_NARUON_SERIALIZED_BYTES + ) { + throw new TypeError( + "Invalid naruon rehearsal handoff JSON: serialized payload is invalid or oversized" + ); + } + let value: unknown; + try { + value = JSON.parse(serialized); + } catch { + throw new TypeError("Invalid naruon rehearsal handoff JSON: malformed JSON"); + } + return parseNaruonRehearsalHandoff(value); +} From 80147750f5d9c2a40c866f3f32ce5cb54b8b6472 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 3 Aug 2026 19:56:38 +0900 Subject: [PATCH 59/74] docs(integration): distinguish signed bytes from canonical values --- docs/integrations/naruon.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md index e0ff73b26..077b1d77f 100644 --- a/docs/integrations/naruon.md +++ b/docs/integrations/naruon.md @@ -65,7 +65,7 @@ const artifact = createNaruonRehearsalHandoff({ const json = serializeNaruonRehearsalHandoff(artifact); ``` -Consumers receiving untrusted bytes must call `deserializeNaruonRehearsalHandoff` or `parseNaruonRehearsalHandoff` before use. Serialized handoffs are limited to 256 KiB of UTF-8 and are size-checked before JSON parsing. +Consumers receiving untrusted bytes must call `deserializeNaruonRehearsalHandoff` or `parseNaruonRehearsalHandoff` before use. Serialized handoffs are limited to 256 KiB of UTF-8 and are size-checked before JSON parsing. Preserve original transport bytes separately only when a detached-signature verification workflow requires them; application logic should use the validated canonical value. ## Boundary guarantees From 00c957fa92da2619a5217e8d7e7988ed120d05a6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 12 Aug 2026 03:03:04 +0900 Subject: [PATCH 60/74] fix(security): require patched PDF.js --- apps/desktop/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e7685d6f0..647047e31 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -20,7 +20,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^1.24.0", - "pdfjs-dist": "6.1.200", + "pdfjs-dist": "^6.2.108", "react": "^19.2.4", "react-dom": "^19.2.7", "sonner": "^2.0.7", From c3075b92790e26112570d13f7a52a1f68382f21a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 12 Aug 2026 03:03:17 +0900 Subject: [PATCH 61/74] fix(security): refresh vulnerable npm transitive pins --- package-lock.json | 2943 +++++++++++++++++++++++---------------------- 1 file changed, 1514 insertions(+), 1429 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf1c991c1..abc0775cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,11 @@ "apps/*", "packages/*" ], + "dependencies": { + "nanoid": "^3.3.18", + "pdfjs-dist": "^6.2.108", + "undici": "^7.29.0" + }, "devDependencies": { "@eslint/js": "^10.0.1", "eslint-plugin-jsdoc": "^63.0.13", @@ -32,7 +37,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^1.24.0", - "pdfjs-dist": "6.1.200", + "pdfjs-dist": "^6.2.108", "react": "^19.2.4", "react-dom": "^19.2.7", "sonner": "^2.0.7", @@ -60,252 +65,10 @@ "vitest": "^4.1.10" } }, - "apps/desktop/node_modules/@types/react-dom": { - "version": "19.2.3", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "apps/desktop/node_modules/@vitest/coverage-v8": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", - "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.10", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "4.1.10", - "vitest": "4.1.10" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "apps/desktop/node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "apps/desktop/node_modules/@vitest/mocker": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", - "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.10", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "apps/desktop/node_modules/@vitest/pretty-format": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", - "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "apps/desktop/node_modules/@vitest/runner": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", - "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.10", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "apps/desktop/node_modules/@vitest/snapshot": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", - "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.10", - "@vitest/utils": "4.1.10", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "apps/desktop/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "apps/desktop/node_modules/@vitest/utils": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", - "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.10", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "apps/desktop/node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.10", - "@vitest/mocker": "4.1.10", - "@vitest/pretty-format": "4.1.10", - "@vitest/runner": "4.1.10", - "@vitest/snapshot": "4.1.10", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.10", - "@vitest/browser-preview": "4.1.10", - "@vitest/browser-webdriverio": "4.1.10", - "@vitest/coverage-istanbul": "4.1.10", - "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@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 - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", "dev": true, "license": "MIT" }, @@ -427,14 +190,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -567,13 +330,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -583,9 +346,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -607,18 +370,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "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.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -626,9 +389,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { @@ -648,15 +411,15 @@ "link": true }, "node_modules/@base-ui/react": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.5.0.tgz", - "integrity": "sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.7.0.tgz", + "integrity": "sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", - "@base-ui/utils": "0.2.9", - "@floating-ui/react-dom": "^2.1.8", - "@floating-ui/utils": "^0.2.11", + "@base-ui/utils": "0.3.2", + "@floating-ui/react-dom": "^2.1.9", + "@floating-ui/utils": "^0.2.12", "use-sync-external-store": "^1.6.0" }, "engines": { @@ -686,14 +449,14 @@ } }, "node_modules/@base-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.2.tgz", + "integrity": "sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", - "@floating-ui/utils": "^0.2.11", - "reselect": "^5.1.1", + "@floating-ui/utils": "^0.2.12", + "reselect": "^5.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { @@ -731,9 +494,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", "dev": true, "funding": [ { @@ -751,9 +514,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", "dev": true, "funding": [ { @@ -775,9 +538,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.3.tgz", - "integrity": "sha512-DOgvIPkikIOixQRlD4YF31VN6fLLUTdrzhfRbis8vm0kMTgIbEPX0Ip/YX9fOeV9iywAS4sUUbTclpan7yYP8Q==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", + "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", "dev": true, "funding": [ { @@ -791,8 +554,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.2.1" + "@csstools/color-helpers": "^6.1.0", + "@csstools/css-calc": "^3.3.0" }, "engines": { "node": ">=20.19.0" @@ -826,9 +589,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", - "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", "dev": true, "funding": [ { @@ -871,32 +634,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", "dev": true, "license": "MIT", "optional": true, @@ -916,17 +668,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.88.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.88.0.tgz", - "integrity": "sha512-GK/HL/claLLNo5KG705auIlZMwEtmn88ofSGuLsmVZwKBqMPJhW9DiznYNq07QEqz9BPtA3LBfYImtZmhVvRAw==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.91.0.tgz", + "integrity": "sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.9", - "@typescript-eslint/types": "^8.59.4", + "@typescript-eslint/types": "^8.65.0", "comment-parser": "1.4.7", "esquery": "^1.7.0", - "jsdoc-type-pratt-parser": "~7.2.0" + "jsdoc-type-pratt-parser": "~8.0.0" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -943,9 +695,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -955,15 +707,14 @@ "os": [ "aix" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -973,15 +724,14 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -991,15 +741,14 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -1009,15 +758,14 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -1027,15 +775,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -1045,15 +792,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -1063,15 +809,14 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -1081,15 +826,14 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -1099,15 +843,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -1117,15 +860,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -1135,15 +877,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -1153,15 +894,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -1171,15 +911,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -1189,15 +928,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -1207,15 +945,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -1225,15 +962,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -1243,15 +979,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -1261,15 +996,14 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -1279,15 +1013,14 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -1297,15 +1030,14 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -1315,15 +1047,14 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -1333,15 +1064,14 @@ "os": [ "openharmony" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -1351,15 +1081,14 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -1369,15 +1098,14 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -1387,15 +1115,14 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -1405,15 +1132,14 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { @@ -1468,9 +1194,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", - "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1539,9 +1265,9 @@ } }, "node_modules/@exodus/bytes": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", - "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", "dev": true, "license": "MIT", "engines": { @@ -1557,31 +1283,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.11" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.6" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -1589,44 +1315,58 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@fontsource-variable/geist": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.2.9.tgz", - "integrity": "sha512-TP+QSBG3wxKGPE33CbMy/L0Nu3qvJ6Fy81Yc4LnQ95xH+i+cfEp8fyU8/kfV14YwszxIFPhnoMTbjL71waVpyQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.3.0.tgz", + "integrity": "sha512-j0m+vLQuG5XAYoHtGCVu0spvlGreR3EzpECUVzkFmI1mTVnAO38l/NEPDCFgZ177JxzYJCLSmTQibIiYPilGrA==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1726,9 +1466,9 @@ } }, "node_modules/@napi-rs/canvas": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.2.tgz", - "integrity": "sha512-EYEqlMYaCbpZDz+IgDH5xp9MTd3ui4dmGqbQYryhMLnSRxrhHKq5KQWHHKxFUcEP4Hp8/BWgvqXocX4j7iSbOQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.5.tgz", + "integrity": "sha512-GaPlicMtnvgPr5SowFRprkEJicDSrV3qCq17U4jiF5u0kNORZo3IbdN2Bk4SfcZJAMYFHbMVJ81O3w21CYxazg==", "license": "MIT", "optional": true, "workspaces": [ @@ -1742,23 +1482,23 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "1.0.2", - "@napi-rs/canvas-darwin-arm64": "1.0.2", - "@napi-rs/canvas-darwin-x64": "1.0.2", - "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.2", - "@napi-rs/canvas-linux-arm64-gnu": "1.0.2", - "@napi-rs/canvas-linux-arm64-musl": "1.0.2", - "@napi-rs/canvas-linux-riscv64-gnu": "1.0.2", - "@napi-rs/canvas-linux-x64-gnu": "1.0.2", - "@napi-rs/canvas-linux-x64-musl": "1.0.2", - "@napi-rs/canvas-win32-arm64-msvc": "1.0.2", - "@napi-rs/canvas-win32-x64-msvc": "1.0.2" + "@napi-rs/canvas-android-arm64": "1.0.5", + "@napi-rs/canvas-darwin-arm64": "1.0.5", + "@napi-rs/canvas-darwin-x64": "1.0.5", + "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.5", + "@napi-rs/canvas-linux-arm64-gnu": "1.0.5", + "@napi-rs/canvas-linux-arm64-musl": "1.0.5", + "@napi-rs/canvas-linux-riscv64-gnu": "1.0.5", + "@napi-rs/canvas-linux-x64-gnu": "1.0.5", + "@napi-rs/canvas-linux-x64-musl": "1.0.5", + "@napi-rs/canvas-win32-arm64-msvc": "1.0.5", + "@napi-rs/canvas-win32-x64-msvc": "1.0.5" } }, "node_modules/@napi-rs/canvas-android-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.2.tgz", - "integrity": "sha512-IMXKVQod0ol4vt3gmClUfXz4JAgHYESGPCUqmH3lQxBoL0K/2greJaQE1HVBVxWWFKfLc4OLZVdxg7kXVyXv+g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.5.tgz", + "integrity": "sha512-ZzDlpKQocwFfCwhMh17UWre6Qt5yZN3kNIJoUpGfRZqwDDZ164IKOsPOHsRd3d8Tuj5KM6bDjGuPmZxuPuG3NQ==", "cpu": [ "arm64" ], @@ -1776,9 +1516,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-Sc8tPi6cF+5lqOzCCKFALJHhDiRwyMzTPYm3bbhdXsOunU0lQO5f05ucyOzN2r55I23Hg5bsjH63uSCvWp3EgQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.5.tgz", + "integrity": "sha512-Hr8v6CA/TBe+OJOePdV3sXWxzQHQKfQsTKPbc8wG7iPqVeAx6MMdzKGXlYID6SVvpfwV/zqkvGcdImYWSlhrZg==", "cpu": [ "arm64" ], @@ -1796,9 +1536,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.2.tgz", - "integrity": "sha512-niDXZ9LhKB1zLrUdYB64RHQFDGz9rr0eGx061qtJJU3U20EMMIx28ADF5fVYbhtOgkWQrBjFicfaye1yM0U62A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.5.tgz", + "integrity": "sha512-9BXlLHBXpYnK4jSae1MdFdyPq09Xi1I3PeCNpvRzqgmUUBhgJS7aC1z7SZEP8JUXDHtbfIrolCS3sFuT9IGP2A==", "cpu": [ "x64" ], @@ -1816,9 +1556,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.2.tgz", - "integrity": "sha512-sgatQL9JxGRH/Amzcvu0P3t8Am3duou74CisfuJ41Dwt8cWy723z/9KZ8LlgmxfypEwEZxSTNFJtU8d281lmhQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.5.tgz", + "integrity": "sha512-zEW4fgvtYsOJ/N56Us4TQPfaFrUf0shGr9CgGSj3GACc+NHfUM3ci0YF9xFTjwJWGDmaEhYPL6KqCfFCxwm/qg==", "cpu": [ "arm" ], @@ -1836,12 +1576,15 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.2.tgz", - "integrity": "sha512-dgKuX0peF3xwY6ZF5QxGS4wbfDqpoFAJYXiLSp+guZKARQUKMkRqZSDrXKj7nfrec3UCMzC0PFCPte0ES98AiA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.5.tgz", + "integrity": "sha512-HFprwLspelJxCEtZvdMcz95Mwvfs63GzFVedLFmC/wslHnaOXhjXxgYxPCM/VdM4Jhx3CV4Lk0vVmh6hJv2etQ==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1856,12 +1599,15 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.2.tgz", - "integrity": "sha512-qwROoDIC9upfvDoRLuPn2aNg9CGW1x0Ygr4k2Or+8paA9d0qBLwk87U+g8KQpoOviKoPoiwl97kvBYuYD7qZoA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.5.tgz", + "integrity": "sha512-FNMGFAx8DvtDwlLfWyBJ+oQjgPXoIAqCnNTJYqtJCFRwwzK3AyAe5B1Ll3NZ6hcOzqw7HylZsq4nQxVyPCQX1Q==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1876,12 +1622,15 @@ } }, "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.2.tgz", - "integrity": "sha512-fXRjnPihdnbO6qy1QQOgxAonb68A0TCEG7rj1x7v7rxNElsE8EVIKIEUTvyDtU+sthYSbX+8e7g3oZiLGnOmxw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.5.tgz", + "integrity": "sha512-2vd5v8Lui+37Hh/spITKIvTT384ip4dnUc5XBn0E+sMNS4b7au7IswyT5YDG2udPTjSh/eLUs3sGuB5YHooFOA==", "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1896,12 +1645,15 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.2.tgz", - "integrity": "sha512-nPR97DXhbWIAy7yazF3jc06kEPMqYMLmPzFOVNlwKPfIoSChnI+x7dc0hTLaihz3jxrjL6j4BbA7earxfx4X3g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.5.tgz", + "integrity": "sha512-iQIPy+Uey0expZTOszLri5n8rY7x4WUpMaY82mcXNIgbil30iHvc01OsiizhZC1KQHTK90RFMFWSpwFU+ON3aA==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1916,12 +1668,15 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.2.tgz", - "integrity": "sha512-l7zZY5+jL5qnBZtDz7CoBtY6p7EkHu422g/0zWwrOrzIwWyWxZFRfZZORY1UG7YApymPLx+UbOkN206xXn/c1Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.5.tgz", + "integrity": "sha512-Npthji25t7FUqIAKsoEkFS0qY5CYVkHjvI3tuZjDTG92wX8g4dst+Lfb4hhubdqPazlDcIwalPzInsFCtf3FFg==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1936,9 +1691,9 @@ } }, "node_modules/@napi-rs/canvas-win32-arm64-msvc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.2.tgz", - "integrity": "sha512-yE0koHCFF4PIbMc2o2SEALhnipz7WBISh5glLvQiomtIoCcW0np3H4Lw93ceJAfJttTTeIIWFbwH84F7EVzjMQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.5.tgz", + "integrity": "sha512-bi+JsdCdbfVJDoAQybTYmkLKwh1xpYpptg5j/BNr2BB56u4/R26jrVvtjqff+CxYMXV6Kz1/jeDVhZCuj6bDng==", "cpu": [ "arm64" ], @@ -1956,9 +1711,9 @@ } }, "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.2.tgz", - "integrity": "sha512-okU8/t2foV6C31n0GtvEMbfD5rOFc70+/6xUNME9Guld29sgSOIGUEDScAWFlcP3k5TYQRl9TNkwJEEjh15w8A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.5.tgz", + "integrity": "sha512-KQQwG9/sBmcGxqaLFIQf+k2OefREGoyEaIBmRuTM8bUuFKOEE9Xk5pel90hE6pmBwk/vo4RB0OdX+FxobJGMFw==", "cpu": [ "x64" ], @@ -1976,22 +1731,25 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", + "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" } }, "node_modules/@oxc-parser/binding-android-arm-eabi": { @@ -2121,6 +1879,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2138,6 +1899,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2155,6 +1919,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2172,6 +1939,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2189,6 +1959,9 @@ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2206,6 +1979,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2223,6 +1999,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2240,6 +2019,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2285,29 +2067,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@oxc-parser/binding-win32-arm64-msvc": { "version": "0.127.0", "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", @@ -2360,9 +2119,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.139.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", "dev": true, "license": "MIT", "funding": { @@ -2370,9 +2129,9 @@ } }, "node_modules/@oxc-resolver/binding-android-arm-eabi": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.23.0.tgz", - "integrity": "sha512-8IJyWRLVAyhTfe9/TIEbQqSQnl5rUqYJrUOS6Dkr+Mq9FGHMxDGeiEmwkBqCvDP5KckpPh/GYSgbag66O6JsCw==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.24.2.tgz", + "integrity": "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==", "cpu": [ "arm" ], @@ -2384,9 +2143,9 @@ ] }, "node_modules/@oxc-resolver/binding-android-arm64": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.23.0.tgz", - "integrity": "sha512-pprVojnNhHxupwTT2gdeUlkxll6XEvWWBk3oVicOSNVWQC99OBnDhMQDoirqnzrE1bScQSMS2JgPpqdlrhz/Fg==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.24.2.tgz", + "integrity": "sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==", "cpu": [ "arm64" ], @@ -2398,9 +2157,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.23.0.tgz", - "integrity": "sha512-mbIrWIMAJeytyee36OyUP5XH92TP7FaKaQ2m5AjokKy7STgjrhRt7SMXqpqLjhGm6Xn721Xmsg6H3Rtd9YQETw==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.24.2.tgz", + "integrity": "sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==", "cpu": [ "arm64" ], @@ -2412,9 +2171,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.23.0.tgz", - "integrity": "sha512-UnIphmZ1LazUCr9DXWaKYWtKDefPMbgLsywaoYxRqVCNHhq4MM6d2q1Nz1i9Vzxt5i+cE2nRUYpAUHr/lijNYA==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.24.2.tgz", + "integrity": "sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==", "cpu": [ "x64" ], @@ -2426,9 +2185,9 @@ ] }, "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.23.0.tgz", - "integrity": "sha512-aaZ/cSEYFkSxgS2hOrobT6RQcsWNviOX8dW6CEkVx2/UYkAf9MeHbjl3W0usWV53rVV//ndBdn2nb1y7jsu4lw==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.24.2.tgz", + "integrity": "sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==", "cpu": [ "x64" ], @@ -2440,9 +2199,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.23.0.tgz", - "integrity": "sha512-IoJLvO5SjLSVMaq83BNTrPCb1FppvoJc1IhZ5CoUVl3PykUBku7D+LK1j0GSurhJcIc6zfjghsvaZNpq5ev6Mg==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.24.2.tgz", + "integrity": "sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==", "cpu": [ "arm" ], @@ -2454,9 +2213,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.23.0.tgz", - "integrity": "sha512-vskFpwg44T/LFsfjSCnVZ5ygcuqzPC1yUzVEiKa8BgHAQz0+QLQQW3EGWLPVi8EXFghzjR4EtgPBtOhCjU4jdw==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.24.2.tgz", + "integrity": "sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==", "cpu": [ "arm" ], @@ -2468,13 +2227,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.23.0.tgz", - "integrity": "sha512-//TcHVhrChyw5RYtgts6WO7KcWq9387c1Z5Zvhqpk/ktAbyaRYgBZrpSY1GDCFq50ASt6B6jhh+JxB1rB45IAg==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.24.2.tgz", + "integrity": "sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2482,13 +2244,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.23.0.tgz", - "integrity": "sha512-ZFqlwiTf7CXLLSGyAR9tYiO33LiaeIEXW+xm42d8mnUGpDgPltyrCGYtQezyMMEXvjhOgCz1X+i7sbDTJEx+bg==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.24.2.tgz", + "integrity": "sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2496,13 +2261,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.23.0.tgz", - "integrity": "sha512-oZ5LeN5+H1R19dRjTAxKrxQguH+AsemHcnthEfFxf4OjmBSty2doHLeSmMunKy3zpTHJQ3lh3Af+dNS+W6dYeA==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.24.2.tgz", + "integrity": "sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2510,13 +2278,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.23.0.tgz", - "integrity": "sha512-O4ciFDyX5ebQd0qkb1bjAIg8IEfiLT03GbSeylwlwlUMK9KwBWaALwrxSbc0Msaz4U6iPj+T9eRXpD5mxBfmvA==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.24.2.tgz", + "integrity": "sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2524,13 +2295,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.23.0.tgz", - "integrity": "sha512-P3o8Y9kISYjcxadmbO+94ThRwLhwGuDAbA7dcdd4+YLpfeF+mmobz8fXf4NmSdfSqjyRSkceJDBRZha9NVYkiQ==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.24.2.tgz", + "integrity": "sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2538,13 +2312,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.23.0.tgz", - "integrity": "sha512-oj03m1E3RmTFczKhcKJDzHaEDKJnPIsDcQFVxBJsSdXGSuIPdt5TvcM332FfMQgzI6yDJqyl4InrnFfXrmUTKQ==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.24.2.tgz", + "integrity": "sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2552,13 +2329,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.23.0.tgz", - "integrity": "sha512-BqJxbSC8FdP7mSuSpRePTGHm0hXWV+dfz//f7SjsteZncLaBgWTBmi/OZNv7sX6CyG/Pt/eJkPorP+DkMOhMwQ==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.24.2.tgz", + "integrity": "sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2566,13 +2346,16 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.23.0.tgz", - "integrity": "sha512-utmw+VmUrW4K8LI5/6jhg4aGYKJHOIjQ9syYOOA6pF3w7haKu4r4enTe2U0C04/HbUvkq/Zif43xFsKW1Pnq9w==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.24.2.tgz", + "integrity": "sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2580,9 +2363,9 @@ ] }, "node_modules/@oxc-resolver/binding-openharmony-arm64": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.23.0.tgz", - "integrity": "sha512-V6lbRrthHa4TbvsLjPtg+EkXT1tRY+s4I8rYLXUfiHlZzGx3sLv1EH9CEOOevjvUYHLsbe/gqCIc73XnQfPb9A==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.24.2.tgz", + "integrity": "sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==", "cpu": [ "arm64" ], @@ -2594,9 +2377,9 @@ ] }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.23.0.tgz", - "integrity": "sha512-gRoOxQPdnAmIAjxcuQNBxfihvx+wjTaQM/9/eP12xwnGNawOG/+Zz9RHN4WNSxT45b5CrscK4NB8aPh+oZQXAQ==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.24.2.tgz", + "integrity": "sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==", "cpu": [ "wasm32" ], @@ -2604,18 +2387,52 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", + "@emnapi/core": "1.11.2", + "@emnapi/runtime": "1.11.2", "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { "node": ">=14.0.0" } }, + "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.23.0.tgz", - "integrity": "sha512-CgTGMYsJVe1eUiCdJTpGw21svXw79ITsemN1h0hcNkiswasDbN5MoibSLY+gRMWP5syfEz5iffrjZnwEP8xeUA==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.24.2.tgz", + "integrity": "sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==", "cpu": [ "arm64" ], @@ -2627,9 +2444,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.23.0.tgz", - "integrity": "sha512-gUGJpr+Rn6zMxm5juApV0K3U845i8t47o8k+rbO0BHbi4PoJIfSPeQmrE2dgohQm2g5k6iviNFyXCGqvmaYUpw==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.24.2.tgz", + "integrity": "sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==", "cpu": [ "x64" ], @@ -2641,9 +2458,9 @@ ] }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", "cpu": [ "arm64" ], @@ -2658,9 +2475,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", "cpu": [ "arm64" ], @@ -2675,9 +2492,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", "cpu": [ "x64" ], @@ -2692,9 +2509,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", "cpu": [ "x64" ], @@ -2709,9 +2526,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", "cpu": [ "arm" ], @@ -2726,13 +2543,16 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2743,13 +2563,16 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2760,13 +2583,16 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2777,13 +2603,16 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2794,13 +2623,16 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2811,13 +2643,16 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2828,9 +2663,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", "cpu": [ "arm64" ], @@ -2844,29 +2679,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", "cpu": [ "arm64" ], @@ -2881,9 +2697,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", "cpu": [ "x64" ], @@ -2927,13 +2743,6 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/@sindresorhus/base62": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", @@ -2955,13 +2764,13 @@ "license": "MIT" }, "node_modules/@storybook/builder-vite": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.4.6.tgz", - "integrity": "sha512-BHBtD81HiXUiDQz/CaFynLtWmm7AFUQn8VnXuHipZ8KlnUANopa4yqdVuy/Gwz8ub254uFI5NMZsW/KlgWNgNg==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.5.7.tgz", + "integrity": "sha512-fShF/aQaITqcJuMCLr42BGNUAbhDi4IboqvlbZqXAwgrrTslnZEUnY8GcEcvpZmjl11VwlmazhMJdH50fIgBPg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "10.4.6", + "@storybook/csf-plugin": "10.5.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -2969,14 +2778,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.4.6", + "storybook": "^10.5.7", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.4.6.tgz", - "integrity": "sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.7.tgz", + "integrity": "sha512-IaX8FlM0H36HNFhJ2+4L9bCldqfvHGqcLg841SJNyK/DhfMlM7JsvY/GDH2ZFuWrUf8FSOx96GRRnHq6XfRKag==", "dev": true, "license": "MIT", "dependencies": { @@ -2989,7 +2798,7 @@ "peerDependencies": { "esbuild": "*", "rollup": "*", - "storybook": "^10.4.6", + "storybook": "^10.5.7", "vite": "*", "webpack": "*" }, @@ -3026,14 +2835,14 @@ } }, "node_modules/@storybook/react": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.4.6.tgz", - "integrity": "sha512-9Y7YecrVFe1/01KYjfOLxVqTg2Aq+IO6TEv6sC2U0PfD0AWCSCmQ91QqgBpN/XW4aFFWoiZNinyXMUlU8zxy2w==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.7.tgz", + "integrity": "sha512-uFvty2MMdFXzW5PcQe1JqDAZkz6cQq7q/9G/cbGVnBEvP6zsOVeL+bmrQ0/WBlFQN0Ko9+ZoCTvaQ9s65zBa5g==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.4.6", + "@storybook/react-dom-shim": "10.5.7", "react-docgen": "^8.0.2", "react-docgen-typescript": "^2.2.2" }, @@ -3046,7 +2855,7 @@ "@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.4.6", + "storybook": "^10.5.7", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -3062,9 +2871,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.4.6.tgz", - "integrity": "sha512-iGNmKzrq9vgl2PDrYAnZKI+yvac3Ym+lJXXuQaqlFRS23zA5MNm4EBX+rAG7WulqchoK6NaZ0KQOs2mAgEpTMg==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.7.tgz", + "integrity": "sha512-lxOkyh+wu/MiBXvYQHjZfD+DRKOa4bHBzbuGuiHXnHXmdOcTRdcrQTsoeN2FPtfugmmOG66cZUEgDwNX+k5eRA==", "dev": true, "license": "MIT", "funding": { @@ -3076,7 +2885,7 @@ "@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.4.6" + "storybook": "^10.5.7" }, "peerDependenciesMeta": { "@types/react": { @@ -3088,19 +2897,19 @@ } }, "node_modules/@storybook/react-vite": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.4.6.tgz", - "integrity": "sha512-0arEQtybqGYXHbXpTot+Wv9YtG+V5Vp43QayXavPKQ20M8mpEzhyCPKd0EhqMGSC1Z1UEt0hm365WUBhI9LfKA==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.5.7.tgz", + "integrity": "sha512-eEo3eVa2pvqrzQukKxAzx7YvswDAA1s6k/y+tdMxmRvWyHX6QEOsb9Tda6wcVaa7c8BeJM7Ggq+289cRMTH6Iw==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.4.6", - "@storybook/react": "10.4.6", + "@storybook/builder-vite": "10.5.7", + "@storybook/react": "10.5.7", "empathic": "^2.0.0", "magic-string": "^0.30.0", - "react-docgen": "^8.0.0", + "react-docgen": "^8.0.2", "resolve": "^1.22.8", "tsconfig-paths": "^4.2.0" }, @@ -3111,54 +2920,60 @@ "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.4.6", + "storybook": "^10.5.7", + "typescript": ">= 4.9.x", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@tailwindcss/node": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", - "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", + "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.2" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", - "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-x64": "4.3.2", - "@tailwindcss/oxide-freebsd-x64": "4.3.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-x64-musl": "4.3.2", - "@tailwindcss/oxide-wasm32-wasi": "4.3.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", - "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", "cpu": [ "arm64" ], @@ -3173,9 +2988,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", - "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ "arm64" ], @@ -3190,9 +3005,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", - "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ "x64" ], @@ -3207,9 +3022,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", - "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ "x64" ], @@ -3224,9 +3039,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", - "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ "arm" ], @@ -3241,13 +3056,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", - "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3258,13 +3076,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", - "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3275,13 +3096,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", - "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3292,13 +3116,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", - "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3309,9 +3136,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", - "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -3338,76 +3165,10 @@ "node": ">=14.0.0" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", - "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -3422,9 +3183,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", - "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -3439,24 +3200,24 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", - "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.2", - "@tailwindcss/oxide": "4.3.2", - "tailwindcss": "4.3.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "node_modules/@tauri-apps/api": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.0.tgz", - "integrity": "sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz", + "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", "license": "Apache-2.0 OR MIT", "funding": { "type": "opencollective", @@ -3552,6 +3313,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3569,6 +3333,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3586,6 +3353,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3603,6 +3373,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3620,6 +3393,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3686,7 +3462,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3757,9 +3532,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "version": "14.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.3.tgz", + "integrity": "sha512-6dBq67jT8lE+JTE8Exm02Kt6ze43hz1jdiSpSJwtTZiT1xQQ6b7nZYTTQ9njdArdU8XklOwaDp/AbT/eYSKF4g==", "dev": true, "license": "MIT", "engines": { @@ -3786,8 +3561,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -3881,9 +3655,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", + "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", "dev": true, "license": "MIT", "dependencies": { @@ -3891,15 +3665,25 @@ } }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" } }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@types/resolve": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", @@ -3908,17 +3692,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.63.0.tgz", - "integrity": "sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.66.0.tgz", + "integrity": "sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.63.0", - "@typescript-eslint/type-utils": "8.63.0", - "@typescript-eslint/utils": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/type-utils": "8.66.0", + "@typescript-eslint/utils": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -3931,7 +3715,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.63.0", + "@typescript-eslint/parser": "^8.66.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -3947,16 +3731,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.63.0.tgz", - "integrity": "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz", + "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.63.0", - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", "debug": "^4.4.3" }, "engines": { @@ -3972,14 +3756,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.63.0.tgz", - "integrity": "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz", + "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.63.0", - "@typescript-eslint/types": "^8.63.0", + "@typescript-eslint/tsconfig-utils": "^8.66.0", + "@typescript-eslint/types": "^8.66.0", "debug": "^4.4.3" }, "engines": { @@ -3994,14 +3778,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.63.0.tgz", - "integrity": "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz", + "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0" + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4012,9 +3796,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.63.0.tgz", - "integrity": "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz", + "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==", "dev": true, "license": "MIT", "engines": { @@ -4029,15 +3813,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.63.0.tgz", - "integrity": "sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.66.0.tgz", + "integrity": "sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0", - "@typescript-eslint/utils": "8.63.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/utils": "8.66.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -4054,9 +3838,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.63.0.tgz", - "integrity": "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz", + "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==", "dev": true, "license": "MIT", "engines": { @@ -4068,16 +3852,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.63.0.tgz", - "integrity": "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz", + "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.63.0", - "@typescript-eslint/tsconfig-utils": "8.63.0", - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0", + "@typescript-eslint/project-service": "8.66.0", + "@typescript-eslint/tsconfig-utils": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -4096,16 +3880,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.63.0.tgz", - "integrity": "sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.66.0.tgz", + "integrity": "sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.63.0", - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0" + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4120,13 +3904,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.63.0.tgz", - "integrity": "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz", + "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/types": "8.66.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -4138,13 +3922,13 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", - "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "^1.0.0" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -4163,6 +3947,37 @@ } } }, + "node_modules/@vitest/coverage-v8": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", + "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.10", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.10", + "vitest": "4.1.10" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, "node_modules/@vitest/expect": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", @@ -4180,21 +3995,32 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "tinyrainbow": "^2.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/expect/node_modules/tinyrainbow": { @@ -4207,27 +4033,94 @@ "node": ">=14.0.0" } }, + "node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { @@ -4244,30 +4137,20 @@ } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@webcontainer/env": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", @@ -4276,9 +4159,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -4299,9 +4182,9 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -4321,7 +4204,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -4332,7 +4214,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -4384,9 +4265,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", + "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", "dev": true, "license": "MIT", "dependencies": { @@ -4395,6 +4276,16 @@ "js-tokens": "^10.0.0" } }, + "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", @@ -4413,9 +4304,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.42", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", - "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", + "version": "2.11.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", + "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4449,9 +4340,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -4469,11 +4360,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -4499,9 +4390,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001800", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", - "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "dev": true, "funding": [ { @@ -4520,11 +4411,18 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, "engines": { "node": ">=18" } @@ -4757,13 +4655,12 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.387", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", - "integrity": "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==", + "version": "1.5.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.403.tgz", + "integrity": "sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==", "dev": true, "license": "ISC" }, @@ -4778,9 +4675,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", "dependencies": { @@ -4815,16 +4712,16 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true, "license": "MIT" }, "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4835,32 +4732,32 @@ "node": ">=18" }, "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" } }, "node_modules/escalade": { @@ -4887,9 +4784,9 @@ } }, "node_modules/eslint": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", - "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", + "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -4899,7 +4796,7 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.6.0", + "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", @@ -4923,7 +4820,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -4946,13 +4843,13 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "63.0.13", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.13.tgz", - "integrity": "sha512-ahG1kWA8jYNwaQJtzJlnF+v4Gb9w5r+WL98gp+L8qjLN9ErpL5sevGuemN+fCYsU3Np27F36KmDc8UPi1ml/dg==", + "version": "63.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.3.tgz", + "integrity": "sha512-xI4IeVRzRFA2DGHrPLIxF3U+oJHU3FE+P9Zb27fVs5dPHgfcpoAs0PyCbznVhK7pwR+9BPUztFeXSgpw/CL4Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.88.0", + "@es-joy/jsdoccomment": "~0.91.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.7", @@ -4964,7 +4861,7 @@ "object-deep-merge": "^2.0.1", "parse-imports-exports": "^0.2.4", "semver": "^7.8.5", - "spdx-expression-parse": "^4.0.0", + "spdx-expression-parse": "^5.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { @@ -5075,14 +4972,11 @@ } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", @@ -5095,9 +4989,9 @@ } }, "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5105,9 +4999,9 @@ } }, "node_modules/fast-check": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.8.0.tgz", - "integrity": "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.9.0.tgz", + "integrity": "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==", "dev": true, "funding": [ { @@ -5211,9 +5105,9 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -5541,9 +5435,9 @@ "license": "MIT" }, "node_modules/jsdoc-type-pratt-parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz", - "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-8.0.0.tgz", + "integrity": "sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==", "dev": true, "license": "MIT", "engines": { @@ -5638,6 +5532,13 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5805,6 +5706,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5826,6 +5730,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5847,6 +5754,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5868,6 +5778,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5947,9 +5860,9 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -5957,9 +5870,9 @@ } }, "node_modules/lucide-react": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.24.0.tgz", - "integrity": "sha512-YT6mBD8lGKkg4nM39enlm94/sfJIiW0YKUT60fBy4YK8tai31ylg1VhGNWxkpSKHo9UagfnZqwIff3HTDQwXeA==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.30.0.tgz", + "integrity": "sha512-tUIr2jXLbWpCkdtH8XP7P7YppM9ueWgTky99lpWDY6z5REs6B+O6ZQ3U5tHkUUY59ANyOv/PBcs8E4Fe3KO3eA==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5971,7 +5884,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -5987,14 +5899,14 @@ } }, "node_modules/magicast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, @@ -6032,13 +5944,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -6075,10 +5987,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", - "dev": true, + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", @@ -6101,9 +6012,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, "license": "MIT", "engines": { @@ -6118,15 +6029,18 @@ "license": "MIT" }, "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } }, "node_modules/open": { "version": "10.2.0", @@ -6203,45 +6117,35 @@ "@oxc-parser/binding-win32-x64-msvc": "0.127.0" } }, - "node_modules/oxc-parser/node_modules/@oxc-project/types": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", - "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, "node_modules/oxc-resolver": { - "version": "11.23.0", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.23.0.tgz", - "integrity": "sha512-f0+l598CJMOLnYPXsXxttJALH0ljtivdRMKtvHhxRuWa5FYmw5+qODARl8oYjMC/brpzKcrpdORsOBrTqhBZ9A==", + "version": "11.24.2", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.24.2.tgz", + "integrity": "sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-resolver/binding-android-arm-eabi": "11.23.0", - "@oxc-resolver/binding-android-arm64": "11.23.0", - "@oxc-resolver/binding-darwin-arm64": "11.23.0", - "@oxc-resolver/binding-darwin-x64": "11.23.0", - "@oxc-resolver/binding-freebsd-x64": "11.23.0", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.23.0", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.23.0", - "@oxc-resolver/binding-linux-arm64-gnu": "11.23.0", - "@oxc-resolver/binding-linux-arm64-musl": "11.23.0", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.23.0", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.23.0", - "@oxc-resolver/binding-linux-riscv64-musl": "11.23.0", - "@oxc-resolver/binding-linux-s390x-gnu": "11.23.0", - "@oxc-resolver/binding-linux-x64-gnu": "11.23.0", - "@oxc-resolver/binding-linux-x64-musl": "11.23.0", - "@oxc-resolver/binding-openharmony-arm64": "11.23.0", - "@oxc-resolver/binding-wasm32-wasi": "11.23.0", - "@oxc-resolver/binding-win32-arm64-msvc": "11.23.0", - "@oxc-resolver/binding-win32-x64-msvc": "11.23.0" + "@oxc-resolver/binding-android-arm-eabi": "11.24.2", + "@oxc-resolver/binding-android-arm64": "11.24.2", + "@oxc-resolver/binding-darwin-arm64": "11.24.2", + "@oxc-resolver/binding-darwin-x64": "11.24.2", + "@oxc-resolver/binding-freebsd-x64": "11.24.2", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.24.2", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.24.2", + "@oxc-resolver/binding-linux-arm64-gnu": "11.24.2", + "@oxc-resolver/binding-linux-arm64-musl": "11.24.2", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.24.2", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.24.2", + "@oxc-resolver/binding-linux-riscv64-musl": "11.24.2", + "@oxc-resolver/binding-linux-s390x-gnu": "11.24.2", + "@oxc-resolver/binding-linux-x64-gnu": "11.24.2", + "@oxc-resolver/binding-linux-x64-musl": "11.24.2", + "@oxc-resolver/binding-openharmony-arm64": "11.24.2", + "@oxc-resolver/binding-wasm32-wasi": "11.24.2", + "@oxc-resolver/binding-win32-arm64-msvc": "11.24.2", + "@oxc-resolver/binding-win32-x64-msvc": "11.24.2" } }, "node_modules/p-limit": { @@ -6368,9 +6272,9 @@ } }, "node_modules/pdfjs-dist": { - "version": "6.1.200", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.1.200.tgz", - "integrity": "sha512-o8MolyzirkkLrcdsae/HEOiIcXWI7DS5zGpvqW8xTC2YUsW30rltFw2bDGvw/fskUdEMrQm2br68jzDS5BH2vw==", + "version": "6.2.108", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.2.108.tgz", + "integrity": "sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==", "license": "Apache-2.0", "engines": { "node": ">=22.13.0 || >=24" @@ -6444,7 +6348,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -6465,9 +6368,9 @@ } }, "node_modules/pure-rand": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz", - "integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.2.tgz", + "integrity": "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==", "dev": true, "funding": [ { @@ -6482,9 +6385,9 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6522,29 +6425,16 @@ "typescript": ">= 4.3.x" } }, - "node_modules/react-docgen/node_modules/strip-indent": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", - "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.7" + "react": "^19.2.8" } }, "node_modules/react-is": { @@ -6552,13 +6442,12 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/recast": { - "version": "0.23.12", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.12.tgz", - "integrity": "sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==", + "version": "0.23.19", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.19.tgz", + "integrity": "sha512-T98lym7kH+pnZmRaD8yDRdaNqyUbwnbEBx0MuchrzMFOEMray4AO3ZJoTUZ5r78Ao78X/OhzW0DL8GB85w/I2w==", "dev": true, "license": "MIT", "dependencies": { @@ -6586,6 +6475,19 @@ "node": ">=8" } }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6638,13 +6540,13 @@ } }, "node_modules/rolldown": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.139.0", + "@oxc-project/types": "=0.143.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -6654,21 +6556,30 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.5", - "@rolldown/binding-darwin-arm64": "1.1.5", - "@rolldown/binding-darwin-x64": "1.1.5", - "@rolldown/binding-freebsd-x64": "1.1.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", - "@rolldown/binding-linux-arm64-gnu": "1.1.5", - "@rolldown/binding-linux-arm64-musl": "1.1.5", - "@rolldown/binding-linux-ppc64-gnu": "1.1.5", - "@rolldown/binding-linux-s390x-gnu": "1.1.5", - "@rolldown/binding-linux-x64-gnu": "1.1.5", - "@rolldown/binding-linux-x64-musl": "1.1.5", - "@rolldown/binding-openharmony-arm64": "1.1.5", - "@rolldown/binding-wasm32-wasi": "1.1.5", - "@rolldown/binding-win32-arm64-msvc": "1.1.5", - "@rolldown/binding-win32-x64-msvc": "1.1.5" + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" + } + }, + "node_modules/rolldown/node_modules/@oxc-project/types": { + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/run-applescript": { @@ -6747,13 +6658,19 @@ "license": "ISC" }, "node_modules/sonner": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", - "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.8.tgz", + "integrity": "sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==", "license": "MIT", "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/source-map": { @@ -6784,9 +6701,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz", + "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6809,34 +6726,36 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, "node_modules/storybook": { - "version": "10.4.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.4.6.tgz", - "integrity": "sha512-6wkA6LxfDSSilloITsrFOJfsnw0mDUP2h8Ls+lRt8oRsudtz2RWFhLv+Toiwg6NW7hUpdTDc2hzR7DztJid6+A==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.7.tgz", + "integrity": "sha512-oiKvWIwIoOhFP1i6dASYyMXwPHKEtVZMshqSB7EvIVYjWRh0l9H7gHEt1z4Gh2rLGFMekWdsm4s94rvwpR7gkg==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", - "@testing-library/jest-dom": "^6.9.1", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0", + "jsonc-parser": "^3.3.1", "open": "^10.2.0", "oxc-parser": "^0.127.0", "oxc-resolver": "^11.19.1", "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", - "ws": "^8.18.0" + "ws": "^8.21.1" }, "bin": { "storybook": "dist/bin/dispatcher.js" @@ -6848,7 +6767,7 @@ "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "prettier": "^2 || ^3", - "vite-plus": "^0.1.15" + "vite-plus": "^0.1.15 || ^0.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6873,16 +6792,16 @@ } }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { @@ -6929,9 +6848,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "dev": true, "license": "MIT" }, @@ -6964,9 +6883,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "dev": true, "license": "MIT", "engines": { @@ -6991,9 +6910,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", "engines": { @@ -7011,22 +6930,22 @@ } }, "node_modules/tldts": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", - "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", + "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.27" + "tldts-core": "^7.4.10" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", - "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", + "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", "dev": true, "license": "MIT" }, @@ -7048,9 +6967,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7155,16 +7074,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.63.0.tgz", - "integrity": "sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.66.0.tgz", + "integrity": "sha512-QlEbBPz/RuJ1XUHj29nm3t0F/O/cSlEnntozqPOYHnnTGAXFamnMBu5i9Vn6vhUPHGAjR+Vl+5J8vPN/BMUrJw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.63.0", - "@typescript-eslint/parser": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0", - "@typescript-eslint/utils": "8.63.0" + "@typescript-eslint/eslint-plugin": "8.66.0", + "@typescript-eslint/parser": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/utils": "8.66.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7179,10 +7098,9 @@ } }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "dev": true, + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -7212,9 +7130,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz", + "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==", "dev": true, "funding": [ { @@ -7262,16 +7180,16 @@ } }, "node_modules/vite": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", - "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "dev": true, "license": "MIT", "dependencies": { - "lightningcss": "^1.32.0", + "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.16", - "rolldown": "~1.1.4", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "bin": { @@ -7288,7 +7206,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.3.0", + "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -7339,7 +7257,408 @@ } } }, - "node_modules/w3c-xmlserializer": { + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "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" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@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 + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", @@ -7438,9 +7757,9 @@ } }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", "engines": { @@ -7524,240 +7843,6 @@ "typescript-eslint": "^8.63.0", "vitest": "^4.1.10" } - }, - "packages/shared-types/node_modules/@vitest/coverage-v8": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", - "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.10", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "4.1.10", - "vitest": "4.1.10" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "packages/shared-types/node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/shared-types/node_modules/@vitest/mocker": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", - "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.10", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/shared-types/node_modules/@vitest/pretty-format": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", - "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/shared-types/node_modules/@vitest/runner": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", - "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.10", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/shared-types/node_modules/@vitest/snapshot": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", - "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.10", - "@vitest/utils": "4.1.10", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/shared-types/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/shared-types/node_modules/@vitest/utils": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", - "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.10", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/shared-types/node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.10", - "@vitest/mocker": "4.1.10", - "@vitest/pretty-format": "4.1.10", - "@vitest/runner": "4.1.10", - "@vitest/snapshot": "4.1.10", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.10", - "@vitest/browser-preview": "4.1.10", - "@vitest/browser-webdriverio": "4.1.10", - "@vitest/coverage-istanbul": "4.1.10", - "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@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 - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } } } } From 7b93c197cd269c8c6d6ff61376e36d41df841dcb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 12 Aug 2026 03:50:53 +0900 Subject: [PATCH 62/74] fix(deps): restore manifest-lock consistency --- package-lock.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index abc0775cb..71b01d535 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,6 @@ "apps/*", "packages/*" ], - "dependencies": { - "nanoid": "^3.3.18", - "pdfjs-dist": "^6.2.108", - "undici": "^7.29.0" - }, "devDependencies": { "@eslint/js": "^10.0.1", "eslint-plugin-jsdoc": "^63.0.13", From f84aa3086162b5fd03d71887f6e99b29e130d3bd Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 14 Aug 2026 18:49:11 +0900 Subject: [PATCH 63/74] chore(integration): remove unrelated dependency drift --- apps/desktop/package.json | 2 +- package-lock.json | 2938 ++++++++++++++++++------------------- 2 files changed, 1430 insertions(+), 1510 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 647047e31..e7685d6f0 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -20,7 +20,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^1.24.0", - "pdfjs-dist": "^6.2.108", + "pdfjs-dist": "6.1.200", "react": "^19.2.4", "react-dom": "^19.2.7", "sonner": "^2.0.7", diff --git a/package-lock.json b/package-lock.json index 71b01d535..cf1c991c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^1.24.0", - "pdfjs-dist": "^6.2.108", + "pdfjs-dist": "6.1.200", "react": "^19.2.4", "react-dom": "^19.2.7", "sonner": "^2.0.7", @@ -60,10 +60,252 @@ "vitest": "^4.1.10" } }, + "apps/desktop/node_modules/@types/react-dom": { + "version": "19.2.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "apps/desktop/node_modules/@vitest/coverage-v8": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", + "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.10", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.10", + "vitest": "4.1.10" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "apps/desktop/node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "apps/desktop/node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "apps/desktop/node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "apps/desktop/node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "apps/desktop/node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "apps/desktop/node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "apps/desktop/node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "apps/desktop/node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@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 + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, "node_modules/@adobe/css-tools": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", - "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", "dev": true, "license": "MIT" }, @@ -185,14 +427,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -325,13 +567,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.8" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -341,9 +583,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -365,18 +607,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", + "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -384,9 +626,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { @@ -406,15 +648,15 @@ "link": true }, "node_modules/@base-ui/react": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.7.0.tgz", - "integrity": "sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.5.0.tgz", + "integrity": "sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", - "@base-ui/utils": "0.3.2", - "@floating-ui/react-dom": "^2.1.9", - "@floating-ui/utils": "^0.2.12", + "@base-ui/utils": "0.2.9", + "@floating-ui/react-dom": "^2.1.8", + "@floating-ui/utils": "^0.2.11", "use-sync-external-store": "^1.6.0" }, "engines": { @@ -444,14 +686,14 @@ } }, "node_modules/@base-ui/utils": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.2.tgz", - "integrity": "sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", - "@floating-ui/utils": "^0.2.12", - "reselect": "^5.2.0", + "@floating-ui/utils": "^0.2.11", + "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { @@ -489,9 +731,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", - "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", "dev": true, "funding": [ { @@ -509,9 +751,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "dev": true, "funding": [ { @@ -533,9 +775,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", - "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.3.tgz", + "integrity": "sha512-DOgvIPkikIOixQRlD4YF31VN6fLLUTdrzhfRbis8vm0kMTgIbEPX0Ip/YX9fOeV9iywAS4sUUbTclpan7yYP8Q==", "dev": true, "funding": [ { @@ -549,8 +791,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.3.0" + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" }, "engines": { "node": ">=20.19.0" @@ -584,9 +826,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", - "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", "dev": true, "funding": [ { @@ -629,21 +871,32 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "dev": true, "license": "MIT", "optional": true, @@ -663,17 +916,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.91.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.91.0.tgz", - "integrity": "sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==", + "version": "0.88.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.88.0.tgz", + "integrity": "sha512-GK/HL/claLLNo5KG705auIlZMwEtmn88ofSGuLsmVZwKBqMPJhW9DiznYNq07QEqz9BPtA3LBfYImtZmhVvRAw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.9", - "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/types": "^8.59.4", "comment-parser": "1.4.7", "esquery": "^1.7.0", - "jsdoc-type-pratt-parser": "~8.0.0" + "jsdoc-type-pratt-parser": "~7.2.0" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -690,9 +943,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -702,14 +955,15 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -719,14 +973,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -736,14 +991,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -753,14 +1009,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -770,14 +1027,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -787,14 +1045,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -804,14 +1063,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -821,14 +1081,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -838,14 +1099,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -855,14 +1117,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -872,14 +1135,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -889,14 +1153,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -906,14 +1171,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -923,14 +1189,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -940,14 +1207,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -957,14 +1225,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -974,14 +1243,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -991,14 +1261,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -1008,14 +1279,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -1025,14 +1297,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -1042,14 +1315,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -1059,14 +1333,15 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -1076,14 +1351,15 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -1093,14 +1369,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -1110,14 +1387,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -1127,14 +1405,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1189,9 +1468,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1260,9 +1539,9 @@ } }, "node_modules/@exodus/bytes": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", - "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", "dev": true, "license": "MIT", "engines": { @@ -1278,31 +1557,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", - "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.12" + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/dom": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", - "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.8.0", - "@floating-ui/utils": "^0.2.12" + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", - "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.8.0" + "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", @@ -1310,58 +1589,44 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", - "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, "node_modules/@fontsource-variable/geist": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.3.0.tgz", - "integrity": "sha512-j0m+vLQuG5XAYoHtGCVu0spvlGreR3EzpECUVzkFmI1mTVnAO38l/NEPDCFgZ177JxzYJCLSmTQibIiYPilGrA==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.2.9.tgz", + "integrity": "sha512-TP+QSBG3wxKGPE33CbMy/L0Nu3qvJ6Fy81Yc4LnQ95xH+i+cfEp8fyU8/kfV14YwszxIFPhnoMTbjL71waVpyQ==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", + "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1461,9 +1726,9 @@ } }, "node_modules/@napi-rs/canvas": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.5.tgz", - "integrity": "sha512-GaPlicMtnvgPr5SowFRprkEJicDSrV3qCq17U4jiF5u0kNORZo3IbdN2Bk4SfcZJAMYFHbMVJ81O3w21CYxazg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.2.tgz", + "integrity": "sha512-EYEqlMYaCbpZDz+IgDH5xp9MTd3ui4dmGqbQYryhMLnSRxrhHKq5KQWHHKxFUcEP4Hp8/BWgvqXocX4j7iSbOQ==", "license": "MIT", "optional": true, "workspaces": [ @@ -1477,23 +1742,23 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "1.0.5", - "@napi-rs/canvas-darwin-arm64": "1.0.5", - "@napi-rs/canvas-darwin-x64": "1.0.5", - "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.5", - "@napi-rs/canvas-linux-arm64-gnu": "1.0.5", - "@napi-rs/canvas-linux-arm64-musl": "1.0.5", - "@napi-rs/canvas-linux-riscv64-gnu": "1.0.5", - "@napi-rs/canvas-linux-x64-gnu": "1.0.5", - "@napi-rs/canvas-linux-x64-musl": "1.0.5", - "@napi-rs/canvas-win32-arm64-msvc": "1.0.5", - "@napi-rs/canvas-win32-x64-msvc": "1.0.5" + "@napi-rs/canvas-android-arm64": "1.0.2", + "@napi-rs/canvas-darwin-arm64": "1.0.2", + "@napi-rs/canvas-darwin-x64": "1.0.2", + "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.2", + "@napi-rs/canvas-linux-arm64-gnu": "1.0.2", + "@napi-rs/canvas-linux-arm64-musl": "1.0.2", + "@napi-rs/canvas-linux-riscv64-gnu": "1.0.2", + "@napi-rs/canvas-linux-x64-gnu": "1.0.2", + "@napi-rs/canvas-linux-x64-musl": "1.0.2", + "@napi-rs/canvas-win32-arm64-msvc": "1.0.2", + "@napi-rs/canvas-win32-x64-msvc": "1.0.2" } }, "node_modules/@napi-rs/canvas-android-arm64": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.5.tgz", - "integrity": "sha512-ZzDlpKQocwFfCwhMh17UWre6Qt5yZN3kNIJoUpGfRZqwDDZ164IKOsPOHsRd3d8Tuj5KM6bDjGuPmZxuPuG3NQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.2.tgz", + "integrity": "sha512-IMXKVQod0ol4vt3gmClUfXz4JAgHYESGPCUqmH3lQxBoL0K/2greJaQE1HVBVxWWFKfLc4OLZVdxg7kXVyXv+g==", "cpu": [ "arm64" ], @@ -1511,9 +1776,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.5.tgz", - "integrity": "sha512-Hr8v6CA/TBe+OJOePdV3sXWxzQHQKfQsTKPbc8wG7iPqVeAx6MMdzKGXlYID6SVvpfwV/zqkvGcdImYWSlhrZg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-Sc8tPi6cF+5lqOzCCKFALJHhDiRwyMzTPYm3bbhdXsOunU0lQO5f05ucyOzN2r55I23Hg5bsjH63uSCvWp3EgQ==", "cpu": [ "arm64" ], @@ -1531,9 +1796,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.5.tgz", - "integrity": "sha512-9BXlLHBXpYnK4jSae1MdFdyPq09Xi1I3PeCNpvRzqgmUUBhgJS7aC1z7SZEP8JUXDHtbfIrolCS3sFuT9IGP2A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.2.tgz", + "integrity": "sha512-niDXZ9LhKB1zLrUdYB64RHQFDGz9rr0eGx061qtJJU3U20EMMIx28ADF5fVYbhtOgkWQrBjFicfaye1yM0U62A==", "cpu": [ "x64" ], @@ -1551,9 +1816,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.5.tgz", - "integrity": "sha512-zEW4fgvtYsOJ/N56Us4TQPfaFrUf0shGr9CgGSj3GACc+NHfUM3ci0YF9xFTjwJWGDmaEhYPL6KqCfFCxwm/qg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.2.tgz", + "integrity": "sha512-sgatQL9JxGRH/Amzcvu0P3t8Am3duou74CisfuJ41Dwt8cWy723z/9KZ8LlgmxfypEwEZxSTNFJtU8d281lmhQ==", "cpu": [ "arm" ], @@ -1571,15 +1836,12 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.5.tgz", - "integrity": "sha512-HFprwLspelJxCEtZvdMcz95Mwvfs63GzFVedLFmC/wslHnaOXhjXxgYxPCM/VdM4Jhx3CV4Lk0vVmh6hJv2etQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.2.tgz", + "integrity": "sha512-dgKuX0peF3xwY6ZF5QxGS4wbfDqpoFAJYXiLSp+guZKARQUKMkRqZSDrXKj7nfrec3UCMzC0PFCPte0ES98AiA==", "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1594,15 +1856,12 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.5.tgz", - "integrity": "sha512-FNMGFAx8DvtDwlLfWyBJ+oQjgPXoIAqCnNTJYqtJCFRwwzK3AyAe5B1Ll3NZ6hcOzqw7HylZsq4nQxVyPCQX1Q==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.2.tgz", + "integrity": "sha512-qwROoDIC9upfvDoRLuPn2aNg9CGW1x0Ygr4k2Or+8paA9d0qBLwk87U+g8KQpoOviKoPoiwl97kvBYuYD7qZoA==", "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1617,15 +1876,12 @@ } }, "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.5.tgz", - "integrity": "sha512-2vd5v8Lui+37Hh/spITKIvTT384ip4dnUc5XBn0E+sMNS4b7au7IswyT5YDG2udPTjSh/eLUs3sGuB5YHooFOA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.2.tgz", + "integrity": "sha512-fXRjnPihdnbO6qy1QQOgxAonb68A0TCEG7rj1x7v7rxNElsE8EVIKIEUTvyDtU+sthYSbX+8e7g3oZiLGnOmxw==", "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1640,15 +1896,12 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.5.tgz", - "integrity": "sha512-iQIPy+Uey0expZTOszLri5n8rY7x4WUpMaY82mcXNIgbil30iHvc01OsiizhZC1KQHTK90RFMFWSpwFU+ON3aA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.2.tgz", + "integrity": "sha512-nPR97DXhbWIAy7yazF3jc06kEPMqYMLmPzFOVNlwKPfIoSChnI+x7dc0hTLaihz3jxrjL6j4BbA7earxfx4X3g==", "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1663,15 +1916,12 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.5.tgz", - "integrity": "sha512-Npthji25t7FUqIAKsoEkFS0qY5CYVkHjvI3tuZjDTG92wX8g4dst+Lfb4hhubdqPazlDcIwalPzInsFCtf3FFg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.2.tgz", + "integrity": "sha512-l7zZY5+jL5qnBZtDz7CoBtY6p7EkHu422g/0zWwrOrzIwWyWxZFRfZZORY1UG7YApymPLx+UbOkN206xXn/c1Q==", "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1686,9 +1936,9 @@ } }, "node_modules/@napi-rs/canvas-win32-arm64-msvc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.5.tgz", - "integrity": "sha512-bi+JsdCdbfVJDoAQybTYmkLKwh1xpYpptg5j/BNr2BB56u4/R26jrVvtjqff+CxYMXV6Kz1/jeDVhZCuj6bDng==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.2.tgz", + "integrity": "sha512-yE0koHCFF4PIbMc2o2SEALhnipz7WBISh5glLvQiomtIoCcW0np3H4Lw93ceJAfJttTTeIIWFbwH84F7EVzjMQ==", "cpu": [ "arm64" ], @@ -1706,9 +1956,9 @@ } }, "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.5.tgz", - "integrity": "sha512-KQQwG9/sBmcGxqaLFIQf+k2OefREGoyEaIBmRuTM8bUuFKOEE9Xk5pel90hE6pmBwk/vo4RB0OdX+FxobJGMFw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.2.tgz", + "integrity": "sha512-okU8/t2foV6C31n0GtvEMbfD5rOFc70+/6xUNME9Guld29sgSOIGUEDScAWFlcP3k5TYQRl9TNkwJEEjh15w8A==", "cpu": [ "x64" ], @@ -1726,25 +1976,22 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", - "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@oxc-parser/binding-android-arm-eabi": { @@ -1874,9 +2121,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1894,9 +2138,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1914,9 +2155,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1934,9 +2172,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1954,9 +2189,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1974,9 +2206,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1994,9 +2223,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2014,9 +2240,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2062,6 +2285,29 @@ "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@oxc-parser/binding-win32-arm64-msvc": { "version": "0.127.0", "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", @@ -2114,9 +2360,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", - "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", "dev": true, "license": "MIT", "funding": { @@ -2124,9 +2370,9 @@ } }, "node_modules/@oxc-resolver/binding-android-arm-eabi": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.24.2.tgz", - "integrity": "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.23.0.tgz", + "integrity": "sha512-8IJyWRLVAyhTfe9/TIEbQqSQnl5rUqYJrUOS6Dkr+Mq9FGHMxDGeiEmwkBqCvDP5KckpPh/GYSgbag66O6JsCw==", "cpu": [ "arm" ], @@ -2138,9 +2384,9 @@ ] }, "node_modules/@oxc-resolver/binding-android-arm64": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.24.2.tgz", - "integrity": "sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.23.0.tgz", + "integrity": "sha512-pprVojnNhHxupwTT2gdeUlkxll6XEvWWBk3oVicOSNVWQC99OBnDhMQDoirqnzrE1bScQSMS2JgPpqdlrhz/Fg==", "cpu": [ "arm64" ], @@ -2152,9 +2398,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.24.2.tgz", - "integrity": "sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.23.0.tgz", + "integrity": "sha512-mbIrWIMAJeytyee36OyUP5XH92TP7FaKaQ2m5AjokKy7STgjrhRt7SMXqpqLjhGm6Xn721Xmsg6H3Rtd9YQETw==", "cpu": [ "arm64" ], @@ -2166,9 +2412,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.24.2.tgz", - "integrity": "sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.23.0.tgz", + "integrity": "sha512-UnIphmZ1LazUCr9DXWaKYWtKDefPMbgLsywaoYxRqVCNHhq4MM6d2q1Nz1i9Vzxt5i+cE2nRUYpAUHr/lijNYA==", "cpu": [ "x64" ], @@ -2180,9 +2426,9 @@ ] }, "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.24.2.tgz", - "integrity": "sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.23.0.tgz", + "integrity": "sha512-aaZ/cSEYFkSxgS2hOrobT6RQcsWNviOX8dW6CEkVx2/UYkAf9MeHbjl3W0usWV53rVV//ndBdn2nb1y7jsu4lw==", "cpu": [ "x64" ], @@ -2194,9 +2440,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.24.2.tgz", - "integrity": "sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.23.0.tgz", + "integrity": "sha512-IoJLvO5SjLSVMaq83BNTrPCb1FppvoJc1IhZ5CoUVl3PykUBku7D+LK1j0GSurhJcIc6zfjghsvaZNpq5ev6Mg==", "cpu": [ "arm" ], @@ -2208,9 +2454,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.24.2.tgz", - "integrity": "sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.23.0.tgz", + "integrity": "sha512-vskFpwg44T/LFsfjSCnVZ5ygcuqzPC1yUzVEiKa8BgHAQz0+QLQQW3EGWLPVi8EXFghzjR4EtgPBtOhCjU4jdw==", "cpu": [ "arm" ], @@ -2222,16 +2468,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.24.2.tgz", - "integrity": "sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.23.0.tgz", + "integrity": "sha512-//TcHVhrChyw5RYtgts6WO7KcWq9387c1Z5Zvhqpk/ktAbyaRYgBZrpSY1GDCFq50ASt6B6jhh+JxB1rB45IAg==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2239,16 +2482,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.24.2.tgz", - "integrity": "sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.23.0.tgz", + "integrity": "sha512-ZFqlwiTf7CXLLSGyAR9tYiO33LiaeIEXW+xm42d8mnUGpDgPltyrCGYtQezyMMEXvjhOgCz1X+i7sbDTJEx+bg==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2256,16 +2496,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.24.2.tgz", - "integrity": "sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.23.0.tgz", + "integrity": "sha512-oZ5LeN5+H1R19dRjTAxKrxQguH+AsemHcnthEfFxf4OjmBSty2doHLeSmMunKy3zpTHJQ3lh3Af+dNS+W6dYeA==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2273,16 +2510,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.24.2.tgz", - "integrity": "sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.23.0.tgz", + "integrity": "sha512-O4ciFDyX5ebQd0qkb1bjAIg8IEfiLT03GbSeylwlwlUMK9KwBWaALwrxSbc0Msaz4U6iPj+T9eRXpD5mxBfmvA==", "cpu": [ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2290,16 +2524,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.24.2.tgz", - "integrity": "sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.23.0.tgz", + "integrity": "sha512-P3o8Y9kISYjcxadmbO+94ThRwLhwGuDAbA7dcdd4+YLpfeF+mmobz8fXf4NmSdfSqjyRSkceJDBRZha9NVYkiQ==", "cpu": [ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2307,16 +2538,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.24.2.tgz", - "integrity": "sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.23.0.tgz", + "integrity": "sha512-oj03m1E3RmTFczKhcKJDzHaEDKJnPIsDcQFVxBJsSdXGSuIPdt5TvcM332FfMQgzI6yDJqyl4InrnFfXrmUTKQ==", "cpu": [ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2324,16 +2552,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.24.2.tgz", - "integrity": "sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.23.0.tgz", + "integrity": "sha512-BqJxbSC8FdP7mSuSpRePTGHm0hXWV+dfz//f7SjsteZncLaBgWTBmi/OZNv7sX6CyG/Pt/eJkPorP+DkMOhMwQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2341,16 +2566,13 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.24.2.tgz", - "integrity": "sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.23.0.tgz", + "integrity": "sha512-utmw+VmUrW4K8LI5/6jhg4aGYKJHOIjQ9syYOOA6pF3w7haKu4r4enTe2U0C04/HbUvkq/Zif43xFsKW1Pnq9w==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2358,9 +2580,9 @@ ] }, "node_modules/@oxc-resolver/binding-openharmony-arm64": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.24.2.tgz", - "integrity": "sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.23.0.tgz", + "integrity": "sha512-V6lbRrthHa4TbvsLjPtg+EkXT1tRY+s4I8rYLXUfiHlZzGx3sLv1EH9CEOOevjvUYHLsbe/gqCIc73XnQfPb9A==", "cpu": [ "arm64" ], @@ -2372,9 +2594,9 @@ ] }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.24.2.tgz", - "integrity": "sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.23.0.tgz", + "integrity": "sha512-gRoOxQPdnAmIAjxcuQNBxfihvx+wjTaQM/9/eP12xwnGNawOG/+Zz9RHN4WNSxT45b5CrscK4NB8aPh+oZQXAQ==", "cpu": [ "wasm32" ], @@ -2382,52 +2604,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.11.2", - "@emnapi/runtime": "1.11.2", + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.24.2.tgz", - "integrity": "sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.23.0.tgz", + "integrity": "sha512-CgTGMYsJVe1eUiCdJTpGw21svXw79ITsemN1h0hcNkiswasDbN5MoibSLY+gRMWP5syfEz5iffrjZnwEP8xeUA==", "cpu": [ "arm64" ], @@ -2439,9 +2627,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.24.2.tgz", - "integrity": "sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.23.0.tgz", + "integrity": "sha512-gUGJpr+Rn6zMxm5juApV0K3U845i8t47o8k+rbO0BHbi4PoJIfSPeQmrE2dgohQm2g5k6iviNFyXCGqvmaYUpw==", "cpu": [ "x64" ], @@ -2453,9 +2641,9 @@ ] }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", "cpu": [ "arm64" ], @@ -2470,9 +2658,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", "cpu": [ "arm64" ], @@ -2487,9 +2675,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", "cpu": [ "x64" ], @@ -2504,9 +2692,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", "cpu": [ "x64" ], @@ -2521,9 +2709,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", "cpu": [ "arm" ], @@ -2538,16 +2726,13 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2558,16 +2743,13 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2578,16 +2760,13 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2598,16 +2777,13 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", "cpu": [ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2618,16 +2794,13 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2638,16 +2811,13 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2658,9 +2828,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", "cpu": [ "arm64" ], @@ -2674,10 +2844,29 @@ "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", "cpu": [ "arm64" ], @@ -2692,9 +2881,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", "cpu": [ "x64" ], @@ -2738,6 +2927,13 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@sindresorhus/base62": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", @@ -2759,13 +2955,13 @@ "license": "MIT" }, "node_modules/@storybook/builder-vite": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.5.7.tgz", - "integrity": "sha512-fShF/aQaITqcJuMCLr42BGNUAbhDi4IboqvlbZqXAwgrrTslnZEUnY8GcEcvpZmjl11VwlmazhMJdH50fIgBPg==", + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.4.6.tgz", + "integrity": "sha512-BHBtD81HiXUiDQz/CaFynLtWmm7AFUQn8VnXuHipZ8KlnUANopa4yqdVuy/Gwz8ub254uFI5NMZsW/KlgWNgNg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "10.5.7", + "@storybook/csf-plugin": "10.4.6", "ts-dedent": "^2.0.0" }, "funding": { @@ -2773,14 +2969,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.5.7", + "storybook": "^10.4.6", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.7.tgz", - "integrity": "sha512-IaX8FlM0H36HNFhJ2+4L9bCldqfvHGqcLg841SJNyK/DhfMlM7JsvY/GDH2ZFuWrUf8FSOx96GRRnHq6XfRKag==", + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.4.6.tgz", + "integrity": "sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2793,7 +2989,7 @@ "peerDependencies": { "esbuild": "*", "rollup": "*", - "storybook": "^10.5.7", + "storybook": "^10.4.6", "vite": "*", "webpack": "*" }, @@ -2830,14 +3026,14 @@ } }, "node_modules/@storybook/react": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.7.tgz", - "integrity": "sha512-uFvty2MMdFXzW5PcQe1JqDAZkz6cQq7q/9G/cbGVnBEvP6zsOVeL+bmrQ0/WBlFQN0Ko9+ZoCTvaQ9s65zBa5g==", + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.4.6.tgz", + "integrity": "sha512-9Y7YecrVFe1/01KYjfOLxVqTg2Aq+IO6TEv6sC2U0PfD0AWCSCmQ91QqgBpN/XW4aFFWoiZNinyXMUlU8zxy2w==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.5.7", + "@storybook/react-dom-shim": "10.4.6", "react-docgen": "^8.0.2", "react-docgen-typescript": "^2.2.2" }, @@ -2850,7 +3046,7 @@ "@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.7", + "storybook": "^10.4.6", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -2866,9 +3062,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.7.tgz", - "integrity": "sha512-lxOkyh+wu/MiBXvYQHjZfD+DRKOa4bHBzbuGuiHXnHXmdOcTRdcrQTsoeN2FPtfugmmOG66cZUEgDwNX+k5eRA==", + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.4.6.tgz", + "integrity": "sha512-iGNmKzrq9vgl2PDrYAnZKI+yvac3Ym+lJXXuQaqlFRS23zA5MNm4EBX+rAG7WulqchoK6NaZ0KQOs2mAgEpTMg==", "dev": true, "license": "MIT", "funding": { @@ -2880,7 +3076,7 @@ "@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.7" + "storybook": "^10.4.6" }, "peerDependenciesMeta": { "@types/react": { @@ -2892,19 +3088,19 @@ } }, "node_modules/@storybook/react-vite": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.5.7.tgz", - "integrity": "sha512-eEo3eVa2pvqrzQukKxAzx7YvswDAA1s6k/y+tdMxmRvWyHX6QEOsb9Tda6wcVaa7c8BeJM7Ggq+289cRMTH6Iw==", + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.4.6.tgz", + "integrity": "sha512-0arEQtybqGYXHbXpTot+Wv9YtG+V5Vp43QayXavPKQ20M8mpEzhyCPKd0EhqMGSC1Z1UEt0hm365WUBhI9LfKA==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.5.7", - "@storybook/react": "10.5.7", + "@storybook/builder-vite": "10.4.6", + "@storybook/react": "10.4.6", "empathic": "^2.0.0", "magic-string": "^0.30.0", - "react-docgen": "^8.0.2", + "react-docgen": "^8.0.0", "resolve": "^1.22.8", "tsconfig-paths": "^4.2.0" }, @@ -2915,60 +3111,54 @@ "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.7", - "typescript": ">= 4.9.x", + "storybook": "^10.4.6", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/@tailwindcss/node": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", - "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.24.1", + "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.3" + "tailwindcss": "4.3.2" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", - "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-x64": "4.3.3", - "@tailwindcss/oxide-freebsd-x64": "4.3.3", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-x64-musl": "4.3.3", - "@tailwindcss/oxide-wasm32-wasi": "4.3.3", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", - "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", "cpu": [ "arm64" ], @@ -2983,9 +3173,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", - "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", "cpu": [ "arm64" ], @@ -3000,9 +3190,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", - "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", "cpu": [ "x64" ], @@ -3017,9 +3207,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", - "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", "cpu": [ "x64" ], @@ -3034,9 +3224,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", - "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", "cpu": [ "arm" ], @@ -3051,16 +3241,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", - "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3071,16 +3258,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", - "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3091,16 +3275,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", - "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3111,16 +3292,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", - "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3131,9 +3309,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", - "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -3160,10 +3338,76 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", - "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", "cpu": [ "arm64" ], @@ -3178,9 +3422,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", - "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", "cpu": [ "x64" ], @@ -3195,24 +3439,24 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", - "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.3", - "@tailwindcss/oxide": "4.3.3", - "tailwindcss": "4.3.3" + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "node_modules/@tauri-apps/api": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz", - "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.0.tgz", + "integrity": "sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA==", "license": "Apache-2.0 OR MIT", "funding": { "type": "opencollective", @@ -3308,9 +3552,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3328,9 +3569,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3348,9 +3586,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3368,9 +3603,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3388,9 +3620,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -3457,6 +3686,7 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3527,9 +3757,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.6.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.3.tgz", - "integrity": "sha512-6dBq67jT8lE+JTE8Exm02Kt6ze43hz1jdiSpSJwtTZiT1xQQ6b7nZYTTQ9njdArdU8XklOwaDp/AbT/eYSKF4g==", + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "dev": true, "license": "MIT", "engines": { @@ -3556,7 +3786,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -3650,9 +3881,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", - "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", + "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", "dev": true, "license": "MIT", "dependencies": { @@ -3660,25 +3891,15 @@ } }, "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" } }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, "node_modules/@types/resolve": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", @@ -3687,17 +3908,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.66.0.tgz", - "integrity": "sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.63.0.tgz", + "integrity": "sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.66.0", - "@typescript-eslint/type-utils": "8.66.0", - "@typescript-eslint/utils": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0", + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/type-utils": "8.63.0", + "@typescript-eslint/utils": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -3710,7 +3931,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.66.0", + "@typescript-eslint/parser": "^8.63.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -3726,16 +3947,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz", - "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.63.0.tgz", + "integrity": "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.66.0", - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0", + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", "debug": "^4.4.3" }, "engines": { @@ -3751,14 +3972,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz", - "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.63.0.tgz", + "integrity": "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.66.0", - "@typescript-eslint/types": "^8.66.0", + "@typescript-eslint/tsconfig-utils": "^8.63.0", + "@typescript-eslint/types": "^8.63.0", "debug": "^4.4.3" }, "engines": { @@ -3773,14 +3994,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz", - "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.63.0.tgz", + "integrity": "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0" + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3791,9 +4012,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz", - "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.63.0.tgz", + "integrity": "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==", "dev": true, "license": "MIT", "engines": { @@ -3808,15 +4029,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.66.0.tgz", - "integrity": "sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.63.0.tgz", + "integrity": "sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0", - "@typescript-eslint/utils": "8.66.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/utils": "8.63.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -3833,9 +4054,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz", - "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.63.0.tgz", + "integrity": "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==", "dev": true, "license": "MIT", "engines": { @@ -3847,16 +4068,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz", - "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.63.0.tgz", + "integrity": "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.66.0", - "@typescript-eslint/tsconfig-utils": "8.66.0", - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0", + "@typescript-eslint/project-service": "8.63.0", + "@typescript-eslint/tsconfig-utils": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3875,16 +4096,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.66.0.tgz", - "integrity": "sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.63.0.tgz", + "integrity": "sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.66.0", - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0" + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3899,13 +4120,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz", - "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.63.0.tgz", + "integrity": "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/types": "8.63.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3917,13 +4138,13 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "^1.0.1" + "@rolldown/pluginutils": "^1.0.0" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -3942,37 +4163,6 @@ } } }, - "node_modules/@vitest/coverage-v8": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", - "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.10", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "4.1.10", - "vitest": "4.1.10" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, "node_modules/@vitest/expect": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", @@ -3990,32 +4180,21 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "node_modules/@vitest/expect/node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=18" } }, "node_modules/@vitest/expect/node_modules/tinyrainbow": { @@ -4028,94 +4207,27 @@ "node": ">=14.0.0" } }, - "node_modules/@vitest/mocker": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", - "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.10", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", - "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", - "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.10", - "pathe": "^2.0.3" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", - "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.10", - "@vitest/utils": "4.1.10", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=14.0.0" } }, "node_modules/@vitest/spy": { @@ -4132,20 +4244,30 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", - "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/utils/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@webcontainer/env": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", @@ -4154,9 +4276,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -4177,9 +4299,9 @@ } }, "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -4199,6 +4321,7 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -4209,6 +4332,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -4260,9 +4384,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", - "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -4271,16 +4395,6 @@ "js-tokens": "^10.0.0" } }, - "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", @@ -4299,9 +4413,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.11.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", - "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", + "version": "2.10.42", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4335,9 +4449,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", "dev": true, "funding": [ { @@ -4355,11 +4469,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -4385,9 +4499,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "version": "1.0.30001800", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", + "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", "dev": true, "funding": [ { @@ -4406,18 +4520,11 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -4650,12 +4757,13 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/electron-to-chromium": { - "version": "1.5.403", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.403.tgz", - "integrity": "sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==", + "version": "1.5.387", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", + "integrity": "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==", "dev": true, "license": "ISC" }, @@ -4670,9 +4778,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4707,16 +4815,16 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", - "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, "node_modules/esbuild": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4727,32 +4835,32 @@ "node": ">=18" }, "optionalDependencies": { - "@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" + "@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" } }, "node_modules/escalade": { @@ -4779,9 +4887,9 @@ } }, "node_modules/eslint": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", - "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", + "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -4791,7 +4899,7 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", + "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", @@ -4815,7 +4923,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -4838,13 +4946,13 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "63.3.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.3.tgz", - "integrity": "sha512-xI4IeVRzRFA2DGHrPLIxF3U+oJHU3FE+P9Zb27fVs5dPHgfcpoAs0PyCbznVhK7pwR+9BPUztFeXSgpw/CL4Yg==", + "version": "63.0.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.13.tgz", + "integrity": "sha512-ahG1kWA8jYNwaQJtzJlnF+v4Gb9w5r+WL98gp+L8qjLN9ErpL5sevGuemN+fCYsU3Np27F36KmDc8UPi1ml/dg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.91.0", + "@es-joy/jsdoccomment": "~0.88.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.7", @@ -4856,7 +4964,7 @@ "object-deep-merge": "^2.0.1", "parse-imports-exports": "^0.2.4", "semver": "^7.8.5", - "spdx-expression-parse": "^5.0.0", + "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { @@ -4967,11 +5075,14 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -4984,9 +5095,9 @@ } }, "node_modules/expect-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4994,9 +5105,9 @@ } }, "node_modules/fast-check": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.9.0.tgz", - "integrity": "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.8.0.tgz", + "integrity": "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==", "dev": true, "funding": [ { @@ -5100,9 +5211,9 @@ } }, "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -5430,9 +5541,9 @@ "license": "MIT" }, "node_modules/jsdoc-type-pratt-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-8.0.0.tgz", - "integrity": "sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz", + "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==", "dev": true, "license": "MIT", "engines": { @@ -5527,13 +5638,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5701,9 +5805,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5725,9 +5826,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5749,9 +5847,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5773,9 +5868,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5855,9 +5947,9 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -5865,9 +5957,9 @@ } }, "node_modules/lucide-react": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.30.0.tgz", - "integrity": "sha512-tUIr2jXLbWpCkdtH8XP7P7YppM9ueWgTky99lpWDY6z5REs6B+O6ZQ3U5tHkUUY59ANyOv/PBcs8E4Fe3KO3eA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.24.0.tgz", + "integrity": "sha512-YT6mBD8lGKkg4nM39enlm94/sfJIiW0YKUT60fBy4YK8tai31ylg1VhGNWxkpSKHo9UagfnZqwIff3HTDQwXeA==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5879,6 +5971,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -5894,14 +5987,14 @@ } }, "node_modules/magicast": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", - "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, @@ -5939,13 +6032,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.8" + "brace-expansion": "^5.0.2" }, "engines": { "node": "18 || 20 || >=22" @@ -5982,9 +6075,10 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, "funding": [ { "type": "github", @@ -6007,9 +6101,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", "dev": true, "license": "MIT", "engines": { @@ -6024,18 +6118,15 @@ "license": "MIT" }, "node_modules/obug": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", - "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" ], - "license": "MIT", - "engines": { - "node": ">=12.20.0" - } + "license": "MIT" }, "node_modules/open": { "version": "10.2.0", @@ -6112,35 +6203,45 @@ "@oxc-parser/binding-win32-x64-msvc": "0.127.0" } }, + "node_modules/oxc-parser/node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/oxc-resolver": { - "version": "11.24.2", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.24.2.tgz", - "integrity": "sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==", + "version": "11.23.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.23.0.tgz", + "integrity": "sha512-f0+l598CJMOLnYPXsXxttJALH0ljtivdRMKtvHhxRuWa5FYmw5+qODARl8oYjMC/brpzKcrpdORsOBrTqhBZ9A==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-resolver/binding-android-arm-eabi": "11.24.2", - "@oxc-resolver/binding-android-arm64": "11.24.2", - "@oxc-resolver/binding-darwin-arm64": "11.24.2", - "@oxc-resolver/binding-darwin-x64": "11.24.2", - "@oxc-resolver/binding-freebsd-x64": "11.24.2", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.24.2", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.24.2", - "@oxc-resolver/binding-linux-arm64-gnu": "11.24.2", - "@oxc-resolver/binding-linux-arm64-musl": "11.24.2", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.24.2", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.24.2", - "@oxc-resolver/binding-linux-riscv64-musl": "11.24.2", - "@oxc-resolver/binding-linux-s390x-gnu": "11.24.2", - "@oxc-resolver/binding-linux-x64-gnu": "11.24.2", - "@oxc-resolver/binding-linux-x64-musl": "11.24.2", - "@oxc-resolver/binding-openharmony-arm64": "11.24.2", - "@oxc-resolver/binding-wasm32-wasi": "11.24.2", - "@oxc-resolver/binding-win32-arm64-msvc": "11.24.2", - "@oxc-resolver/binding-win32-x64-msvc": "11.24.2" + "@oxc-resolver/binding-android-arm-eabi": "11.23.0", + "@oxc-resolver/binding-android-arm64": "11.23.0", + "@oxc-resolver/binding-darwin-arm64": "11.23.0", + "@oxc-resolver/binding-darwin-x64": "11.23.0", + "@oxc-resolver/binding-freebsd-x64": "11.23.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.23.0", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.23.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.23.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.23.0", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.23.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.23.0", + "@oxc-resolver/binding-linux-riscv64-musl": "11.23.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.23.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.23.0", + "@oxc-resolver/binding-linux-x64-musl": "11.23.0", + "@oxc-resolver/binding-openharmony-arm64": "11.23.0", + "@oxc-resolver/binding-wasm32-wasi": "11.23.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.23.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.23.0" } }, "node_modules/p-limit": { @@ -6267,9 +6368,9 @@ } }, "node_modules/pdfjs-dist": { - "version": "6.2.108", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.2.108.tgz", - "integrity": "sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==", + "version": "6.1.200", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.1.200.tgz", + "integrity": "sha512-o8MolyzirkkLrcdsae/HEOiIcXWI7DS5zGpvqW8xTC2YUsW30rltFw2bDGvw/fskUdEMrQm2br68jzDS5BH2vw==", "license": "Apache-2.0", "engines": { "node": ">=22.13.0 || >=24" @@ -6343,6 +6444,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -6363,9 +6465,9 @@ } }, "node_modules/pure-rand": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.2.tgz", - "integrity": "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz", + "integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==", "dev": true, "funding": [ { @@ -6380,9 +6482,9 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6420,16 +6522,29 @@ "typescript": ">= 4.3.x" } }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.8" + "react": "^19.2.7" } }, "node_modules/react-is": { @@ -6437,12 +6552,13 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/recast": { - "version": "0.23.19", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.19.tgz", - "integrity": "sha512-T98lym7kH+pnZmRaD8yDRdaNqyUbwnbEBx0MuchrzMFOEMray4AO3ZJoTUZ5r78Ao78X/OhzW0DL8GB85w/I2w==", + "version": "0.23.12", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.12.tgz", + "integrity": "sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==", "dev": true, "license": "MIT", "dependencies": { @@ -6470,19 +6586,6 @@ "node": ">=8" } }, - "node_modules/redent/node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6535,13 +6638,13 @@ } }, "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.143.0", + "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -6551,30 +6654,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/rolldown/node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, "node_modules/run-applescript": { @@ -6653,19 +6747,13 @@ "license": "ISC" }, "node_modules/sonner": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.8.tgz", - "integrity": "sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } } }, "node_modules/source-map": { @@ -6696,9 +6784,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz", - "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6721,36 +6809,34 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", - "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", "dev": true, "license": "MIT" }, "node_modules/storybook": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.7.tgz", - "integrity": "sha512-oiKvWIwIoOhFP1i6dASYyMXwPHKEtVZMshqSB7EvIVYjWRh0l9H7gHEt1z4Gh2rLGFMekWdsm4s94rvwpR7gkg==", + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.4.6.tgz", + "integrity": "sha512-6wkA6LxfDSSilloITsrFOJfsnw0mDUP2h8Ls+lRt8oRsudtz2RWFhLv+Toiwg6NW7hUpdTDc2hzR7DztJid6+A==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", - "@testing-library/dom": "^10.4.1", - "@testing-library/jest-dom": "6.9.1", + "@testing-library/jest-dom": "^6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0", - "jsonc-parser": "^3.3.1", "open": "^10.2.0", "oxc-parser": "^0.127.0", "oxc-resolver": "^11.19.1", "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", - "ws": "^8.21.1" + "ws": "^8.18.0" }, "bin": { "storybook": "dist/bin/dispatcher.js" @@ -6762,7 +6848,7 @@ "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "prettier": "^2 || ^3", - "vite-plus": "^0.1.15 || ^0.2.0" + "vite-plus": "^0.1.15" }, "peerDependenciesMeta": { "@types/react": { @@ -6787,16 +6873,16 @@ } }, "node_modules/strip-indent": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", - "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "min-indent": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, "node_modules/supports-color": { @@ -6843,9 +6929,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", - "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", "dev": true, "license": "MIT" }, @@ -6878,9 +6964,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", "dev": true, "license": "MIT", "engines": { @@ -6905,9 +6991,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", - "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -6925,22 +7011,22 @@ } }, "node_modules/tldts": { - "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", - "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", + "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.10" + "tldts-core": "^7.0.27" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", - "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", + "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", "dev": true, "license": "MIT" }, @@ -6962,9 +7048,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", - "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7069,16 +7155,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.66.0.tgz", - "integrity": "sha512-QlEbBPz/RuJ1XUHj29nm3t0F/O/cSlEnntozqPOYHnnTGAXFamnMBu5i9Vn6vhUPHGAjR+Vl+5J8vPN/BMUrJw==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.63.0.tgz", + "integrity": "sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.66.0", - "@typescript-eslint/parser": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0", - "@typescript-eslint/utils": "8.66.0" + "@typescript-eslint/eslint-plugin": "8.63.0", + "@typescript-eslint/parser": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/utils": "8.63.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7093,9 +7179,10 @@ } }, "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "dev": true, "license": "MIT", "engines": { "node": ">=20.18.1" @@ -7125,9 +7212,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz", - "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -7175,16 +7262,16 @@ } }, "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "dev": true, "license": "MIT", "dependencies": { - "lightningcss": "^1.33.0", + "lightningcss": "^1.32.0", "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -7201,7 +7288,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -7252,407 +7339,6 @@ } } }, - "node_modules/vite/node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "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" - } - }, - "node_modules/vite/node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.10", - "@vitest/mocker": "4.1.10", - "@vitest/pretty-format": "4.1.10", - "@vitest/runner": "4.1.10", - "@vitest/snapshot": "4.1.10", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.10", - "@vitest/browser-preview": "4.1.10", - "@vitest/browser-webdriverio": "4.1.10", - "@vitest/coverage-istanbul": "4.1.10", - "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@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 - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/vitest/node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -7752,9 +7438,9 @@ } }, "node_modules/ws": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", - "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { @@ -7838,6 +7524,240 @@ "typescript-eslint": "^8.63.0", "vitest": "^4.1.10" } + }, + "packages/shared-types/node_modules/@vitest/coverage-v8": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", + "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.10", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.10", + "vitest": "4.1.10" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "packages/shared-types/node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/shared-types/node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "packages/shared-types/node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/shared-types/node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/shared-types/node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/shared-types/node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/shared-types/node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/shared-types/node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@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 + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } } } } From 16f6fa189d35f069b08c9f201ed8047e68f659aa Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 21:24:10 +0900 Subject: [PATCH 64/74] test(integration): redact unknown naruon field names [skip ci] --- .../test/naruon-error-redaction.test.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 packages/shared-types/test/naruon-error-redaction.test.ts diff --git a/packages/shared-types/test/naruon-error-redaction.test.ts b/packages/shared-types/test/naruon-error-redaction.test.ts new file mode 100644 index 000000000..3e326c8ae --- /dev/null +++ b/packages/shared-types/test/naruon-error-redaction.test.ts @@ -0,0 +1,64 @@ +import { + createNaruonRehearsalHandoff, + parseNaruonRehearsalHandoff, + validateNaruonRehearsalHandoff, + type CreateNaruonRehearsalHandoffInput +} from "../src/naruon"; + +/** Return one valid handoff for payload-safe validation-error regressions. */ +function validHandoff(): unknown { + const input: CreateNaruonRehearsalHandoffInput = { + createdAt: "2026-08-03T01:23:45Z", + source: { + application: "bandscope", + workspaceId: "workspace-redaction", + bandId: "band-redaction", + rehearsalId: "rehearsal-redaction" + }, + normGroup: { kind: "band", id: "band-redaction", label: "Redaction Band" }, + event: { + title: "Payload-safe rehearsal", + startsAt: "2026-08-10T19:00:00+09:00", + endsAt: "2026-08-10T20:00:00+09:00", + timeZone: "Asia/Seoul" + }, + commitment: { status: "confirmed", rsvpDirection: "organizer" }, + provenance: { + sourceRecordId: "source-redaction", + confidence: 1, + evidence: [{ field: "startsAt", value: "2026-08-10T19:00:00+09:00" }] + } + }; + return createNaruonRehearsalHandoff(input); +} + +describe("naruon validation error payload safety", () => { + it.each([ + ["root", (value: Record, secret: string) => { value[secret] = true; }], + [ + "source", + (value: Record, secret: string) => { + (value.source as Record)[secret] = true; + } + ], + [ + "provenance.evidence[0]", + (value: Record, secret: string) => { + const provenance = value.provenance as { evidence: Record[] }; + provenance.evidence[0]![secret] = true; + } + ] + ])("rejects an unexpected %s field without echoing its attacker-controlled key", (path, mutate) => { + const secret = "private-person-name-and-api-key"; + const value = structuredClone(validHandoff()) as Record; + mutate(value, secret); + + const error = validateNaruonRehearsalHandoff(value); + + expect(error).toBe(`${path} contains an unexpected field`); + expect(error).not.toContain(secret); + expect(() => parseNaruonRehearsalHandoff(value)).toThrow( + `Invalid naruon rehearsal handoff: ${path} contains an unexpected field` + ); + }); +}); From 1d7ca6962789b79814dea9efaaf13ce9c136b595 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 21:25:55 +0900 Subject: [PATCH 65/74] ci(repair): harden PR 737 error payload safety --- .../repair-pr-737-payload-safe-errors.yml | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 .github/workflows/repair-pr-737-payload-safe-errors.yml diff --git a/.github/workflows/repair-pr-737-payload-safe-errors.yml b/.github/workflows/repair-pr-737-payload-safe-errors.yml new file mode 100644 index 000000000..a1b968346 --- /dev/null +++ b/.github/workflows/repair-pr-737-payload-safe-errors.yml @@ -0,0 +1,141 @@ +name: Repair PR 737 payload-safe errors + +on: + push: + branches: + - feat/naruon-rehearsal-handoff-v1 + paths: + - .github/workflows/repair-pr-737-payload-safe-errors.yml + +permissions: + contents: write + +env: + GIT_CONFIG_COUNT: "1" + GIT_CONFIG_KEY_0: init.defaultBranch + GIT_CONFIG_VALUE_0: develop + +jobs: + repair: + if: >- + github.repository == 'ContextualWisdomLab/bandscope' && + github.ref == 'refs/heads/feat/naruon-rehearsal-handoff-v1' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 0 + ref: feat/naruon-rehearsal-handoff-v1 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 22.22.3 + cache: npm + - name: Install approved dependency consumer + run: | + npm install --global npm@10.9.8 + npm ci --ignore-scripts --no-audit --no-fund + - name: Prove the payload-safe regression is red + run: | + set +e + npm exec --workspace @bandscope/shared-types -- \ + vitest run test/naruon-error-redaction.test.ts --coverage=false + status=$? + set -e + if [ "$status" -eq 0 ]; then + echo "Expected attacker-controlled unknown-field names to leak before repair" >&2 + exit 1 + fi + - name: Redact caller-controlled field names while preserving structural location + run: | + python3 - <<'PY' + from pathlib import Path + + source_path = Path("packages/shared-types/src/naruon.ts") + source = source_path.read_text(encoding="utf-8") + source = source.replace( + "/** Return the first key outside an exact allowlist. */", + "/** Return the structural parent path when an object contains an unknown key. */", + ) + old = """ for (const key of Object.keys(value)) { + if (!allowedKeys.includes(key)) { + return `${path}.${key}`; + } + } +""" + new = """ for (const key of Object.keys(value)) { + if (!allowedKeys.includes(key)) { + return path; + } + } +""" + if source.count(old) != 1: + raise SystemExit("unexpected unknown-key helper shape") + source = source.replace(old, new) + source = source.replace("`${sourceExtra} is not allowed`", "`${sourceExtra} contains an unexpected field`") + source = source.replace("`${normExtra} is not allowed`", "`${normExtra} contains an unexpected field`") + source = source.replace("`${eventExtra} is not allowed`", "`${eventExtra} contains an unexpected field`") + source = source.replace("`${commitmentExtra} is not allowed`", "`${commitmentExtra} contains an unexpected field`") + source = source.replace("`${provenanceExtra} is not allowed`", "`${provenanceExtra} contains an unexpected field`") + source = source.replace("`${rootExtra} is not allowed`", "`${rootExtra} contains an unexpected field`") + source = source.replace("`${extra} is not allowed`", "`${extra} contains an unexpected field`") + source_path.write_text(source, encoding="utf-8") + + test_path = Path("packages/shared-types/test/naruon.test.ts") + tests = test_path.read_text(encoding="utf-8") + replacements = { + '"root.extra"': '"root contains an unexpected field"', + '"source.extra"': '"source contains an unexpected field"', + '"normGroup.extra"': '"normGroup contains an unexpected field"', + '"event.extra"': '"event contains an unexpected field"', + '"commitment.extra"': '"commitment contains an unexpected field"', + '"provenance.extra"': '"provenance contains an unexpected field"', + '"evidence[0].extra"': '"evidence[0] contains an unexpected field"', + } + for before, after in replacements.items(): + if tests.count(before) != 1: + raise SystemExit(f"unexpected naruon test expectation: {before}") + tests = tests.replace(before, after) + test_path.write_text(tests, encoding="utf-8") + + docs_path = Path("docs/integrations/naruon.md") + docs = docs_path.read_text(encoding="utf-8") + marker = "Parsing snapshots caller-owned data once before validation and canonicalization." + insertion = ( + "Validation errors identify the structural object containing an unknown field but never " + "echo the caller-controlled field name. This preserves actionable location without " + "copying tenant, person, credential, or other payload text into logs.\n\n" + ) + if docs.count(marker) != 1: + raise SystemExit("unexpected naruon privacy insertion point") + docs_path.write_text(docs.replace(marker, insertion + marker), encoding="utf-8") + + changelog_path = Path("CHANGELOG.md") + changelog = changelog_path.read_text(encoding="utf-8") + old_entry = "- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with Band norm-group identity, Event and Commitment semantics, calibrated provenance, deterministic JSON serialization, and a public JSON Schema while preserving BandScope's standalone local-first operation." + new_entry = old_entry + " Unknown-field errors retain the structural object path without echoing caller-controlled field names." + if changelog.count(old_entry) != 1: + raise SystemExit("unexpected naruon changelog entry") + changelog_path.write_text(changelog.replace(old_entry, new_entry), encoding="utf-8") + PY + - name: Verify shared contract and repository gate + run: | + npm exec --workspace @bandscope/shared-types -- \ + vitest run test/naruon-error-redaction.test.ts --coverage=false + npm run lint --workspace @bandscope/shared-types + npm run typecheck --workspace @bandscope/shared-types + npm run test --workspace @bandscope/shared-types + ./scripts/harness/quickcheck.sh + - name: Remove repair workflow and publish GREEN head + run: | + git config user.name "CWL repair bot" + git config user.email "actions@users.noreply.github.com" + rm .github/workflows/repair-pr-737-payload-safe-errors.yml + git add \ + CHANGELOG.md \ + docs/integrations/naruon.md \ + packages/shared-types/src/naruon.ts \ + packages/shared-types/test/naruon.test.ts \ + packages/shared-types/test/naruon-error-redaction.test.ts \ + .github/workflows/repair-pr-737-payload-safe-errors.yml + git commit -m "fix(integration): keep naruon errors payload-safe" + git push origin HEAD:feat/naruon-rehearsal-handoff-v1 From af8aebf7ceb7d909623bad8ab8624f7c8b346452 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 21:27:26 +0900 Subject: [PATCH 66/74] ci(repair): extract PR 737 repair logic [skip ci] --- .github/scripts/repair_pr_737.py | 161 +++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 .github/scripts/repair_pr_737.py diff --git a/.github/scripts/repair_pr_737.py b/.github/scripts/repair_pr_737.py new file mode 100644 index 000000000..6d0b0a112 --- /dev/null +++ b/.github/scripts/repair_pr_737.py @@ -0,0 +1,161 @@ +from __future__ import annotations + +import subprocess +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] + + +def run(*args: str, check: bool = True) -> subprocess.CompletedProcess[str]: + """Run one repository command with deterministic failure propagation.""" + return subprocess.run(args, cwd=ROOT, check=check, text=True) + + +def replace_once(path: Path, old: str, new: str, label: str) -> None: + """Replace exactly one expected source fragment.""" + text = path.read_text(encoding="utf-8") + if text.count(old) != 1: + raise RuntimeError(f"unexpected {label} shape") + path.write_text(text.replace(old, new), encoding="utf-8") + + +def implement_payload_safe_errors() -> None: + """Retain structural error locations without echoing caller-controlled keys.""" + source_path = ROOT / "packages/shared-types/src/naruon.ts" + source = source_path.read_text(encoding="utf-8") + source = source.replace( + "/** Return the first key outside an exact allowlist. */", + "/** Return the structural parent path when an object contains an unknown key. */", + ) + old = """ for (const key of Object.keys(value)) { + if (!allowedKeys.includes(key)) { + return `${path}.${key}`; + } + } +""" + new = """ for (const key of Object.keys(value)) { + if (!allowedKeys.includes(key)) { + return path; + } + } +""" + if source.count(old) != 1: + raise RuntimeError("unexpected unknown-key helper shape") + source = source.replace(old, new) + for variable in ( + "sourceExtra", + "normExtra", + "eventExtra", + "commitmentExtra", + "provenanceExtra", + "rootExtra", + "extra", + ): + before = f"`${{{variable}}} is not allowed`" + after = f"`${{{variable}}} contains an unexpected field`" + if source.count(before) != 1: + raise RuntimeError(f"unexpected {variable} error shape") + source = source.replace(before, after) + source_path.write_text(source, encoding="utf-8") + + test_path = ROOT / "packages/shared-types/test/naruon.test.ts" + tests = test_path.read_text(encoding="utf-8") + replacements = { + '"root.extra"': '"root contains an unexpected field"', + '"source.extra"': '"source contains an unexpected field"', + '"normGroup.extra"': '"normGroup contains an unexpected field"', + '"event.extra"': '"event contains an unexpected field"', + '"commitment.extra"': '"commitment contains an unexpected field"', + '"provenance.extra"': '"provenance contains an unexpected field"', + '"evidence[0].extra"': '"evidence[0] contains an unexpected field"', + } + for before, after in replacements.items(): + if tests.count(before) != 1: + raise RuntimeError(f"unexpected naruon test expectation: {before}") + tests = tests.replace(before, after) + test_path.write_text(tests, encoding="utf-8") + + docs_path = ROOT / "docs/integrations/naruon.md" + marker = "Parsing snapshots caller-owned data once before validation and canonicalization." + insertion = ( + "Validation errors identify the structural object containing an unknown field but never " + "echo the caller-controlled field name. This preserves actionable location without " + "copying tenant, person, credential, or other payload text into logs.\n\n" + ) + replace_once(docs_path, marker, insertion + marker, "naruon privacy insertion point") + + changelog_path = ROOT / "CHANGELOG.md" + old_entry = ( + "- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with " + "Band norm-group identity, Event and Commitment semantics, calibrated provenance, " + "deterministic JSON serialization, and a public JSON Schema while preserving BandScope's " + "standalone local-first operation." + ) + replace_once( + changelog_path, + old_entry, + old_entry + + " Unknown-field errors retain the structural object path without echoing " + "caller-controlled field names.", + "naruon changelog entry", + ) + + +def main() -> None: + """Execute RED, minimal implementation, GREEN verification, and self-removal.""" + run("npm", "install", "--global", "npm@10.9.8") + run("npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund") + + red = run( + "npm", + "exec", + "--workspace", + "@bandscope/shared-types", + "--", + "vitest", + "run", + "test/naruon-error-redaction.test.ts", + "--coverage=false", + check=False, + ) + if red.returncode == 0: + raise RuntimeError("expected unknown-field key leakage before implementation") + + implement_payload_safe_errors() + run( + "npm", + "exec", + "--workspace", + "@bandscope/shared-types", + "--", + "vitest", + "run", + "test/naruon-error-redaction.test.ts", + "--coverage=false", + ) + run("npm", "run", "lint", "--workspace", "@bandscope/shared-types") + run("npm", "run", "typecheck", "--workspace", "@bandscope/shared-types") + run("npm", "run", "test", "--workspace", "@bandscope/shared-types") + run("./scripts/harness/quickcheck.sh") + + (ROOT / ".github/workflows/repair-pr-737-payload-safe-errors.yml").unlink() + Path(__file__).unlink() + run("git", "config", "user.name", "CWL repair bot") + run("git", "config", "user.email", "actions@users.noreply.github.com") + run( + "git", + "add", + "CHANGELOG.md", + "docs/integrations/naruon.md", + "packages/shared-types/src/naruon.ts", + "packages/shared-types/test/naruon.test.ts", + "packages/shared-types/test/naruon-error-redaction.test.ts", + ".github/workflows/repair-pr-737-payload-safe-errors.yml", + ".github/scripts/repair_pr_737.py", + ) + run("git", "commit", "-m", "fix(integration): keep naruon errors payload-safe") + run("git", "push", "origin", "HEAD:feat/naruon-rehearsal-handoff-v1") + + +if __name__ == "__main__": + main() From 7c848fbcc144ab1adb981dd434a2a76687d33b95 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 21:27:42 +0900 Subject: [PATCH 67/74] ci(repair): use minimal PR 737 launcher --- .../repair-pr-737-payload-safe-errors.yml | 111 +----------------- 1 file changed, 2 insertions(+), 109 deletions(-) diff --git a/.github/workflows/repair-pr-737-payload-safe-errors.yml b/.github/workflows/repair-pr-737-payload-safe-errors.yml index a1b968346..6b5638021 100644 --- a/.github/workflows/repair-pr-737-payload-safe-errors.yml +++ b/.github/workflows/repair-pr-737-payload-safe-errors.yml @@ -30,112 +30,5 @@ jobs: with: node-version: 22.22.3 cache: npm - - name: Install approved dependency consumer - run: | - npm install --global npm@10.9.8 - npm ci --ignore-scripts --no-audit --no-fund - - name: Prove the payload-safe regression is red - run: | - set +e - npm exec --workspace @bandscope/shared-types -- \ - vitest run test/naruon-error-redaction.test.ts --coverage=false - status=$? - set -e - if [ "$status" -eq 0 ]; then - echo "Expected attacker-controlled unknown-field names to leak before repair" >&2 - exit 1 - fi - - name: Redact caller-controlled field names while preserving structural location - run: | - python3 - <<'PY' - from pathlib import Path - - source_path = Path("packages/shared-types/src/naruon.ts") - source = source_path.read_text(encoding="utf-8") - source = source.replace( - "/** Return the first key outside an exact allowlist. */", - "/** Return the structural parent path when an object contains an unknown key. */", - ) - old = """ for (const key of Object.keys(value)) { - if (!allowedKeys.includes(key)) { - return `${path}.${key}`; - } - } -""" - new = """ for (const key of Object.keys(value)) { - if (!allowedKeys.includes(key)) { - return path; - } - } -""" - if source.count(old) != 1: - raise SystemExit("unexpected unknown-key helper shape") - source = source.replace(old, new) - source = source.replace("`${sourceExtra} is not allowed`", "`${sourceExtra} contains an unexpected field`") - source = source.replace("`${normExtra} is not allowed`", "`${normExtra} contains an unexpected field`") - source = source.replace("`${eventExtra} is not allowed`", "`${eventExtra} contains an unexpected field`") - source = source.replace("`${commitmentExtra} is not allowed`", "`${commitmentExtra} contains an unexpected field`") - source = source.replace("`${provenanceExtra} is not allowed`", "`${provenanceExtra} contains an unexpected field`") - source = source.replace("`${rootExtra} is not allowed`", "`${rootExtra} contains an unexpected field`") - source = source.replace("`${extra} is not allowed`", "`${extra} contains an unexpected field`") - source_path.write_text(source, encoding="utf-8") - - test_path = Path("packages/shared-types/test/naruon.test.ts") - tests = test_path.read_text(encoding="utf-8") - replacements = { - '"root.extra"': '"root contains an unexpected field"', - '"source.extra"': '"source contains an unexpected field"', - '"normGroup.extra"': '"normGroup contains an unexpected field"', - '"event.extra"': '"event contains an unexpected field"', - '"commitment.extra"': '"commitment contains an unexpected field"', - '"provenance.extra"': '"provenance contains an unexpected field"', - '"evidence[0].extra"': '"evidence[0] contains an unexpected field"', - } - for before, after in replacements.items(): - if tests.count(before) != 1: - raise SystemExit(f"unexpected naruon test expectation: {before}") - tests = tests.replace(before, after) - test_path.write_text(tests, encoding="utf-8") - - docs_path = Path("docs/integrations/naruon.md") - docs = docs_path.read_text(encoding="utf-8") - marker = "Parsing snapshots caller-owned data once before validation and canonicalization." - insertion = ( - "Validation errors identify the structural object containing an unknown field but never " - "echo the caller-controlled field name. This preserves actionable location without " - "copying tenant, person, credential, or other payload text into logs.\n\n" - ) - if docs.count(marker) != 1: - raise SystemExit("unexpected naruon privacy insertion point") - docs_path.write_text(docs.replace(marker, insertion + marker), encoding="utf-8") - - changelog_path = Path("CHANGELOG.md") - changelog = changelog_path.read_text(encoding="utf-8") - old_entry = "- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with Band norm-group identity, Event and Commitment semantics, calibrated provenance, deterministic JSON serialization, and a public JSON Schema while preserving BandScope's standalone local-first operation." - new_entry = old_entry + " Unknown-field errors retain the structural object path without echoing caller-controlled field names." - if changelog.count(old_entry) != 1: - raise SystemExit("unexpected naruon changelog entry") - changelog_path.write_text(changelog.replace(old_entry, new_entry), encoding="utf-8") - PY - - name: Verify shared contract and repository gate - run: | - npm exec --workspace @bandscope/shared-types -- \ - vitest run test/naruon-error-redaction.test.ts --coverage=false - npm run lint --workspace @bandscope/shared-types - npm run typecheck --workspace @bandscope/shared-types - npm run test --workspace @bandscope/shared-types - ./scripts/harness/quickcheck.sh - - name: Remove repair workflow and publish GREEN head - run: | - git config user.name "CWL repair bot" - git config user.email "actions@users.noreply.github.com" - rm .github/workflows/repair-pr-737-payload-safe-errors.yml - git add \ - CHANGELOG.md \ - docs/integrations/naruon.md \ - packages/shared-types/src/naruon.ts \ - packages/shared-types/test/naruon.test.ts \ - packages/shared-types/test/naruon-error-redaction.test.ts \ - .github/workflows/repair-pr-737-payload-safe-errors.yml - git commit -m "fix(integration): keep naruon errors payload-safe" - git push origin HEAD:feat/naruon-rehearsal-handoff-v1 + - name: Execute bounded test-first repair + run: python3 .github/scripts/repair_pr_737.py From 6400f005656c9338f3f93645a15021de7bfd5aa4 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 23:10:30 +0900 Subject: [PATCH 68/74] ci(repair): provision PR 737 verification toolchain --- .../repair-pr-737-payload-safe-errors.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/repair-pr-737-payload-safe-errors.yml b/.github/workflows/repair-pr-737-payload-safe-errors.yml index 6b5638021..1f31c3854 100644 --- a/.github/workflows/repair-pr-737-payload-safe-errors.yml +++ b/.github/workflows/repair-pr-737-payload-safe-errors.yml @@ -30,5 +30,20 @@ jobs: with: node-version: 22.22.3 cache: npm + - uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 + with: + version: "0.8.6" + enable-cache: false + - name: Install stable Rust toolchain + run: rustup toolchain install stable --profile minimal + - name: Build and install Rust numeric extension + run: | + uv sync --project services/analysis-engine --group dev --frozen + VENV_PY="$PWD/services/analysis-engine/.venv/bin/python" + uvx maturin@1.9.6 build --release \ + --manifest-path services/analysis-engine/rust/Cargo.toml \ + --interpreter "$VENV_PY" \ + --out services/analysis-engine/rust/dist + uv pip install --python "$VENV_PY" services/analysis-engine/rust/dist/*.whl - name: Execute bounded test-first repair run: python3 .github/scripts/repair_pr_737.py From 3e4319e68087963ad18ba6cbb90d544e5a77e452 Mon Sep 17 00:00:00 2001 From: CWL repair bot Date: Sat, 15 Aug 2026 15:23:48 +0000 Subject: [PATCH 69/74] fix(integration): keep naruon errors payload-safe --- .github/scripts/repair_pr_737.py | 161 ------------------ .../repair-pr-737-payload-safe-errors.yml | 49 ------ CHANGELOG.md | 2 +- docs/integrations/naruon.md | 2 + packages/shared-types/src/naruon.ts | 18 +- packages/shared-types/test/naruon.test.ts | 14 +- 6 files changed, 19 insertions(+), 227 deletions(-) delete mode 100644 .github/scripts/repair_pr_737.py delete mode 100644 .github/workflows/repair-pr-737-payload-safe-errors.yml diff --git a/.github/scripts/repair_pr_737.py b/.github/scripts/repair_pr_737.py deleted file mode 100644 index 6d0b0a112..000000000 --- a/.github/scripts/repair_pr_737.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import annotations - -import subprocess -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[2] - - -def run(*args: str, check: bool = True) -> subprocess.CompletedProcess[str]: - """Run one repository command with deterministic failure propagation.""" - return subprocess.run(args, cwd=ROOT, check=check, text=True) - - -def replace_once(path: Path, old: str, new: str, label: str) -> None: - """Replace exactly one expected source fragment.""" - text = path.read_text(encoding="utf-8") - if text.count(old) != 1: - raise RuntimeError(f"unexpected {label} shape") - path.write_text(text.replace(old, new), encoding="utf-8") - - -def implement_payload_safe_errors() -> None: - """Retain structural error locations without echoing caller-controlled keys.""" - source_path = ROOT / "packages/shared-types/src/naruon.ts" - source = source_path.read_text(encoding="utf-8") - source = source.replace( - "/** Return the first key outside an exact allowlist. */", - "/** Return the structural parent path when an object contains an unknown key. */", - ) - old = """ for (const key of Object.keys(value)) { - if (!allowedKeys.includes(key)) { - return `${path}.${key}`; - } - } -""" - new = """ for (const key of Object.keys(value)) { - if (!allowedKeys.includes(key)) { - return path; - } - } -""" - if source.count(old) != 1: - raise RuntimeError("unexpected unknown-key helper shape") - source = source.replace(old, new) - for variable in ( - "sourceExtra", - "normExtra", - "eventExtra", - "commitmentExtra", - "provenanceExtra", - "rootExtra", - "extra", - ): - before = f"`${{{variable}}} is not allowed`" - after = f"`${{{variable}}} contains an unexpected field`" - if source.count(before) != 1: - raise RuntimeError(f"unexpected {variable} error shape") - source = source.replace(before, after) - source_path.write_text(source, encoding="utf-8") - - test_path = ROOT / "packages/shared-types/test/naruon.test.ts" - tests = test_path.read_text(encoding="utf-8") - replacements = { - '"root.extra"': '"root contains an unexpected field"', - '"source.extra"': '"source contains an unexpected field"', - '"normGroup.extra"': '"normGroup contains an unexpected field"', - '"event.extra"': '"event contains an unexpected field"', - '"commitment.extra"': '"commitment contains an unexpected field"', - '"provenance.extra"': '"provenance contains an unexpected field"', - '"evidence[0].extra"': '"evidence[0] contains an unexpected field"', - } - for before, after in replacements.items(): - if tests.count(before) != 1: - raise RuntimeError(f"unexpected naruon test expectation: {before}") - tests = tests.replace(before, after) - test_path.write_text(tests, encoding="utf-8") - - docs_path = ROOT / "docs/integrations/naruon.md" - marker = "Parsing snapshots caller-owned data once before validation and canonicalization." - insertion = ( - "Validation errors identify the structural object containing an unknown field but never " - "echo the caller-controlled field name. This preserves actionable location without " - "copying tenant, person, credential, or other payload text into logs.\n\n" - ) - replace_once(docs_path, marker, insertion + marker, "naruon privacy insertion point") - - changelog_path = ROOT / "CHANGELOG.md" - old_entry = ( - "- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with " - "Band norm-group identity, Event and Commitment semantics, calibrated provenance, " - "deterministic JSON serialization, and a public JSON Schema while preserving BandScope's " - "standalone local-first operation." - ) - replace_once( - changelog_path, - old_entry, - old_entry - + " Unknown-field errors retain the structural object path without echoing " - "caller-controlled field names.", - "naruon changelog entry", - ) - - -def main() -> None: - """Execute RED, minimal implementation, GREEN verification, and self-removal.""" - run("npm", "install", "--global", "npm@10.9.8") - run("npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund") - - red = run( - "npm", - "exec", - "--workspace", - "@bandscope/shared-types", - "--", - "vitest", - "run", - "test/naruon-error-redaction.test.ts", - "--coverage=false", - check=False, - ) - if red.returncode == 0: - raise RuntimeError("expected unknown-field key leakage before implementation") - - implement_payload_safe_errors() - run( - "npm", - "exec", - "--workspace", - "@bandscope/shared-types", - "--", - "vitest", - "run", - "test/naruon-error-redaction.test.ts", - "--coverage=false", - ) - run("npm", "run", "lint", "--workspace", "@bandscope/shared-types") - run("npm", "run", "typecheck", "--workspace", "@bandscope/shared-types") - run("npm", "run", "test", "--workspace", "@bandscope/shared-types") - run("./scripts/harness/quickcheck.sh") - - (ROOT / ".github/workflows/repair-pr-737-payload-safe-errors.yml").unlink() - Path(__file__).unlink() - run("git", "config", "user.name", "CWL repair bot") - run("git", "config", "user.email", "actions@users.noreply.github.com") - run( - "git", - "add", - "CHANGELOG.md", - "docs/integrations/naruon.md", - "packages/shared-types/src/naruon.ts", - "packages/shared-types/test/naruon.test.ts", - "packages/shared-types/test/naruon-error-redaction.test.ts", - ".github/workflows/repair-pr-737-payload-safe-errors.yml", - ".github/scripts/repair_pr_737.py", - ) - run("git", "commit", "-m", "fix(integration): keep naruon errors payload-safe") - run("git", "push", "origin", "HEAD:feat/naruon-rehearsal-handoff-v1") - - -if __name__ == "__main__": - main() diff --git a/.github/workflows/repair-pr-737-payload-safe-errors.yml b/.github/workflows/repair-pr-737-payload-safe-errors.yml deleted file mode 100644 index 1f31c3854..000000000 --- a/.github/workflows/repair-pr-737-payload-safe-errors.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Repair PR 737 payload-safe errors - -on: - push: - branches: - - feat/naruon-rehearsal-handoff-v1 - paths: - - .github/workflows/repair-pr-737-payload-safe-errors.yml - -permissions: - contents: write - -env: - GIT_CONFIG_COUNT: "1" - GIT_CONFIG_KEY_0: init.defaultBranch - GIT_CONFIG_VALUE_0: develop - -jobs: - repair: - if: >- - github.repository == 'ContextualWisdomLab/bandscope' && - github.ref == 'refs/heads/feat/naruon-rehearsal-handoff-v1' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - with: - fetch-depth: 0 - ref: feat/naruon-rehearsal-handoff-v1 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - with: - node-version: 22.22.3 - cache: npm - - uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 - with: - version: "0.8.6" - enable-cache: false - - name: Install stable Rust toolchain - run: rustup toolchain install stable --profile minimal - - name: Build and install Rust numeric extension - run: | - uv sync --project services/analysis-engine --group dev --frozen - VENV_PY="$PWD/services/analysis-engine/.venv/bin/python" - uvx maturin@1.9.6 build --release \ - --manifest-path services/analysis-engine/rust/Cargo.toml \ - --interpreter "$VENV_PY" \ - --out services/analysis-engine/rust/dist - uv pip install --python "$VENV_PY" services/analysis-engine/rust/dist/*.whl - - name: Execute bounded test-first repair - run: python3 .github/scripts/repair_pr_737.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 191ac39f9..93f2890bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Added -- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with Band norm-group identity, Event and Commitment semantics, calibrated provenance, deterministic JSON serialization, and a public JSON Schema while preserving BandScope's standalone local-first operation. +- Add a versioned, dependency-free BandScope → naruon rehearsal handoff contract with Band norm-group identity, Event and Commitment semantics, calibrated provenance, deterministic JSON serialization, and a public JSON Schema while preserving BandScope's standalone local-first operation. Unknown-field errors retain the structural object path without echoing caller-controlled field names. - Display the analyzed song tempo (BPM) as a badge in the rehearsal workspace. - 각 합주 역할(Role)별 개인 연습 진행도를 0~100% 범위로 기록 및 시각화할 수 있는 연습 진척도(`practiceProgress`) 트래커 기능 추가. UI 컨트롤(슬라이더 및 +/- 버튼)과 한/영 다국어 지원 포함. diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md index 077b1d77f..260d5eab6 100644 --- a/docs/integrations/naruon.md +++ b/docs/integrations/naruon.md @@ -86,6 +86,8 @@ The contract fails closed on: `Z` and `-00:00` are accepted with an explicit IANA zone as unknown-local-offset forms; a numeric `+/-HH:MM` offset is treated as an assertion and must agree with that zone. This follows the RFC 9557 distinction between an asserted numeric offset and time-zone information. +Validation errors identify the structural object containing an unknown field but never echo the caller-controlled field name. This preserves actionable location without copying tenant, person, credential, or other payload text into logs. + Parsing snapshots caller-owned data once before validation and canonicalization. It then returns newly allocated nested objects and evidence receipts, so accessors, proxies, concurrent mutation, or retained input references cannot make validation observe different data from the canonical output. ## Trust and privacy model diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index c0e74249a..c48fd434e 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -126,7 +126,7 @@ function isDenseArray(value: unknown, maximumLength: number): value is unknown[] return true; } -/** Return the first key outside an exact allowlist. */ +/** Return the structural parent path when an object contains an unknown key. */ function unexpectedKey( value: Record, allowedKeys: readonly string[], @@ -134,7 +134,7 @@ function unexpectedKey( ): string | null { for (const key of Object.keys(value)) { if (!allowedKeys.includes(key)) { - return `${path}.${key}`; + return path; } } return null; @@ -249,7 +249,7 @@ function isOffsetConsistentWithTimeZone(timestamp: string, timeZone: string): bo function validateEvidenceReceipt(value: unknown, path: string): string | null { if (!isRecord(value)) return `${path} must be an object`; const extra = unexpectedKey(value, ["field", "value"], path); - if (extra) return `${extra} is not allowed`; + if (extra) return `${extra} contains an unexpected field`; if (!isDisplayText(value.field, MAX_IDENTIFIER_LENGTH)) return `${path}.field is invalid`; if (!isDisplayText(value.value)) return `${path}.value is invalid`; return null; @@ -272,7 +272,7 @@ function validateSnapshot(value: unknown): string | null { ], "root" ); - if (rootExtra) return `${rootExtra} is not allowed`; + if (rootExtra) return `${rootExtra} contains an unexpected field`; if (value.artifactKind !== NARUON_REHEARSAL_HANDOFF_KIND) return "artifactKind is invalid"; if (value.artifactVersion !== NARUON_REHEARSAL_HANDOFF_VERSION) return "artifactVersion is invalid"; if (!isRfc3339(value.createdAt)) return "createdAt is invalid"; @@ -283,7 +283,7 @@ function validateSnapshot(value: unknown): string | null { ["application", "workspaceId", "bandId", "rehearsalId"], "source" ); - if (sourceExtra) return `${sourceExtra} is not allowed`; + if (sourceExtra) return `${sourceExtra} contains an unexpected field`; if (value.source.application !== "bandscope") return "source.application is invalid"; for (const field of ["workspaceId", "bandId", "rehearsalId"] as const) { if (!isOpaqueIdentifier(value.source[field])) return `source.${field} is invalid`; @@ -291,7 +291,7 @@ function validateSnapshot(value: unknown): string | null { if (!isRecord(value.normGroup)) return "normGroup must be an object"; const normExtra = unexpectedKey(value.normGroup, ["kind", "id", "label"], "normGroup"); - if (normExtra) return `${normExtra} is not allowed`; + if (normExtra) return `${normExtra} contains an unexpected field`; if (value.normGroup.kind !== "band") return "normGroup.kind is invalid"; if (!isOpaqueIdentifier(value.normGroup.id)) return "normGroup.id is invalid"; if (!isDisplayText(value.normGroup.label)) return "normGroup.label is invalid"; @@ -303,7 +303,7 @@ function validateSnapshot(value: unknown): string | null { ["title", "startsAt", "endsAt", "timeZone", "venue"], "event" ); - if (eventExtra) return `${eventExtra} is not allowed`; + if (eventExtra) return `${eventExtra} contains an unexpected field`; if (!isDisplayText(value.event.title)) return "event.title is invalid"; if (!isRfc3339(value.event.startsAt)) return "event.startsAt is invalid"; if (!isRfc3339(value.event.endsAt)) return "event.endsAt is invalid"; @@ -327,7 +327,7 @@ function validateSnapshot(value: unknown): string | null { ["status", "rsvpDirection"], "commitment" ); - if (commitmentExtra) return `${commitmentExtra} is not allowed`; + if (commitmentExtra) return `${commitmentExtra} contains an unexpected field`; if (!isOneOf(COMMITMENT_STATUSES, value.commitment.status)) { return "commitment.status is invalid"; } @@ -341,7 +341,7 @@ function validateSnapshot(value: unknown): string | null { ["sourceRecordId", "confidence", "evidence"], "provenance" ); - if (provenanceExtra) return `${provenanceExtra} is not allowed`; + if (provenanceExtra) return `${provenanceExtra} contains an unexpected field`; if (!isOpaqueIdentifier(value.provenance.sourceRecordId)) { return "provenance.sourceRecordId is invalid"; } diff --git a/packages/shared-types/test/naruon.test.ts b/packages/shared-types/test/naruon.test.ts index 6e0c76e09..fca7f14c2 100644 --- a/packages/shared-types/test/naruon.test.ts +++ b/packages/shared-types/test/naruon.test.ts @@ -157,24 +157,24 @@ describe("naruon rehearsal handoff contract", () => { }); it.each([ - ["root.extra", (value: any) => { value.extra = true; }], + ["root contains an unexpected field", (value: any) => { value.extra = true; }], ["artifactKind", (value: any) => { value.artifactKind = "other"; }], ["artifactVersion", (value: any) => { value.artifactVersion = 2; }], ["createdAt", (value: any) => { value.createdAt = "2026-08-03"; }], ["source must", (value: any) => { value.source = null; }], - ["source.extra", (value: any) => { value.source.extra = true; }], + ["source contains an unexpected field", (value: any) => { value.source.extra = true; }], ["source.application", (value: any) => { value.source.application = "naruon"; }], ["source.workspaceId", (value: any) => { value.source.workspaceId = "123"; }], ["source.bandId", (value: any) => { value.source.bandId = ""; }], ["source.rehearsalId", (value: any) => { value.source.rehearsalId = "bad\nvalue"; }], ["normGroup must", (value: any) => { value.normGroup = []; }], - ["normGroup.extra", (value: any) => { value.normGroup.extra = true; }], + ["normGroup contains an unexpected field", (value: any) => { value.normGroup.extra = true; }], ["normGroup.kind", (value: any) => { value.normGroup.kind = "team"; }], ["normGroup.id is", (value: any) => { value.normGroup.id = "44"; }], ["normGroup.label", (value: any) => { value.normGroup.label = " label "; }], ["must equal", (value: any) => { value.normGroup.id = "band-other"; }], ["event must", (value: any) => { value.event = "event"; }], - ["event.extra", (value: any) => { value.event.extra = true; }], + ["event contains an unexpected field", (value: any) => { value.event.extra = true; }], ["event.title", (value: any) => { value.event.title = ""; }], ["event.startsAt", (value: any) => { value.event.startsAt = "not-a-date"; }], ["event.endsAt is", (value: any) => { value.event.endsAt = "not-a-date"; }], @@ -182,16 +182,16 @@ describe("naruon rehearsal handoff contract", () => { ["event.timeZone", (value: any) => { value.event.timeZone = "Mars/Olympus"; }], ["event.venue", (value: any) => { value.event.venue = " "; }], ["commitment must", (value: any) => { value.commitment = null; }], - ["commitment.extra", (value: any) => { value.commitment.extra = true; }], + ["commitment contains an unexpected field", (value: any) => { value.commitment.extra = true; }], ["commitment.status", (value: any) => { value.commitment.status = "maybe"; }], ["commitment.rsvpDirection", (value: any) => { value.commitment.rsvpDirection = "observer"; }], ["provenance must", (value: any) => { value.provenance = null; }], - ["provenance.extra", (value: any) => { value.provenance.extra = true; }], + ["provenance contains an unexpected field", (value: any) => { value.provenance.extra = true; }], ["provenance.sourceRecordId", (value: any) => { value.provenance.sourceRecordId = "7"; }], ["provenance.confidence", (value: any) => { value.provenance.confidence = Number.NaN; }], ["provenance.evidence", (value: any) => { value.provenance.evidence = "receipt"; }], ["evidence[0] must", (value: any) => { value.provenance.evidence[0] = null; }], - ["evidence[0].extra", (value: any) => { value.provenance.evidence[0].extra = true; }], + ["evidence[0] contains an unexpected field", (value: any) => { value.provenance.evidence[0].extra = true; }], ["evidence[0].field", (value: any) => { value.provenance.evidence[0].field = ""; }], ["evidence[0].value", (value: any) => { value.provenance.evidence[0].value = "bad\nvalue"; }] ])("fails closed for %s", (expected, mutate) => { From cd8dd7f6eb154e59ab3d941dd3d583bb824e5a15 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 16 Aug 2026 00:35:54 +0900 Subject: [PATCH 70/74] docs(integration): clarify payload-safe error locations --- docs/integrations/naruon.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md index 260d5eab6..347bb22e4 100644 --- a/docs/integrations/naruon.md +++ b/docs/integrations/naruon.md @@ -86,7 +86,7 @@ The contract fails closed on: `Z` and `-00:00` are accepted with an explicit IANA zone as unknown-local-offset forms; a numeric `+/-HH:MM` offset is treated as an assertion and must agree with that zone. This follows the RFC 9557 distinction between an asserted numeric offset and time-zone information. -Validation errors identify the structural object containing an unknown field but never echo the caller-controlled field name. This preserves actionable location without copying tenant, person, credential, or other payload text into logs. +Validation errors identify the structural object containing an unknown field but never echo the caller-controlled field name. This preserves actionable location without copying tenant, person, credential, or other payload text into logs. Diagnostic locations such as `root`, `source`, and `provenance.evidence[0]` are schema-owned labels derived from validation structure, not from payload keys or values. Parsing snapshots caller-owned data once before validation and canonicalization. It then returns newly allocated nested objects and evidence receipts, so accessors, proxies, concurrent mutation, or retained input references cannot make validation observe different data from the canonical output. From 455f189b877a95105acd57ffa69b9c6c856b5d1f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 16 Aug 2026 06:19:01 +0900 Subject: [PATCH 71/74] docs(doctoring): ground naruon handoff in current standards --- docs/doctoring/naruon-rehearsal-handoff.md | 74 ++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 docs/doctoring/naruon-rehearsal-handoff.md diff --git a/docs/doctoring/naruon-rehearsal-handoff.md b/docs/doctoring/naruon-rehearsal-handoff.md new file mode 100644 index 000000000..3c638f87d --- /dev/null +++ b/docs/doctoring/naruon-rehearsal-handoff.md @@ -0,0 +1,74 @@ +# BandScope → naruon rehearsal handoff standards evidence + +## Status + +**Active Draft PR evidence.** This record documents the standards basis for the versioned BandScope → naruon rehearsal handoff introduced on PR #737. It is not protected-`develop` shipped truth until the implementation is merged and revalidated on the protected branch. + +## Scope and architectural decision + +BandScope remains independently useful and local-first. The integration boundary is a dependency-free, versioned JSON artifact rather than a mandatory naruon network dependency. The TypeScript parser is the authoritative application trust boundary; the public JSON Schema is a portable structural companion, not a substitute for application-level semantic validation. + +This split is intentional. JSON Schema Draft 2020-12 separates structural validation from semantic `format` handling, and its standard meta-schema does not require `format` to be asserted by default. Therefore, consumers cannot safely assume that a generic schema validator will fully validate date-time semantics merely because a property declares `"format": "date-time"` (Wright et al., 2022). BandScope consequently performs calendrical, IANA-zone, cross-field, size, snapshot, and offset-consistency checks in the TypeScript parser. + +## Timestamp profile and time-zone semantics + +The handoff uses a deliberately bounded RFC 3339-derived timestamp profile: + +- four-digit years, two-digit month/day/time fields, an explicit `T`, and an explicit `Z` or numeric UTC offset; +- calendar-valid dates and bounded fractional seconds; +- uppercase `T`/`Z` canonical spelling; +- no leap-second `:60` values at this application boundary; and +- an explicit IANA time-zone identifier stored separately in `event.timeZone`. + +RFC 3339 permits leap-second `:60` under its leap-second rules and notes that lowercase `t`/`z` can be accepted by the ABNF, while also allowing specifications in case-sensitive contexts to require uppercase spellings (Klyne & Newman, 2002). BandScope intentionally chooses a narrower scheduling profile: rehearsal events do not need leap-second representation, and canonical uppercase serialization avoids cross-runtime ambiguity. Documentation must therefore describe this as BandScope's RFC 3339 profile rather than implying acceptance of every RFC 3339 lexical form. + +RFC 9557 updates RFC 3339's interpretation of `Z`: `Z` expresses that the UTC instant is known while the preferred local offset is not asserted; `-00:00` has the same semantic meaning but is less interoperable and `Z` is preferred. By contrast, a numeric offset is an assertion that can be inconsistent with named time-zone information (Sharma & Bormann, 2024). The handoff reflects that distinction: + +- `Z` and `-00:00` do not assert local clock fields against `event.timeZone`; +- numeric `+/-HH:MM` offsets are checked against the required IANA zone at that instant; and +- an inconsistency is rejected rather than silently choosing one source of temporal truth. + +Although RFC 9557 serializes named time zones as IXDTF suffixes, BandScope carries the IANA identifier in a separate required JSON field. The semantic rule is deliberately equivalent to treating the named zone as critical application information: a consumer must not project an event whose asserted numeric offset conflicts with the required zone. + +## JSON and schema boundary + +RFC 8259 defines JSON's interoperable data model and requires object member names to be strings; it does not provide application authorization, provenance, or semantic identity guarantees (Bray, 2017). The handoff therefore adds fail-closed application constraints beyond JSON syntax: + +- `additionalProperties: false` at every public object level; +- bounded strings, arrays, and serialized UTF-8 size; +- opaque nonnumeric identifiers; +- exact artifact kind/version discriminators; +- canonical key order for deterministic serialization; +- band identity consistency between `source.bandId` and `normGroup.id`; +- finite calibrated confidence in `[0, 1]`; +- dense bounded evidence receipts; and +- payload-safe diagnostics that report schema-owned locations without echoing attacker-controlled unknown property names. + +JSON Schema Draft 2020-12 expects Unicode-aware regular-expression behavior, but validator implementations can still differ in feature support. The checked-in schema therefore documents that consumers must use Unicode semantics for `\p{Nd}` and must invoke the TypeScript parser for semantic checks that are not portable schema assertions. + +## Security, privacy, and evidence implications + +The artifact carries authorized rehearsal coordination facts and provenance; it is not itself an authorization token. It grants no filesystem, database, calendar, mail, model, or network capability. Connector authentication, tenant binding, consent, signature/authenticated-envelope verification, persistence, and externally visible writeback remain outside the shared-types package. + +For audit readiness, a receiving connector should preserve the validated artifact plus transport/signature evidence, maintain tenant/band segregation, and record the mapping from `sourceRecordId`/field evidence to any projected Event or Commitment. Validation errors must remain payload-safe so logs do not become a secondary disclosure channel for person, tenant, credential, or other caller-controlled property names. + +## Verification contract + +Commercial verification for this boundary requires all of the following: + +1. runtime parser and public schema reject unknown fields and malformed structure; +2. runtime parser enforces the semantic rules the schema cannot portably guarantee, including IANA-zone availability, numeric-offset consistency, cross-field identity, canonical snapshotting, and serialized-size limits; +3. deterministic serialization is invariant to caller key insertion order; +4. valid `Z`/`-00:00` unknown-local-offset forms remain accepted with an explicit IANA zone, while inconsistent numeric offsets fail closed; +5. the deliberately narrower timestamp profile rejects leap-second `:60` and noncanonical lowercase timestamp separators as application policy rather than misclassifying those forms as universally invalid RFC 3339; and +6. repository exact-head type, lint, test, coverage, SAST, security, SBOM, supply-chain, and independent-review gates remain mandatory. + +## References + +Bray, T. (2017). *The JavaScript Object Notation (JSON) data interchange format* (RFC 8259). Internet Engineering Task Force. https://doi.org/10.17487/RFC8259 + +Klyne, G., & Newman, C. (2002). *Date and time on the Internet: Timestamps* (RFC 3339). Internet Engineering Task Force. https://doi.org/10.17487/RFC3339 + +Sharma, U., & Bormann, C. (2024). *Date and time on the Internet: Timestamps with additional information* (RFC 9557). Internet Engineering Task Force. https://doi.org/10.17487/RFC9557 + +Wright, A., Andrews, H., Hutton, B., & Dennis, G. (2022). *JSON Schema Draft 2020-12*. JSON Schema. https://json-schema.org/draft/2020-12 From 30904bb26acb0af03493ce854c7976b6563d6563 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 16 Aug 2026 06:19:25 +0900 Subject: [PATCH 72/74] docs(integration): clarify timestamp and schema authority --- docs/integrations/naruon.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/integrations/naruon.md b/docs/integrations/naruon.md index 347bb22e4..d1ba7935e 100644 --- a/docs/integrations/naruon.md +++ b/docs/integrations/naruon.md @@ -74,7 +74,8 @@ The contract fails closed on: - unknown fields at every object level; - numeric-only IDs (BandScope and naruon IDs must remain opaque strings); - blank, untrimmed, control-character-bearing, or oversized values; -- malformed or calendrically invalid RFC 3339 timestamps; +- malformed or calendrically invalid timestamps outside BandScope's canonical RFC 3339 profile; +- leap-second `:60` values and noncanonical lowercase timestamp separators, which this scheduling contract deliberately excludes even though RFC 3339 itself defines broader lexical cases; - an end time that is not later than its start time; - time-zone identifiers rejected by the runtime's IANA/ICU database; - numeric UTC offsets whose asserted local clock fields disagree with the required IANA time zone at that instant, including daylight-saving transitions; @@ -84,15 +85,17 @@ The contract fails closed on: - empty, sparse, oversized, or malformed provenance receipt arrays; - JSON inputs larger than 256 KiB of UTF-8 or caller-owned values that cannot be safely snapshotted. -`Z` and `-00:00` are accepted with an explicit IANA zone as unknown-local-offset forms; a numeric `+/-HH:MM` offset is treated as an assertion and must agree with that zone. This follows the RFC 9557 distinction between an asserted numeric offset and time-zone information. +`Z` and `-00:00` are accepted with an explicit IANA zone as unknown-local-offset forms; a numeric `+/-HH:MM` offset is treated as an assertion and must agree with that zone. This follows RFC 9557's update to RFC 3339: `Z` and `-00:00` do not assert a preferred local offset, while a numeric offset does. Validation errors identify the structural object containing an unknown field but never echo the caller-controlled field name. This preserves actionable location without copying tenant, person, credential, or other payload text into logs. Diagnostic locations such as `root`, `source`, and `provenance.evidence[0]` are schema-owned labels derived from validation structure, not from payload keys or values. Parsing snapshots caller-owned data once before validation and canonicalization. It then returns newly allocated nested objects and evidence receipts, so accessors, proxies, concurrent mutation, or retained input references cannot make validation observe different data from the canonical output. +The standards rationale, semantic profile decisions, and APA 7 references are maintained in `docs/doctoring/naruon-rehearsal-handoff.md`. + ## Trust and privacy model -This artifact contains **rehearsal coordination facts only**. It does not grant naruon filesystem, database, calendar, mail, model, or network authority. Transport, tenant authorization, detached signature verification, consent, context bridging, and writeback remain responsibilities of the naruon plugin/connector installation. +This artifact contains **rehearsal coordination facts only**. It does not grant naruon filesystem, database, calendar, mail, model, or network authority. Transport, tenant authorization, detached signature verification, consent, context bridging, persistence, and writeback remain responsibilities of the naruon plugin/connector installation. A connector should: @@ -109,4 +112,4 @@ A connector should: - `artifactVersion`: `1` - Additive fields require a new version because version 1 rejects unknown keys. - Breaking semantic changes require a new artifact kind or major version. -- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; validators must compile schema patterns with Unicode semantics for `\p{Nd}`, and the TypeScript parser remains authoritative for payload-size, snapshot, cross-field, leading/trailing whitespace normalization, Unicode-aware numeric-only identifier rejection, RFC 9557 offset/time-zone consistency, and IANA time-zone checks. +- The JSON Schema companion is `naruon-rehearsal-handoff-v1.schema.json`; validators must compile schema patterns with Unicode semantics for `\p{Nd}`. Under JSON Schema Draft 2020-12, `format` is not an assertion by default, so schema-only consumers must not treat `"format": "date-time"` as proof of complete temporal validity. The TypeScript parser remains authoritative for payload size, snapshotting, cross-field rules, leading/trailing whitespace normalization, Unicode-aware numeric-only identifier rejection, BandScope's canonical timestamp profile, RFC 9557 offset/time-zone consistency, and IANA time-zone checks. From 5f44945b5a06b5b3580621d8b0a308111555485a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 16 Aug 2026 13:24:08 +0900 Subject: [PATCH 73/74] fix(integration): enforce naruon wire size --- packages/shared-types/src/naruon.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/shared-types/src/naruon.ts b/packages/shared-types/src/naruon.ts index c48fd434e..0d501d354 100644 --- a/packages/shared-types/src/naruon.ts +++ b/packages/shared-types/src/naruon.ts @@ -366,6 +366,11 @@ function validateSnapshot(value: unknown): string | null { ); if (error) return error; } + + const canonicalSerialized = `${JSON.stringify(canonicalizeSnapshot(value))}\n`; + if (serializedByteLength(canonicalSerialized) > MAX_NARUON_SERIALIZED_BYTES) { + return "serialized handoff is oversized"; + } return null; } From 82ae343e9911e30cbfe65f1264367b6ae8576cb6 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 16 Aug 2026 13:24:35 +0900 Subject: [PATCH 74/74] test(integration): lock naruon wire-size round trip --- .../shared-types/test/naruon-hardening.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/shared-types/test/naruon-hardening.test.ts b/packages/shared-types/test/naruon-hardening.test.ts index 113c806fc..9c75c5407 100644 --- a/packages/shared-types/test/naruon-hardening.test.ts +++ b/packages/shared-types/test/naruon-hardening.test.ts @@ -4,6 +4,7 @@ import { createNaruonRehearsalHandoff, deserializeNaruonRehearsalHandoff, parseNaruonRehearsalHandoff, + serializeNaruonRehearsalHandoff, validateNaruonRehearsalHandoff, type CreateNaruonRehearsalHandoffInput } from "../src/naruon"; @@ -135,6 +136,21 @@ describe("naruon handoff boundary hardening", () => { ); }); + it("rejects handoffs whose canonical UTF-8 serialization exceeds the wire limit", () => { + const input = validInput(); + input.provenance.evidence = Array.from( + { length: MAX_NARUON_EVIDENCE_RECEIPTS }, + (_, index) => ({ field: `field-${index}`, value: "界".repeat(2_048) }) + ); + const value = artifact(input); + + expect(validateNaruonRehearsalHandoff(value)).toBe("serialized handoff is oversized"); + expect(() => parseNaruonRehearsalHandoff(value)).toThrow("serialized handoff is oversized"); + expect(() => serializeNaruonRehearsalHandoff(value)).toThrow( + "serialized handoff is oversized" + ); + }); + it("bounds untrusted serialized input before JSON parsing", () => { expect(() => deserializeNaruonRehearsalHandoff(42)).toThrow( "serialized payload is invalid or oversized"