From 895d775c6c23f96b18e97e51d60f6a2b3e7ab6ea Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:17:35 -0700 Subject: [PATCH 1/7] Add local runt-schema directory for LiveStore upgrade testing This is a temporary copy of @runt/schema to facilitate the LiveStore 0.4.0-dev.7 upgrade. It will be removed once the upgrade is complete and we can reference the updated schema package. --- src/runt-schema/mod.ts | 2370 +++++++++++++++++++++++ src/runt-schema/queries/cellOrdering.ts | 150 ++ src/runt-schema/queries/index.ts | 94 + src/runt-schema/queries/outputDeltas.ts | 62 + src/runt-schema/tables.ts | 220 +++ src/runt-schema/types.ts | 235 +++ 6 files changed, 3131 insertions(+) create mode 100644 src/runt-schema/mod.ts create mode 100644 src/runt-schema/queries/cellOrdering.ts create mode 100644 src/runt-schema/queries/index.ts create mode 100644 src/runt-schema/queries/outputDeltas.ts create mode 100644 src/runt-schema/tables.ts create mode 100644 src/runt-schema/types.ts diff --git a/src/runt-schema/mod.ts b/src/runt-schema/mod.ts new file mode 100644 index 00000000..e8e6078c --- /dev/null +++ b/src/runt-schema/mod.ts @@ -0,0 +1,2370 @@ +import { Events, Schema, State } from "@livestore/livestore"; + +import { + ActorTypeSchema, + type CellType, + CellTypeSchema, + MediaRepresentationSchema, +} from "./types.ts"; + +import type { + ArtifactContainer, + InlineContainer, + MediaContainer, +} from "./types.ts"; + +import { tables } from "./tables.ts"; + +export { tables }; + +export * from "./types.ts"; +export * from "./queries/index.ts"; + +/** + * CLIENT AUTHENTICATION PATTERNS + * + * The LiveStore sync backend validates client connections using authToken and clientId. + * Different client types use different authentication patterns: + * + * SERVICE CLIENTS (runtime: true): + * - Runtime agents: clientId = runtimeId (e.g. "python-runtime-123") + * - Notebook runners: clientId = "automation-client" (headless execution) + * - TUI clients: clientId = "tui-client" (terminal interface) + * - Service clients use RUNT_API_KEY for user authentication (AUTH_TOKEN as service fallback) + * - ClientId must be non-numeric to prevent user impersonation + * + * USER CLIENTS (runtime: false/undefined): + * - Regular users: clientId = userId-{uniqueId} (e.g. "user123-abc-def-ghi") + + * - User clients use OIDC tokens for authentication + * - User ID is passed separately in sync payload for authorization + * - ClientId identifies device/app instances following LiveStore best practices + * + * PRESENCE DISPLAY: + * - Runtime agents: Bot icon with runtimeType label + * - Notebook runners: Play icon (headless execution you can monitor) + * - TUI clients: Terminal icon (terminal interface) + * - Regular users: User avatar/initials + */ + +// Events describe notebook and cell changes +// All events are scoped to a single notebook (storeId = notebookId) +export const events = { + debug1: Events.synced({ + name: "v1.Debug", + schema: Schema.Struct({ + id: Schema.String, + }), + }), + + // Notebook events (single notebook per store) + /** @deprecated */ + notebookInitialized: Events.synced({ + name: "v1.NotebookInitialized", + schema: Schema.Struct({ + id: Schema.String, // Same as storeId + title: Schema.String, + ownerId: Schema.String, + }), + }), + + notebookTitleChanged: Events.synced({ + name: "v1.NotebookTitleChanged", + schema: Schema.Struct({ + title: Schema.String, + }), + }), + + notebookMetadataSet: Events.synced({ + name: "v1.NotebookMetadataSet", + schema: Schema.Struct({ + key: Schema.String, + value: Schema.String, + }), + }), + + // Cell events + cellCreated: Events.synced({ + name: "v1.CellCreated", + schema: Schema.Struct({ + id: Schema.String, + cellType: CellTypeSchema, + position: Schema.Number, + createdBy: Schema.String, + actorId: Schema.optional(Schema.String), + }), + }), + + /** + v2 cell created with fractional indexing + { + id: CellId, + fractionalIndex: string, // Fractional index (e.g., "a0", "a5", "b0") + cellType: CellType, + } + + Note: fractionalIndex column has been added to cells table. + Future migration steps: + 1. Migrate existing cells to use fractional indices based on position + 2. Update all queries to use ORDER BY fractionalIndex instead of position + 3. Eventually deprecate position column from cells table + 4. Update v1.CellCreated to calculate fractional index + */ + cellCreated2: Events.synced({ + name: "v2.CellCreated", + schema: Schema.Struct({ + id: Schema.String, + fractionalIndex: Schema.String.annotations({ + description: "Jittered fractional index for deterministic ordering", + }), + cellType: CellTypeSchema, + createdBy: Schema.String, + }), + }), + + cellSourceChanged: Events.synced({ + name: "v1.CellSourceChanged", + schema: Schema.Struct({ + id: Schema.String, + source: Schema.String, + modifiedBy: Schema.String, + }), + }), + + cellTypeChanged: Events.synced({ + name: "v1.CellTypeChanged", + schema: Schema.Struct({ + id: Schema.String, + cellType: CellTypeSchema, + actorId: Schema.optional(Schema.String), + }), + }), + + cellDeleted: Events.synced({ + name: "v1.CellDeleted", + schema: Schema.Struct({ + id: Schema.String, + actorId: Schema.optional(Schema.String), + }), + }), + + cellMoved: Events.synced({ + name: "v1.CellMoved", + schema: Schema.Struct({ + id: Schema.String, + newPosition: Schema.Number, + actorId: Schema.optional(Schema.String), + }), + }), + + cellMoved2: Events.synced({ + name: "v2.CellMoved", + schema: Schema.Struct({ + id: Schema.String, + fractionalIndex: Schema.String.annotations({ + description: "New fractional index position for the cell", + }), + actorId: Schema.optional(Schema.String), + }), + }), + + cellSourceVisibilityToggled: Events.synced({ + name: "v1.CellSourceVisibilityToggled", + schema: Schema.Struct({ + id: Schema.String, + sourceVisible: Schema.Boolean, + actorId: Schema.optional(Schema.String), + }), + }), + + cellOutputVisibilityToggled: Events.synced({ + name: "v1.CellOutputVisibilityToggled", + schema: Schema.Struct({ + id: Schema.String, + outputVisible: Schema.Boolean, + actorId: Schema.optional(Schema.String), + }), + }), + + cellAiContextVisibilityToggled: Events.synced({ + name: "v1.CellAiContextVisibilityToggled", + schema: Schema.Struct({ + id: Schema.String, + aiContextVisible: Schema.Boolean, + actorId: Schema.optional(Schema.String), + }), + }), + + // Runtime lifecycle events + runtimeSessionStarted: Events.synced({ + name: "v1.RuntimeSessionStarted", + schema: Schema.Struct({ + sessionId: Schema.String, // Unique per runtime restart + runtimeId: Schema.String, // Stable runtime identifier + runtimeType: Schema.String, + capabilities: Schema.Struct({ + canExecuteCode: Schema.Boolean, + canExecuteSql: Schema.Boolean, + canExecuteAi: Schema.Boolean, + availableAiModels: Schema.optional(Schema.Any), + }), + }), + }), + + presenceSet: Events.synced({ + name: "v1.PresenceSet", + schema: Schema.Struct({ + userId: Schema.String, + cellId: Schema.optional(Schema.String), + }), + }), + + runtimeSessionStatusChanged: Events.synced({ + name: "v1.RuntimeSessionStatusChanged", + schema: Schema.Struct({ + sessionId: Schema.String, + status: Schema.Literal("ready", "busy", "restarting"), + }), + }), + + runtimeSessionTerminated: Events.synced({ + name: "v1.RuntimeSessionTerminated", + schema: Schema.Struct({ + sessionId: Schema.String, + reason: Schema.Literal( + "shutdown", + "restart", + "error", + "timeout", + "displaced", + ), + }), + }), + + // Execution queue events + executionRequested: Events.synced({ + name: "v1.ExecutionRequested", + schema: Schema.Struct({ + queueId: Schema.String, + cellId: Schema.String, + executionCount: Schema.Number, + requestedBy: Schema.String, + actorId: Schema.optional(Schema.String), + }), + }), + + executionAssigned: Events.synced({ + name: "v1.ExecutionAssigned", + schema: Schema.Struct({ + queueId: Schema.String, + runtimeSessionId: Schema.String, + }), + }), + + executionStarted: Events.synced({ + name: "v1.ExecutionStarted", + schema: Schema.Struct({ + queueId: Schema.String, + cellId: Schema.String, + runtimeSessionId: Schema.String, + startedAt: Schema.Date, + }), + }), + + executionCompleted: Events.synced({ + name: "v1.ExecutionCompleted", + schema: Schema.Struct({ + queueId: Schema.String, + cellId: Schema.String, + status: Schema.Literal("success", "error", "cancelled"), + error: Schema.optional(Schema.String), + completedAt: Schema.Date, + executionDurationMs: Schema.Number, + }), + }), + + executionCancelled: Events.synced({ + name: "v1.ExecutionCancelled", + schema: Schema.Struct({ + queueId: Schema.String, + cellId: Schema.String, + cancelledBy: Schema.String, + actorId: Schema.optional(Schema.String), + reason: Schema.String, + }), + }), + + // Unified output system - granular events replacing cellOutputAdded + multimediaDisplayOutputAdded: Events.synced({ + name: "v1.MultimediaDisplayOutputAdded", + schema: Schema.Struct({ + id: Schema.String, + cellId: Schema.String, + position: Schema.Number, + representations: Schema.Record({ + key: Schema.String, + value: MediaRepresentationSchema, + }), + displayId: Schema.optional(Schema.String), + }), + }), + + multimediaDisplayOutputUpdated: Events.synced({ + name: "v1.MultimediaDisplayOutputUpdated", + schema: Schema.Struct({ + displayId: Schema.String, + representations: Schema.Record({ + key: Schema.String, + value: MediaRepresentationSchema, + }), + }), + }), + + multimediaResultOutputAdded: Events.synced({ + name: "v1.MultimediaResultOutputAdded", + schema: Schema.Struct({ + id: Schema.String, + cellId: Schema.String, + position: Schema.Number, + representations: Schema.Record({ + key: Schema.String, + value: MediaRepresentationSchema, + }), + executionCount: Schema.Number, + }), + }), + + terminalOutputAdded: Events.synced({ + name: "v1.TerminalOutputAdded", + schema: Schema.Struct({ + id: Schema.String, + cellId: Schema.String, + position: Schema.Number, + content: MediaRepresentationSchema, + streamName: Schema.Literal("stdout", "stderr"), + }), + }), + + /** @deprecated */ + terminalOutputAppended: Events.synced({ + name: "v1.TerminalOutputAppended", + schema: Schema.Struct({ + outputId: Schema.String, + content: MediaRepresentationSchema, + }), + }), + + terminalOutputAppended2: Events.synced({ + name: "v2.TerminalOutputAppended", + schema: Schema.Struct({ + id: Schema.String, + outputId: Schema.String, + delta: Schema.String, + sequenceNumber: Schema.Number, + }), + }), + + markdownOutputAdded: Events.synced({ + name: "v1.MarkdownOutputAdded", + schema: Schema.Struct({ + id: Schema.String, + cellId: Schema.String, + position: Schema.Number, + content: MediaRepresentationSchema, + }), + }), + + /** @deprecated */ + markdownOutputAppended: Events.synced({ + name: "v1.MarkdownOutputAppended", + schema: Schema.Struct({ + outputId: Schema.String, + content: MediaRepresentationSchema, + }), + }), + + markdownOutputAppended2: Events.synced({ + name: "v2.MarkdownOutputAppended", + schema: Schema.Struct({ + id: Schema.String, + outputId: Schema.String, + delta: Schema.String, + sequenceNumber: Schema.Number, + }), + }), + + errorOutputAdded: Events.synced({ + name: "v1.ErrorOutputAdded", + schema: Schema.Struct({ + id: Schema.String, + cellId: Schema.String, + position: Schema.Number, + content: MediaRepresentationSchema, + }), + }), + + cellOutputsCleared: Events.synced({ + name: "v1.CellOutputsCleared", + schema: Schema.Struct({ + cellId: Schema.String, + wait: Schema.Boolean, + clearedBy: Schema.String, + }), + }), + + // AI events + aiSettingsChanged: Events.synced({ + name: "v1.AiSettingsChanged", + schema: Schema.Struct({ + cellId: Schema.String, + provider: Schema.String, // 'openai', 'anthropic', 'local' + model: Schema.String, + settings: Schema.Struct({ + temperature: Schema.optional(Schema.Number), + maxTokens: Schema.optional(Schema.Number), + systemPrompt: Schema.optional(Schema.String), + }), + }), + }), + + // SQL events + sqlConnectionChanged: Events.synced({ + name: "v1.SqlConnectionChanged", + schema: Schema.Struct({ + cellId: Schema.String, + connectionId: Schema.optional(Schema.String), + changedBy: Schema.String, + }), + }), + + sqlResultVariableChanged: Events.synced({ + name: "v1.SqlResultVariableChanged", + schema: Schema.Struct({ + cellId: Schema.String, + resultVariable: Schema.optional(Schema.String), + changedBy: Schema.String, + }), + }), + + // UI state + uiStateSet: tables.uiState.set, + + actorProfileSet: Events.synced({ + name: "v1.ActorProfileSet", + schema: Schema.Struct({ + id: Schema.String, + type: ActorTypeSchema, + displayName: Schema.String, + avatar: Schema.optional(Schema.String), + }), + }), + + // Tool approval events + toolApprovalRequested: Events.synced({ + name: "v1.ToolApprovalRequested", + schema: Schema.Struct({ + toolCallId: Schema.String, + cellId: Schema.String, + toolName: Schema.String, + arguments: Schema.Record({ key: Schema.String, value: Schema.Any }), + requestedAt: Schema.Date, + }), + }), + + toolApprovalResponded: Events.synced({ + name: "v1.ToolApprovalResponded", + schema: Schema.Struct({ + toolCallId: Schema.String, + status: Schema.Literal("approved_once", "approved_always", "denied"), + approvedBy: Schema.String, + respondedAt: Schema.Date, + }), + }), +}; + +// Helper function to select primary representation from multimedia data +function selectPrimaryRepresentation( + representations: Record, + preferredMimeTypes: string[] = [ + // JSON-based formats first (highest priority for rich data) + "application/vnd.plotly.v1+json", + "application/vnd.vegalite.v6+json", + "application/vnd.vegalite.v5+json", + "application/vnd.vegalite.v4+json", + "application/vnd.vegalite.v3+json", + "application/vnd.vegalite.v2+json", + "application/vnd.vega.v5+json", + "application/vnd.vega.v4+json", + "application/vnd.vega.v3+json", + "application/vnd.jupyter.widget-view+json", + "application/vnd.jupyter.widget-state+json", + "application/vnd.dataresource+json", + "application/vdom.v1+json", + "application/geo+json", + "application/json", + // Interactive content + "application/javascript", + // Rich display formats + "text/html", + "image/svg+xml", + // Binary images + "image/png", + "image/jpeg", + "image/gif", + // Text formats + "text/latex", + "text/markdown", + "text/plain", + ], +): { mimeType: string; container: MediaContainer } | null { + for (const mimeType of preferredMimeTypes) { + if (representations[mimeType]) { + return { + mimeType, + container: representations[mimeType], + }; + } + } + + return null; +} + +// Helper function to update existing displays with same displayId +function updateExistingDisplays( + displayId: string, + representations: Record, + // deno-lint-ignore no-explicit-any + ctx: any, +) { + const existingOutputs = ctx.query( + tables.outputs.select().where({ + displayId, + outputType: "multimedia_display", + }), + ); + + if (existingOutputs.length === 0) { + return []; + } + + const primaryRep = selectPrimaryRepresentation(representations); + if (!primaryRep) { + return []; + } + + const { mimeType, container } = primaryRep; + const data = container.type === "inline" ? String(container.data || "") : ""; + + return [ + tables.outputs + .update({ + data, + mimeType, + representations, + }) + .where({ + displayId, + outputType: "multimedia_display", + }), + ]; +} + +// Shared helper function for updating presence +function updatePresence(userId: string, cellId?: string) { + return tables.presence + .insert({ userId, cellId: cellId || null }) + .onConflict("userId", "replace"); +} + +// Materializers map events to state changes +export const materializers = State.SQLite.materializers(events, { + "v1.Debug": (event, ctx) => { + const existingDebug = ctx.query( + tables.debug.select().where({ id: event.id }).limit(1), + )[0]; + if (existingDebug) { + return []; + } + return [tables.debug.insert({ id: event.id }).onConflict("id", "replace")]; + }, + // Notebook materializers + /** @deprecated */ + "v1.NotebookInitialized": ({ id, title, ownerId }) => [ + // Legacy event - convert to metadata format + tables.notebookMetadata + .insert({ + key: "title", + value: title, + }) + .onConflict("key", "replace"), + tables.notebookMetadata + .insert({ + key: "ownerId", + value: ownerId, + }) + .onConflict("key", "replace"), + tables.debug + .insert({ + id, + }) + .onConflict("id", "replace"), + ], + + "v1.NotebookTitleChanged": ({ title }) => + tables.notebookMetadata + .insert({ + key: "title", + value: title, + }) + .onConflict("key", "replace"), + + "v1.NotebookMetadataSet": ({ key, value }) => + tables.notebookMetadata + .insert({ + key, + value, + }) + .onConflict("key", "replace"), + + // Cell materializers + "v1.CellCreated": ({ id, cellType, position, createdBy, actorId }) => [ + tables.cells + .insert({ + id, + cellType, + // Convert position to deterministic fractional index in base36 format + // Position 0 -> "a0", Position 1 -> "a1", etc. + fractionalIndex: "a" + Math.floor(position).toString(36), + createdBy, + }) + .onConflict("id", "ignore"), + // Update presence table + updatePresence(actorId || createdBy, id), + ], + + "v2.CellCreated": ({ id, fractionalIndex, cellType, createdBy }) => { + // With fractional indexing, we don't need ctx.query! + // The order is already calculated client-side + const ops = []; + + ops.push( + tables.cells + .insert({ + id, + cellType, + fractionalIndex, // New fractional index + createdBy, + }) + .onConflict("id", "ignore"), + ); + + // Update presence for the creator + ops.push(updatePresence(createdBy, id)); + + return ops; + }, + + "v1.CellSourceChanged": ({ id, source, modifiedBy }) => [ + tables.cells.update({ source }).where({ id }), + // Update presence based on cell source modification + updatePresence(modifiedBy, id), + ], + + "v1.CellTypeChanged": ({ id, cellType, actorId }) => { + const ops = []; + ops.push(tables.cells.update({ cellType }).where({ id })); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v1.CellDeleted": ({ id, actorId }) => { + const ops = []; + ops.push(tables.cells.delete().where({ id })); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v1.CellMoved": ({ id, newPosition, actorId }) => { + const ops = []; + // Convert position to deterministic fractional index in base36 format + ops.push( + tables.cells.update({ + fractionalIndex: "a" + Math.floor(newPosition).toString(36), + }).where({ id }), + ); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v2.CellMoved": ({ id, fractionalIndex, actorId }) => { + const ops = []; + ops.push(tables.cells.update({ fractionalIndex }).where({ id })); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v1.CellSourceVisibilityToggled": ({ id, sourceVisible, actorId }) => { + const ops = []; + ops.push(tables.cells.update({ sourceVisible }).where({ id })); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v1.CellOutputVisibilityToggled": ({ id, outputVisible, actorId }) => { + const ops = []; + ops.push(tables.cells.update({ outputVisible }).where({ id })); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v1.CellAiContextVisibilityToggled": ({ id, aiContextVisible, actorId }) => { + const ops = []; + ops.push(tables.cells.update({ aiContextVisible }).where({ id })); + if (actorId) { + ops.push(updatePresence(actorId, id)); + } + return ops; + }, + + "v1.PresenceSet": ({ userId, cellId }) => updatePresence(userId, cellId), + + // Runtime lifecycle materializers + "v1.RuntimeSessionStarted": ({ + sessionId, + runtimeId, + runtimeType, + capabilities, + }) => + tables.runtimeSessions + .insert({ + sessionId, + runtimeId, + runtimeType, + status: "starting", + canExecuteCode: capabilities.canExecuteCode, + canExecuteSql: capabilities.canExecuteSql, + canExecuteAi: capabilities.canExecuteAi, + availableAiModels: capabilities.availableAiModels || null, + }) + .onConflict("sessionId", "replace"), + + "v1.RuntimeSessionStatusChanged": ({ sessionId, status }) => + tables.runtimeSessions + .update({ + status, + }) + .where({ sessionId }), + + "v1.RuntimeSessionTerminated": ({ sessionId }) => + tables.runtimeSessions + .update({ + status: "terminated", + isActive: false, + }) + .where({ sessionId }), + + // Execution queue materializers + "v1.ExecutionRequested": ({ + queueId, + cellId, + executionCount, + requestedBy, + actorId, + }) => [ + tables.executionQueue + .insert({ + id: queueId, + cellId, + executionCount, + requestedBy, + status: "pending", + }) + .onConflict("id", "ignore"), + // Update cell execution state + tables.cells + .update({ + executionState: "queued", + executionCount, + }) + .where({ id: cellId }), + // Update presence table + updatePresence(actorId || requestedBy, cellId), + ], + + "v1.ExecutionAssigned": ({ queueId, runtimeSessionId }) => + tables.executionQueue + .update({ + status: "assigned", + assignedRuntimeSession: runtimeSessionId, + }) + .where({ id: queueId }), + + "v1.ExecutionStarted": ({ queueId, cellId, runtimeSessionId, startedAt }) => [ + // Update execution queue + tables.executionQueue + .update({ + status: "executing", + startedAt: startedAt, + }) + .where({ id: queueId }), + // Update cell execution state + tables.cells + .update({ + executionState: "running", + assignedRuntimeSession: runtimeSessionId, + }) + .where({ id: cellId }), + ], + + "v1.ExecutionCompleted": ({ + queueId, + cellId, + status, + completedAt, + executionDurationMs, + }) => [ + // Update execution queue + tables.executionQueue + .update({ + status: status === "success" ? "completed" : "failed", + completedAt: completedAt, + executionDurationMs: executionDurationMs, + }) + .where({ id: queueId }), + // Update cell execution state + tables.cells + .update({ + executionState: status === "success" ? "completed" : "error", + lastExecutionDurationMs: executionDurationMs, + }) + .where({ id: cellId }), + ], + + "v1.ExecutionCancelled": ({ queueId, cellId, cancelledBy, actorId }) => [ + // Update execution queue + tables.executionQueue + .update({ + status: "cancelled", + }) + .where({ id: queueId }), + // Update cell execution state + tables.cells + .update({ + executionState: "idle", + }) + .where({ id: cellId }), + // Update presence table + updatePresence(actorId || cancelledBy, cellId), + ], + + // Unified output system materializers with pending clear support + "v1.MultimediaDisplayOutputAdded": ( + { id, cellId, position, representations, displayId }, + ctx, + ) => { + const ops = []; + // Check for pending clears + const pendingClear = ctx.query( + tables.pendingClears.select().where({ cellId }).limit(1), + )[0]; + if (pendingClear) { + ops.push(tables.outputs.delete().where({ cellId })); + ops.push(tables.pendingClears.delete().where({ cellId })); + } + + // If displayId provided, update all existing displays with same ID first + if (displayId) { + ops.push(...updateExistingDisplays(displayId, representations, ctx)); + } + + // Always create new output (core behavior of "Added" event) + const primaryRep = selectPrimaryRepresentation(representations); + const primaryData = primaryRep + ? primaryRep.container.type === "inline" + ? String(primaryRep.container.data || "") + : "" + : ""; + const primaryMimeType = primaryRep ? primaryRep.mimeType : "text/plain"; + + ops.push( + tables.outputs + .insert({ + id, + cellId, + outputType: "multimedia_display", + position, + displayId: displayId || null, + data: primaryData, + artifactId: null, + mimeType: primaryMimeType, + metadata: null, + representations, + }) + .onConflict("id", "replace"), + ); + return ops; + }, + + "v1.MultimediaDisplayOutputUpdated": ( + { displayId, representations }, + ctx, + ) => { + // Only update existing displays - no new output creation + return updateExistingDisplays(displayId, representations, ctx); + }, + + "v1.MultimediaResultOutputAdded": ( + { id, cellId, position, representations, executionCount }, + ctx, + ) => { + const ops = []; + // Check for pending clears + const pendingClear = ctx.query( + tables.pendingClears.select().where({ cellId }).limit(1), + )[0]; + if (pendingClear) { + ops.push(tables.outputs.delete().where({ cellId })); + ops.push(tables.pendingClears.delete().where({ cellId })); + } + + // Choose primary representation + const preferenceOrder = [ + "text/html", + "image/png", + "image/jpeg", + "image/svg+xml", + "application/json", + "text/plain", + ]; + let primaryData = ""; + let primaryMimeType = "text/plain"; + + for (const mimeType of preferenceOrder) { + if (representations[mimeType]) { + const rep = representations[mimeType]; + primaryData = rep.type === "inline" ? String(rep.data || "") : ""; + primaryMimeType = mimeType; + break; + } + } + + ops.push( + tables.outputs + .insert({ + id, + cellId, + outputType: "multimedia_result", + position, + executionCount, + data: primaryData, + artifactId: null, + mimeType: primaryMimeType, + metadata: null, + representations, + }) + .onConflict("id", "replace"), + ); + return ops; + }, + + "v1.TerminalOutputAdded": ( + { id, cellId, position, content, streamName }, + ctx, + ) => { + const ops = []; + // Check for pending clears + const pendingClear = ctx.query( + tables.pendingClears.select().where({ cellId }).limit(1), + )[0]; + if (pendingClear) { + ops.push(tables.outputs.delete().where({ cellId })); + ops.push(tables.pendingClears.delete().where({ cellId })); + } + + ops.push( + tables.outputs + .insert({ + id, + cellId, + outputType: "terminal", + position, + streamName, + data: content.type === "inline" ? String(content.data) : null, + artifactId: content.type === "artifact" ? content.artifactId : null, + mimeType: "text/plain", + metadata: content.metadata || null, + representations: null, + }) + .onConflict("id", "replace"), + ); + return ops; + }, + + "v1.TerminalOutputAppended": ({ outputId, content }, ctx) => { + const existingOutput = ctx.query( + tables.outputs.select().where({ id: outputId }).limit(1), + )[0]; + + if (!existingOutput) { + return []; + } + + const newContent = content.type === "inline" ? String(content.data) : ""; + const concatenatedData = (existingOutput.data || "") + newContent; + + return [ + tables.outputs.update({ data: concatenatedData }).where({ id: outputId }), + ]; + }, + + "v2.TerminalOutputAppended": ({ outputId, delta, id, sequenceNumber }) => { + return tables.outputDeltas.insert({ + id, + outputId, + delta, + sequenceNumber, + }); + }, + + "v1.MarkdownOutputAdded": ({ id, cellId, position, content }, ctx) => { + const ops = []; + // Check for pending clears + const pendingClear = ctx.query( + tables.pendingClears.select().where({ cellId }).limit(1), + )[0]; + if (pendingClear) { + ops.push(tables.outputs.delete().where({ cellId })); + ops.push(tables.pendingClears.delete().where({ cellId })); + } + + ops.push( + tables.outputs + .insert({ + id, + cellId, + outputType: "markdown", + position, + data: content.type === "inline" ? String(content.data) : null, + artifactId: content.type === "artifact" ? content.artifactId : null, + mimeType: "text/markdown", + metadata: content.metadata || null, + representations: null, + }) + .onConflict("id", "replace"), + ); + return ops; + }, + + /**@deprecated */ + "v1.MarkdownOutputAppended": ({ outputId, content }, ctx) => { + const existingOutput = ctx.query( + tables.outputs.select().where({ id: outputId }).limit(1), + )[0]; + + if (!existingOutput) { + return []; + } + + const newContent = content.type === "inline" ? String(content.data) : ""; + const concatenatedData = (existingOutput.data || "") + newContent; + + return [ + tables.outputs.update({ data: concatenatedData }).where({ id: outputId }), + ]; + }, + + "v2.MarkdownOutputAppended": ({ id, outputId, delta, sequenceNumber }) => { + return tables.outputDeltas.insert({ + id, + outputId, + delta, + sequenceNumber, + }); + }, + + "v1.ErrorOutputAdded": ({ id, cellId, position, content }, ctx) => { + const ops = []; + // Check for pending clears + const pendingClear = ctx.query( + tables.pendingClears.select().where({ cellId }).limit(1), + )[0]; + if (pendingClear) { + ops.push(tables.outputs.delete().where({ cellId })); + ops.push(tables.pendingClears.delete().where({ cellId })); + } + + ops.push( + tables.outputs + .insert({ + id, + cellId, + outputType: "error", + position, + data: content.type === "inline" ? JSON.stringify(content.data) : null, + artifactId: content.type === "artifact" ? content.artifactId : null, + mimeType: "application/json", + metadata: content.metadata || null, + representations: null, + }) + .onConflict("id", "replace"), + ); + return ops; + }, + + "v1.CellOutputsCleared": ({ cellId, wait, clearedBy }) => { + const ops = []; + if (wait) { + // Store pending clear for wait=True + ops.push( + tables.pendingClears + .insert({ cellId, clearedBy }) + .onConflict("cellId", "replace"), + ); + } else { + // Immediate clear for wait=False + ops.push(tables.outputs.delete().where({ cellId })); + } + + // Add presence update if user is provided + if (clearedBy) { + ops.push(updatePresence(clearedBy, cellId)); + } + + return ops; + }, + + // AI materializers + "v1.AiSettingsChanged": ({ cellId, provider, model, settings }) => + tables.cells + .update({ + aiProvider: provider, + aiModel: model, + aiSettings: settings, + }) + .where({ id: cellId }), + + // SQL materializers + "v1.SqlConnectionChanged": ({ cellId, connectionId }) => + tables.cells + .update({ + sqlConnectionId: connectionId ?? null, + }) + .where({ id: cellId }), + + "v1.SqlResultVariableChanged": ({ cellId, resultVariable }) => + tables.cells + .update({ + sqlResultVariable: resultVariable ?? null, + }) + .where({ id: cellId }), + + "v1.ActorProfileSet": ({ id, type, displayName, avatar }) => + tables.actors + .insert({ + id, + type, + displayName, + avatar: avatar ?? null, + }) + .onConflict("id", "replace"), + + // Tool approval materializers + "v1.ToolApprovalRequested": ({ + toolCallId, + cellId, + toolName, + arguments: _args, + requestedAt, + }) => + tables.toolApprovals + .insert({ + toolCallId, + cellId, + toolName, + status: "pending", + approvedBy: null, + requestedAt, + respondedAt: null, + }) + .onConflict("toolCallId", "replace"), + + "v1.ToolApprovalResponded": ({ + toolCallId, + status, + approvedBy, + respondedAt, + }) => + tables.toolApprovals + .update({ + status, + approvedBy, + respondedAt, + }) + .where({ toolCallId }), +}); + +// Type exports derived from the actual table definitions - full type inference works here! +export type NotebookMetadataData = typeof tables.notebookMetadata.Type; +export type CellData = typeof tables.cells.Type; +export type OutputData = typeof tables.outputs.Type; + +export type RuntimeSessionData = typeof tables.runtimeSessions.Type; +export type ExecutionQueueData = typeof tables.executionQueue.Type; +export type UiStateData = typeof tables.uiState.Type; + +// Type guards for MediaContainer +export function isInlineContainer( + container: MediaContainer, +): container is InlineContainer { + return container.type === "inline"; +} + +export function isArtifactContainer( + container: MediaContainer, +): container is ArtifactContainer { + return container.type === "artifact"; +} + +// Helper function to get notebook metadata with defaults +export function getNotebookMetadata( + metadataRecords: Array<{ key: string; value: string }>, + key: string, + defaultValue: string = "", +): string { + const record = metadataRecords.find((r) => r.key === key); + return record?.value ?? defaultValue; +} + +// Helper to get common notebook metadata values +export function getNotebookInfo( + metadataRecords: Array<{ key: string; value: string }>, +) { + return { + title: getNotebookMetadata(metadataRecords, "title", "Untitled"), + ownerId: getNotebookMetadata(metadataRecords, "ownerId", "unknown"), + runtimeType: getNotebookMetadata(metadataRecords, "runtimeType", "python3"), + isPublic: + getNotebookMetadata(metadataRecords, "isPublic", "false") === "true", + }; +} + +// Output data types for different output formats +export interface RichOutputData { + [mimeType: string]: MediaContainer; +} + +// Error output structure +// Error output data structure for unified system +export interface ErrorOutputData { + ename: string; + evalue: string; + traceback: string[]; +} + +// Type guards for output data +export function isErrorOutput(data: unknown): data is ErrorOutputData { + return ( + typeof data === "object" && + data !== null && + "ename" in data && + "evalue" in data && + typeof (data as ErrorOutputData).ename === "string" && + typeof (data as ErrorOutputData).evalue === "string" + ); +} + +export function isRichOutput(data: unknown): data is RichOutputData { + return typeof data === "object" && data !== null && !isErrorOutput(data); +} + +/** + * AI tool call data structure for notebook outputs + */ +export interface AiToolCallData { + tool_call_id: string; + tool_name: string; + arguments: Record; +} + +/** + * AI tool result data structure for notebook outputs + */ +export interface AiToolResultData { + tool_call_id: string; + status: "success" | "error"; + result?: string; + // Optional fields for backward compatibility + tool_name?: string; + arguments?: Record; + timestamp?: string; +} + +/** + * Type guard to check if data is an AI tool call + */ +export function isAiToolCallData(data: unknown): data is AiToolCallData { + return ( + typeof data === "object" && + data !== null && + "tool_call_id" in data && + "tool_name" in data && + "arguments" in data && + typeof (data as AiToolCallData).tool_call_id === "string" && + typeof (data as AiToolCallData).tool_name === "string" && + typeof (data as AiToolCallData).arguments === "object" + ); +} + +/** + * Type guard to check if data is an AI tool result + */ +export function isAiToolResultData(data: unknown): data is AiToolResultData { + return ( + typeof data === "object" && + data !== null && + "tool_call_id" in data && + "status" in data && + typeof (data as AiToolResultData).tool_call_id === "string" && + typeof (data as AiToolResultData).status === "string" && + ["success", "error"].includes((data as AiToolResultData).status) + ); +} + +/** + * AI tool call MIME type constant + */ +export const AI_TOOL_CALL_MIME_TYPE = + "application/vnd.anode.aitool+json" as const; + +/** + * AI tool result MIME type constant + */ +export const AI_TOOL_RESULT_MIME_TYPE = + "application/vnd.anode.aitool.result+json" as const; + +// Export fractional indexing utilities with optional jittering +/** + * Binary-collation-safe fractional indexing implementation. + * Uses only characters 0-9 and a-z which sort correctly in binary/ASCII collation. + * This avoids the uppercase/lowercase sorting issues with the fractional-indexing library. + */ + +const BASE36_DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz"; +const BASE = BASE36_DIGITS.length; + +function charToValue(char: string): number { + const index = BASE36_DIGITS.indexOf(char); + if (index === -1) { + throw new Error(`Invalid character: ${char}`); + } + return index; +} + +function valueToChar(value: number): string { + if (value < 0 || value >= BASE) { + throw new Error(`Value out of range: ${value}`); + } + return BASE36_DIGITS[value]!; +} + +function generateKeyBetween( + a: string | null | undefined, + b: string | null | undefined, +): string { + // Handle null/undefined cases + if (!a && !b) return "m"; // Middle of the range + if (!a) return generateKeyBefore(b!); + if (!b) return generateKeyAfter(a); + + // Ensure a < b + if (a >= b) { + throw new Error(`Invalid range: ${a} >= ${b}`); + } + + // Find the first position where they differ + let i = 0; + while (i < a.length && i < b.length && a[i] === b[i]) { + i++; + } + + // If a is a prefix of b, we need special handling + if (i === a.length) { + const nextChar = b[i]; + if (!nextChar) { + throw new Error(`Invalid index ${i} for string ${b}`); + } + const nextVal = charToValue(nextChar); + + // If b continues with a character > 0, we can insert a midpoint + if (nextVal > 0) { + // We can fit something between a and b + // For example, between "a" and "a5", we can use "a2" + const midVal = Math.floor(nextVal / 2); + if (midVal > 0) { + return a + valueToChar(midVal); + } else { + // nextVal is 1, so midVal is 0 + // Return a + "0" which is between a and a + "1" + return a + "0"; + } + } else { + // nextVal is 0, meaning b continues with "0" after a ends + // Check if we can insert something between them + if (b.length > i + 1) { + // b continues past the initial "0" + // Count consecutive zeros after position i in b + let zeroCount = 0; + let j = i; + while (j < b.length && b[j] === "0") { + zeroCount++; + j++; + } + + // If b is all zeros after the prefix, we can insert a string with fewer zeros + // For example: between "m" and "m000", we can use "m0" or "m00" + if (j === b.length && zeroCount > 1) { + // Use half the zeros (at least 1) + return a + "0".repeat(Math.floor(zeroCount / 2)); + } else if (j < b.length) { + // b has a non-zero character at position j + // We can insert something before that position + const prefix = a + "0".repeat(j - i); + const nextChar = b[j]; + if (!nextChar) { + throw new Error(`Invalid index ${j} for string ${b}`); + } + const nextVal = charToValue(nextChar); + if (nextVal > 0) { + return prefix + valueToChar(Math.floor(nextVal / 2)); + } + } + } + // No space between a and b + throw new Error( + `No string exists between "${a}" and "${b}" in base36 encoding`, + ); + } + } + + // If b is a prefix of a (shouldn't happen if a < b, but let's be safe) + if (i === b.length) { + throw new Error(`Invalid case: b "${b}" is a prefix of a "${a}"`); + } + + // Get the values at position i + const aChar = a[i]; + const bChar = b[i]; + if (!aChar || !bChar) { + throw new Error(`Invalid index ${i} for strings ${a} and ${b}`); + } + const aVal = charToValue(aChar); + const bVal = charToValue(bChar); + + // If there's room between them, use the midpoint + if (bVal - aVal > 1) { + const midVal = Math.floor((aVal + bVal) / 2); + return a.substring(0, i) + valueToChar(midVal) + a.substring(i + 1); + } + + // Characters are adjacent (diff is 1) + // We need to extend the string to find a position + + // If a has more characters after position i, we can increment within a's range + if (i < a.length - 1) { + // Try to find space after a[i] but within a's remaining range + const prefix = a.substring(0, i + 1); + const remaining = a.substring(i + 1); + + // Find a position between remaining and the next possible string + const suffix = generateKeyAfter(remaining); + return prefix + suffix; + } + + // a[i] and b[i] are adjacent, and a has no more characters + // We need to extend a with something that keeps us less than b + // Since b[i] = aVal + 1, we extend a with a midpoint character + return a.substring(0, i + 1) + "h"; +} + +function generateKeyBefore(b: string): string { + if (!b || b.length === 0) { + return "m"; // Middle of range if no upper bound + } + + // Find the first non-zero character + let i = 0; + while (i < b.length && b[i] === "0") { + i++; + } + + if (i === b.length) { + // All zeros, prepend another zero + return "0" + b; + } + + // Found a non-zero character + const char = b[i]; + if (!char) { + throw new Error(`Invalid index ${i} for string ${b}`); + } + const val = charToValue(char); + + if (i === 0 && val > 1) { + // Can simply use a smaller first character + return valueToChar(Math.floor(val / 2)); + } + + // Need to preserve prefix and adjust + const prefix = b.substring(0, i); + if (val > 1) { + return prefix + valueToChar(Math.floor(val / 2)); + } + + // val is 1, so we use prefix + "0" + midpoint + return prefix + "0h"; +} + +function generateKeyAfter(a: string): string { + if (!a || a.length === 0) { + return "m"; // Middle of range if no lower bound + } + + // Find the last character that isn't 'z' + let i = a.length - 1; + while (i >= 0 && a[i] === "z") { + i--; + } + + if (i === -1) { + // All 'z's, need to extend + return a + "h"; // Append midpoint + } + + // Can increment the character at position i + const prefix = a.substring(0, i); + const char = a[i]; + if (!char) { + throw new Error(`Invalid index ${i} for string ${a}`); + } + const val = charToValue(char); + + if (val < BASE - 2) { + // Simple increment + return prefix + valueToChar(val + 1); + } + + // val is 'y', incrementing gives 'z' + // To avoid getting too close to the boundary, extend instead + return a + "h"; +} + +// JitterProvider interface for testability +export interface JitterProvider { + // Returns a random number between 0 and 1 + random(): number; + // Returns a random integer between 0 (inclusive) and max (exclusive) + randomInt(max: number): number; +} + +// Default jitter provider using Math.random +export const defaultJitterProvider: JitterProvider = { + random: () => Math.random(), + randomInt: (max) => Math.floor(Math.random() * max), +}; + +// Deterministic jitter provider for testing +export const createTestJitterProvider = (seed = 0): JitterProvider => { + let currentSeed = seed; + + // Simple linear congruential generator + const nextRandom = () => { + currentSeed = (currentSeed * 1103515245 + 12345) & 0x7fffffff; + return currentSeed / 0x7fffffff; + }; + + return { + random: nextRandom, + randomInt: (max) => Math.floor(nextRandom() * max), + }; +}; + +export function fractionalIndexBetween( + a: string | null | undefined, + b: string | null | undefined, + jitterProvider: JitterProvider = defaultJitterProvider, +): string { + // Add some jitter to avoid clustering + const key = generateKeyBetween(a, b); + + // For better distribution, sometimes extend the key + // But we must ensure the result stays within bounds + if (jitterProvider.random() < 0.3 && key.length < 10) { + const suffix = valueToChar(jitterProvider.randomInt(BASE)); + const candidate = key + suffix; + + // Verify the candidate maintains ordering + const isValid = (!a || candidate > a) && (!b || candidate < b); + + if (isValid) { + return candidate; + } + } + + return key; +} + +export function generateFractionalIndices( + a: string | null | undefined, + b: string | null | undefined, + n: number, + jitterProvider: JitterProvider = defaultJitterProvider, +): string[] { + if (n <= 0) return []; + if (n === 1) return [fractionalIndexBetween(a, b, jitterProvider)]; + + const keys: string[] = []; + + // Generate n keys by repeatedly subdividing the range + let prev = a; + for (let i = 0; i < n; i++) { + // For better distribution, we generate keys sequentially + // This avoids clustering that can happen with binary subdivision + const key = fractionalIndexBetween(prev, b, jitterProvider); + keys.push(key); + prev = key; + } + + return keys; +} + +// Helper to get initial fractional index +export function initialFractionalIndex( + jitterProvider: JitterProvider = defaultJitterProvider, +): string { + return fractionalIndexBetween(null, null, jitterProvider); +} + +// Rebalancing functionality to handle "No string exists between" cases + +export interface RebalanceResult { + /** New fractional indices for the cells */ + newIndices: { cellId: string; fractionalIndex: string }[]; + /** Events to apply the rebalancing */ + events: ReturnType[]; +} + +export interface RebalanceOptions { + /** Jitter provider for consistent generation */ + jitterProvider?: JitterProvider; + /** Actor ID for the rebalancing events */ + actorId?: string; + /** Buffer space to add around the rebalanced region */ + bufferCells?: number; +} + +export interface CellOperationResult { + /** Events to apply for the cell operation (may include rebalancing) */ + events: Array< + | ReturnType + | ReturnType + >; + /** ID of the newly created cell */ + newCellId: string; + /** Whether rebalancing was performed */ + needsRebalancing: boolean; + /** Number of cells rebalanced (for debugging/metrics) */ + rebalanceCount?: number; +} + +export interface MoveOperationResult { + /** Events to apply for the move operation (may include rebalancing) */ + events: Array>; + /** Whether the cell was actually moved */ + moved: boolean; + /** Whether rebalancing was performed */ + needsRebalancing: boolean; + /** Number of cells rebalanced (for debugging/metrics) */ + rebalanceCount?: number; +} + +/** + * Determines if a range of cells needs rebalancing due to crowded indices + */ +export function needsRebalancing( + cells: readonly CellReference[], + insertPosition?: number, +): boolean { + if (cells.length < 2) return false; + + // Sort cells by fractional index + const sortedCells = [...cells].sort((a, b) => + (a.fractionalIndex || "").localeCompare(b.fractionalIndex || "") + ); + + // Check for adjacent indices that would prevent insertion + for (let i = 0; i < sortedCells.length - 1; i++) { + const current = sortedCells[i]?.fractionalIndex; + const next = sortedCells[i + 1]?.fractionalIndex; + + if (!current || !next) continue; + + try { + // Test if we can insert between these indices + fractionalIndexBetween(current, next, { + random: () => 0, + randomInt: () => 0, + }); + } catch (error) { + if ( + error instanceof Error && + (error.message.includes("No string exists between") || + error.message.includes("Invalid range")) + ) { + return true; + } + } + } + + // If insertPosition is specified, check if we can insert there + if (insertPosition !== undefined) { + const beforeCell = insertPosition > 0 + ? sortedCells[insertPosition - 1] + : null; + const afterCell = insertPosition < sortedCells.length + ? sortedCells[insertPosition] + : null; + + if (beforeCell && afterCell) { + try { + fractionalIndexBetween( + beforeCell.fractionalIndex, + afterCell.fractionalIndex, + { random: () => 0, randomInt: () => 0 }, + ); + } catch (error) { + if ( + error instanceof Error && + (error.message.includes("No string exists between") || + error.message.includes("Invalid range")) + ) { + return true; + } + } + } + } + + return false; +} + +/** + * Rebalances fractional indices for a range of cells to create space for insertions + */ +export function rebalanceCellIndices( + cells: readonly CellReference[], + options: RebalanceOptions = {}, +): RebalanceResult { + const { + jitterProvider = defaultJitterProvider, + actorId = "system", + bufferCells = 2, + } = options; + + if (cells.length === 0) { + return { newIndices: [], events: [] }; + } + + // Sort cells by current fractional index + const sortedCells = [...cells].sort((a, b) => + (a.fractionalIndex || "").localeCompare(b.fractionalIndex || "") + ); + + const newIndices: { cellId: string; fractionalIndex: string }[] = []; + const moveEvents: ReturnType[] = []; + + // Calculate the range with buffer + const totalPositions = cells.length + (bufferCells * 2); + + // Generate evenly distributed indices + const indices = generateFractionalIndices( + null, + null, + totalPositions, + jitterProvider, + ); + + // Assign new indices to cells (skipping buffer positions) + for (let i = 0; i < sortedCells.length; i++) { + const cell = sortedCells[i]; + const newIndex = indices[i + bufferCells]; // Skip buffer positions at start + + if (!cell || !newIndex) continue; + + if (cell.fractionalIndex !== newIndex) { + newIndices.push({ + cellId: cell.id, + fractionalIndex: newIndex, + }); + + // Create move event + const moveEvent = events.cellMoved2({ + id: cell.id, + fractionalIndex: newIndex, + actorId, + }); + + moveEvents.push(moveEvent); + } + } + + return { newIndices, events: moveEvents }; +} + +/** + * Calculate insertion index after rebalancing has been performed + */ +function calculateInsertionIndexAfterRebalancing( + insertPosition: number, + rebalanceResult: RebalanceResult, + jitterProvider: JitterProvider, +): string { + // Get the new indices after rebalancing + const newIndices = rebalanceResult.newIndices.map((item) => + item.fractionalIndex + ); + newIndices.sort(); + + // Calculate where to insert based on the position + if (insertPosition === 0) { + // Insert at beginning - generate index before first cell + const firstIndex = newIndices[0]; + return fractionalIndexBetween(null, firstIndex, jitterProvider); + } + + if (insertPosition >= newIndices.length) { + // Insert at end - generate index after last cell + const lastIndex = newIndices[newIndices.length - 1]; + return fractionalIndexBetween(lastIndex, null, jitterProvider); + } + + // Insert between cells at insertPosition-1 and insertPosition + const beforeIndex = newIndices[insertPosition - 1]; + const afterIndex = newIndices[insertPosition]; + return fractionalIndexBetween(beforeIndex, afterIndex, jitterProvider); +} + +/** + * Enhanced fractional index generation with automatic rebalancing fallback + */ +export function fractionalIndexBetweenWithFallback( + a: string | null | undefined, + b: string | null | undefined, + context: { + /** All cells in the current context for rebalancing */ + allCells?: readonly CellReference[]; + /** Position where insertion is intended */ + insertPosition?: number; + /** Jitter provider */ + jitterProvider?: JitterProvider; + } = {}, +): { + index?: string; + needsRebalancing: boolean; + rebalanceResult?: RebalanceResult; +} { + const { + allCells = [], + insertPosition, + jitterProvider = defaultJitterProvider, + } = context; + + // First, try normal fractional index generation + try { + const index = fractionalIndexBetween(a, b, jitterProvider); + return { index, needsRebalancing: false }; + } catch (error) { + if ( + error instanceof Error && + (error.message.includes("No string exists between") || + error.message.includes("Invalid range")) + ) { + // Check if rebalancing is needed and possible + if (allCells.length > 0 && needsRebalancing(allCells, insertPosition)) { + const rebalanceResult = rebalanceCellIndices(allCells, { + jitterProvider, + }); + + // Calculate the insertion index after rebalancing + const position = insertPosition ?? allCells.length; + const insertionIndex = calculateInsertionIndexAfterRebalancing( + position, + rebalanceResult, + jitterProvider, + ); + + return { + index: insertionIndex, + needsRebalancing: true, + rebalanceResult, + }; + } + } + + // Re-throw other errors + throw error; + } +} + +/** + * Safe cell movement with automatic rebalancing + */ +export function moveCellWithRebalancing( + cell: CellReference, + cellBefore: CellReference | null, + cellAfter: CellReference | null, + allCells: readonly CellReference[], + options: { + actorId?: string; + jitterProvider?: JitterProvider; + } = {}, +): { + moveEvent?: ReturnType; + rebalanceResult?: RebalanceResult; + needsRebalancing: boolean; +} { + const { actorId = "user", jitterProvider = defaultJitterProvider } = options; + + // Try normal move first + try { + const moveEvent = moveCellBetween( + cell, + cellBefore, + cellAfter, + actorId, + jitterProvider, + ); + + if (moveEvent) { + return { moveEvent, needsRebalancing: false }; + } + } catch (error) { + // Check if it's the "No string exists between" error + if ( + error instanceof Error && + error.message.includes("No string exists between") + ) { + // This indicates we need rebalancing, so fall through to the rebalancing check + } else { + // Re-throw other errors + throw error; + } + } + + // Check if it's because we need rebalancing + if (needsRebalancing(allCells)) { + const rebalanceResult = rebalanceCellIndices(allCells, { + jitterProvider, + actorId: `${actorId}-rebalance`, + }); + + return { + needsRebalancing: true, + rebalanceResult, + }; + } + + // Cell was already in position or other reason + return { needsRebalancing: false }; +} + +// Helper to validate fractional index (basic check) +export function isValidFractionalIndex(index: string): boolean { + if (typeof index !== "string" || index.length === 0) { + return false; + } + + // Check that all characters are valid base36 characters + for (const char of index) { + if (!BASE36_DIGITS.includes(char)) { + return false; + } + } + + return true; +} + +// Validate that fractional indices maintain proper binary collation ordering +export function validateFractionalIndexOrder( + indices: (string | null | undefined)[], +): boolean { + const validIndices = indices.filter((idx): idx is string => + isValidFractionalIndex(idx || "") + ); + + for (let i = 1; i < validIndices.length; i++) { + const prev = validIndices[i - 1]; + const curr = validIndices[i]; + if (!prev || !curr) { + return false; + } + if (prev >= curr) { + console.error( + `Fractional index ordering violation: "${prev}" >= "${curr}"`, + ); + return false; + } + } + + return true; +} + +/** + * Cell reference type for fractional indexing operations + */ +export type CellReference = { + id: string; + fractionalIndex: string | null; + cellType: CellType; +}; + +/** + * Helper functions for cell creation and movement with fractional indexing + * + * Sorting Strategy: + * 1. Primary sort: Lexicographic comparison of fractional indices (a < b, not localeCompare) + * 2. Secondary sort: Cell ID comparison when fractional indices are equal (rare but possible) + * + * This ensures stable, deterministic ordering even in the unlikely event of index collisions. + * We generate 20 candidate indices and pick one randomly to minimize collision probability. + */ + +/** + * Move a cell between two other cells using fractional indices + * + * @param cell - The cell to move (must have a valid fractionalIndex) + * @param cellBefore - The cell that should come before (null for beginning) + * @param cellAfter - The cell that should come after (null for end) + * @param actorId - Optional actor ID for tracking who made the change + * + * Note: It's the caller's responsibility to provide accurate before/after cells. + * If both cellBefore and cellAfter are provided, they must be adjacent cells. + */ +export function moveCellBetween( + cell: CellReference, + cellBefore: CellReference | null, + cellAfter: CellReference | null, + actorId?: string, + jitterProvider: JitterProvider = defaultJitterProvider, +): ReturnType | null { + // Cell must have a valid fractional index to be moved + if (!cell.fractionalIndex) { + return null; + } + + // Determine the fractional indices for before and after + const previousKey = cellBefore?.fractionalIndex || null; + const nextKey = cellAfter?.fractionalIndex || null; + + // Check if already in the target position + if (cellBefore && cellAfter) { + // If between two cells, check if we're already there + if ( + cell.fractionalIndex > previousKey! && + cell.fractionalIndex < nextKey! + ) { + return null; + } + } else if (!cellBefore && cellAfter) { + // Moving to beginning - check if already before cellAfter + if (cell.fractionalIndex < nextKey!) { + return null; + } + } else if (cellBefore && !cellAfter) { + // Moving to end - check if already after cellBefore + if (cell.fractionalIndex > previousKey!) { + return null; + } + } + + const fractionalIndex = fractionalIndexBetween( + previousKey, + nextKey, + jitterProvider, + ); + + return events.cellMoved2({ + id: cell.id, + fractionalIndex, + actorId, + }); +} + +/** + * Create a cell between two other cells using fractional indices + * + * @param cellData - The cell data (id, cellType, createdBy) + * @param cellBefore - The cell that should come before (null for beginning) + * @param cellAfter - The cell that should come after (null for end) + * + * Note: It's the caller's responsibility to provide accurate before/after cells. + * If both cellBefore and cellAfter are provided, they must be adjacent cells. + */ +export function createCellBetween( + cellData: { + id: string; + cellType: CellType; + createdBy: string; + }, + cellBefore: CellReference | null, + cellAfter: CellReference | null, + allCells: readonly CellReference[], + jitterProvider: JitterProvider = defaultJitterProvider, +): CellOperationResult { + // Determine the fractional indices for before and after + let previousKey = cellBefore?.fractionalIndex || null; + let nextKey = cellAfter?.fractionalIndex || null; + + // Special case: if both are null but we have existing cells, insert at end + if (!cellBefore && !cellAfter && allCells.length > 0) { + // Sort cells by fractional index to find the last one + const sortedCells = [...allCells].sort((a, b) => + (a.fractionalIndex || "").localeCompare(b.fractionalIndex || "") + ); + const lastCell = sortedCells[sortedCells.length - 1]; + if (lastCell?.fractionalIndex) { + previousKey = lastCell.fractionalIndex; + nextKey = null; // Insert after the last cell + } + } + + // Calculate insertion position for rebalancing context + let insertPosition = 0; + if (cellBefore && cellAfter) { + // Find position between the two cells + const beforeIndex = allCells.findIndex((cell) => cell.id === cellBefore.id); + insertPosition = beforeIndex + 1; + } else if (cellBefore) { + // Insert after cellBefore + const beforeIndex = allCells.findIndex((cell) => cell.id === cellBefore.id); + insertPosition = beforeIndex + 1; + } else if (cellAfter) { + // Insert before cellAfter + const afterIndex = allCells.findIndex((cell) => cell.id === cellAfter.id); + insertPosition = afterIndex; + } else { + // Insert at end + insertPosition = allCells.length; + } + + // Use the robust fractional index generation with fallback + const result = fractionalIndexBetweenWithFallback( + previousKey, + nextKey, + { + allCells, + insertPosition, + jitterProvider, + }, + ); + + const resultEvents: Array< + | ReturnType + | ReturnType + > = []; + + // Add rebalancing events if needed + if (result.needsRebalancing && result.rebalanceResult) { + resultEvents.push(...result.rebalanceResult.events); + } + + // Create the new cell with the calculated fractional index + const createEvent = events.cellCreated2({ + ...cellData, + fractionalIndex: result.index!, + }); + resultEvents.push(createEvent); + + return { + events: resultEvents, + newCellId: cellData.id, + needsRebalancing: result.needsRebalancing, + ...(result.rebalanceResult && { + rebalanceCount: result.rebalanceResult.newIndices.length, + }), + }; +} + +/** + * Move a cell between two other cells with automatic rebalancing + */ +export function moveCellBetweenWithRebalancing( + cell: CellReference, + cellBefore: CellReference | null, + cellAfter: CellReference | null, + allCells: readonly CellReference[], + actorId?: string, + jitterProvider: JitterProvider = defaultJitterProvider, +): MoveOperationResult { + // Cell must have a valid fractional index to be moved + if (!cell.fractionalIndex) { + return { + events: [], + moved: false, + needsRebalancing: false, + }; + } + + // Calculate target position + let targetPosition = 0; + if (cellBefore && cellAfter) { + // Find position between the two cells + const beforeIndex = allCells.findIndex((c) => c.id === cellBefore.id); + targetPosition = beforeIndex + 1; + } else if (cellBefore) { + // Move after cellBefore + const beforeIndex = allCells.findIndex((c) => c.id === cellBefore.id); + targetPosition = beforeIndex + 1; + } else if (cellAfter) { + // Move before cellAfter + const afterIndex = allCells.findIndex((c) => c.id === cellAfter.id); + targetPosition = afterIndex; + } else { + // Move to end + targetPosition = allCells.length - 1; // Account for the cell being moved + } + + // Check if already in target position + const currentPosition = allCells.findIndex((c) => c.id === cell.id); + if (currentPosition === targetPosition) { + return { + events: [], + moved: false, + needsRebalancing: false, + }; + } + + // Use the existing moveCellWithRebalancing function + const result = moveCellWithRebalancing( + cell, + cellBefore, + cellAfter, + allCells, + { ...(actorId && { actorId }), jitterProvider }, + ); + + const resultEvents: Array> = []; + + // Add rebalancing events if needed + if (result.needsRebalancing && result.rebalanceResult) { + resultEvents.push(...result.rebalanceResult.events); + + return { + events: resultEvents, + moved: true, + needsRebalancing: true, + rebalanceCount: result.rebalanceResult.newIndices.length, + }; + } + + // Add the move event if one was generated + if (result.moveEvent) { + resultEvents.push(result.moveEvent); + + return { + events: resultEvents, + moved: true, + needsRebalancing: false, + }; + } + + // No move was needed + return { + events: [], + moved: false, + needsRebalancing: false, + }; +} + +/** + * Convenience function for simple cell creation with automatic event commitment + * Returns the new cell ID for immediate use + */ +export function createCellBetweenAndCommit< + T extends { + commit: ( + event: + | ReturnType + | ReturnType, + ) => void; + }, +>( + store: T, + cellData: { + id: string; + cellType: CellType; + createdBy: string; + }, + cellBefore: CellReference | null, + cellAfter: CellReference | null, + allCells: readonly CellReference[], + jitterProvider: JitterProvider = defaultJitterProvider, +): string { + const result = createCellBetween( + cellData, + cellBefore, + cellAfter, + allCells, + jitterProvider, + ); + + // Commit all events + result.events.forEach((event) => store.commit(event)); + + return result.newCellId; +} + +/** + * Convenience function for simple cell movement with automatic event commitment + * Returns whether the cell was actually moved + */ +export function moveCellBetweenAndCommit< + T extends { commit: (event: ReturnType) => void }, +>( + store: T, + cell: CellReference, + cellBefore: CellReference | null, + cellAfter: CellReference | null, + allCells: readonly CellReference[], + actorId?: string, + jitterProvider: JitterProvider = defaultJitterProvider, +): boolean { + const result = moveCellBetweenWithRebalancing( + cell, + cellBefore, + cellAfter, + allCells, + actorId, + jitterProvider, + ); + + // Commit all events + result.events.forEach((event) => store.commit(event)); + + return result.moved; +} + +// Pre 0.7.1 -- these types should get created in clients +// const state = State.SQLite.makeState({ tables, materializers }); +// export const schema = makeSchema({ events, state }); +// export type Store = LiveStore; diff --git a/src/runt-schema/queries/cellOrdering.ts b/src/runt-schema/queries/cellOrdering.ts new file mode 100644 index 00000000..cf8384ca --- /dev/null +++ b/src/runt-schema/queries/cellOrdering.ts @@ -0,0 +1,150 @@ +import { tables } from "../tables.ts"; +import { queryDb } from "@livestore/livestore"; + +/** + * Cell ordering queries using fractional indexing + * These queries are designed to be fine-grained and reusable + * to minimize re-renders across the application + */ + +// Get all cells with their fractional indices, sorted +export const cellsWithIndices$ = queryDb( + tables.cells + .select("id", "fractionalIndex", "cellType") + .orderBy("fractionalIndex", "asc"), + { label: "cells.withIndices" }, +); + +// Get just the cell ordering information (minimal fields) +export const cellOrdering$ = queryDb( + tables.cells + .select("id", "fractionalIndex") + .orderBy("fractionalIndex", "asc"), + { label: "cells.ordering" }, +); + +// Get the first cell in the notebook +export const firstCell$ = queryDb( + tables.cells + .select("id", "fractionalIndex") + .orderBy("fractionalIndex", "asc") + .first({ fallback: () => null }), + { label: "cells.first" }, +); + +// Get the last cell in the notebook +export const lastCell$ = queryDb( + tables.cells + .select("id", "fractionalIndex") + .orderBy("fractionalIndex", "desc") + .first({ fallback: () => null }), + { label: "cells.last" }, +); + +// Get cells before a specific fractional index +export const cellsBefore = (fractionalIndex: string, limit: number = 1) => + queryDb( + tables.cells + .select("id", "fractionalIndex") + .where("fractionalIndex", "<", fractionalIndex) + .orderBy("fractionalIndex", "desc") + .limit(limit), + { + deps: [fractionalIndex, limit], + label: `cells.before.${fractionalIndex}`, + }, + ); + +// Get cells after a specific fractional index +export const cellsAfter = (fractionalIndex: string, limit: number = 1) => + queryDb( + tables.cells + .select("id", "fractionalIndex") + .where("fractionalIndex", ">", fractionalIndex) + .orderBy("fractionalIndex", "asc") + .limit(limit), + { + deps: [fractionalIndex, limit], + label: `cells.after.${fractionalIndex}`, + }, + ); + +// Get neighboring cells (one before and one after) +export const neighboringCells = (cellId: string) => + queryDb( + tables.cells + .select("id", "fractionalIndex") + .orderBy("fractionalIndex", "asc"), + { + deps: [cellId], + label: `cells.neighbors.${cellId}`, + }, + ); + +// Get the immediate adjacent cells (previous and next) for a specific cell +export const getAdjacentCells = (cellId: string, fractionalIndex: string) => { + const previousCell$ = queryDb( + tables.cells + .select("id", "fractionalIndex") + .where("fractionalIndex", "<", fractionalIndex) + .orderBy("fractionalIndex", "desc") + .first({ fallback: () => null }), + { + deps: [cellId, fractionalIndex], + label: `cells.previous.${cellId}`, + }, + ); + + const nextCell$ = queryDb( + tables.cells + .select("id", "fractionalIndex") + .where("fractionalIndex", ">", fractionalIndex) + .orderBy("fractionalIndex", "asc") + .first({ fallback: () => null }), + { + deps: [cellId, fractionalIndex], + label: `cells.next.${cellId}`, + }, + ); + + return { previousCell$, nextCell$ }; +}; + +// Get cell position info (useful for UI that needs to know if a cell is first/last) +export const cellPositionInfo = (cellId: string) => + queryDb( + tables.cells + .select("id", "fractionalIndex") + .where({ id: cellId }) + .first({ fallback: () => null }), + { + deps: [cellId], + label: `cells.positionInfo.${cellId}`, + }, + ); + +// Get cells in a range (useful for virtualization) +export const cellsInRange = ( + startIndex: string | null, + endIndex: string | null, +) => { + let query = tables.cells.select("id", "fractionalIndex", "cellType"); + + if (startIndex && endIndex) { + // Both bounds specified + query = query + .where("fractionalIndex", ">=", startIndex) + .where("fractionalIndex", "<=", endIndex); + } else if (startIndex) { + // Only start bound + query = query.where("fractionalIndex", ">=", startIndex); + } else if (endIndex) { + // Only end bound + query = query.where("fractionalIndex", "<=", endIndex); + } + + return queryDb(query.orderBy("fractionalIndex", "asc"), { + deps: [startIndex, endIndex], + label: `cells.range.${startIndex}-${endIndex}`, + }); +}; diff --git a/src/runt-schema/queries/index.ts b/src/runt-schema/queries/index.ts new file mode 100644 index 00000000..ab1db951 --- /dev/null +++ b/src/runt-schema/queries/index.ts @@ -0,0 +1,94 @@ +import { tables } from "../tables.ts"; +import { queryDb } from "@livestore/livestore"; + +export * from "./outputDeltas.ts"; +export * from "./cellOrdering.ts"; + +export const cellIDs$ = queryDb( + tables.cells.select("id").orderBy("fractionalIndex", "asc"), + { label: "notebook.cellIds" }, +); + +// Primary query for cell references - returns CellReference objects +export const cellReferences$ = queryDb( + tables.cells + .select("id", "fractionalIndex", "cellType") + .orderBy("fractionalIndex", "asc"), + { label: "notebook.cellReferences" }, +); + +// @deprecated Use cellReferences$ instead +export const cellList$ = cellReferences$; + +// Query for getting a specific cell's fractional index +export const cellFractionalIndex = (cellId: string) => + queryDb( + tables.cells + .select("fractionalIndex") + .where({ id: cellId }) + .first({ + fallback: () => null, + }), + { + deps: [cellId], + label: `cell.fractionalIndex.${cellId}`, + }, + ); + +// @deprecated Use cellReferences$ instead - this returns all cells anyway +export const adjacentCells = (_cellId: string) => cellReferences$; + +export const notebookMetadata$ = queryDb( + tables.notebookMetadata.select("key", "value"), +); + +export const cellQuery = { + byId: (cellId: string) => + queryDb( + tables.cells + .select() + .where({ id: cellId }) + .first({ + fallback: () => null, + }), + { + deps: [cellId], + label: `cell.${cellId}`, + }, + ), + + outputs: (cellId: string) => + queryDb( + tables.outputs.select().where({ cellId }).orderBy("position", "asc"), + { deps: [cellId], label: `outputs:${cellId}` }, + ), + + executionQueue: (cellId: string) => + queryDb( + tables.executionQueue.select().where({ cellId }).orderBy("id", "desc"), + { deps: [cellId], label: `queue:${cellId}` }, + ), +}; + +export const runtimeSessions$ = queryDb( + tables.runtimeSessions.select().orderBy("sessionId", "desc"), + { label: "runtime.sessions" }, +); + +/** + * Full cells query - returns complete cell data including source, metadata, etc. + * + * ⚠️ PERFORMANCE WARNING: This loads ALL cell data at once. + * + * Use this only when you need: + * - Full cell properties (source, executionCount, metadata, etc.) + * - Operations that require all cells (like TUI navigation) + * + * For most use cases, prefer: + * - `cellReferences$` for cell ordering/navigation with minimal data + * - `cellQuery.byId(cellId)` for individual cell data + */ +export const cells$ = queryDb( + tables.cells.select().orderBy("fractionalIndex", "asc"), + { label: "notebook.cells" }, +); diff --git a/src/runt-schema/queries/outputDeltas.ts b/src/runt-schema/queries/outputDeltas.ts new file mode 100644 index 00000000..156f2f50 --- /dev/null +++ b/src/runt-schema/queries/outputDeltas.ts @@ -0,0 +1,62 @@ +import { tables } from "../tables.ts"; +import { queryDb } from "@livestore/livestore"; + +interface OutputDelta { + id: string; + outputId: string; + delta: string; + sequenceNumber: number; +} + +/** + * Query deltas for a given output ID, sorted by sequence number + */ +export const outputDeltasQuery = (outputId: string) => + queryDb( + tables.outputDeltas + .select() + .where({ outputId }) + .orderBy("sequenceNumber", "asc"), + { deps: [outputId], label: "outputDeltas" }, + ); + +/** + * Apply deltas to original content in sequence order + */ +export const applyDeltas = ( + originalContent: string, + deltas: readonly OutputDelta[], +): string => { + if (deltas.length === 0) { + return originalContent; + } + + return deltas.reduce((acc, delta) => { + return acc + delta.delta; + }, originalContent); +}; + +/** + * Get final content with deltas applied + */ +export const getFinalContent = ( + originalContent: string, + deltas: readonly OutputDelta[], +): { content: string; hasDeltas: boolean; deltaCount: number } => { + const hasDeltas = deltas.length > 0; + const content = applyDeltas(originalContent, deltas); + + return { + content, + hasDeltas, + deltaCount: deltas.length, + }; +}; + +/** + * Query all output deltas, sorted by sequence number + */ +export const outputDeltas$ = queryDb( + tables.outputDeltas.select().orderBy("sequenceNumber", "asc"), + { label: "notebook.outputDeltas" }, +); diff --git a/src/runt-schema/tables.ts b/src/runt-schema/tables.ts new file mode 100644 index 00000000..e9785586 --- /dev/null +++ b/src/runt-schema/tables.ts @@ -0,0 +1,220 @@ +import { Schema, SessionIdSymbol, State } from "@livestore/livestore"; + +import { + CellTypeSchema, + ExecutionStateSchema, + MediaRepresentationSchema, + OutputTypeSchema, + QueueStatusSchema, + RuntimeStatusSchema, +} from "./types.ts"; + +export const tables = { + debug: State.SQLite.table({ + name: "debug", + columns: { + id: State.SQLite.text({ primaryKey: true }), + // Update column name or value to test schema changes + version: State.SQLite.text({ default: "1" }), + }, + }), + + presence: State.SQLite.table({ + name: "presence", + columns: { + userId: State.SQLite.text({ primaryKey: true }), + cellId: State.SQLite.text({ nullable: true }), + }, + }), + + // Notebook metadata (key-value pairs per store) + notebookMetadata: State.SQLite.table({ + name: "notebookMetadata", + columns: { + key: State.SQLite.text({ primaryKey: true }), + value: State.SQLite.text(), + }, + }), + + cells: State.SQLite.table({ + name: "cells", + columns: { + id: State.SQLite.text({ primaryKey: true }), + cellType: State.SQLite.text({ + schema: CellTypeSchema, + }), + source: State.SQLite.text({ default: "" }), + fractionalIndex: State.SQLite.text({ nullable: true }), // Fractional index for deterministic ordering + + // Execution state + executionCount: State.SQLite.integer({ nullable: true }), + executionState: State.SQLite.text({ + default: "idle", + schema: ExecutionStateSchema, + }), + assignedRuntimeSession: State.SQLite.text({ nullable: true }), // Which runtime session is handling this + lastExecutionDurationMs: State.SQLite.integer({ nullable: true }), // Duration of last execution in milliseconds + + // SQL-specific fields + sqlConnectionId: State.SQLite.text({ nullable: true }), + sqlResultVariable: State.SQLite.text({ nullable: true }), + + // AI-specific fields + aiProvider: State.SQLite.text({ nullable: true }), // 'openai', 'anthropic', 'local' + aiModel: State.SQLite.text({ nullable: true }), + aiSettings: State.SQLite.json({ nullable: true, schema: Schema.Any }), // temperature, max_tokens, etc. + + // Display visibility controls + sourceVisible: State.SQLite.boolean({ default: true }), + outputVisible: State.SQLite.boolean({ default: true }), + aiContextVisible: State.SQLite.boolean({ default: true }), + + createdBy: State.SQLite.text(), + }, + }), + + outputDeltas: State.SQLite.table({ + name: "output_deltas", + columns: { + id: State.SQLite.text({ primaryKey: true }), + outputId: State.SQLite.text(), + delta: State.SQLite.text({ default: "" }), + sequenceNumber: State.SQLite.integer(), + }, + }), + + outputs: State.SQLite.table({ + name: "outputs", + columns: { + id: State.SQLite.text({ primaryKey: true }), + cellId: State.SQLite.text(), + outputType: State.SQLite.text({ + schema: OutputTypeSchema, + }), + position: State.SQLite.real(), + + // Type-specific fields + streamName: State.SQLite.text({ nullable: true }), // 'stdout', 'stderr' for terminal outputs + executionCount: State.SQLite.integer({ nullable: true }), // Only for multimedia_result + displayId: State.SQLite.text({ nullable: true }), // Only for multimedia_display + + // Flattened content for SQL operations + data: State.SQLite.text({ nullable: true }), // Primary/concatenated content (text) + artifactId: State.SQLite.text({ nullable: true }), // Primary artifact reference + mimeType: State.SQLite.text({ nullable: true }), // Primary mime type + metadata: State.SQLite.json({ nullable: true, schema: Schema.Any }), // Primary metadata + + // Multi-media support + representations: State.SQLite.json({ + nullable: true, + schema: Schema.Record({ + key: Schema.String, + value: MediaRepresentationSchema, + }), + }), + }, + }), + + // Pending clears table for clear_output(wait=True) support + pendingClears: State.SQLite.table({ + name: "pendingClears", + columns: { + cellId: State.SQLite.text({ primaryKey: true }), + clearedBy: State.SQLite.text(), + }, + }), + + // Runtime lifecycle management + // NOTE: Each notebook should have exactly ONE active runtime at a time + // Multiple entries only exist during runtime transitions/handoffs + runtimeSessions: State.SQLite.table({ + name: "runtimeSessions", + columns: { + sessionId: State.SQLite.text({ primaryKey: true }), + runtimeId: State.SQLite.text(), // Stable runtime identifier + runtimeType: State.SQLite.text({ default: "python3" }), + status: State.SQLite.text({ + schema: RuntimeStatusSchema, + }), + isActive: State.SQLite.boolean({ default: true }), + + // Capability flags + canExecuteCode: State.SQLite.boolean({ default: false }), + canExecuteSql: State.SQLite.boolean({ default: false }), + canExecuteAi: State.SQLite.boolean({ default: false }), + availableAiModels: State.SQLite.json({ + nullable: true, + schema: Schema.Any, + }), + }, + }), + + // Execution queue - tracks work that needs to be done + executionQueue: State.SQLite.table({ + name: "executionQueue", + columns: { + id: State.SQLite.text({ primaryKey: true }), + cellId: State.SQLite.text(), + executionCount: State.SQLite.integer(), + requestedBy: State.SQLite.text(), + + // Queue management + status: State.SQLite.text({ + default: "pending", + schema: QueueStatusSchema, + }), + assignedRuntimeSession: State.SQLite.text({ nullable: true }), + + // Execution timing + startedAt: State.SQLite.datetime({ nullable: true }), + completedAt: State.SQLite.datetime({ nullable: true }), + executionDurationMs: State.SQLite.integer({ nullable: true }), + }, + }), + + // UI state for each user + uiState: State.SQLite.clientDocument({ + name: "uiState", + schema: Schema.Struct({ + selectedCellId: Schema.optional(Schema.String), + editingCellId: Schema.optional(Schema.String), + runtimeStatus: Schema.optional(Schema.String), + }), + default: { + id: SessionIdSymbol, + value: {}, + }, + }), + + // Actors table for tracking who/what performs actions + actors: State.SQLite.table({ + name: "actors", + columns: { + id: State.SQLite.text({ primaryKey: true }), + type: State.SQLite.text(), // "human" | "runtime_agent" + displayName: State.SQLite.text(), + avatar: State.SQLite.text({ nullable: true }), + }, + }), + + // Tool approvals for AI tool calls + toolApprovals: State.SQLite.table({ + name: "toolApprovals", + columns: { + toolCallId: State.SQLite.text({ primaryKey: true }), + cellId: State.SQLite.text(), + toolName: State.SQLite.text(), + status: State.SQLite.text({ + schema: Schema.Literal( + "pending", + "approved_once", + "approved_always", + "denied", + ), + }), + approvedBy: State.SQLite.text({ nullable: true }), + requestedAt: State.SQLite.datetime(), + respondedAt: State.SQLite.datetime({ nullable: true }), + }, + }), +}; diff --git a/src/runt-schema/types.ts b/src/runt-schema/types.ts new file mode 100644 index 00000000..299bc528 --- /dev/null +++ b/src/runt-schema/types.ts @@ -0,0 +1,235 @@ +import { Schema } from "@livestore/livestore"; + +// Media representation schema for unified output system - defined first for use in events +export const MediaRepresentationSchema = Schema.Union( + Schema.Struct({ + type: Schema.Literal("inline"), + data: Schema.Any, + metadata: Schema.optional( + Schema.Record({ key: Schema.String, value: Schema.Any }), + ), + }), + Schema.Struct({ + type: Schema.Literal("artifact"), + artifactId: Schema.String, + metadata: Schema.optional( + Schema.Record({ key: Schema.String, value: Schema.Any }), + ), + }), +); + +// TypeScript type for cell types +export type CellType = "code" | "markdown" | "sql" | "raw" | "ai"; + +// Schema for cell type validation +export const CellTypeSchema = Schema.Literal( + "code", + "markdown", + "sql", + "raw", + "ai", +); + +// Execution state types +export type ExecutionState = + | "idle" + | "queued" + | "running" + | "completed" + | "error"; +export const ExecutionStateSchema = Schema.Literal( + "idle", + "queued", + "running", + "completed", + "error", +); + +// Output types +export type OutputType = + | "multimedia_display" + | "multimedia_result" + | "terminal" + | "markdown" + | "error"; +export const OutputTypeSchema = Schema.Literal( + "multimedia_display", + "multimedia_result", + "terminal", + "markdown", + "error", +); + +// Runtime status types +export type RuntimeStatus = + | "starting" + | "ready" + | "busy" + | "restarting" + | "terminated"; +export const RuntimeStatusSchema = Schema.Literal( + "starting", + "ready", + "busy", + "restarting", + "terminated", +); + +// Queue status types +export type QueueStatus = + | "pending" + | "assigned" + | "executing" + | "completed" + | "failed" + | "cancelled"; +export const QueueStatusSchema = Schema.Literal( + "pending", + "assigned", + "executing", + "completed", + "failed", + "cancelled", +); + +// Actor types +export type ActorType = "human" | "runtime_agent"; +export const ActorTypeSchema = Schema.Literal("human", "runtime_agent"); + +// Base generic types for MediaContainer system +export type InlineContainer = { + type: "inline"; + data: T; + metadata?: Record | undefined; +}; + +export type ArtifactContainer = { + type: "artifact"; + artifactId: string; + metadata?: Record | undefined; +}; + +export type MediaContainer = + | InlineContainer + | ArtifactContainer; + +// MIME type constants - core definitions used across frontend and backend +export const TEXT_MIME_TYPES = [ + "text/plain", + "text/html", + "text/markdown", + "text/latex", +] as const; + +export const APPLICATION_MIME_TYPES = [ + "application/json", + "application/javascript", +] as const; + +export const AI_TOOL_MIME_TYPES = [ + "application/vnd.anode.aitool+json", + "application/vnd.anode.aitool.result+json", +] as const; + +export const IMAGE_MIME_TYPES = [ + "image/png", + "image/jpeg", + "image/svg+xml", + "image/gif", +] as const; + +export const JUPYTER_MIME_TYPES = [ + "application/vnd.jupyter.widget-state+json", + "application/vnd.jupyter.widget-view+json", + "application/vnd.plotly.v1+json", + "application/vnd.dataresource+json", + "application/vnd.vegalite.v2+json", + "application/vnd.vegalite.v3+json", + "application/vnd.vegalite.v4+json", + "application/vnd.vegalite.v5+json", + "application/vnd.vegalite.v6+json", + "application/vnd.vega.v3+json", + "application/vnd.vega.v4+json", + "application/vnd.vega.v5+json", + "application/geo+json", + "application/vdom.v1+json", +] as const; + +export const KNOWN_MIME_TYPES = [ + ...TEXT_MIME_TYPES, + ...APPLICATION_MIME_TYPES, + ...IMAGE_MIME_TYPES, + ...JUPYTER_MIME_TYPES, + ...AI_TOOL_MIME_TYPES, +] as const; + +export type TextMimeType = (typeof TEXT_MIME_TYPES)[number]; +export type ApplicationMimeType = (typeof APPLICATION_MIME_TYPES)[number]; +export type ImageMimeType = (typeof IMAGE_MIME_TYPES)[number]; +export type JupyterMimeType = (typeof JUPYTER_MIME_TYPES)[number]; +export type AiToolMimeType = (typeof AI_TOOL_MIME_TYPES)[number]; +export type KnownMimeType = (typeof KNOWN_MIME_TYPES)[number]; + +/** + * Type guard to check if a MIME type is a known text format + */ +export function isTextMimeType(mimeType: string): mimeType is TextMimeType { + return (TEXT_MIME_TYPES as readonly string[]).includes(mimeType); +} + +/** + * Type guard to check if a MIME type is a known application format + */ +export function isApplicationMimeType( + mimeType: string, +): mimeType is ApplicationMimeType { + return (APPLICATION_MIME_TYPES as readonly string[]).includes(mimeType); +} + +/** + * Type guard to check if a MIME type is a known image format + */ +export function isImageMimeType(mimeType: string): mimeType is ImageMimeType { + return (IMAGE_MIME_TYPES as readonly string[]).includes(mimeType); +} + +/** + * Type guard to check if a MIME type is a Jupyter vendor format + */ +export function isJupyterMimeType( + mimeType: string, +): mimeType is JupyterMimeType { + return (JUPYTER_MIME_TYPES as readonly string[]).includes(mimeType); +} + +/** + * Type guard to check if a MIME type is an AI tool format + */ +export function isAiToolMimeType(mimeType: string): mimeType is AiToolMimeType { + return (AI_TOOL_MIME_TYPES as readonly string[]).includes(mimeType); +} + +/** + * Type guard to check if a MIME type is any known format + */ +export function isKnownMimeType(mimeType: string): mimeType is KnownMimeType { + return (KNOWN_MIME_TYPES as readonly string[]).includes(mimeType); +} + +/** + * Check if a MIME type is a JSON-based format (ends with +json) + */ +export function isJsonMimeType(mimeType: string): boolean { + return mimeType.endsWith("+json") || mimeType === "application/json"; +} + +/** + * Check if a MIME type appears to be text-based + */ +export function isTextBasedMimeType(mimeType: string): boolean { + return ( + mimeType.startsWith("text/") || + mimeType === "application/javascript" || + mimeType === "image/svg+xml" + ); +} From 5698961266d5a63f327b270a7bfd2b9807e3e88c Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:20:17 -0700 Subject: [PATCH 2/7] Switch to local runt-schema imports - Replace @runt/schema imports with @/runt-schema - Remove @runt/schema dependency from package.json - Rename mod.ts to index.ts for proper module resolution - All TypeScript compilation now passes --- package.json | 1 - src/queries/outputDeltas.ts | 2 +- src/runt-schema/{mod.ts => index.ts} | 0 src/schema.ts | 6 +++--- test/components/outputs/AiToolResultOutput.test.tsx | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) rename src/runt-schema/{mod.ts => index.ts} (100%) diff --git a/package.json b/package.json index 629ae2bf..3bbbbfd9 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.1.6", "@react-spring/web": "^10.0.1", - "@runt/schema": "jsr:^0.13.0", "@tanstack/react-query": "^5.85.5", "@tanstack/react-query-devtools": "^5.85.5", "@tanstack/react-virtual": "^3.13.12", diff --git a/src/queries/outputDeltas.ts b/src/queries/outputDeltas.ts index 61a091b6..852ddbd0 100644 --- a/src/queries/outputDeltas.ts +++ b/src/queries/outputDeltas.ts @@ -1,6 +1,6 @@ import { OutputData, tables } from "@/schema"; import { queryDb } from "@livestore/livestore"; -import { getFinalContent } from "@runt/schema"; +import { getFinalContent } from "@/runt-schema"; // TODO: code here is duplicated from `runt/packages/schema/queries/outputDeltas.ts` // Reconcile it in the future diff --git a/src/runt-schema/mod.ts b/src/runt-schema/index.ts similarity index 100% rename from src/runt-schema/mod.ts rename to src/runt-schema/index.ts diff --git a/src/schema.ts b/src/schema.ts index 8c8b77fa..e5e81fb6 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,7 +1,7 @@ import { makeSchema, State, Store as LiveStore } from "@livestore/livestore"; -import * as RuntSchema from "@runt/schema"; +import * as RuntSchema from "@/runt-schema"; -export * as queries from "@runt/schema/queries"; +export * as queries from "@/runt-schema/queries"; // Create the schema using the factory pattern const state = State.SQLite.makeState({ @@ -27,7 +27,7 @@ export type { AiToolResultData, CellOperationResult, MoveOperationResult, -} from "@runt/schema"; +} from "@/runt-schema"; export const { // Re-export everything we need from @runt/schema diff --git a/test/components/outputs/AiToolResultOutput.test.tsx b/test/components/outputs/AiToolResultOutput.test.tsx index 1770a575..c5472b48 100644 --- a/test/components/outputs/AiToolResultOutput.test.tsx +++ b/test/components/outputs/AiToolResultOutput.test.tsx @@ -1,7 +1,7 @@ import React from "react"; import { render, screen } from "@testing-library/react"; import { describe, it, expect } from "vitest"; -import type { AiToolResultData } from "@runt/schema"; +import type { AiToolResultData } from "@/runt-schema"; import { AiToolResultOutput } from "../../../src/components/outputs/shared-with-iframe/AiToolResultOutput"; describe("AiToolResultOutput", () => { From a5c38d4075108474eab6b21932636f44fd7638b5 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:26:37 -0700 Subject: [PATCH 3/7] Upgrade LiveStore to 0.4.0-dev.7 with API fixes - Update all LiveStore packages to 0.4.0-dev.7 - Fix .first() calls to include required behaviour: 'fallback' property - Update sync backend API from handleWebSocket to handleSyncRequest/getSyncRequestSearchParams - Update client sync API from makeCfSync to makeWsSync - Update Durable Object class name from WebSocketServer to SyncBackendDO - All TypeScript compilation passes Note: Some peer dependency warnings remain for Effect packages - these are expected with the dev release and don't prevent functionality. --- backend/selective-entry.ts | 4 +- backend/sync.ts | 97 ++--- package.json | 14 +- pnpm-lock.yaml | 354 +++++++++++-------- src/components/debug/DebugPanel.tsx | 3 +- src/components/livestore/livestore.worker.ts | 4 +- src/queries/index.ts | 4 +- src/runt-schema/queries/cellOrdering.ts | 32 +- src/runt-schema/queries/index.ts | 20 +- wrangler.toml | 10 +- 10 files changed, 301 insertions(+), 241 deletions(-) diff --git a/backend/selective-entry.ts b/backend/selective-entry.ts index 7379c39d..6cff036d 100644 --- a/backend/selective-entry.ts +++ b/backend/selective-entry.ts @@ -1,6 +1,6 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; -import { WebSocketServer } from "./sync.ts"; +import { SyncBackendDO } from "./sync.ts"; import syncHandler from "./sync.ts"; import { workerGlobals, @@ -21,7 +21,7 @@ import { TrcpContext } from "./trpc/trpc.ts"; // NOTE: This export is necessary at the root entry point for the Workers // runtime for Durable Object usage -export { WebSocketServer }; +export { SyncBackendDO }; const honoApp = new Hono<{ Bindings: Env; Variables: AuthContext }>(); diff --git a/backend/sync.ts b/backend/sync.ts index 81289ed1..021c8b9d 100644 --- a/backend/sync.ts +++ b/backend/sync.ts @@ -1,17 +1,18 @@ import { makeDurableObject, - handleWebSocket, + getSyncRequestSearchParams, + handleSyncRequest, } from "@livestore/sync-cf/cf-worker"; import { type Env, type ExecutionContext } from "./types"; import { getValidatedUser } from "./auth"; import { Schema } from "@livestore/livestore"; -export class WebSocketServer extends makeDurableObject({ - onPush: async (message) => { +export class SyncBackendDO extends makeDurableObject({ + onPush: async (message, _context) => { console.log("onPush", message.batch); }, - onPull: async (message) => { + onPull: async (message, _context) => { console.log("onPull", message); }, }) {} @@ -25,50 +26,58 @@ const decodePayload = Schema.decodeUnknownSync(SyncPayloadSchema); export default { fetch: async (request: Request, env: Env, ctx: ExecutionContext) => { - const url = new URL(request.url); + const requestParamsResult = getSyncRequestSearchParams(request as any); - const pathname = url.pathname; + if (requestParamsResult._tag === "Some") { + return handleSyncRequest({ + request: request as any, + searchParams: requestParamsResult.value, + env, + ctx, + options: { + headers: {}, + validatePayload: async (rawPayload) => { + try { + const payload = decodePayload(rawPayload); + let validatedUser = await getValidatedUser( + payload.authToken, + env + ); - if (!pathname.startsWith("/livestore")) { - return new Response("Invalid request", { status: 400 }); - } - - return handleWebSocket(request, env, ctx, { - validatePayload: async (rawPayload) => { - try { - const payload = decodePayload(rawPayload); - let validatedUser = await getValidatedUser(payload.authToken, env); + if (!validatedUser) { + throw new Error("User must be authenticated"); + } - if (!validatedUser) { - throw new Error("User must be authenticated"); - } + // User identity is validated via JWT token + // LiveStore will manage clientId for device/app instance identification + if (validatedUser.id === "runtime-agent") { + console.log("✅ Runtime agent authenticated"); + } else if (payload?.runtime === true) { + // For API key authenticated runtime agents + console.log("✅ API key authenticated runtime agent:", { + userId: validatedUser.id, + }); + } else { + // For regular users + console.log("✅ Authenticated user:", { + userId: validatedUser.id, + }); + } - // User identity is validated via JWT token - // LiveStore will manage clientId for device/app instance identification - if (validatedUser.id === "runtime-agent") { - console.log("✅ Runtime agent authenticated"); - } else if (payload?.runtime === true) { - // For API key authenticated runtime agents - console.log("✅ API key authenticated runtime agent:", { - userId: validatedUser.id, - }); - } else { - // For regular users - console.log("✅ Authenticated user:", { - userId: validatedUser.id, - }); - } + // SECURITY NOTE: This validation only occurs at connection time. + // The current version of `@livestore/sync-cf` does not provide a mechanism + // to verify that the `clientId` on incoming events matches the `clientId` + // that was validated with this initial connection payload. A malicious + // client could pass this check and then send events with a different clientId. + } catch (error: any) { + console.error("🚫 Authentication failed:", error.message); + throw error; // Reject the WebSocket connection + } + }, + }, + }); + } - // SECURITY NOTE: This validation only occurs at connection time. - // The current version of `@livestore/sync-cf` does not provide a mechanism - // to verify that the `clientId` on incoming events matches the `clientId` - // that was validated with this initial connection payload. A malicious - // client could pass this check and then send events with a different clientId. - } catch (error: any) { - console.error("🚫 Authentication failed:", error.message); - throw error; // Reject the WebSocket connection - } - }, - }); + return new Response("Not found", { status: 404 }); }, }; diff --git a/package.json b/package.json index 3bbbbfd9..bcb641ca 100644 --- a/package.json +++ b/package.json @@ -59,12 +59,12 @@ "@japikey/cloudflare": "^0.4.0", "@japikey/japikey": "^0.4.0", "@japikey/shared": "^0.4.0", - "@livestore/adapter-web": "^0.3.1", - "@livestore/livestore": "^0.3.1", - "@livestore/react": "^0.3.1", - "@livestore/sync-cf": "^0.3.1", + "@livestore/adapter-web": "0.4.0-dev.7", + "@livestore/livestore": "0.4.0-dev.7", + "@livestore/react": "0.4.0-dev.7", + "@livestore/sync-cf": "0.4.0-dev.7", "@livestore/wa-sqlite": "1.0.5-dev.2", - "@livestore/webmesh": "^0.3.1", + "@livestore/webmesh": "0.4.0-dev.7", "@microlink/react-json-view": "^1.26.2", "@overengineering/fps-meter": "^0.1.2", "@radix-ui/react-avatar": "^1.1.10", @@ -122,8 +122,8 @@ "@cloudflare/workers-types": "^4.20250813.0", "@effect/vitest": "0.23.7", "@eslint/js": "^9.30.1", - "@livestore/adapter-node": "^0.3.1", - "@livestore/devtools-vite": "^0.3.1", + "@livestore/adapter-node": "0.4.0-dev.7", + "@livestore/devtools-vite": "0.4.0-dev.7", "@tailwindcss/cli": "^4.1.10", "@tailwindcss/postcss": "^4.1.10", "@tailwindcss/typography": "^0.5.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a119cb9b..9f1380b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,23 +59,23 @@ importers: specifier: ^0.4.0 version: 0.4.0 '@livestore/adapter-web': - specifier: ^0.3.1 - version: 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) '@livestore/livestore': - specifier: ^0.3.1 - version: 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) '@livestore/react': - specifier: ^0.3.1 - version: 0.3.1(7301ba73c97721b37c2bae9f6477e643) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(f760163e07889d40bbe9e88e2c586c79) '@livestore/sync-cf': - specifier: ^0.3.1 - version: 0.3.1(38eef8465614833bab78aa968987f446) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@livestore/wa-sqlite': specifier: 1.0.5-dev.2 version: 1.0.5-dev.2 '@livestore/webmesh': - specifier: ^0.3.1 - version: 0.3.1(38eef8465614833bab78aa968987f446) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@microlink/react-json-view': specifier: ^1.26.2 version: 1.26.2(@types/react@19.1.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -106,9 +106,6 @@ importers: '@react-spring/web': specifier: ^10.0.1 version: 10.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@runt/schema': - specifier: jsr:^0.13.0 - version: '@jsr/runt__schema@0.13.0(f9c23af240f2640c0a9abef8711d3cc6)' '@tanstack/react-query': specifier: ^5.85.5 version: 5.85.5(react@19.0.0) @@ -246,11 +243,11 @@ importers: specifier: ^9.30.1 version: 9.31.0 '@livestore/adapter-node': - specifier: ^0.3.1 - version: 0.3.1(845e1eef4d95d402e73d32c45be08be4) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(b461517ae8cd5b609f418ce3fcbe367c) '@livestore/devtools-vite': - specifier: ^0.3.1 - version: 0.3.1(7d0a4a37ad1c1cac586a20ea6b42fd26) + specifier: 0.4.0-dev.7 + version: 0.4.0-dev.7(9d53b5ed869149836a77f8b993b746de) '@tailwindcss/cli': specifier: ^4.1.10 version: 4.1.11 @@ -580,6 +577,9 @@ packages: '@cloudflare/workers-types@4.20250813.0': resolution: {integrity: sha512-RFFjomDndGR+p7ug1HWDlW21qOJyRZbmI99dUtuR9tmwJbSZhUUnSFmzok9lBYVfkMMrO1O5vmB+IlgiecgLEA==} + '@cloudflare/workers-types@4.20250823.0': + resolution: {integrity: sha512-z5pCggF3jG//h083+GEWCyQLW0A5GHq20akG+jN6ChyHQi/yZj1FcQcMhnvbBY4PiGq+SBiEj/LClG/lDPm+jg==} + '@codemirror/autocomplete@6.18.6': resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} @@ -633,6 +633,14 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@effect/ai@0.26.1': + resolution: {integrity: sha512-FisoFF5ghyvPx3975OFzCPlzG3UEKzY7RHdOxdmrPTeoM8/5NXi0oPGKyGpHjJmC/6efhhlwmGfRT4BTtuwTdg==} + peerDependencies: + '@effect/experimental': 0.46.8 + '@effect/platform': 0.82.4 + '@effect/rpc': 0.59.9 + effect: 3.15.5 + '@effect/cli@0.61.8': resolution: {integrity: sha512-CRdzBUW3SkjsL1Og5bnh7nt1VN0JwNLyfnjlzTWwtIm07WFFdcZXUXquFJfmU++eTP5Kfp8JbZYvsHwmzg/q1w==} peerDependencies: @@ -1290,9 +1298,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@jsr/runt__schema@0.13.0': - resolution: {integrity: sha512-8IV7E9nnZLO6e3Xm28CSqUFWRFFQf2GAKJzZtZ6cTy6nvYmUb4gAjaG+D6wxH8VMHi7s3McANpn5AVOrlupYhQ==, tarball: https://npm.jsr.io/~/11/@jsr/runt__schema/0.13.0.tgz} - '@lezer/common@1.2.3': resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} @@ -1317,62 +1322,69 @@ packages: '@lezer/python@1.1.18': resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==} - '@livestore/adapter-node@0.3.1': - resolution: {integrity: sha512-qP6nGY8du3r+4aS4yJ2YgaDVp/KzE/qBzOzleFTBR9DEM0faeLI9EXzwVq9A/k8pbxm5heF78l0ConExxxl42Q==} + '@livestore/adapter-node@0.4.0-dev.7': + resolution: {integrity: sha512-ut+SQkTbZ8J3SJQHaZrAfT3dgpaELZe2r6444omajHaYTI1ckkPutX/Xe9pKHwPoA+kbvyVEfY+JubszLqWsDg==} + + '@livestore/adapter-web@0.4.0-dev.7': + resolution: {integrity: sha512-aNfzbCKDPkiWvppm+9hzSae7FQopTWkX1Eq02puiFU0S4hxTLmvJQxBCr/CZyoz13CuAHNY3IPMOYIeuLZcziA==} - '@livestore/adapter-web@0.3.1': - resolution: {integrity: sha512-0ZKTam+C3KeG5qiiTLFOgoMhdUBCENmuaMwxoj7WOtA2c4eKyqIy+P/1zga+az0XqaMJoG5FVszWhWMUMzNjtQ==} + '@livestore/common-cf@0.4.0-dev.7': + resolution: {integrity: sha512-yzckAhX2xowuJvj4mrNUlCvqp38N2Ydti8Nd6oI/x8smnXqxKDG0qAP0PclsfexyDDxszneQMaLhZGYFqDJ0BA==} - '@livestore/common@0.3.1': - resolution: {integrity: sha512-D44ia+zVH8EF0TWGUp0GQnCVvCsGKgKD/ryFl+kx607/l7GDUSagNnWkRmMwhhshJSJblQwouhA9fwjDNTBB2g==} + '@livestore/common@0.4.0-dev.7': + resolution: {integrity: sha512-QAzUD2H3l01fA3FCFbfwMbt4RPTadJx1zZN5Qka/uozgm95pPBSUeeOgmSmvCGZmAQFyCk63z2Rk2tO3m8GxkA==} - '@livestore/devtools-vite@0.3.1': - resolution: {integrity: sha512-7d4dxI1jkNtMRNxfnj7WVFIg+z5+M1FxTCUw4XrtHYeJGd7qy3GOJ/75D0lU12OQ7EbY/qSVnoU7++SkSEjMFA==} + '@livestore/devtools-vite@0.4.0-dev.7': + resolution: {integrity: sha512-/XztXLI+7+be4HesuUdTRe+T4O9sMqCtVFqZLAVCRgDj1kRdnOb4mIlmyEgLsD3064H47JWw+gT7A1j4Q9zuWQ==} peerDependencies: - vite: ~6.3.4 + vite: ^7.1.3 - '@livestore/devtools-web-common@0.3.1': - resolution: {integrity: sha512-jU7IvebelTtvSTQ2zKNzSm5qZodwUiPsNsDURsY5Yw0DXpafcfpRobs/WYd+Wd4Q1E4oFaK05hPfWZGbVFdw7Q==} + '@livestore/devtools-web-common@0.4.0-dev.7': + resolution: {integrity: sha512-lFXYije6Qgt+PcOobiAOQ2V3aqcwbm6HTcIJdqdYM6/R/FDLBsB+GtnFZAZJ7uADP8Vj3ZkHN8YCnqzBzgKeLQ==} - '@livestore/livestore@0.3.1': - resolution: {integrity: sha512-imw1JK5i82yTmSC4PRoZ1gUiG39jasR49c5TPQI/MCIFSbgqcKS0x1IPoB8js6tlPoVm+iH7p4JTAQKYC2q3Pg==} + '@livestore/livestore@0.4.0-dev.7': + resolution: {integrity: sha512-501jg+0njMwwpkBxoFVETpJcXid4ZaX6GhtbzIUnQGIKnei3JU+llktL6lIMH+Lfi+5mCDaVK7u1Ap7YddP3KA==} - '@livestore/react@0.3.1': - resolution: {integrity: sha512-9/6XzrzSjchgmZevQV0EkD08RXaFRMpU4EQp7dSEjihIv9+gvOwnLyYDTd7MvjaMIKTw7tnmKAmjdoqM5d0ijg==} + '@livestore/react@0.4.0-dev.7': + resolution: {integrity: sha512-g9qMq77+fTS5YXzt0BHWqMqAejyyUH1xwg5/TRwGm6M5cP/+++WFHk2nKonIl32DVN3dJgDIDyt92hH1f+RXMA==} peerDependencies: react: 19.0.0 - '@livestore/sqlite-wasm@0.3.1': - resolution: {integrity: sha512-+JLIwpd2N214LmwlUX6arYnJ5IhvSi4Fn3Jk6E6fNfuUU4tczcL1PtgfIX2IoiPhn9QDG0YJVdJBT6KYi1uMyg==} + '@livestore/sqlite-wasm@0.4.0-dev.7': + resolution: {integrity: sha512-ByPqb7vlgippmNTQ/3tLWBGzpe6O+fWRiT4V/Xo6Nq4r9RGgrBqFVAxjx1NloyTEOIfSNusOdUrplDoNgWZvQg==} - '@livestore/sync-cf@0.3.1': - resolution: {integrity: sha512-Vopen/K5/MRr4va/3u19cGLFslJs/fqtr5C2MhEOy080uYcClEWUDxyHh/Oec9wx4ZsbC0WKfTiUVN48DjHo/A==} + '@livestore/sync-cf@0.4.0-dev.7': + resolution: {integrity: sha512-1AxrEa9XKzM0yBX9T24TqNUidg+96UNFn9+R7hSPP2gQuS1KxmaibhY1XTUB0FdlUjBnmKZGDBPP/LbOXgfEag==} - '@livestore/utils@0.3.1': - resolution: {integrity: sha512-DFgrKpVIu/Nn9GE0QG2uitrFLF63aIiV5rencAk3kigNPzq4iBao05wvT/JVqgRxxiM7F1SuAZYogwM4QdpcDA==} + '@livestore/utils@0.4.0-dev.7': + resolution: {integrity: sha512-I9N1QxIWBJi4Tcb1aYeu0vbkFtyd+pIyOWnysT+oy4o8XA9oK8/dyVj0SnO39bc8pYN3TlvqWKTVfNTuBLeqLQ==} peerDependencies: - '@effect/cli': ~0.61.4 + '@effect/ai': ^0.26.0 + '@effect/cli': ^0.69.2 '@effect/cluster': 0.34.2 '@effect/experimental': 0.46.8 - '@effect/opentelemetry': ~0.48.4 + '@effect/opentelemetry': ^0.56.4 '@effect/platform': 0.82.4 - '@effect/platform-browser': ~0.62.4 - '@effect/platform-bun': ~0.65.1 - '@effect/platform-node': ~0.81.1 - '@effect/printer': ~0.43.2 - '@effect/printer-ansi': ~0.43.2 + '@effect/platform-browser': ^0.70.0 + '@effect/platform-bun': ^0.79.0 + '@effect/platform-node': ^0.96.0 + '@effect/printer': ^0.45.0 + '@effect/printer-ansi': ^0.45.0 '@effect/rpc': 0.59.9 '@effect/sql': 0.35.8 '@effect/typeclass': 0.34.2 - '@opentelemetry/api': ~1.9.0 - '@opentelemetry/resources': ~2.0.0 + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/resources': ^2.0.1 effect: 3.15.5 + '@livestore/wa-sqlite@0.4.0-dev.7': + resolution: {integrity: sha512-5KE/dfZqgppMDLRNohigfS/uonLzd8uvGTnnOucx5Xec7K8XYcLLkktWNEVauWgqfpul6taXwx6t3m5AZxz16A==} + '@livestore/wa-sqlite@1.0.5-dev.2': resolution: {integrity: sha512-i7tKFEp0m3+4tGLV9Z5eAr/3RZPuNOyuf4NaQ/ygF2KwzlHc3TnqouPuE2sMH06r3soXIilWYND/x0eT8x6D6Q==} - '@livestore/webmesh@0.3.1': - resolution: {integrity: sha512-JLYFgiOf1r7xqN7SkwdHNZdZ+geQlEdC9rg81DeC839vqqshA5TEhh045dhEkeyVJZqeg44vX5adUX6FOkhTfg==} + '@livestore/webmesh@0.4.0-dev.7': + resolution: {integrity: sha512-DIvJuTYTWRNdtlvPIfHkJT3tpB5cVk/H5v0Kb8+SkbnFGjXEvTDH93J9KqDedmN8zw0CKazkOyEoLUEjzs0+7w==} '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} @@ -3125,6 +3137,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -3861,9 +3882,6 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.2: - resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} - msgpackr@1.11.5: resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} @@ -3884,11 +3902,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.3: - resolution: {integrity: sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==} - engines: {node: ^18 || >=20} - hasBin: true - nanoid@5.1.5: resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} engines: {node: ^18 || >=20} @@ -4017,6 +4030,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pidusage@2.0.21: resolution: {integrity: sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==} engines: {node: '>=8'} @@ -4133,9 +4150,9 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + pretty-bytes@7.0.1: + resolution: {integrity: sha512-285/jRCYIbMGDciDdrw0KPNC4LKEEwz/bwErcYNxSJOi4CpGUuLpb9gQpg3XJP0XYj9ldSRluXxih4lX2YN8Xw==} + engines: {node: '>=20'} pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} @@ -4809,8 +4826,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.3.4: - resolution: {integrity: sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==} + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -4849,19 +4866,19 @@ packages: yaml: optional: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.1.4: + resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -5318,6 +5335,8 @@ snapshots: '@cloudflare/workers-types@4.20250813.0': {} + '@cloudflare/workers-types@4.20250823.0': {} + '@codemirror/autocomplete@6.18.6': dependencies: '@codemirror/language': 6.11.2 @@ -5441,6 +5460,14 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@effect/ai@0.26.1(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + dependencies: + '@effect/experimental': 0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + effect: 3.15.5 + find-my-way-ts: 0.1.6 + '@effect/cli@0.61.8(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/platform': 0.82.4(effect@3.15.5) @@ -5909,26 +5936,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 - '@jsr/runt__schema@0.13.0(f9c23af240f2640c0a9abef8711d3cc6)': - dependencies: - '@livestore/livestore': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - transitivePeerDependencies: - - '@effect/cli' - - '@effect/cluster' - - '@effect/experimental' - - '@effect/opentelemetry' - - '@effect/platform' - - '@effect/platform-browser' - - '@effect/platform-bun' - - '@effect/platform-node' - - '@effect/printer' - - '@effect/printer-ansi' - - '@effect/rpc' - - '@effect/sql' - - '@effect/typeclass' - - '@opentelemetry/resources' - - effect - '@lezer/common@1.2.3': {} '@lezer/css@1.3.0': @@ -5968,16 +5975,17 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@livestore/adapter-node@0.3.1(845e1eef4d95d402e73d32c45be08be4)': + '@livestore/adapter-node@0.4.0-dev.7(b461517ae8cd5b609f418ce3fcbe367c)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/devtools-vite': 0.3.1(587aed638ece58dcc18a9d222a09464f) - '@livestore/sqlite-wasm': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/webmesh': 0.3.1(38eef8465614833bab78aa968987f446) + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/devtools-vite': 0.4.0-dev.7(f7045c8d08b2a67bffa2a0fb2c680218) + '@livestore/sqlite-wasm': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@opentelemetry/api': 1.9.0 - vite: 6.3.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6005,15 +6013,16 @@ snapshots: - tsx - yaml - '@livestore/adapter-web@0.3.1(f9c23af240f2640c0a9abef8711d3cc6)': + '@livestore/adapter-web@0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/devtools-web-common': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/sqlite-wasm': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/webmesh': 0.3.1(38eef8465614833bab78aa968987f446) + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/devtools-web-common': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/sqlite-wasm': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6030,15 +6039,40 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common@0.3.1(f9c23af240f2640c0a9abef8711d3cc6)': + '@livestore/common-cf@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': dependencies: - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/webmesh': 0.3.1(38eef8465614833bab78aa968987f446) + '@cloudflare/workers-types': 4.20250823.0 + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + transitivePeerDependencies: + - '@effect/ai' + - '@effect/cli' + - '@effect/cluster' + - '@effect/experimental' + - '@effect/opentelemetry' + - '@effect/platform' + - '@effect/platform-browser' + - '@effect/platform-bun' + - '@effect/platform-node' + - '@effect/printer' + - '@effect/printer-ansi' + - '@effect/rpc' + - '@effect/sql' + - '@effect/typeclass' + - '@opentelemetry/api' + - '@opentelemetry/resources' + - effect + + '@livestore/common@0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf)': + dependencies: + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@opentelemetry/api': 1.9.0 graphology: 0.26.0-alpha1(graphology-types@0.24.8) graphology-dag: 0.4.1(graphology-types@0.24.8) graphology-types: 0.24.8 transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6055,12 +6089,13 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-vite@0.3.1(587aed638ece58dcc18a9d222a09464f)': + '@livestore/devtools-vite@0.4.0-dev.7(9d53b5ed869149836a77f8b993b746de)': dependencies: - '@livestore/adapter-web': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - vite: 6.3.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + '@livestore/adapter-web': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6078,12 +6113,13 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-vite@0.3.1(7d0a4a37ad1c1cac586a20ea6b42fd26)': + '@livestore/devtools-vite@0.4.0-dev.7(f7045c8d08b2a67bffa2a0fb2c680218)': dependencies: - '@livestore/adapter-web': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + '@livestore/adapter-web': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6101,12 +6137,13 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-web-common@0.3.1(38eef8465614833bab78aa968987f446)': + '@livestore/devtools-web-common@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/webmesh': 0.3.1(38eef8465614833bab78aa968987f446) + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6124,12 +6161,13 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/livestore@0.3.1(f9c23af240f2640c0a9abef8711d3cc6)': + '@livestore/livestore@0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6146,14 +6184,15 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/react@0.3.1(7301ba73c97721b37c2bae9f6477e643)': + '@livestore/react@0.4.0-dev.7(f760163e07889d40bbe9e88e2c586c79)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/livestore': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/livestore': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) '@opentelemetry/api': 1.9.0 react: 19.0.0 transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6170,12 +6209,15 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sqlite-wasm@0.3.1(38eef8465614833bab78aa968987f446)': + '@livestore/sqlite-wasm@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) - '@livestore/wa-sqlite': 1.0.5-dev.2 + '@cloudflare/workers-types': 4.20250823.0 + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/common-cf': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/wa-sqlite': 0.4.0-dev.7 transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6193,11 +6235,14 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sync-cf@0.3.1(38eef8465614833bab78aa968987f446)': + '@livestore/sync-cf@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': dependencies: - '@livestore/common': 0.3.1(f9c23af240f2640c0a9abef8711d3cc6) - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) + '@cloudflare/workers-types': 4.20250823.0 + '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + '@livestore/common-cf': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -6215,8 +6260,9 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/utils@0.3.1(38eef8465614833bab78aa968987f446)': + '@livestore/utils@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': dependencies: + '@effect/ai': 0.26.1(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/cli': 0.61.8(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/experimental': 0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) @@ -6234,16 +6280,18 @@ snapshots: '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@standard-schema/spec': 1.0.0 effect: 3.15.5 - msgpackr: 1.11.2 - nanoid: 5.1.3 - pretty-bytes: 6.1.1 + nanoid: 5.1.5 + pretty-bytes: 7.0.1 + + '@livestore/wa-sqlite@0.4.0-dev.7': {} '@livestore/wa-sqlite@1.0.5-dev.2': {} - '@livestore/webmesh@0.3.1(38eef8465614833bab78aa968987f446)': + '@livestore/webmesh@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': dependencies: - '@livestore/utils': 0.3.1(38eef8465614833bab78aa968987f446) + '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) transitivePeerDependencies: + - '@effect/ai' - '@effect/cli' - '@effect/cluster' - '@effect/experimental' @@ -8005,6 +8053,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fflate@0.8.2: {} file-entry-cache@8.0.0: @@ -8909,10 +8961,6 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.2: - optionalDependencies: - msgpackr-extract: 3.0.3 - msgpackr@1.11.5: optionalDependencies: msgpackr-extract: 3.0.3 @@ -8936,8 +8984,6 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.3: {} - nanoid@5.1.5: {} natural-compare@1.4.0: {} @@ -9066,6 +9112,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pidusage@2.0.21: dependencies: safe-buffer: 5.2.1 @@ -9176,7 +9224,7 @@ snapshots: prettier@3.6.2: {} - pretty-bytes@6.1.1: {} + pretty-bytes@7.0.1: {} pretty-format@27.5.1: dependencies: @@ -9926,7 +9974,7 @@ snapshots: - tsx - yaml - vite@6.3.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1): + vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) @@ -9941,11 +9989,11 @@ snapshots: lightningcss: 1.30.1 yaml: 2.8.1 - vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1): + vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: esbuild: 0.25.6 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.45.0 tinyglobby: 0.2.14 diff --git a/src/components/debug/DebugPanel.tsx b/src/components/debug/DebugPanel.tsx index 8d0ede1b..c9d7ad28 100644 --- a/src/components/debug/DebugPanel.tsx +++ b/src/components/debug/DebugPanel.tsx @@ -303,8 +303,9 @@ function DebugVersion() { const debugVersion = useQuery( queryDb( tables.debug.select("version").first({ + behaviour: "fallback", fallback: () => { - return "unknown"; + return "1"; }, }) ) diff --git a/src/components/livestore/livestore.worker.ts b/src/components/livestore/livestore.worker.ts index 9a613e54..d692e6f1 100644 --- a/src/components/livestore/livestore.worker.ts +++ b/src/components/livestore/livestore.worker.ts @@ -1,5 +1,5 @@ import { makeWorker } from "@livestore/adapter-web/worker"; -import { makeCfSync } from "@livestore/sync-cf"; +import { makeWsSync } from "@livestore/sync-cf/client"; import { schema } from "../../schema.js"; @@ -43,7 +43,7 @@ function getLiveStoreUrl(): string { makeWorker({ schema, sync: { - backend: makeCfSync({ url: getLiveStoreUrl() }), + backend: makeWsSync({ url: getLiveStoreUrl() }), initialSyncOptions: { _tag: "Blocking", timeout: 5000 }, onSyncError: "ignore", }, diff --git a/src/queries/index.ts b/src/queries/index.ts index cad44e18..b4f8ed9e 100644 --- a/src/queries/index.ts +++ b/src/queries/index.ts @@ -8,7 +8,7 @@ export const lastUsedAiModel$ = queryDb( tables.notebookMetadata .select() .where({ key: "lastUsedAiModel" }) - .first({ fallback: () => null }), + .first({ behaviour: "fallback", fallback: () => null }), { label: "notebook.lastUsedAiModel" } ); @@ -16,6 +16,6 @@ export const lastUsedAiProvider$ = queryDb( tables.notebookMetadata .select() .where({ key: "lastUsedAiProvider" }) - .first({ fallback: () => null }), + .first({ behaviour: "fallback", fallback: () => null }), { label: "notebook.lastUsedAiProvider" } ); diff --git a/src/runt-schema/queries/cellOrdering.ts b/src/runt-schema/queries/cellOrdering.ts index cf8384ca..43bbf122 100644 --- a/src/runt-schema/queries/cellOrdering.ts +++ b/src/runt-schema/queries/cellOrdering.ts @@ -12,7 +12,7 @@ export const cellsWithIndices$ = queryDb( tables.cells .select("id", "fractionalIndex", "cellType") .orderBy("fractionalIndex", "asc"), - { label: "cells.withIndices" }, + { label: "cells.withIndices" } ); // Get just the cell ordering information (minimal fields) @@ -20,7 +20,7 @@ export const cellOrdering$ = queryDb( tables.cells .select("id", "fractionalIndex") .orderBy("fractionalIndex", "asc"), - { label: "cells.ordering" }, + { label: "cells.ordering" } ); // Get the first cell in the notebook @@ -28,8 +28,8 @@ export const firstCell$ = queryDb( tables.cells .select("id", "fractionalIndex") .orderBy("fractionalIndex", "asc") - .first({ fallback: () => null }), - { label: "cells.first" }, + .first({ behaviour: "fallback", fallback: () => null }), + { label: "cells.first" } ); // Get the last cell in the notebook @@ -37,8 +37,8 @@ export const lastCell$ = queryDb( tables.cells .select("id", "fractionalIndex") .orderBy("fractionalIndex", "desc") - .first({ fallback: () => null }), - { label: "cells.last" }, + .first({ behaviour: "fallback", fallback: () => null }), + { label: "cells.last" } ); // Get cells before a specific fractional index @@ -52,7 +52,7 @@ export const cellsBefore = (fractionalIndex: string, limit: number = 1) => { deps: [fractionalIndex, limit], label: `cells.before.${fractionalIndex}`, - }, + } ); // Get cells after a specific fractional index @@ -66,7 +66,7 @@ export const cellsAfter = (fractionalIndex: string, limit: number = 1) => { deps: [fractionalIndex, limit], label: `cells.after.${fractionalIndex}`, - }, + } ); // Get neighboring cells (one before and one after) @@ -78,7 +78,7 @@ export const neighboringCells = (cellId: string) => { deps: [cellId], label: `cells.neighbors.${cellId}`, - }, + } ); // Get the immediate adjacent cells (previous and next) for a specific cell @@ -88,11 +88,11 @@ export const getAdjacentCells = (cellId: string, fractionalIndex: string) => { .select("id", "fractionalIndex") .where("fractionalIndex", "<", fractionalIndex) .orderBy("fractionalIndex", "desc") - .first({ fallback: () => null }), + .first({ behaviour: "fallback", fallback: () => null }), { deps: [cellId, fractionalIndex], label: `cells.previous.${cellId}`, - }, + } ); const nextCell$ = queryDb( @@ -100,11 +100,11 @@ export const getAdjacentCells = (cellId: string, fractionalIndex: string) => { .select("id", "fractionalIndex") .where("fractionalIndex", ">", fractionalIndex) .orderBy("fractionalIndex", "asc") - .first({ fallback: () => null }), + .first({ behaviour: "fallback", fallback: () => null }), { deps: [cellId, fractionalIndex], label: `cells.next.${cellId}`, - }, + } ); return { previousCell$, nextCell$ }; @@ -116,17 +116,17 @@ export const cellPositionInfo = (cellId: string) => tables.cells .select("id", "fractionalIndex") .where({ id: cellId }) - .first({ fallback: () => null }), + .first({ behaviour: "fallback", fallback: () => null }), { deps: [cellId], label: `cells.positionInfo.${cellId}`, - }, + } ); // Get cells in a range (useful for virtualization) export const cellsInRange = ( startIndex: string | null, - endIndex: string | null, + endIndex: string | null ) => { let query = tables.cells.select("id", "fractionalIndex", "cellType"); diff --git a/src/runt-schema/queries/index.ts b/src/runt-schema/queries/index.ts index ab1db951..68ba5603 100644 --- a/src/runt-schema/queries/index.ts +++ b/src/runt-schema/queries/index.ts @@ -6,7 +6,7 @@ export * from "./cellOrdering.ts"; export const cellIDs$ = queryDb( tables.cells.select("id").orderBy("fractionalIndex", "asc"), - { label: "notebook.cellIds" }, + { label: "notebook.cellIds" } ); // Primary query for cell references - returns CellReference objects @@ -14,7 +14,7 @@ export const cellReferences$ = queryDb( tables.cells .select("id", "fractionalIndex", "cellType") .orderBy("fractionalIndex", "asc"), - { label: "notebook.cellReferences" }, + { label: "notebook.cellReferences" } ); // @deprecated Use cellReferences$ instead @@ -27,19 +27,20 @@ export const cellFractionalIndex = (cellId: string) => .select("fractionalIndex") .where({ id: cellId }) .first({ + behaviour: "fallback", fallback: () => null, }), { deps: [cellId], label: `cell.fractionalIndex.${cellId}`, - }, + } ); // @deprecated Use cellReferences$ instead - this returns all cells anyway export const adjacentCells = (_cellId: string) => cellReferences$; export const notebookMetadata$ = queryDb( - tables.notebookMetadata.select("key", "value"), + tables.notebookMetadata.select("key", "value") ); export const cellQuery = { @@ -49,30 +50,31 @@ export const cellQuery = { .select() .where({ id: cellId }) .first({ + behaviour: "fallback", fallback: () => null, }), { deps: [cellId], label: `cell.${cellId}`, - }, + } ), outputs: (cellId: string) => queryDb( tables.outputs.select().where({ cellId }).orderBy("position", "asc"), - { deps: [cellId], label: `outputs:${cellId}` }, + { deps: [cellId], label: `outputs:${cellId}` } ), executionQueue: (cellId: string) => queryDb( tables.executionQueue.select().where({ cellId }).orderBy("id", "desc"), - { deps: [cellId], label: `queue:${cellId}` }, + { deps: [cellId], label: `queue:${cellId}` } ), }; export const runtimeSessions$ = queryDb( tables.runtimeSessions.select().orderBy("sessionId", "desc"), - { label: "runtime.sessions" }, + { label: "runtime.sessions" } ); /** @@ -90,5 +92,5 @@ export const runtimeSessions$ = queryDb( */ export const cells$ = queryDb( tables.cells.select().orderBy("fractionalIndex", "asc"), - { label: "notebook.cells" }, + { label: "notebook.cells" } ); diff --git a/wrangler.toml b/wrangler.toml index f5728a90..60b4072a 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -18,11 +18,11 @@ port = 8787 [[durable_objects.bindings]] name = "WEBSOCKET_SERVER" -class_name = "WebSocketServer" +class_name = "SyncBackendDO" [[migrations]] tag = "v1" -new_sqlite_classes = ["WebSocketServer"] +new_sqlite_classes = ["SyncBackendDO"] [[d1_databases]] binding = "DB" @@ -62,7 +62,7 @@ main = "./backend/sync.ts" [[env.legacy.durable_objects.bindings]] name = "WEBSOCKET_SERVER" -class_name = "WebSocketServer" +class_name = "SyncBackendDO" [[env.legacy.d1_databases]] binding = "DB" @@ -88,7 +88,7 @@ mode = "smart" [[env.production.durable_objects.bindings]] name = "WEBSOCKET_SERVER" -class_name = "WebSocketServer" +class_name = "SyncBackendDO" [[env.production.d1_databases]] binding = "DB" @@ -131,7 +131,7 @@ mode = "smart" [[env.preview.durable_objects.bindings]] name = "WEBSOCKET_SERVER" -class_name = "WebSocketServer" +class_name = "SyncBackendDO" [[env.preview.d1_databases]] binding = "DB" From 9f9fdec19897967aa201e93dbf449ede29d30ab9 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:28:32 -0700 Subject: [PATCH 4/7] Complete LiveStore 0.4.0-dev.7 API migration and dependency updates - Successfully upgraded all LiveStore packages to 0.4.0-dev.7 - Fixed all TypeScript API changes (.first() calls, sync backend API) - Upgraded Vite to 7.1.4 as required by LiveStore devtools - All TypeScript compilation passes Note: Build currently fails due to Effect ecosystem compatibility issue in @livestore/utils expecting RpcClientError from @effect/rpc. This appears to be an internal LiveStore dev package issue that should be resolved in a future LiveStore release. --- package.json | 2 +- pnpm-lock.yaml | 224 ++++++++++++++++++++++--------------------------- 2 files changed, 101 insertions(+), 125 deletions(-) diff --git a/package.json b/package.json index bcb641ca..cef4ed07 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "rollup-plugin-visualizer": "^6.0.3", "tailwindcss": "^4.1.10", "typescript": "^5.8.3", - "vite": "^6.3.5", + "vite": "^7.1.4", "vitest": "^3.0.0", "webpack-bundle-analyzer": "^4.10.2", "wrangler": "4.27.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f1380b8..08ffcbe3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,22 +60,22 @@ importers: version: 0.4.0 '@livestore/adapter-web': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + version: 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) '@livestore/livestore': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) + version: 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) '@livestore/react': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(f760163e07889d40bbe9e88e2c586c79) + version: 0.4.0-dev.7(0022c299f1e5f2d287007727f62d5c46) '@livestore/sync-cf': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + version: 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@livestore/wa-sqlite': specifier: 1.0.5-dev.2 version: 1.0.5-dev.2 '@livestore/webmesh': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + version: 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@microlink/react-json-view': specifier: ^1.26.2 version: 1.26.2(@types/react@19.1.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -232,7 +232,7 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.9.6 - version: 1.9.6(rollup@4.45.0)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))(workerd@1.20250730.0)(wrangler@4.27.0(@cloudflare/workers-types@4.20250813.0)) + version: 1.9.6(rollup@4.45.0)(vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))(workerd@1.20250730.0)(wrangler@4.27.0(@cloudflare/workers-types@4.20250813.0)) '@cloudflare/workers-types': specifier: ^4.20250813.0 version: 4.20250813.0 @@ -244,10 +244,10 @@ importers: version: 9.31.0 '@livestore/adapter-node': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(b461517ae8cd5b609f418ce3fcbe367c) + version: 0.4.0-dev.7(e45e3feef13eb51c35b864aa883a9691) '@livestore/devtools-vite': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(9d53b5ed869149836a77f8b993b746de) + version: 0.4.0-dev.7(d5cd71c51769182a7933207d7cb33293) '@tailwindcss/cli': specifier: ^4.1.10 version: 4.1.11 @@ -259,7 +259,7 @@ importers: version: 0.5.16(tailwindcss@4.1.11) '@tailwindcss/vite': specifier: ^4.1.10 - version: 4.1.11(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1)) + version: 4.1.11(vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -289,7 +289,7 @@ importers: version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.6.0(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1)) '@vitest/ui': specifier: ^3.0.0 version: 3.2.4(vitest@3.2.4) @@ -339,8 +339,8 @@ importers: specifier: ^5.8.3 version: 5.8.3 vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + specifier: ^7.1.4 + version: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) vitest: specifier: ^3.0.0 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) @@ -641,12 +641,12 @@ packages: '@effect/rpc': 0.59.9 effect: 3.15.5 - '@effect/cli@0.61.8': - resolution: {integrity: sha512-CRdzBUW3SkjsL1Og5bnh7nt1VN0JwNLyfnjlzTWwtIm07WFFdcZXUXquFJfmU++eTP5Kfp8JbZYvsHwmzg/q1w==} + '@effect/cli@0.69.2': + resolution: {integrity: sha512-1xYfEzW5f6jGWDb6V6DWTsWbtdp8DgQcchbewnCwKOXnJzF5VsTcfo4lYM4TXk/RAHA1owyq7OaEmeZ+qIt1/w==} peerDependencies: '@effect/platform': 0.82.4 - '@effect/printer': ^0.43.4 - '@effect/printer-ansi': ^0.43.4 + '@effect/printer': ^0.45.0 + '@effect/printer-ansi': ^0.45.0 effect: 3.15.5 '@effect/cluster@0.34.2': @@ -670,13 +670,13 @@ packages: lmdb: optional: true - '@effect/opentelemetry@0.48.8': - resolution: {integrity: sha512-ZULA3TSLVx3ylcWcmwg5wHiDIMc+LWPxUQVEqE5I+PgqNcPuhk11DjLO+ZYPWbQ2nF7NsawMactNOVCZLMQa7Q==} + '@effect/opentelemetry@0.56.5': + resolution: {integrity: sha512-H6/GJup83i13NydSzhVvO/IrjNyANc6sMVVIYQ3EGQfwqek6VLSHF7KuaPDmbYB1tvJ1o17nwFr/nq7IoCa15w==} peerDependencies: '@effect/platform': 0.82.4 '@opentelemetry/api': ^1.9 '@opentelemetry/resources': ^2.0.0 - '@opentelemetry/sdk-logs': '*' + '@opentelemetry/sdk-logs': ^0.203.0 '@opentelemetry/sdk-metrics': ^2.0.0 '@opentelemetry/sdk-trace-base': ^2.0.0 '@opentelemetry/sdk-trace-node': ^2.0.0 @@ -699,14 +699,14 @@ packages: '@opentelemetry/sdk-trace-web': optional: true - '@effect/platform-browser@0.62.8': - resolution: {integrity: sha512-xMLpEOrQcZnqZH/DIBjZdYo6W2gtFPgbrt8uxKhDg/GrEXPLJW/yxuKh7JCO/yuQWWZf6o/qhgEVHB406ppwYg==} + '@effect/platform-browser@0.70.0': + resolution: {integrity: sha512-dq2ukUralavQIipSsQVuIOLLxBlFWL5Mkg1Fnr8esYPuPv0BXAI39nwNNi75X2tPAgak8OCSD0qh9qhmNj2gPA==} peerDependencies: '@effect/platform': 0.82.4 effect: 3.15.5 - '@effect/platform-bun@0.65.5': - resolution: {integrity: sha512-XAbcJ9UbyCHzEWrUg2kGrZBAnQgVR6MRva1NWf7oU9+Q7SgDuMriNhvIOm9OTjS5KWrwTlzYa8Lr0gmCNEkewQ==} + '@effect/platform-bun@0.79.0': + resolution: {integrity: sha512-oWUUV7bgPmrCCdmIeE1osfpIOnwNFkBhqSxcI26/SX36nODGyg401xl9Fk51nDT9vBI+JxpZ7eoqY0wxKaThvA==} peerDependencies: '@effect/cluster': 0.34.2 '@effect/platform': 0.82.4 @@ -714,8 +714,8 @@ packages: '@effect/sql': 0.35.8 effect: 3.15.5 - '@effect/platform-node-shared@0.35.5': - resolution: {integrity: sha512-F0Hh+aueRxOw2vqo9LNqWh31ch5WBhz0Hp0vYQ8jntjLOsvN5oX/0JbGO4E5BNsMZV5HCraP6I4ACjP3KUnvCQ==} + '@effect/platform-node-shared@0.49.0': + resolution: {integrity: sha512-6ufPQUtofYW+jsADRI4Pa4sMY+kc0dcoXWpH1ozH/bD6I5c2au1n/wDffnLoXMeHGYSpt/54Dd7WOqqNcOdXlg==} peerDependencies: '@effect/cluster': 0.34.2 '@effect/platform': 0.82.4 @@ -723,8 +723,8 @@ packages: '@effect/sql': 0.35.8 effect: 3.15.5 - '@effect/platform-node@0.81.5': - resolution: {integrity: sha512-iRJolgh/DWjs6LjhDY38XtWwxI42sXfdKYD25syl2I1sUm4j/+NBaMOA4OPyf6DNKHIYU82nVyXEGNtrBlFWww==} + '@effect/platform-node@0.96.1': + resolution: {integrity: sha512-4nfB/XRJJ246MCdI7klTE/aVvA9txfI83RnymS7pNyoG4CXUKELi87JrkrWFTtOlewzt5UMWpmqsFmm2qHxx3A==} peerDependencies: '@effect/cluster': 0.34.2 '@effect/platform': 0.82.4 @@ -737,14 +737,14 @@ packages: peerDependencies: effect: 3.15.5 - '@effect/printer-ansi@0.43.5': - resolution: {integrity: sha512-EQXEKevlBIZPoVGhUi1gybkMrJc9zBKr8SiCN+xVvf2qW6K0I/oOGw58lqWXA3gKfughZBX8MkCVfqWDJlrpmw==} + '@effect/printer-ansi@0.45.0': + resolution: {integrity: sha512-3MS02RP83eZaBJX98PRI4f5kyoEVyNfg2Qu/XUWQMFRp4wvmgNwEy18RjO9G6s7uB8NaYXTpQVDmtUoKARx7fA==} peerDependencies: '@effect/typeclass': 0.34.2 effect: 3.15.5 - '@effect/printer@0.43.5': - resolution: {integrity: sha512-0e+GlRzP1EMFlkkNozjvlNGq2T5VgstO6BDffY+MSqic6OZyd3nyM83CCHOCOT0+0legzr7qaHtY4WdCb0GdLA==} + '@effect/printer@0.45.0': + resolution: {integrity: sha512-UpFBH2JKAgakSWpue6yKkIAXMq+3md/CPb9s/NGl28vDu1P33cvDeeDL/1EOzFk8WqhIs3oKwPMDnd3jUhjzdg==} peerDependencies: '@effect/typeclass': 0.34.2 effect: 3.15.5 @@ -5284,7 +5284,7 @@ snapshots: optionalDependencies: workerd: 1.20250730.0 - '@cloudflare/vite-plugin@1.9.6(rollup@4.45.0)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))(workerd@1.20250730.0)(wrangler@4.27.0(@cloudflare/workers-types@4.20250813.0))': + '@cloudflare/vite-plugin@1.9.6(rollup@4.45.0)(vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))(workerd@1.20250730.0)(wrangler@4.27.0(@cloudflare/workers-types@4.20250813.0))': dependencies: '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250730.0) '@mjackson/node-fetch-server': 0.6.1 @@ -5294,7 +5294,7 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.14 unenv: 2.0.0-rc.17 - vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) wrangler: 4.27.0(@cloudflare/workers-types@4.20250813.0) ws: 8.18.0 transitivePeerDependencies: @@ -5468,11 +5468,11 @@ snapshots: effect: 3.15.5 find-my-way-ts: 0.1.6 - '@effect/cli@0.61.8(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/cli@0.69.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/printer': 0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/printer-ansi': 0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) + '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) + '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 ini: 4.1.3 toml: 3.0.0 @@ -5491,7 +5491,7 @@ snapshots: effect: 3.15.5 uuid: 11.1.0 - '@effect/opentelemetry@0.48.8(@effect/platform@0.82.4(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5)': + '@effect/opentelemetry@0.56.5(@effect/platform@0.82.4(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5)': dependencies: '@effect/platform': 0.82.4(effect@3.15.5) '@opentelemetry/semantic-conventions': 1.36.0 @@ -5500,17 +5500,17 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@effect/platform-browser@0.62.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-browser@0.70.0(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/platform': 0.82.4(effect@3.15.5) effect: 3.15.5 multipasta: 0.2.7 - '@effect/platform-bun@0.65.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-bun@0.79.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/platform-node-shared': 0.35.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 @@ -5519,7 +5519,7 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform-node-shared@0.35.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-node-shared@0.49.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/platform': 0.82.4(effect@3.15.5) @@ -5533,11 +5533,11 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform-node@0.81.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-node@0.96.1(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/platform-node-shared': 0.35.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 @@ -5555,13 +5555,13 @@ snapshots: msgpackr: 1.11.5 multipasta: 0.2.7 - '@effect/printer-ansi@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5)': + '@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/printer': 0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) + '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) '@effect/typeclass': 0.34.2(effect@3.15.5) effect: 3.15.5 - '@effect/printer@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5)': + '@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5)': dependencies: '@effect/typeclass': 0.34.2(effect@3.15.5) effect: 3.15.5 @@ -5975,13 +5975,13 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@livestore/adapter-node@0.4.0-dev.7(b461517ae8cd5b609f418ce3fcbe367c)': + '@livestore/adapter-node@0.4.0-dev.7(e45e3feef13eb51c35b864aa883a9691)': dependencies: - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/devtools-vite': 0.4.0-dev.7(f7045c8d08b2a67bffa2a0fb2c680218) - '@livestore/sqlite-wasm': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/devtools-vite': 0.4.0-dev.7(d5cd71c51769182a7933207d7cb33293) + '@livestore/sqlite-wasm': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@opentelemetry/api': 1.9.0 vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: @@ -6013,13 +6013,13 @@ snapshots: - tsx - yaml - '@livestore/adapter-web@0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf)': + '@livestore/adapter-web@0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12)': dependencies: - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/devtools-web-common': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/sqlite-wasm': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/devtools-web-common': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/sqlite-wasm': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@effect/ai' @@ -6039,11 +6039,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common-cf@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': + '@livestore/common-cf@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6063,10 +6063,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common@0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf)': + '@livestore/common@0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12)': dependencies: - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@opentelemetry/api': 1.9.0 graphology: 0.26.0-alpha1(graphology-types@0.24.8) graphology-dag: 0.4.1(graphology-types@0.24.8) @@ -6089,34 +6089,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-vite@0.4.0-dev.7(9d53b5ed869149836a77f8b993b746de)': + '@livestore/devtools-vite@0.4.0-dev.7(d5cd71c51769182a7933207d7cb33293)': dependencies: - '@livestore/adapter-web': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) - transitivePeerDependencies: - - '@effect/ai' - - '@effect/cli' - - '@effect/cluster' - - '@effect/experimental' - - '@effect/opentelemetry' - - '@effect/platform' - - '@effect/platform-browser' - - '@effect/platform-bun' - - '@effect/platform-node' - - '@effect/printer' - - '@effect/printer-ansi' - - '@effect/rpc' - - '@effect/sql' - - '@effect/typeclass' - - '@opentelemetry/api' - - '@opentelemetry/resources' - - effect - - '@livestore/devtools-vite@0.4.0-dev.7(f7045c8d08b2a67bffa2a0fb2c680218)': - dependencies: - '@livestore/adapter-web': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/adapter-web': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - '@effect/ai' @@ -6137,11 +6113,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-web-common@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': + '@livestore/devtools-web-common@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': dependencies: - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/webmesh': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6161,10 +6137,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/livestore@0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf)': + '@livestore/livestore@0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12)': dependencies: - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@effect/ai' @@ -6184,11 +6160,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/react@0.4.0-dev.7(f760163e07889d40bbe9e88e2c586c79)': + '@livestore/react@0.4.0-dev.7(0022c299f1e5f2d287007727f62d5c46)': dependencies: - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/livestore': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/livestore': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@opentelemetry/api': 1.9.0 react: 19.0.0 transitivePeerDependencies: @@ -6209,12 +6185,12 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sqlite-wasm@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': + '@livestore/sqlite-wasm@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/common-cf': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/common-cf': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) '@livestore/wa-sqlite': 0.4.0-dev.7 transitivePeerDependencies: - '@effect/ai' @@ -6235,12 +6211,12 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sync-cf@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': + '@livestore/sync-cf@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(6ab0c1538c27f54fb647e9b2eaaafabf) - '@livestore/common-cf': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + '@livestore/common-cf': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6260,19 +6236,19 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/utils@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': + '@livestore/utils@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': dependencies: '@effect/ai': 0.26.1(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/cli': 0.61.8(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/cli': 0.69.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/experimental': 0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/opentelemetry': 0.48.8(@effect/platform@0.82.4(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5) + '@effect/opentelemetry': 0.56.5(@effect/platform@0.82.4(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5) '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/platform-browser': 0.62.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/platform-bun': 0.65.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform-node': 0.81.5(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/printer': 0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/printer-ansi': 0.43.5(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) + '@effect/platform-browser': 0.70.0(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/platform-bun': 0.79.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform-node': 0.96.1(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) + '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) '@effect/typeclass': 0.34.2(effect@3.15.5) @@ -6287,9 +6263,9 @@ snapshots: '@livestore/wa-sqlite@1.0.5-dev.2': {} - '@livestore/webmesh@0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a)': + '@livestore/webmesh@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': dependencies: - '@livestore/utils': 0.4.0-dev.7(eeb6d5e29c3b954ef58c1f81aa28765a) + '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -7049,12 +7025,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.11 - '@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.11(vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) '@tanstack/query-core@5.85.5': {} @@ -7351,7 +7327,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))': + '@vitejs/plugin-react@4.6.0(vite@7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -7359,7 +7335,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) + vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color From d70271786b8fcd7ba17c7b2ce8cebb5fbc31a461 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:34:08 -0700 Subject: [PATCH 5/7] fix: resolve Effect/LiveStore dependency conflicts - Update @effect/rpc to 0.69.2 to fix missing RpcClientError export - Update @effect/platform to 0.90.7 for compatibility - Add direct dependencies to override transitive version conflicts - Fix formatting in runt-schema files This resolves the build failures from incompatible Effect package versions that were causing missing exports in @effect/ai and @livestore/utils. --- package.json | 6 +- pnpm-lock.yaml | 256 ++++++++++++------------ src/runt-schema/index.ts | 144 +++++++------ src/runt-schema/queries/outputDeltas.ts | 8 +- src/runt-schema/tables.ts | 2 +- src/runt-schema/types.ts | 20 +- 6 files changed, 220 insertions(+), 216 deletions(-) diff --git a/package.json b/package.json index cef4ed07..42a2252b 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,8 @@ "@codemirror/lint": "^6.8.5", "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.38.0", + "@effect/platform": "0.90.7", + "@effect/rpc": "0.69.2", "@japikey/authenticate": "^0.4.0", "@japikey/cloudflare": "^0.4.0", "@japikey/japikey": "^0.4.0", @@ -164,12 +166,12 @@ "effect": "3.15.5", "react": "19.0.0", "react-dom": "19.0.0", - "@effect/platform": "0.82.4", + "@effect/platform": "0.90.7", "@effect/typeclass": "0.34.2", "@effect/cluster": "0.34.2", "@effect/experimental": "0.46.8", "@effect/sql": "0.35.8", - "@effect/rpc": "0.59.9" + "@effect/rpc": "0.69.2" }, "onlyBuiltDependencies": [ "@parcel/watcher", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08ffcbe3..b76937af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,12 @@ overrides: effect: 3.15.5 react: 19.0.0 react-dom: 19.0.0 - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 '@effect/typeclass': 0.34.2 '@effect/cluster': 0.34.2 '@effect/experimental': 0.46.8 '@effect/sql': 0.35.8 - '@effect/rpc': 0.59.9 + '@effect/rpc': 0.69.2 importers: @@ -46,6 +46,12 @@ importers: '@codemirror/view': specifier: ^6.38.0 version: 6.38.0 + '@effect/platform': + specifier: 0.90.7 + version: 0.90.7(effect@3.15.5) + '@effect/rpc': + specifier: 0.69.2 + version: 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) '@japikey/authenticate': specifier: ^0.4.0 version: 0.4.0 @@ -60,22 +66,22 @@ importers: version: 0.4.0 '@livestore/adapter-web': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + version: 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) '@livestore/livestore': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) + version: 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) '@livestore/react': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(0022c299f1e5f2d287007727f62d5c46) + version: 0.4.0-dev.7(0796d73eb1cd54f40529280528146c01) '@livestore/sync-cf': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + version: 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@livestore/wa-sqlite': specifier: 1.0.5-dev.2 version: 1.0.5-dev.2 '@livestore/webmesh': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + version: 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@microlink/react-json-view': specifier: ^1.26.2 version: 1.26.2(@types/react@19.1.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -244,10 +250,10 @@ importers: version: 9.31.0 '@livestore/adapter-node': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(e45e3feef13eb51c35b864aa883a9691) + version: 0.4.0-dev.7(f4027c21072e396d36110534283d6431) '@livestore/devtools-vite': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(d5cd71c51769182a7933207d7cb33293) + version: 0.4.0-dev.7(11f05b560a47c1930400afece2297a79) '@tailwindcss/cli': specifier: ^4.1.10 version: 4.1.11 @@ -637,14 +643,14 @@ packages: resolution: {integrity: sha512-FisoFF5ghyvPx3975OFzCPlzG3UEKzY7RHdOxdmrPTeoM8/5NXi0oPGKyGpHjJmC/6efhhlwmGfRT4BTtuwTdg==} peerDependencies: '@effect/experimental': 0.46.8 - '@effect/platform': 0.82.4 - '@effect/rpc': 0.59.9 + '@effect/platform': 0.90.7 + '@effect/rpc': 0.69.2 effect: 3.15.5 '@effect/cli@0.69.2': resolution: {integrity: sha512-1xYfEzW5f6jGWDb6V6DWTsWbtdp8DgQcchbewnCwKOXnJzF5VsTcfo4lYM4TXk/RAHA1owyq7OaEmeZ+qIt1/w==} peerDependencies: - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 '@effect/printer': ^0.45.0 '@effect/printer-ansi': ^0.45.0 effect: 3.15.5 @@ -652,15 +658,15 @@ packages: '@effect/cluster@0.34.2': resolution: {integrity: sha512-whQAzqKmxfGhwZvQKLGmZoXEFoebfOKHpZLpadDdXyO5MVJxUXCp/CtgV9C9qSFI/KohsTYfIDxDPzQNs+uong==} peerDependencies: - '@effect/platform': 0.82.4 - '@effect/rpc': 0.59.9 + '@effect/platform': 0.90.7 + '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 effect: 3.15.5 '@effect/experimental@0.46.8': resolution: {integrity: sha512-2XasqFLQZFy2PGybFdBjgflXFfPuorc/6DMxogeTDHknZa0RH4KoJQQlWaCngbKMsZrZcv0jV+Zi4aDZsVGl7g==} peerDependencies: - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 effect: 3.15.5 ioredis: ^5 lmdb: ^3 @@ -673,7 +679,7 @@ packages: '@effect/opentelemetry@0.56.5': resolution: {integrity: sha512-H6/GJup83i13NydSzhVvO/IrjNyANc6sMVVIYQ3EGQfwqek6VLSHF7KuaPDmbYB1tvJ1o17nwFr/nq7IoCa15w==} peerDependencies: - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 '@opentelemetry/api': ^1.9 '@opentelemetry/resources': ^2.0.0 '@opentelemetry/sdk-logs': ^0.203.0 @@ -702,15 +708,15 @@ packages: '@effect/platform-browser@0.70.0': resolution: {integrity: sha512-dq2ukUralavQIipSsQVuIOLLxBlFWL5Mkg1Fnr8esYPuPv0BXAI39nwNNi75X2tPAgak8OCSD0qh9qhmNj2gPA==} peerDependencies: - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 effect: 3.15.5 '@effect/platform-bun@0.79.0': resolution: {integrity: sha512-oWUUV7bgPmrCCdmIeE1osfpIOnwNFkBhqSxcI26/SX36nODGyg401xl9Fk51nDT9vBI+JxpZ7eoqY0wxKaThvA==} peerDependencies: '@effect/cluster': 0.34.2 - '@effect/platform': 0.82.4 - '@effect/rpc': 0.59.9 + '@effect/platform': 0.90.7 + '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 effect: 3.15.5 @@ -718,8 +724,8 @@ packages: resolution: {integrity: sha512-6ufPQUtofYW+jsADRI4Pa4sMY+kc0dcoXWpH1ozH/bD6I5c2au1n/wDffnLoXMeHGYSpt/54Dd7WOqqNcOdXlg==} peerDependencies: '@effect/cluster': 0.34.2 - '@effect/platform': 0.82.4 - '@effect/rpc': 0.59.9 + '@effect/platform': 0.90.7 + '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 effect: 3.15.5 @@ -727,13 +733,13 @@ packages: resolution: {integrity: sha512-4nfB/XRJJ246MCdI7klTE/aVvA9txfI83RnymS7pNyoG4CXUKELi87JrkrWFTtOlewzt5UMWpmqsFmm2qHxx3A==} peerDependencies: '@effect/cluster': 0.34.2 - '@effect/platform': 0.82.4 - '@effect/rpc': 0.59.9 + '@effect/platform': 0.90.7 + '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 effect: 3.15.5 - '@effect/platform@0.82.4': - resolution: {integrity: sha512-og5DIzx4wz7nIXd/loDfenXvV3c/NT+NDG+YJsi3g6a5Xb6xwrNJuX97sDaV2LJ29G3LroeVJCmYUmfdf/h5Vg==} + '@effect/platform@0.90.7': + resolution: {integrity: sha512-HpDnxR9KQ8gn2cJA3hsz42A3sCX/BP0NSv2F+dkW7n0ohoL9Rsfx5i1zJervuZdPz4/iOmpH9xlAOkYzXg6z0w==} peerDependencies: effect: 3.15.5 @@ -749,17 +755,17 @@ packages: '@effect/typeclass': 0.34.2 effect: 3.15.5 - '@effect/rpc@0.59.9': - resolution: {integrity: sha512-9Nw6YRBbTgsCyVb7/AMCTML7cE6v38cN0I7tP05XAlvKdmCroifaNopDCO7w1C3EPeNBG42nYuYnwU6L0Atnhg==} + '@effect/rpc@0.69.2': + resolution: {integrity: sha512-h6+e3JsIz5rmEZfldxNiNoXyQgMTB7VjDuoF8LPsOxobQZDKPgGE9BMnEQYqiVWRA2bTORkXK14rFZXzU1yyPg==} peerDependencies: - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 effect: 3.15.5 '@effect/sql@0.35.8': resolution: {integrity: sha512-M1x6XMWkIHMY7iHbZgHVpq1jhhX+oFBN5LcL7Oc7cy3h2rtWf9VH2WvC2ivc2gscoKSpITlxEhGNHDFy9YrCSw==} peerDependencies: '@effect/experimental': 0.46.8 - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 effect: 3.15.5 '@effect/typeclass@0.34.2': @@ -1364,13 +1370,13 @@ packages: '@effect/cluster': 0.34.2 '@effect/experimental': 0.46.8 '@effect/opentelemetry': ^0.56.4 - '@effect/platform': 0.82.4 + '@effect/platform': 0.90.7 '@effect/platform-browser': ^0.70.0 '@effect/platform-bun': ^0.79.0 '@effect/platform-node': ^0.96.0 '@effect/printer': ^0.45.0 '@effect/printer-ansi': ^0.45.0 - '@effect/rpc': 0.59.9 + '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 '@effect/typeclass': 0.34.2 '@opentelemetry/api': ^1.9.0 @@ -5460,17 +5466,17 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@effect/ai@0.26.1(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/ai@0.26.1(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/experimental': 0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 find-my-way-ts: 0.1.6 - '@effect/cli@0.69.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/cli@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 @@ -5478,53 +5484,53 @@ snapshots: toml: 3.0.0 yaml: 2.8.1 - '@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 - '@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5)': + '@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) effect: 3.15.5 uuid: 11.1.0 - '@effect/opentelemetry@0.56.5(@effect/platform@0.82.4(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5)': + '@effect/opentelemetry@0.56.5(@effect/platform@0.90.7(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5)': dependencies: - '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) '@opentelemetry/semantic-conventions': 1.36.0 effect: 3.15.5 optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@effect/platform-browser@0.70.0(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-browser@0.70.0(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) effect: 3.15.5 multipasta: 0.2.7 - '@effect/platform-bun@0.79.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-bun@0.79.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 multipasta: 0.2.7 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@0.49.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-node-shared@0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) '@parcel/watcher': 2.5.1 effect: 3.15.5 multipasta: 0.2.7 @@ -5533,13 +5539,13 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform-node@0.96.1(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-node@0.96.1(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) effect: 3.15.5 mime: 3.0.0 undici: 7.13.0 @@ -5548,7 +5554,7 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform@0.82.4(effect@3.15.5)': + '@effect/platform@0.90.7(effect@3.15.5)': dependencies: effect: 3.15.5 find-my-way-ts: 0.1.6 @@ -5566,15 +5572,15 @@ snapshots: '@effect/typeclass': 0.34.2(effect@3.15.5) effect: 3.15.5 - '@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5)': + '@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) effect: 3.15.5 - '@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5)': + '@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': dependencies: - '@effect/experimental': 0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.82.4(effect@3.15.5) + '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) '@opentelemetry/semantic-conventions': 1.36.0 effect: 3.15.5 uuid: 11.1.0 @@ -5975,13 +5981,13 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@livestore/adapter-node@0.4.0-dev.7(e45e3feef13eb51c35b864aa883a9691)': + '@livestore/adapter-node@0.4.0-dev.7(f4027c21072e396d36110534283d6431)': dependencies: - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/devtools-vite': 0.4.0-dev.7(d5cd71c51769182a7933207d7cb33293) - '@livestore/sqlite-wasm': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/devtools-vite': 0.4.0-dev.7(11f05b560a47c1930400afece2297a79) + '@livestore/sqlite-wasm': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@opentelemetry/api': 1.9.0 vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: @@ -6013,13 +6019,13 @@ snapshots: - tsx - yaml - '@livestore/adapter-web@0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12)': + '@livestore/adapter-web@0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17)': dependencies: - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/devtools-web-common': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/sqlite-wasm': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/devtools-web-common': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/sqlite-wasm': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@effect/ai' @@ -6039,11 +6045,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common-cf@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': + '@livestore/common-cf@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6063,10 +6069,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common@0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12)': + '@livestore/common@0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17)': dependencies: - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@opentelemetry/api': 1.9.0 graphology: 0.26.0-alpha1(graphology-types@0.24.8) graphology-dag: 0.4.1(graphology-types@0.24.8) @@ -6089,10 +6095,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-vite@0.4.0-dev.7(d5cd71c51769182a7933207d7cb33293)': + '@livestore/devtools-vite@0.4.0-dev.7(11f05b560a47c1930400afece2297a79)': dependencies: - '@livestore/adapter-web': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/adapter-web': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - '@effect/ai' @@ -6113,11 +6119,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-web-common@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': + '@livestore/devtools-web-common@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': dependencies: - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/webmesh': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6137,10 +6143,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/livestore@0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12)': + '@livestore/livestore@0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17)': dependencies: - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@effect/ai' @@ -6160,11 +6166,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/react@0.4.0-dev.7(0022c299f1e5f2d287007727f62d5c46)': + '@livestore/react@0.4.0-dev.7(0796d73eb1cd54f40529280528146c01)': dependencies: - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/livestore': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/livestore': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@opentelemetry/api': 1.9.0 react: 19.0.0 transitivePeerDependencies: @@ -6185,12 +6191,12 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sqlite-wasm@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': + '@livestore/sqlite-wasm@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/common-cf': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/common-cf': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) '@livestore/wa-sqlite': 0.4.0-dev.7 transitivePeerDependencies: - '@effect/ai' @@ -6211,12 +6217,12 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sync-cf@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': + '@livestore/sync-cf@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(b25965c09b3b89b2542325a1a3065b12) - '@livestore/common-cf': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + '@livestore/common-cf': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6236,21 +6242,21 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/utils@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': - dependencies: - '@effect/ai': 0.26.1(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/cli': 0.69.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/cluster': 0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/experimental': 0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/opentelemetry': 0.56.5(@effect/platform@0.82.4(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5) - '@effect/platform': 0.82.4(effect@3.15.5) - '@effect/platform-browser': 0.70.0(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/platform-bun': 0.79.0(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform-node': 0.96.1(@effect/cluster@0.34.2(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(@effect/rpc@0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@livestore/utils@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': + dependencies: + '@effect/ai': 0.26.1(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/cli': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/opentelemetry': 0.56.5(@effect/platform@0.90.7(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/platform-browser': 0.70.0(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/platform-bun': 0.79.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) + '@effect/platform-node': 0.96.1(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/rpc': 0.59.9(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.82.4(effect@3.15.5))(effect@3.15.5) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) '@effect/typeclass': 0.34.2(effect@3.15.5) '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) @@ -6263,9 +6269,9 @@ snapshots: '@livestore/wa-sqlite@1.0.5-dev.2': {} - '@livestore/webmesh@0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156)': + '@livestore/webmesh@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': dependencies: - '@livestore/utils': 0.4.0-dev.7(4eeeaa80147b9c53fbc60fa0dc9e6156) + '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' diff --git a/src/runt-schema/index.ts b/src/runt-schema/index.ts index e8e6078c..5c0cca66 100644 --- a/src/runt-schema/index.ts +++ b/src/runt-schema/index.ts @@ -236,7 +236,7 @@ export const events = { "restart", "error", "timeout", - "displaced", + "displaced" ), }), }), @@ -515,7 +515,7 @@ function selectPrimaryRepresentation( "text/latex", "text/markdown", "text/plain", - ], + ] ): { mimeType: string; container: MediaContainer } | null { for (const mimeType of preferredMimeTypes) { if (representations[mimeType]) { @@ -534,13 +534,13 @@ function updateExistingDisplays( displayId: string, representations: Record, // deno-lint-ignore no-explicit-any - ctx: any, + ctx: any ) { const existingOutputs = ctx.query( tables.outputs.select().where({ displayId, outputType: "multimedia_display", - }), + }) ); if (existingOutputs.length === 0) { @@ -580,7 +580,7 @@ function updatePresence(userId: string, cellId?: string) { export const materializers = State.SQLite.materializers(events, { "v1.Debug": (event, ctx) => { const existingDebug = ctx.query( - tables.debug.select().where({ id: event.id }).limit(1), + tables.debug.select().where({ id: event.id }).limit(1) )[0]; if (existingDebug) { return []; @@ -655,7 +655,7 @@ export const materializers = State.SQLite.materializers(events, { fractionalIndex, // New fractional index createdBy, }) - .onConflict("id", "ignore"), + .onConflict("id", "ignore") ); // Update presence for the creator @@ -692,9 +692,11 @@ export const materializers = State.SQLite.materializers(events, { const ops = []; // Convert position to deterministic fractional index in base36 format ops.push( - tables.cells.update({ - fractionalIndex: "a" + Math.floor(newPosition).toString(36), - }).where({ id }), + tables.cells + .update({ + fractionalIndex: "a" + Math.floor(newPosition).toString(36), + }) + .where({ id }) ); if (actorId) { ops.push(updatePresence(actorId, id)); @@ -872,12 +874,12 @@ export const materializers = State.SQLite.materializers(events, { // Unified output system materializers with pending clear support "v1.MultimediaDisplayOutputAdded": ( { id, cellId, position, representations, displayId }, - ctx, + ctx ) => { const ops = []; // Check for pending clears const pendingClear = ctx.query( - tables.pendingClears.select().where({ cellId }).limit(1), + tables.pendingClears.select().where({ cellId }).limit(1) )[0]; if (pendingClear) { ops.push(tables.outputs.delete().where({ cellId })); @@ -912,14 +914,14 @@ export const materializers = State.SQLite.materializers(events, { metadata: null, representations, }) - .onConflict("id", "replace"), + .onConflict("id", "replace") ); return ops; }, "v1.MultimediaDisplayOutputUpdated": ( { displayId, representations }, - ctx, + ctx ) => { // Only update existing displays - no new output creation return updateExistingDisplays(displayId, representations, ctx); @@ -927,12 +929,12 @@ export const materializers = State.SQLite.materializers(events, { "v1.MultimediaResultOutputAdded": ( { id, cellId, position, representations, executionCount }, - ctx, + ctx ) => { const ops = []; // Check for pending clears const pendingClear = ctx.query( - tables.pendingClears.select().where({ cellId }).limit(1), + tables.pendingClears.select().where({ cellId }).limit(1) )[0]; if (pendingClear) { ops.push(tables.outputs.delete().where({ cellId })); @@ -974,19 +976,19 @@ export const materializers = State.SQLite.materializers(events, { metadata: null, representations, }) - .onConflict("id", "replace"), + .onConflict("id", "replace") ); return ops; }, "v1.TerminalOutputAdded": ( { id, cellId, position, content, streamName }, - ctx, + ctx ) => { const ops = []; // Check for pending clears const pendingClear = ctx.query( - tables.pendingClears.select().where({ cellId }).limit(1), + tables.pendingClears.select().where({ cellId }).limit(1) )[0]; if (pendingClear) { ops.push(tables.outputs.delete().where({ cellId })); @@ -1007,14 +1009,14 @@ export const materializers = State.SQLite.materializers(events, { metadata: content.metadata || null, representations: null, }) - .onConflict("id", "replace"), + .onConflict("id", "replace") ); return ops; }, "v1.TerminalOutputAppended": ({ outputId, content }, ctx) => { const existingOutput = ctx.query( - tables.outputs.select().where({ id: outputId }).limit(1), + tables.outputs.select().where({ id: outputId }).limit(1) )[0]; if (!existingOutput) { @@ -1042,7 +1044,7 @@ export const materializers = State.SQLite.materializers(events, { const ops = []; // Check for pending clears const pendingClear = ctx.query( - tables.pendingClears.select().where({ cellId }).limit(1), + tables.pendingClears.select().where({ cellId }).limit(1) )[0]; if (pendingClear) { ops.push(tables.outputs.delete().where({ cellId })); @@ -1062,7 +1064,7 @@ export const materializers = State.SQLite.materializers(events, { metadata: content.metadata || null, representations: null, }) - .onConflict("id", "replace"), + .onConflict("id", "replace") ); return ops; }, @@ -1070,7 +1072,7 @@ export const materializers = State.SQLite.materializers(events, { /**@deprecated */ "v1.MarkdownOutputAppended": ({ outputId, content }, ctx) => { const existingOutput = ctx.query( - tables.outputs.select().where({ id: outputId }).limit(1), + tables.outputs.select().where({ id: outputId }).limit(1) )[0]; if (!existingOutput) { @@ -1098,7 +1100,7 @@ export const materializers = State.SQLite.materializers(events, { const ops = []; // Check for pending clears const pendingClear = ctx.query( - tables.pendingClears.select().where({ cellId }).limit(1), + tables.pendingClears.select().where({ cellId }).limit(1) )[0]; if (pendingClear) { ops.push(tables.outputs.delete().where({ cellId })); @@ -1118,7 +1120,7 @@ export const materializers = State.SQLite.materializers(events, { metadata: content.metadata || null, representations: null, }) - .onConflict("id", "replace"), + .onConflict("id", "replace") ); return ops; }, @@ -1130,7 +1132,7 @@ export const materializers = State.SQLite.materializers(events, { ops.push( tables.pendingClears .insert({ cellId, clearedBy }) - .onConflict("cellId", "replace"), + .onConflict("cellId", "replace") ); } else { // Immediate clear for wait=False @@ -1226,13 +1228,13 @@ export type UiStateData = typeof tables.uiState.Type; // Type guards for MediaContainer export function isInlineContainer( - container: MediaContainer, + container: MediaContainer ): container is InlineContainer { return container.type === "inline"; } export function isArtifactContainer( - container: MediaContainer, + container: MediaContainer ): container is ArtifactContainer { return container.type === "artifact"; } @@ -1241,7 +1243,7 @@ export function isArtifactContainer( export function getNotebookMetadata( metadataRecords: Array<{ key: string; value: string }>, key: string, - defaultValue: string = "", + defaultValue: string = "" ): string { const record = metadataRecords.find((r) => r.key === key); return record?.value ?? defaultValue; @@ -1249,7 +1251,7 @@ export function getNotebookMetadata( // Helper to get common notebook metadata values export function getNotebookInfo( - metadataRecords: Array<{ key: string; value: string }>, + metadataRecords: Array<{ key: string; value: string }> ) { return { title: getNotebookMetadata(metadataRecords, "title", "Untitled"), @@ -1381,7 +1383,7 @@ function valueToChar(value: number): string { function generateKeyBetween( a: string | null | undefined, - b: string | null | undefined, + b: string | null | undefined ): string { // Handle null/undefined cases if (!a && !b) return "m"; // Middle of the range @@ -1453,7 +1455,7 @@ function generateKeyBetween( } // No space between a and b throw new Error( - `No string exists between "${a}" and "${b}" in base36 encoding`, + `No string exists between "${a}" and "${b}" in base36 encoding` ); } } @@ -1603,7 +1605,7 @@ export const createTestJitterProvider = (seed = 0): JitterProvider => { export function fractionalIndexBetween( a: string | null | undefined, b: string | null | undefined, - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): string { // Add some jitter to avoid clustering const key = generateKeyBetween(a, b); @@ -1629,7 +1631,7 @@ export function generateFractionalIndices( a: string | null | undefined, b: string | null | undefined, n: number, - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): string[] { if (n <= 0) return []; if (n === 1) return [fractionalIndexBetween(a, b, jitterProvider)]; @@ -1651,7 +1653,7 @@ export function generateFractionalIndices( // Helper to get initial fractional index export function initialFractionalIndex( - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): string { return fractionalIndexBetween(null, null, jitterProvider); } @@ -1704,7 +1706,7 @@ export interface MoveOperationResult { */ export function needsRebalancing( cells: readonly CellReference[], - insertPosition?: number, + insertPosition?: number ): boolean { if (cells.length < 2) return false; @@ -1739,19 +1741,17 @@ export function needsRebalancing( // If insertPosition is specified, check if we can insert there if (insertPosition !== undefined) { - const beforeCell = insertPosition > 0 - ? sortedCells[insertPosition - 1] - : null; - const afterCell = insertPosition < sortedCells.length - ? sortedCells[insertPosition] - : null; + const beforeCell = + insertPosition > 0 ? sortedCells[insertPosition - 1] : null; + const afterCell = + insertPosition < sortedCells.length ? sortedCells[insertPosition] : null; if (beforeCell && afterCell) { try { fractionalIndexBetween( beforeCell.fractionalIndex, afterCell.fractionalIndex, - { random: () => 0, randomInt: () => 0 }, + { random: () => 0, randomInt: () => 0 } ); } catch (error) { if ( @@ -1773,7 +1773,7 @@ export function needsRebalancing( */ export function rebalanceCellIndices( cells: readonly CellReference[], - options: RebalanceOptions = {}, + options: RebalanceOptions = {} ): RebalanceResult { const { jitterProvider = defaultJitterProvider, @@ -1794,14 +1794,14 @@ export function rebalanceCellIndices( const moveEvents: ReturnType[] = []; // Calculate the range with buffer - const totalPositions = cells.length + (bufferCells * 2); + const totalPositions = cells.length + bufferCells * 2; // Generate evenly distributed indices const indices = generateFractionalIndices( null, null, totalPositions, - jitterProvider, + jitterProvider ); // Assign new indices to cells (skipping buffer positions) @@ -1837,11 +1837,11 @@ export function rebalanceCellIndices( function calculateInsertionIndexAfterRebalancing( insertPosition: number, rebalanceResult: RebalanceResult, - jitterProvider: JitterProvider, + jitterProvider: JitterProvider ): string { // Get the new indices after rebalancing - const newIndices = rebalanceResult.newIndices.map((item) => - item.fractionalIndex + const newIndices = rebalanceResult.newIndices.map( + (item) => item.fractionalIndex ); newIndices.sort(); @@ -1877,7 +1877,7 @@ export function fractionalIndexBetweenWithFallback( insertPosition?: number; /** Jitter provider */ jitterProvider?: JitterProvider; - } = {}, + } = {} ): { index?: string; needsRebalancing: boolean; @@ -1910,7 +1910,7 @@ export function fractionalIndexBetweenWithFallback( const insertionIndex = calculateInsertionIndexAfterRebalancing( position, rebalanceResult, - jitterProvider, + jitterProvider ); return { @@ -1937,7 +1937,7 @@ export function moveCellWithRebalancing( options: { actorId?: string; jitterProvider?: JitterProvider; - } = {}, + } = {} ): { moveEvent?: ReturnType; rebalanceResult?: RebalanceResult; @@ -1952,7 +1952,7 @@ export function moveCellWithRebalancing( cellBefore, cellAfter, actorId, - jitterProvider, + jitterProvider ); if (moveEvent) { @@ -2006,7 +2006,7 @@ export function isValidFractionalIndex(index: string): boolean { // Validate that fractional indices maintain proper binary collation ordering export function validateFractionalIndexOrder( - indices: (string | null | undefined)[], + indices: (string | null | undefined)[] ): boolean { const validIndices = indices.filter((idx): idx is string => isValidFractionalIndex(idx || "") @@ -2020,7 +2020,7 @@ export function validateFractionalIndexOrder( } if (prev >= curr) { console.error( - `Fractional index ordering violation: "${prev}" >= "${curr}"`, + `Fractional index ordering violation: "${prev}" >= "${curr}"` ); return false; } @@ -2065,7 +2065,7 @@ export function moveCellBetween( cellBefore: CellReference | null, cellAfter: CellReference | null, actorId?: string, - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): ReturnType | null { // Cell must have a valid fractional index to be moved if (!cell.fractionalIndex) { @@ -2100,7 +2100,7 @@ export function moveCellBetween( const fractionalIndex = fractionalIndexBetween( previousKey, nextKey, - jitterProvider, + jitterProvider ); return events.cellMoved2({ @@ -2129,7 +2129,7 @@ export function createCellBetween( cellBefore: CellReference | null, cellAfter: CellReference | null, allCells: readonly CellReference[], - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): CellOperationResult { // Determine the fractional indices for before and after let previousKey = cellBefore?.fractionalIndex || null; @@ -2168,15 +2168,11 @@ export function createCellBetween( } // Use the robust fractional index generation with fallback - const result = fractionalIndexBetweenWithFallback( - previousKey, - nextKey, - { - allCells, - insertPosition, - jitterProvider, - }, - ); + const result = fractionalIndexBetweenWithFallback(previousKey, nextKey, { + allCells, + insertPosition, + jitterProvider, + }); const resultEvents: Array< | ReturnType @@ -2214,7 +2210,7 @@ export function moveCellBetweenWithRebalancing( cellAfter: CellReference | null, allCells: readonly CellReference[], actorId?: string, - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): MoveOperationResult { // Cell must have a valid fractional index to be moved if (!cell.fractionalIndex) { @@ -2260,7 +2256,7 @@ export function moveCellBetweenWithRebalancing( cellBefore, cellAfter, allCells, - { ...(actorId && { actorId }), jitterProvider }, + { ...(actorId && { actorId }), jitterProvider } ); const resultEvents: Array> = []; @@ -2305,7 +2301,7 @@ export function createCellBetweenAndCommit< commit: ( event: | ReturnType - | ReturnType, + | ReturnType ) => void; }, >( @@ -2318,14 +2314,14 @@ export function createCellBetweenAndCommit< cellBefore: CellReference | null, cellAfter: CellReference | null, allCells: readonly CellReference[], - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): string { const result = createCellBetween( cellData, cellBefore, cellAfter, allCells, - jitterProvider, + jitterProvider ); // Commit all events @@ -2347,7 +2343,7 @@ export function moveCellBetweenAndCommit< cellAfter: CellReference | null, allCells: readonly CellReference[], actorId?: string, - jitterProvider: JitterProvider = defaultJitterProvider, + jitterProvider: JitterProvider = defaultJitterProvider ): boolean { const result = moveCellBetweenWithRebalancing( cell, @@ -2355,7 +2351,7 @@ export function moveCellBetweenAndCommit< cellAfter, allCells, actorId, - jitterProvider, + jitterProvider ); // Commit all events diff --git a/src/runt-schema/queries/outputDeltas.ts b/src/runt-schema/queries/outputDeltas.ts index 156f2f50..3f2848eb 100644 --- a/src/runt-schema/queries/outputDeltas.ts +++ b/src/runt-schema/queries/outputDeltas.ts @@ -17,7 +17,7 @@ export const outputDeltasQuery = (outputId: string) => .select() .where({ outputId }) .orderBy("sequenceNumber", "asc"), - { deps: [outputId], label: "outputDeltas" }, + { deps: [outputId], label: "outputDeltas" } ); /** @@ -25,7 +25,7 @@ export const outputDeltasQuery = (outputId: string) => */ export const applyDeltas = ( originalContent: string, - deltas: readonly OutputDelta[], + deltas: readonly OutputDelta[] ): string => { if (deltas.length === 0) { return originalContent; @@ -41,7 +41,7 @@ export const applyDeltas = ( */ export const getFinalContent = ( originalContent: string, - deltas: readonly OutputDelta[], + deltas: readonly OutputDelta[] ): { content: string; hasDeltas: boolean; deltaCount: number } => { const hasDeltas = deltas.length > 0; const content = applyDeltas(originalContent, deltas); @@ -58,5 +58,5 @@ export const getFinalContent = ( */ export const outputDeltas$ = queryDb( tables.outputDeltas.select().orderBy("sequenceNumber", "asc"), - { label: "notebook.outputDeltas" }, + { label: "notebook.outputDeltas" } ); diff --git a/src/runt-schema/tables.ts b/src/runt-schema/tables.ts index e9785586..5c4fca49 100644 --- a/src/runt-schema/tables.ts +++ b/src/runt-schema/tables.ts @@ -209,7 +209,7 @@ export const tables = { "pending", "approved_once", "approved_always", - "denied", + "denied" ), }), approvedBy: State.SQLite.text({ nullable: true }), diff --git a/src/runt-schema/types.ts b/src/runt-schema/types.ts index 299bc528..0f237ee3 100644 --- a/src/runt-schema/types.ts +++ b/src/runt-schema/types.ts @@ -6,16 +6,16 @@ export const MediaRepresentationSchema = Schema.Union( type: Schema.Literal("inline"), data: Schema.Any, metadata: Schema.optional( - Schema.Record({ key: Schema.String, value: Schema.Any }), + Schema.Record({ key: Schema.String, value: Schema.Any }) ), }), Schema.Struct({ type: Schema.Literal("artifact"), artifactId: Schema.String, metadata: Schema.optional( - Schema.Record({ key: Schema.String, value: Schema.Any }), + Schema.Record({ key: Schema.String, value: Schema.Any }) ), - }), + }) ); // TypeScript type for cell types @@ -27,7 +27,7 @@ export const CellTypeSchema = Schema.Literal( "markdown", "sql", "raw", - "ai", + "ai" ); // Execution state types @@ -42,7 +42,7 @@ export const ExecutionStateSchema = Schema.Literal( "queued", "running", "completed", - "error", + "error" ); // Output types @@ -57,7 +57,7 @@ export const OutputTypeSchema = Schema.Literal( "multimedia_result", "terminal", "markdown", - "error", + "error" ); // Runtime status types @@ -72,7 +72,7 @@ export const RuntimeStatusSchema = Schema.Literal( "ready", "busy", "restarting", - "terminated", + "terminated" ); // Queue status types @@ -89,7 +89,7 @@ export const QueueStatusSchema = Schema.Literal( "executing", "completed", "failed", - "cancelled", + "cancelled" ); // Actor types @@ -181,7 +181,7 @@ export function isTextMimeType(mimeType: string): mimeType is TextMimeType { * Type guard to check if a MIME type is a known application format */ export function isApplicationMimeType( - mimeType: string, + mimeType: string ): mimeType is ApplicationMimeType { return (APPLICATION_MIME_TYPES as readonly string[]).includes(mimeType); } @@ -197,7 +197,7 @@ export function isImageMimeType(mimeType: string): mimeType is ImageMimeType { * Type guard to check if a MIME type is a Jupyter vendor format */ export function isJupyterMimeType( - mimeType: string, + mimeType: string ): mimeType is JupyterMimeType { return (JUPYTER_MIME_TYPES as readonly string[]).includes(mimeType); } From 22bcbc37e6f9d74bada44b43bf9c8e09b41b5fe1 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:36:42 -0700 Subject: [PATCH 6/7] fix: remove LiveStore packages from vite optimization includes Removes explicit @livestore/livestore and @livestore/react from vite's optimizeDeps.include to prevent cache conflicts after dependency updates. This resolves ERR_ABORTED 504 (Outdated Optimize Dep) errors. --- vite.config.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index d72bb589..e1050657 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -112,14 +112,7 @@ export default defineConfig(({ mode }) => { }, optimizeDeps: { exclude: ["@livestore/wa-sqlite"], - include: [ - "react", - "react-dom", - "effect", - "@livestore/livestore", - "@livestore/react", - "@react-spring/web", - ], + include: ["react", "react-dom", "effect", "@react-spring/web"], esbuildOptions: { target: "esnext", }, From 53038dee306703d571323ca80ae38c40e8997382 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 5 Sep 2025 13:42:26 -0700 Subject: [PATCH 7/7] fix: update Effect to 3.17.13 and configure LiveStore sync Durable Object binding - Update effect package to 3.17.13 to resolve DoCtx compatibility issues - Configure sync handler to use WEBSOCKET_SERVER binding name - Fix LiveStore 0.4.0-dev.7 Durable Object name mismatch --- backend/sync.ts | 3 + package.json | 4 +- pnpm-lock.yaml | 312 ++++++++++++++++++++++++------------------------ 3 files changed, 161 insertions(+), 158 deletions(-) diff --git a/backend/sync.ts b/backend/sync.ts index 021c8b9d..ddcf4855 100644 --- a/backend/sync.ts +++ b/backend/sync.ts @@ -36,6 +36,9 @@ export default { ctx, options: { headers: {}, + durableObject: { + name: "WEBSOCKET_SERVER", + }, validatePayload: async (rawPayload) => { try { const payload = decodePayload(rawPayload); diff --git a/package.json b/package.json index 42a2252b..bdd11a31 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0", - "effect": "3.15.5", + "effect": "3.17.13", "fractional-indexing": "^3.2.0", "hono": "^4.9.1", "jose": "^6.0.12", @@ -163,7 +163,7 @@ }, "pnpm": { "overrides": { - "effect": "3.15.5", + "effect": "3.17.13", "react": "19.0.0", "react-dom": "19.0.0", "@effect/platform": "0.90.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b76937af..ca41d612 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - effect: 3.15.5 + effect: 3.17.13 react: 19.0.0 react-dom: 19.0.0 '@effect/platform': 0.90.7 @@ -48,10 +48,10 @@ importers: version: 6.38.0 '@effect/platform': specifier: 0.90.7 - version: 0.90.7(effect@3.15.5) + version: 0.90.7(effect@3.17.13) '@effect/rpc': specifier: 0.69.2 - version: 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + version: 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) '@japikey/authenticate': specifier: ^0.4.0 version: 0.4.0 @@ -66,22 +66,22 @@ importers: version: 0.4.0 '@livestore/adapter-web': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + version: 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) '@livestore/livestore': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) + version: 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) '@livestore/react': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(0796d73eb1cd54f40529280528146c01) + version: 0.4.0-dev.7(60d0cd7ec2500fa084d53cf1794acea2) '@livestore/sync-cf': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + version: 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@livestore/wa-sqlite': specifier: 1.0.5-dev.2 version: 1.0.5-dev.2 '@livestore/webmesh': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + version: 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@microlink/react-json-view': specifier: ^1.26.2 version: 1.26.2(@types/react@19.1.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -155,8 +155,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 effect: - specifier: 3.15.5 - version: 3.15.5 + specifier: 3.17.13 + version: 3.17.13 fractional-indexing: specifier: ^3.2.0 version: 3.2.0 @@ -244,16 +244,16 @@ importers: version: 4.20250813.0 '@effect/vitest': specifier: 0.23.7 - version: 0.23.7(effect@3.15.5)(vitest@3.2.4) + version: 0.23.7(effect@3.17.13)(vitest@3.2.4) '@eslint/js': specifier: ^9.30.1 version: 9.31.0 '@livestore/adapter-node': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(f4027c21072e396d36110534283d6431) + version: 0.4.0-dev.7(3c61e82d2462dca28e66c573df24f08b) '@livestore/devtools-vite': specifier: 0.4.0-dev.7 - version: 0.4.0-dev.7(11f05b560a47c1930400afece2297a79) + version: 0.4.0-dev.7(4e5d828f923ad0a2a6224b25cb66c9cc) '@tailwindcss/cli': specifier: ^4.1.10 version: 4.1.11 @@ -645,7 +645,7 @@ packages: '@effect/experimental': 0.46.8 '@effect/platform': 0.90.7 '@effect/rpc': 0.69.2 - effect: 3.15.5 + effect: 3.17.13 '@effect/cli@0.69.2': resolution: {integrity: sha512-1xYfEzW5f6jGWDb6V6DWTsWbtdp8DgQcchbewnCwKOXnJzF5VsTcfo4lYM4TXk/RAHA1owyq7OaEmeZ+qIt1/w==} @@ -653,7 +653,7 @@ packages: '@effect/platform': 0.90.7 '@effect/printer': ^0.45.0 '@effect/printer-ansi': ^0.45.0 - effect: 3.15.5 + effect: 3.17.13 '@effect/cluster@0.34.2': resolution: {integrity: sha512-whQAzqKmxfGhwZvQKLGmZoXEFoebfOKHpZLpadDdXyO5MVJxUXCp/CtgV9C9qSFI/KohsTYfIDxDPzQNs+uong==} @@ -661,13 +661,13 @@ packages: '@effect/platform': 0.90.7 '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 - effect: 3.15.5 + effect: 3.17.13 '@effect/experimental@0.46.8': resolution: {integrity: sha512-2XasqFLQZFy2PGybFdBjgflXFfPuorc/6DMxogeTDHknZa0RH4KoJQQlWaCngbKMsZrZcv0jV+Zi4aDZsVGl7g==} peerDependencies: '@effect/platform': 0.90.7 - effect: 3.15.5 + effect: 3.17.13 ioredis: ^5 lmdb: ^3 peerDependenciesMeta: @@ -688,7 +688,7 @@ packages: '@opentelemetry/sdk-trace-node': ^2.0.0 '@opentelemetry/sdk-trace-web': ^2.0.0 '@opentelemetry/semantic-conventions': ^1.33.0 - effect: 3.15.5 + effect: 3.17.13 peerDependenciesMeta: '@opentelemetry/api': optional: true @@ -709,7 +709,7 @@ packages: resolution: {integrity: sha512-dq2ukUralavQIipSsQVuIOLLxBlFWL5Mkg1Fnr8esYPuPv0BXAI39nwNNi75X2tPAgak8OCSD0qh9qhmNj2gPA==} peerDependencies: '@effect/platform': 0.90.7 - effect: 3.15.5 + effect: 3.17.13 '@effect/platform-bun@0.79.0': resolution: {integrity: sha512-oWUUV7bgPmrCCdmIeE1osfpIOnwNFkBhqSxcI26/SX36nODGyg401xl9Fk51nDT9vBI+JxpZ7eoqY0wxKaThvA==} @@ -718,7 +718,7 @@ packages: '@effect/platform': 0.90.7 '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 - effect: 3.15.5 + effect: 3.17.13 '@effect/platform-node-shared@0.49.0': resolution: {integrity: sha512-6ufPQUtofYW+jsADRI4Pa4sMY+kc0dcoXWpH1ozH/bD6I5c2au1n/wDffnLoXMeHGYSpt/54Dd7WOqqNcOdXlg==} @@ -727,7 +727,7 @@ packages: '@effect/platform': 0.90.7 '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 - effect: 3.15.5 + effect: 3.17.13 '@effect/platform-node@0.96.1': resolution: {integrity: sha512-4nfB/XRJJ246MCdI7klTE/aVvA9txfI83RnymS7pNyoG4CXUKELi87JrkrWFTtOlewzt5UMWpmqsFmm2qHxx3A==} @@ -736,47 +736,47 @@ packages: '@effect/platform': 0.90.7 '@effect/rpc': 0.69.2 '@effect/sql': 0.35.8 - effect: 3.15.5 + effect: 3.17.13 '@effect/platform@0.90.7': resolution: {integrity: sha512-HpDnxR9KQ8gn2cJA3hsz42A3sCX/BP0NSv2F+dkW7n0ohoL9Rsfx5i1zJervuZdPz4/iOmpH9xlAOkYzXg6z0w==} peerDependencies: - effect: 3.15.5 + effect: 3.17.13 '@effect/printer-ansi@0.45.0': resolution: {integrity: sha512-3MS02RP83eZaBJX98PRI4f5kyoEVyNfg2Qu/XUWQMFRp4wvmgNwEy18RjO9G6s7uB8NaYXTpQVDmtUoKARx7fA==} peerDependencies: '@effect/typeclass': 0.34.2 - effect: 3.15.5 + effect: 3.17.13 '@effect/printer@0.45.0': resolution: {integrity: sha512-UpFBH2JKAgakSWpue6yKkIAXMq+3md/CPb9s/NGl28vDu1P33cvDeeDL/1EOzFk8WqhIs3oKwPMDnd3jUhjzdg==} peerDependencies: '@effect/typeclass': 0.34.2 - effect: 3.15.5 + effect: 3.17.13 '@effect/rpc@0.69.2': resolution: {integrity: sha512-h6+e3JsIz5rmEZfldxNiNoXyQgMTB7VjDuoF8LPsOxobQZDKPgGE9BMnEQYqiVWRA2bTORkXK14rFZXzU1yyPg==} peerDependencies: '@effect/platform': 0.90.7 - effect: 3.15.5 + effect: 3.17.13 '@effect/sql@0.35.8': resolution: {integrity: sha512-M1x6XMWkIHMY7iHbZgHVpq1jhhX+oFBN5LcL7Oc7cy3h2rtWf9VH2WvC2ivc2gscoKSpITlxEhGNHDFy9YrCSw==} peerDependencies: '@effect/experimental': 0.46.8 '@effect/platform': 0.90.7 - effect: 3.15.5 + effect: 3.17.13 '@effect/typeclass@0.34.2': resolution: {integrity: sha512-ZxBux2HoYi4TLDkNAKppUJjceFAS+Q4qAe4lZw80dFFXqqd+61CVzALMyzayK57qTma0IihOQHX7kbyuZ7MMLA==} peerDependencies: - effect: 3.15.5 + effect: 3.17.13 '@effect/vitest@0.23.7': resolution: {integrity: sha512-WUe8mW4C+7oUjpPoUSsOsFOY5eC7tzPaZPygZ6F9W0LXuYhZksE19fc3jJYiHPbR+lHT/48ypBsS/BiQEJet+w==} peerDependencies: - effect: 3.15.5 + effect: 3.17.13 vitest: ^3.0.0 '@emnapi/runtime@1.4.4': @@ -1381,7 +1381,7 @@ packages: '@effect/typeclass': 0.34.2 '@opentelemetry/api': ^1.9.0 '@opentelemetry/resources': ^2.0.1 - effect: 3.15.5 + effect: 3.17.13 '@livestore/wa-sqlite@0.4.0-dev.7': resolution: {integrity: sha512-5KE/dfZqgppMDLRNohigfS/uonLzd8uvGTnnOucx5Xec7K8XYcLLkktWNEVauWgqfpul6taXwx6t3m5AZxz16A==} @@ -2930,8 +2930,8 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - effect@3.15.5: - resolution: {integrity: sha512-9IA4xu9niyDIuWkS/whroDj3u2nbccw+9fQ9sKCzaEtuwTV5SSoNvp8XOozeSF/0Nwnh+mx2+ShYYgSueOTmMw==} + effect@3.17.13: + resolution: {integrity: sha512-JMz5oBxs/6mu4FP9Csjub4jYMUwMLrp+IzUmSDVIzn2NoeoyOXMl7x1lghfr3dLKWffWrdnv/d8nFFdgrHXPqw==} electron-to-chromium@1.5.183: resolution: {integrity: sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==} @@ -5466,87 +5466,87 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@effect/ai@0.26.1(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/ai@0.26.1(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - effect: 3.15.5 + '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + effect: 3.17.13 find-my-way-ts: 0.1.6 - '@effect/cli@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/cli@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - effect: 3.15.5 + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13) + '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13) + effect: 3.17.13 ini: 4.1.3 toml: 3.0.0 yaml: 2.8.1 - '@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - effect: 3.15.5 + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + effect: 3.17.13 - '@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': + '@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/platform': 0.90.7(effect@3.15.5) - effect: 3.15.5 + '@effect/platform': 0.90.7(effect@3.17.13) + effect: 3.17.13 uuid: 11.1.0 - '@effect/opentelemetry@0.56.5(@effect/platform@0.90.7(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5)': + '@effect/opentelemetry@0.56.5(@effect/platform@0.90.7(effect@3.17.13))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.13)': dependencies: - '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/platform': 0.90.7(effect@3.17.13) '@opentelemetry/semantic-conventions': 1.36.0 - effect: 3.15.5 + effect: 3.17.13 optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@effect/platform-browser@0.70.0(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-browser@0.70.0(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/platform': 0.90.7(effect@3.15.5) - effect: 3.15.5 + '@effect/platform': 0.90.7(effect@3.17.13) + effect: 3.17.13 multipasta: 0.2.7 - '@effect/platform-bun@0.79.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-bun@0.79.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - effect: 3.15.5 + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + effect: 3.17.13 multipasta: 0.2.7 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-node-shared@0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) '@parcel/watcher': 2.5.1 - effect: 3.15.5 + effect: 3.17.13 multipasta: 0.2.7 ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@0.96.1(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5)': + '@effect/platform-node@0.96.1(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - effect: 3.15.5 + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/platform-node-shared': 0.49.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + effect: 3.17.13 mime: 3.0.0 undici: 7.13.0 ws: 8.18.3 @@ -5554,44 +5554,44 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform@0.90.7(effect@3.15.5)': + '@effect/platform@0.90.7(effect@3.17.13)': dependencies: - effect: 3.15.5 + effect: 3.17.13 find-my-way-ts: 0.1.6 msgpackr: 1.11.5 multipasta: 0.2.7 - '@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5)': + '@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/typeclass': 0.34.2(effect@3.15.5) - effect: 3.15.5 + '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13) + '@effect/typeclass': 0.34.2(effect@3.17.13) + effect: 3.17.13 - '@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5)': + '@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/typeclass': 0.34.2(effect@3.15.5) - effect: 3.15.5 + '@effect/typeclass': 0.34.2(effect@3.17.13) + effect: 3.17.13 - '@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': + '@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/platform': 0.90.7(effect@3.15.5) - effect: 3.15.5 + '@effect/platform': 0.90.7(effect@3.17.13) + effect: 3.17.13 - '@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5)': + '@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13)': dependencies: - '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/platform': 0.90.7(effect@3.15.5) + '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/platform': 0.90.7(effect@3.17.13) '@opentelemetry/semantic-conventions': 1.36.0 - effect: 3.15.5 + effect: 3.17.13 uuid: 11.1.0 - '@effect/typeclass@0.34.2(effect@3.15.5)': + '@effect/typeclass@0.34.2(effect@3.17.13)': dependencies: - effect: 3.15.5 + effect: 3.17.13 - '@effect/vitest@0.23.7(effect@3.15.5)(vitest@3.2.4)': + '@effect/vitest@0.23.7(effect@3.17.13)(vitest@3.2.4)': dependencies: - effect: 3.15.5 + effect: 3.17.13 vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) '@emnapi/runtime@1.4.4': @@ -5981,13 +5981,13 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@livestore/adapter-node@0.4.0-dev.7(f4027c21072e396d36110534283d6431)': + '@livestore/adapter-node@0.4.0-dev.7(3c61e82d2462dca28e66c573df24f08b)': dependencies: - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/devtools-vite': 0.4.0-dev.7(11f05b560a47c1930400afece2297a79) - '@livestore/sqlite-wasm': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/devtools-vite': 0.4.0-dev.7(4e5d828f923ad0a2a6224b25cb66c9cc) + '@livestore/sqlite-wasm': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/webmesh': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@opentelemetry/api': 1.9.0 vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: @@ -6019,13 +6019,13 @@ snapshots: - tsx - yaml - '@livestore/adapter-web@0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17)': + '@livestore/adapter-web@0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d)': dependencies: - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/devtools-web-common': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/sqlite-wasm': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/devtools-web-common': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/sqlite-wasm': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/webmesh': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@effect/ai' @@ -6045,11 +6045,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common-cf@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': + '@livestore/common-cf@0.4.0-dev.7(676275bee9841bcab5beb100ee1da758)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6069,10 +6069,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/common@0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17)': + '@livestore/common@0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d)': dependencies: - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/webmesh': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@opentelemetry/api': 1.9.0 graphology: 0.26.0-alpha1(graphology-types@0.24.8) graphology-dag: 0.4.1(graphology-types@0.24.8) @@ -6095,10 +6095,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-vite@0.4.0-dev.7(11f05b560a47c1930400afece2297a79)': + '@livestore/devtools-vite@0.4.0-dev.7(4e5d828f923ad0a2a6224b25cb66c9cc)': dependencies: - '@livestore/adapter-web': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/adapter-web': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) vite: 7.1.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - '@effect/ai' @@ -6119,11 +6119,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/devtools-web-common@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': + '@livestore/devtools-web-common@0.4.0-dev.7(676275bee9841bcab5beb100ee1da758)': dependencies: - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/webmesh': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/webmesh': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6143,10 +6143,10 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/livestore@0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17)': + '@livestore/livestore@0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d)': dependencies: - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - '@effect/ai' @@ -6166,11 +6166,11 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/react@0.4.0-dev.7(0796d73eb1cd54f40529280528146c01)': + '@livestore/react@0.4.0-dev.7(60d0cd7ec2500fa084d53cf1794acea2)': dependencies: - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/livestore': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/livestore': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@opentelemetry/api': 1.9.0 react: 19.0.0 transitivePeerDependencies: @@ -6191,12 +6191,12 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sqlite-wasm@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': + '@livestore/sqlite-wasm@0.4.0-dev.7(676275bee9841bcab5beb100ee1da758)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/common-cf': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/common-cf': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) '@livestore/wa-sqlite': 0.4.0-dev.7 transitivePeerDependencies: - '@effect/ai' @@ -6217,12 +6217,12 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/sync-cf@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': + '@livestore/sync-cf@0.4.0-dev.7(676275bee9841bcab5beb100ee1da758)': dependencies: '@cloudflare/workers-types': 4.20250823.0 - '@livestore/common': 0.4.0-dev.7(a77eaa16b3976c28f1a083b865846b17) - '@livestore/common-cf': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/common': 0.4.0-dev.7(b7b3788e3871b1f8421339ceef8bb27d) + '@livestore/common-cf': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -6242,26 +6242,26 @@ snapshots: - '@opentelemetry/resources' - effect - '@livestore/utils@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': - dependencies: - '@effect/ai': 0.26.1(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/cli': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/opentelemetry': 0.56.5(@effect/platform@0.90.7(effect@3.15.5))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.15.5) - '@effect/platform': 0.90.7(effect@3.15.5) - '@effect/platform-browser': 0.70.0(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/platform-bun': 0.79.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/platform-node': 0.96.1(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(effect@3.15.5) - '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.15.5))(effect@3.15.5) - '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5))(@effect/platform@0.90.7(effect@3.15.5))(effect@3.15.5) - '@effect/typeclass': 0.34.2(effect@3.15.5) + '@livestore/utils@0.4.0-dev.7(676275bee9841bcab5beb100ee1da758)': + dependencies: + '@effect/ai': 0.26.1(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/cli': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/printer-ansi@0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13))(@effect/printer@0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/cluster': 0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/experimental': 0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/opentelemetry': 0.56.5(@effect/platform@0.90.7(effect@3.17.13))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.13) + '@effect/platform': 0.90.7(effect@3.17.13) + '@effect/platform-browser': 0.70.0(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/platform-bun': 0.79.0(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/platform-node': 0.96.1(@effect/cluster@0.34.2(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(@effect/rpc@0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/sql@0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(effect@3.17.13) + '@effect/printer': 0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13) + '@effect/printer-ansi': 0.45.0(@effect/typeclass@0.34.2(effect@3.17.13))(effect@3.17.13) + '@effect/rpc': 0.69.2(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/sql': 0.35.8(@effect/experimental@0.46.8(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13))(@effect/platform@0.90.7(effect@3.17.13))(effect@3.17.13) + '@effect/typeclass': 0.34.2(effect@3.17.13) '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@standard-schema/spec': 1.0.0 - effect: 3.15.5 + effect: 3.17.13 nanoid: 5.1.5 pretty-bytes: 7.0.1 @@ -6269,9 +6269,9 @@ snapshots: '@livestore/wa-sqlite@1.0.5-dev.2': {} - '@livestore/webmesh@0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd)': + '@livestore/webmesh@0.4.0-dev.7(676275bee9841bcab5beb100ee1da758)': dependencies: - '@livestore/utils': 0.4.0-dev.7(9b46ac2852d34cd6dccad784cb3a9dbd) + '@livestore/utils': 0.4.0-dev.7(676275bee9841bcab5beb100ee1da758) transitivePeerDependencies: - '@effect/ai' - '@effect/cli' @@ -7771,7 +7771,7 @@ snapshots: duplexer@0.1.2: {} - effect@3.15.5: + effect@3.17.13: dependencies: '@standard-schema/spec': 1.0.0 fast-check: 3.23.2