@tutti-os/workbench-snapshot 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @tutti-os/workbench-snapshot
2
2
 
3
- Framework-neutral workbench snapshot contract helpers for Nextop workbench
3
+ Framework-neutral workbench snapshot contract helpers for Tutti workbench
4
4
  surfaces.
5
5
 
6
6
  The package exports stable TypeScript types, normalization helpers, validation
package/dist/index.d.ts CHANGED
@@ -59,7 +59,7 @@ declare function migrateWorkbenchSnapshot(value: unknown): WorkbenchSnapshotV1;
59
59
  declare function normalizeWorkbenchSnapshot(value: WorkbenchSnapshotV1): WorkbenchSnapshotV1;
60
60
 
61
61
  var $schema = "https://json-schema.org/draft/2020-12/schema";
62
- var $id = "https://nextop.local/schemas/workbench-snapshot.v1.json";
62
+ var $id = "https://tutti.local/schemas/workbench-snapshot.v1.json";
63
63
  var title = "WorkbenchSnapshotV1";
64
64
  var type = "object";
65
65
  var additionalProperties = false;
package/dist/index.js CHANGED
@@ -386,7 +386,7 @@ function isRecord2(value) {
386
386
  // src/schema.json
387
387
  var schema_default = {
388
388
  $schema: "https://json-schema.org/draft/2020-12/schema",
389
- $id: "https://nextop.local/schemas/workbench-snapshot.v1.json",
389
+ $id: "https://tutti.local/schemas/workbench-snapshot.v1.json",
390
390
  title: "WorkbenchSnapshotV1",
391
391
  type: "object",
392
392
  additionalProperties: false,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/limits.ts","../src/types.ts","../src/validate.ts","../src/normalize.ts","../src/migrate.ts","../src/schema.json","../src/serialize.ts"],"sourcesContent":["export const workbenchSnapshotLimits = {\n maxSerializedBytes: 512 * 1024,\n maxNodes: 128,\n maxNodeIDLength: 160,\n maxKindLength: 120,\n maxTitleLength: 240,\n minFrameWidth: 160,\n minFrameHeight: 120,\n maxFrameCoordinate: 1_000_000,\n maxFrameSize: 1_000_000\n} as const;\n","export const workbenchSnapshotSchemaVersion = 1 as const;\n\nexport type WorkbenchSnapshotSchemaVersion =\n typeof workbenchSnapshotSchemaVersion;\n\nexport interface WorkbenchSnapshotV1 {\n schemaVersion: WorkbenchSnapshotSchemaVersion;\n nodes: WorkbenchSnapshotNodeV1[];\n nodeStack?: string[];\n activeNodeId?: string | null;\n spaces?: WorkbenchSnapshotSpaceV1[];\n activeSpaceId?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WorkbenchFrameV1 {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface WorkbenchSnapshotNodeV1 {\n id: string;\n kind: string;\n title: string;\n frame: WorkbenchFrameV1;\n displayMode?: WorkbenchSnapshotDisplayModeV1;\n restoreFrame?: WorkbenchFrameV1 | null;\n isMinimized?: boolean;\n minimizedAtUnixMs?: number | null;\n data?: unknown;\n adapterState?: WorkbenchSnapshotNodeAdapterStateV1;\n}\n\nexport type WorkbenchSnapshotDisplayModeV1 = \"floating\" | \"fullscreen\";\n\nexport interface WorkbenchSnapshotNodeAdapterStateV1 {\n [key: string]: unknown;\n}\n\nexport interface WorkbenchSnapshotSpaceV1 {\n id: string;\n name: string;\n nodeIds: string[];\n frame?: WorkbenchFrameV1 | null;\n data?: unknown;\n}\n\nexport type WorkbenchSnapshot = WorkbenchSnapshotV1;\nexport type WorkbenchSnapshotNode = WorkbenchSnapshotNodeV1;\nexport type WorkbenchFrame = WorkbenchFrameV1;\n","import { workbenchSnapshotLimits } from \"./limits.ts\";\nimport {\n workbenchSnapshotSchemaVersion,\n type WorkbenchFrameV1,\n type WorkbenchSnapshotDisplayModeV1,\n type WorkbenchSnapshotV1\n} from \"./types.ts\";\n\nexport interface WorkbenchSnapshotValidationIssue {\n path: string;\n message: string;\n}\n\nexport interface WorkbenchSnapshotValidationResult {\n ok: boolean;\n issues: WorkbenchSnapshotValidationIssue[];\n}\n\nconst displayModes = new Set<WorkbenchSnapshotDisplayModeV1>([\n \"floating\",\n \"fullscreen\"\n]);\n\nexport function validateWorkbenchSnapshot(\n value: unknown\n): WorkbenchSnapshotValidationResult {\n const issues: WorkbenchSnapshotValidationIssue[] = [];\n\n if (!isRecord(value)) {\n return issue(\"snapshot\", \"snapshot must be an object\");\n }\n validateAllowedKeys(\n value,\n \"snapshot\",\n [\n \"schemaVersion\",\n \"nodes\",\n \"nodeStack\",\n \"activeNodeId\",\n \"spaces\",\n \"activeSpaceId\",\n \"metadata\"\n ],\n issues\n );\n\n if (value.schemaVersion !== workbenchSnapshotSchemaVersion) {\n issues.push({\n path: \"schemaVersion\",\n message: \"unsupported workbench snapshot schema version\"\n });\n }\n\n if (!Array.isArray(value.nodes)) {\n issues.push({ path: \"nodes\", message: \"nodes must be an array\" });\n } else {\n if (value.nodes.length > workbenchSnapshotLimits.maxNodes) {\n issues.push({\n path: \"nodes\",\n message: `nodes must contain at most ${workbenchSnapshotLimits.maxNodes} items`\n });\n }\n validateNodes(value.nodes, issues);\n }\n\n validateStringArray(value.nodeStack, \"nodeStack\", issues, true);\n validateOptionalStringOrNull(value.activeNodeId, \"activeNodeId\", issues);\n\n if (value.spaces !== undefined) {\n if (!Array.isArray(value.spaces)) {\n issues.push({ path: \"spaces\", message: \"spaces must be an array\" });\n } else {\n validateSpaces(value.spaces, issues);\n }\n }\n\n validateOptionalStringOrNull(value.activeSpaceId, \"activeSpaceId\", issues);\n\n const serializedBytes = serializedByteLength(value);\n if (serializedBytes > workbenchSnapshotLimits.maxSerializedBytes) {\n issues.push({\n path: \"snapshot\",\n message: `snapshot must serialize to at most ${workbenchSnapshotLimits.maxSerializedBytes} bytes`\n });\n }\n\n return { ok: issues.length === 0, issues };\n}\n\nexport function assertValidWorkbenchSnapshot(\n value: unknown\n): asserts value is WorkbenchSnapshotV1 {\n const result = validateWorkbenchSnapshot(value);\n if (!result.ok) {\n throw new Error(formatWorkbenchSnapshotValidationIssues(result.issues));\n }\n}\n\nexport function formatWorkbenchSnapshotValidationIssues(\n issues: WorkbenchSnapshotValidationIssue[]\n): string {\n if (issues.length === 0) {\n return \"workbench snapshot is valid\";\n }\n\n return issues.map((item) => `${item.path}: ${item.message}`).join(\"; \");\n}\n\nfunction validateNodes(\n nodes: unknown[],\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n const ids = new Set<string>();\n\n nodes.forEach((node, index) => {\n const path = `nodes[${index}]`;\n if (!isRecord(node)) {\n issues.push({ path, message: \"node must be an object\" });\n return;\n }\n validateAllowedKeys(\n node,\n path,\n [\n \"id\",\n \"kind\",\n \"title\",\n \"frame\",\n \"displayMode\",\n \"restoreFrame\",\n \"isMinimized\",\n \"minimizedAtUnixMs\",\n \"data\",\n \"adapterState\"\n ],\n issues\n );\n\n const id = validateRequiredString(node.id, `${path}.id`, issues, {\n maxLength: workbenchSnapshotLimits.maxNodeIDLength\n });\n if (id) {\n if (ids.has(id)) {\n issues.push({ path: `${path}.id`, message: \"node id must be unique\" });\n }\n ids.add(id);\n }\n\n validateRequiredString(node.kind, `${path}.kind`, issues, {\n maxLength: workbenchSnapshotLimits.maxKindLength\n });\n validateRequiredString(node.title, `${path}.title`, issues, {\n allowEmpty: true,\n maxLength: workbenchSnapshotLimits.maxTitleLength\n });\n validateFrame(node.frame, `${path}.frame`, issues);\n\n if (\n node.displayMode !== undefined &&\n !displayModes.has(node.displayMode as WorkbenchSnapshotDisplayModeV1)\n ) {\n issues.push({\n path: `${path}.displayMode`,\n message: \"displayMode must be floating or fullscreen\"\n });\n }\n\n if (node.restoreFrame !== undefined && node.restoreFrame !== null) {\n validateFrame(node.restoreFrame, `${path}.restoreFrame`, issues);\n }\n\n if (\n node.isMinimized !== undefined &&\n typeof node.isMinimized !== \"boolean\"\n ) {\n issues.push({\n path: `${path}.isMinimized`,\n message: \"isMinimized must be a boolean\"\n });\n }\n\n validateOptionalNonNegativeIntegerOrNull(\n node.minimizedAtUnixMs,\n `${path}.minimizedAtUnixMs`,\n issues\n );\n });\n}\n\nfunction validateSpaces(\n spaces: unknown[],\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n spaces.forEach((space, index) => {\n const path = `spaces[${index}]`;\n if (!isRecord(space)) {\n issues.push({ path, message: \"space must be an object\" });\n return;\n }\n validateAllowedKeys(\n space,\n path,\n [\"id\", \"name\", \"nodeIds\", \"frame\", \"data\"],\n issues\n );\n\n validateRequiredString(space.id, `${path}.id`, issues);\n validateRequiredString(space.name, `${path}.name`, issues, {\n allowEmpty: true\n });\n validateStringArray(space.nodeIds, `${path}.nodeIds`, issues, false);\n\n if (space.frame !== undefined && space.frame !== null) {\n validateFrame(space.frame, `${path}.frame`, issues);\n }\n });\n}\n\nfunction validateRequiredString(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[],\n options: { allowEmpty?: boolean; maxLength?: number } = {}\n): string | null {\n if (typeof value !== \"string\") {\n issues.push({ path, message: \"value must be a string\" });\n return null;\n }\n\n const trimmed = value.trim();\n if (!options.allowEmpty && trimmed === \"\") {\n issues.push({ path, message: \"value must not be empty\" });\n return null;\n }\n\n if (options.maxLength !== undefined && value.length > options.maxLength) {\n issues.push({\n path,\n message: `value must be at most ${options.maxLength} characters`\n });\n }\n\n return trimmed;\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[],\n optional: boolean\n): void {\n if (value === undefined && optional) {\n return;\n }\n if (!Array.isArray(value)) {\n issues.push({ path, message: \"value must be an array\" });\n return;\n }\n\n value.forEach((item, index) => {\n if (typeof item !== \"string\" || item.trim() === \"\") {\n issues.push({\n path: `${path}[${index}]`,\n message: \"value must be a non-empty string\"\n });\n }\n });\n}\n\nfunction validateOptionalStringOrNull(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (value === undefined || value === null || typeof value === \"string\") {\n return;\n }\n issues.push({ path, message: \"value must be a string or null\" });\n}\n\nfunction validateOptionalNonNegativeIntegerOrNull(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (value === undefined || value === null) {\n return;\n }\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n issues.push({\n path,\n message: \"value must be a non-negative integer or null\"\n });\n }\n}\n\nfunction validateFrame(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (!isRecord(value)) {\n issues.push({ path, message: \"frame must be an object\" });\n return;\n }\n validateAllowedKeys(value, path, [\"x\", \"y\", \"width\", \"height\"], issues);\n\n validateFiniteNumber(value.x, `${path}.x`, issues);\n validateFiniteNumber(value.y, `${path}.y`, issues);\n validateFiniteNumber(value.width, `${path}.width`, issues);\n validateFiniteNumber(value.height, `${path}.height`, issues);\n\n const frame = value as Partial<WorkbenchFrameV1>;\n if (\n typeof frame.width === \"number\" &&\n frame.width < workbenchSnapshotLimits.minFrameWidth\n ) {\n issues.push({\n path: `${path}.width`,\n message: `width must be at least ${workbenchSnapshotLimits.minFrameWidth}`\n });\n }\n if (\n typeof frame.height === \"number\" &&\n frame.height < workbenchSnapshotLimits.minFrameHeight\n ) {\n issues.push({\n path: `${path}.height`,\n message: `height must be at least ${workbenchSnapshotLimits.minFrameHeight}`\n });\n }\n}\n\nfunction validateFiniteNumber(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n issues.push({ path, message: \"value must be a finite number\" });\n }\n}\n\nfunction validateAllowedKeys(\n value: Record<string, unknown>,\n path: string,\n allowedKeys: string[],\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n const allowed = new Set(allowedKeys);\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) {\n issues.push({\n path: `${path}.${key}`,\n message: \"field is not part of the workbench snapshot contract\"\n });\n }\n }\n}\n\nfunction serializedByteLength(value: unknown): number {\n try {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n } catch {\n return Number.POSITIVE_INFINITY;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction issue(\n path: string,\n message: string\n): WorkbenchSnapshotValidationResult {\n return { ok: false, issues: [{ path, message }] };\n}\n","import { workbenchSnapshotLimits } from \"./limits.ts\";\nimport {\n workbenchSnapshotSchemaVersion,\n type WorkbenchFrameV1,\n type WorkbenchSnapshotNodeV1,\n type WorkbenchSnapshotSpaceV1,\n type WorkbenchSnapshotV1\n} from \"./types.ts\";\nimport { assertValidWorkbenchSnapshot } from \"./validate.ts\";\n\nexport function normalizeWorkbenchSnapshot(\n value: WorkbenchSnapshotV1\n): WorkbenchSnapshotV1 {\n assertValidWorkbenchSnapshot(value);\n\n const nodes = value.nodes.map(normalizeNode).sort(compareByID);\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const nodeStack = uniqueStrings(value.nodeStack ?? []).filter((id) =>\n nodeIDs.has(id)\n );\n\n for (const node of nodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n\n const activeNodeId =\n value.activeNodeId && nodeIDs.has(value.activeNodeId)\n ? value.activeNodeId\n : (nodeStack.at(-1) ?? null);\n\n const spaces = value.spaces?.map(normalizeSpace).sort(compareByID);\n const spaceIDs = new Set(spaces?.map((space) => space.id) ?? []);\n const activeSpaceId =\n value.activeSpaceId && spaceIDs.has(value.activeSpaceId)\n ? value.activeSpaceId\n : (spaces?.[0]?.id ?? null);\n\n return stripUndefined({\n schemaVersion: workbenchSnapshotSchemaVersion,\n nodes,\n nodeStack,\n activeNodeId,\n spaces,\n activeSpaceId,\n metadata: value.metadata\n });\n}\n\nfunction normalizeNode(node: WorkbenchSnapshotNodeV1): WorkbenchSnapshotNodeV1 {\n return stripUndefined({\n id: node.id.trim(),\n kind: node.kind.trim(),\n title: node.title,\n frame: normalizeFrame(node.frame),\n displayMode: node.displayMode ?? \"floating\",\n restoreFrame: node.restoreFrame ? normalizeFrame(node.restoreFrame) : null,\n isMinimized: node.isMinimized ?? false,\n minimizedAtUnixMs: normalizeMinimizedAtUnixMs(node),\n data: node.data,\n adapterState: node.adapterState\n });\n}\n\nfunction normalizeMinimizedAtUnixMs(\n node: WorkbenchSnapshotNodeV1\n): number | null | undefined {\n if (node.isMinimized !== true) {\n return undefined;\n }\n return node.minimizedAtUnixMs ?? undefined;\n}\n\nfunction normalizeSpace(\n space: WorkbenchSnapshotSpaceV1\n): WorkbenchSnapshotSpaceV1 {\n return stripUndefined({\n id: space.id.trim(),\n name: space.name,\n nodeIds: uniqueStrings(space.nodeIds),\n frame: space.frame ? normalizeFrame(space.frame) : null,\n data: space.data\n });\n}\n\nfunction normalizeFrame(frame: WorkbenchFrameV1): WorkbenchFrameV1 {\n return {\n x: normalizeNumber(frame.x),\n y: normalizeNumber(frame.y),\n width: Math.max(\n workbenchSnapshotLimits.minFrameWidth,\n normalizeNumber(frame.width)\n ),\n height: Math.max(\n workbenchSnapshotLimits.minFrameHeight,\n normalizeNumber(frame.height)\n )\n };\n}\n\nfunction normalizeNumber(value: number): number {\n return Object.is(value, -0) ? 0 : Number(value.toFixed(3));\n}\n\nfunction compareByID<T extends { id: string }>(left: T, right: T): number {\n return left.id.localeCompare(right.id);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean))\n );\n}\n\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined)\n ) as T;\n}\n","import {\n workbenchSnapshotSchemaVersion,\n type WorkbenchSnapshotV1\n} from \"./types.ts\";\nimport { normalizeWorkbenchSnapshot } from \"./normalize.ts\";\nimport { assertValidWorkbenchSnapshot } from \"./validate.ts\";\n\nexport function migrateWorkbenchSnapshot(value: unknown): WorkbenchSnapshotV1 {\n if (!isRecord(value)) {\n throw new Error(\"workbench snapshot must be an object\");\n }\n\n if (value.schemaVersion === workbenchSnapshotSchemaVersion) {\n assertValidWorkbenchSnapshot(value);\n return normalizeWorkbenchSnapshot(value);\n }\n\n throw new Error(\n `unsupported workbench snapshot schema version: ${String(value.schemaVersion)}`\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://nextop.local/schemas/workbench-snapshot.v1.json\",\n \"title\": \"WorkbenchSnapshotV1\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"schemaVersion\", \"nodes\"],\n \"properties\": {\n \"schemaVersion\": { \"const\": 1 },\n \"nodes\": {\n \"type\": \"array\",\n \"maxItems\": 128,\n \"items\": { \"$ref\": \"#/$defs/node\" }\n },\n \"nodeStack\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\", \"minLength\": 1 }\n },\n \"activeNodeId\": { \"type\": [\"string\", \"null\"] },\n \"spaces\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/$defs/space\" }\n },\n \"activeSpaceId\": { \"type\": [\"string\", \"null\"] },\n \"metadata\": { \"type\": \"object\" }\n },\n \"$defs\": {\n \"frame\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"x\", \"y\", \"width\", \"height\"],\n \"properties\": {\n \"x\": { \"type\": \"number\" },\n \"y\": { \"type\": \"number\" },\n \"width\": { \"type\": \"number\", \"minimum\": 160 },\n \"height\": { \"type\": \"number\", \"minimum\": 120 }\n }\n },\n \"node\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"id\", \"kind\", \"title\", \"frame\"],\n \"properties\": {\n \"id\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 160 },\n \"kind\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n \"title\": { \"type\": \"string\", \"maxLength\": 240 },\n \"frame\": { \"$ref\": \"#/$defs/frame\" },\n \"displayMode\": { \"enum\": [\"floating\", \"fullscreen\"] },\n \"restoreFrame\": {\n \"anyOf\": [{ \"$ref\": \"#/$defs/frame\" }, { \"type\": \"null\" }]\n },\n \"isMinimized\": { \"type\": \"boolean\" },\n \"minimizedAtUnixMs\": {\n \"type\": [\"integer\", \"null\"],\n \"minimum\": 0\n },\n \"data\": true,\n \"adapterState\": { \"type\": \"object\" }\n }\n },\n \"space\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"id\", \"name\", \"nodeIds\"],\n \"properties\": {\n \"id\": { \"type\": \"string\", \"minLength\": 1 },\n \"name\": { \"type\": \"string\" },\n \"nodeIds\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\", \"minLength\": 1 }\n },\n \"frame\": {\n \"anyOf\": [{ \"$ref\": \"#/$defs/frame\" }, { \"type\": \"null\" }]\n },\n \"data\": true\n }\n }\n }\n}\n","import { migrateWorkbenchSnapshot } from \"./migrate.ts\";\nimport { normalizeWorkbenchSnapshot } from \"./normalize.ts\";\nimport type { WorkbenchSnapshotV1 } from \"./types.ts\";\nimport { assertValidWorkbenchSnapshot } from \"./validate.ts\";\n\nexport function serializeWorkbenchSnapshot(\n snapshot: WorkbenchSnapshotV1\n): string {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n assertValidWorkbenchSnapshot(normalized);\n return JSON.stringify(normalized);\n}\n\nexport function parseWorkbenchSnapshot(\n serialized: string\n): WorkbenchSnapshotV1 {\n const parsed = JSON.parse(serialized) as unknown;\n return migrateWorkbenchSnapshot(parsed);\n}\n"],"mappings":"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","names":["isRecord"]}
1
+ {"version":3,"sources":["../src/limits.ts","../src/types.ts","../src/validate.ts","../src/normalize.ts","../src/migrate.ts","../src/schema.json","../src/serialize.ts"],"sourcesContent":["export const workbenchSnapshotLimits = {\n maxSerializedBytes: 512 * 1024,\n maxNodes: 128,\n maxNodeIDLength: 160,\n maxKindLength: 120,\n maxTitleLength: 240,\n minFrameWidth: 160,\n minFrameHeight: 120,\n maxFrameCoordinate: 1_000_000,\n maxFrameSize: 1_000_000\n} as const;\n","export const workbenchSnapshotSchemaVersion = 1 as const;\n\nexport type WorkbenchSnapshotSchemaVersion =\n typeof workbenchSnapshotSchemaVersion;\n\nexport interface WorkbenchSnapshotV1 {\n schemaVersion: WorkbenchSnapshotSchemaVersion;\n nodes: WorkbenchSnapshotNodeV1[];\n nodeStack?: string[];\n activeNodeId?: string | null;\n spaces?: WorkbenchSnapshotSpaceV1[];\n activeSpaceId?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WorkbenchFrameV1 {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface WorkbenchSnapshotNodeV1 {\n id: string;\n kind: string;\n title: string;\n frame: WorkbenchFrameV1;\n displayMode?: WorkbenchSnapshotDisplayModeV1;\n restoreFrame?: WorkbenchFrameV1 | null;\n isMinimized?: boolean;\n minimizedAtUnixMs?: number | null;\n data?: unknown;\n adapterState?: WorkbenchSnapshotNodeAdapterStateV1;\n}\n\nexport type WorkbenchSnapshotDisplayModeV1 = \"floating\" | \"fullscreen\";\n\nexport interface WorkbenchSnapshotNodeAdapterStateV1 {\n [key: string]: unknown;\n}\n\nexport interface WorkbenchSnapshotSpaceV1 {\n id: string;\n name: string;\n nodeIds: string[];\n frame?: WorkbenchFrameV1 | null;\n data?: unknown;\n}\n\nexport type WorkbenchSnapshot = WorkbenchSnapshotV1;\nexport type WorkbenchSnapshotNode = WorkbenchSnapshotNodeV1;\nexport type WorkbenchFrame = WorkbenchFrameV1;\n","import { workbenchSnapshotLimits } from \"./limits.ts\";\nimport {\n workbenchSnapshotSchemaVersion,\n type WorkbenchFrameV1,\n type WorkbenchSnapshotDisplayModeV1,\n type WorkbenchSnapshotV1\n} from \"./types.ts\";\n\nexport interface WorkbenchSnapshotValidationIssue {\n path: string;\n message: string;\n}\n\nexport interface WorkbenchSnapshotValidationResult {\n ok: boolean;\n issues: WorkbenchSnapshotValidationIssue[];\n}\n\nconst displayModes = new Set<WorkbenchSnapshotDisplayModeV1>([\n \"floating\",\n \"fullscreen\"\n]);\n\nexport function validateWorkbenchSnapshot(\n value: unknown\n): WorkbenchSnapshotValidationResult {\n const issues: WorkbenchSnapshotValidationIssue[] = [];\n\n if (!isRecord(value)) {\n return issue(\"snapshot\", \"snapshot must be an object\");\n }\n validateAllowedKeys(\n value,\n \"snapshot\",\n [\n \"schemaVersion\",\n \"nodes\",\n \"nodeStack\",\n \"activeNodeId\",\n \"spaces\",\n \"activeSpaceId\",\n \"metadata\"\n ],\n issues\n );\n\n if (value.schemaVersion !== workbenchSnapshotSchemaVersion) {\n issues.push({\n path: \"schemaVersion\",\n message: \"unsupported workbench snapshot schema version\"\n });\n }\n\n if (!Array.isArray(value.nodes)) {\n issues.push({ path: \"nodes\", message: \"nodes must be an array\" });\n } else {\n if (value.nodes.length > workbenchSnapshotLimits.maxNodes) {\n issues.push({\n path: \"nodes\",\n message: `nodes must contain at most ${workbenchSnapshotLimits.maxNodes} items`\n });\n }\n validateNodes(value.nodes, issues);\n }\n\n validateStringArray(value.nodeStack, \"nodeStack\", issues, true);\n validateOptionalStringOrNull(value.activeNodeId, \"activeNodeId\", issues);\n\n if (value.spaces !== undefined) {\n if (!Array.isArray(value.spaces)) {\n issues.push({ path: \"spaces\", message: \"spaces must be an array\" });\n } else {\n validateSpaces(value.spaces, issues);\n }\n }\n\n validateOptionalStringOrNull(value.activeSpaceId, \"activeSpaceId\", issues);\n\n const serializedBytes = serializedByteLength(value);\n if (serializedBytes > workbenchSnapshotLimits.maxSerializedBytes) {\n issues.push({\n path: \"snapshot\",\n message: `snapshot must serialize to at most ${workbenchSnapshotLimits.maxSerializedBytes} bytes`\n });\n }\n\n return { ok: issues.length === 0, issues };\n}\n\nexport function assertValidWorkbenchSnapshot(\n value: unknown\n): asserts value is WorkbenchSnapshotV1 {\n const result = validateWorkbenchSnapshot(value);\n if (!result.ok) {\n throw new Error(formatWorkbenchSnapshotValidationIssues(result.issues));\n }\n}\n\nexport function formatWorkbenchSnapshotValidationIssues(\n issues: WorkbenchSnapshotValidationIssue[]\n): string {\n if (issues.length === 0) {\n return \"workbench snapshot is valid\";\n }\n\n return issues.map((item) => `${item.path}: ${item.message}`).join(\"; \");\n}\n\nfunction validateNodes(\n nodes: unknown[],\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n const ids = new Set<string>();\n\n nodes.forEach((node, index) => {\n const path = `nodes[${index}]`;\n if (!isRecord(node)) {\n issues.push({ path, message: \"node must be an object\" });\n return;\n }\n validateAllowedKeys(\n node,\n path,\n [\n \"id\",\n \"kind\",\n \"title\",\n \"frame\",\n \"displayMode\",\n \"restoreFrame\",\n \"isMinimized\",\n \"minimizedAtUnixMs\",\n \"data\",\n \"adapterState\"\n ],\n issues\n );\n\n const id = validateRequiredString(node.id, `${path}.id`, issues, {\n maxLength: workbenchSnapshotLimits.maxNodeIDLength\n });\n if (id) {\n if (ids.has(id)) {\n issues.push({ path: `${path}.id`, message: \"node id must be unique\" });\n }\n ids.add(id);\n }\n\n validateRequiredString(node.kind, `${path}.kind`, issues, {\n maxLength: workbenchSnapshotLimits.maxKindLength\n });\n validateRequiredString(node.title, `${path}.title`, issues, {\n allowEmpty: true,\n maxLength: workbenchSnapshotLimits.maxTitleLength\n });\n validateFrame(node.frame, `${path}.frame`, issues);\n\n if (\n node.displayMode !== undefined &&\n !displayModes.has(node.displayMode as WorkbenchSnapshotDisplayModeV1)\n ) {\n issues.push({\n path: `${path}.displayMode`,\n message: \"displayMode must be floating or fullscreen\"\n });\n }\n\n if (node.restoreFrame !== undefined && node.restoreFrame !== null) {\n validateFrame(node.restoreFrame, `${path}.restoreFrame`, issues);\n }\n\n if (\n node.isMinimized !== undefined &&\n typeof node.isMinimized !== \"boolean\"\n ) {\n issues.push({\n path: `${path}.isMinimized`,\n message: \"isMinimized must be a boolean\"\n });\n }\n\n validateOptionalNonNegativeIntegerOrNull(\n node.minimizedAtUnixMs,\n `${path}.minimizedAtUnixMs`,\n issues\n );\n });\n}\n\nfunction validateSpaces(\n spaces: unknown[],\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n spaces.forEach((space, index) => {\n const path = `spaces[${index}]`;\n if (!isRecord(space)) {\n issues.push({ path, message: \"space must be an object\" });\n return;\n }\n validateAllowedKeys(\n space,\n path,\n [\"id\", \"name\", \"nodeIds\", \"frame\", \"data\"],\n issues\n );\n\n validateRequiredString(space.id, `${path}.id`, issues);\n validateRequiredString(space.name, `${path}.name`, issues, {\n allowEmpty: true\n });\n validateStringArray(space.nodeIds, `${path}.nodeIds`, issues, false);\n\n if (space.frame !== undefined && space.frame !== null) {\n validateFrame(space.frame, `${path}.frame`, issues);\n }\n });\n}\n\nfunction validateRequiredString(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[],\n options: { allowEmpty?: boolean; maxLength?: number } = {}\n): string | null {\n if (typeof value !== \"string\") {\n issues.push({ path, message: \"value must be a string\" });\n return null;\n }\n\n const trimmed = value.trim();\n if (!options.allowEmpty && trimmed === \"\") {\n issues.push({ path, message: \"value must not be empty\" });\n return null;\n }\n\n if (options.maxLength !== undefined && value.length > options.maxLength) {\n issues.push({\n path,\n message: `value must be at most ${options.maxLength} characters`\n });\n }\n\n return trimmed;\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[],\n optional: boolean\n): void {\n if (value === undefined && optional) {\n return;\n }\n if (!Array.isArray(value)) {\n issues.push({ path, message: \"value must be an array\" });\n return;\n }\n\n value.forEach((item, index) => {\n if (typeof item !== \"string\" || item.trim() === \"\") {\n issues.push({\n path: `${path}[${index}]`,\n message: \"value must be a non-empty string\"\n });\n }\n });\n}\n\nfunction validateOptionalStringOrNull(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (value === undefined || value === null || typeof value === \"string\") {\n return;\n }\n issues.push({ path, message: \"value must be a string or null\" });\n}\n\nfunction validateOptionalNonNegativeIntegerOrNull(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (value === undefined || value === null) {\n return;\n }\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n issues.push({\n path,\n message: \"value must be a non-negative integer or null\"\n });\n }\n}\n\nfunction validateFrame(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (!isRecord(value)) {\n issues.push({ path, message: \"frame must be an object\" });\n return;\n }\n validateAllowedKeys(value, path, [\"x\", \"y\", \"width\", \"height\"], issues);\n\n validateFiniteNumber(value.x, `${path}.x`, issues);\n validateFiniteNumber(value.y, `${path}.y`, issues);\n validateFiniteNumber(value.width, `${path}.width`, issues);\n validateFiniteNumber(value.height, `${path}.height`, issues);\n\n const frame = value as Partial<WorkbenchFrameV1>;\n if (\n typeof frame.width === \"number\" &&\n frame.width < workbenchSnapshotLimits.minFrameWidth\n ) {\n issues.push({\n path: `${path}.width`,\n message: `width must be at least ${workbenchSnapshotLimits.minFrameWidth}`\n });\n }\n if (\n typeof frame.height === \"number\" &&\n frame.height < workbenchSnapshotLimits.minFrameHeight\n ) {\n issues.push({\n path: `${path}.height`,\n message: `height must be at least ${workbenchSnapshotLimits.minFrameHeight}`\n });\n }\n}\n\nfunction validateFiniteNumber(\n value: unknown,\n path: string,\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n issues.push({ path, message: \"value must be a finite number\" });\n }\n}\n\nfunction validateAllowedKeys(\n value: Record<string, unknown>,\n path: string,\n allowedKeys: string[],\n issues: WorkbenchSnapshotValidationIssue[]\n): void {\n const allowed = new Set(allowedKeys);\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) {\n issues.push({\n path: `${path}.${key}`,\n message: \"field is not part of the workbench snapshot contract\"\n });\n }\n }\n}\n\nfunction serializedByteLength(value: unknown): number {\n try {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n } catch {\n return Number.POSITIVE_INFINITY;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction issue(\n path: string,\n message: string\n): WorkbenchSnapshotValidationResult {\n return { ok: false, issues: [{ path, message }] };\n}\n","import { workbenchSnapshotLimits } from \"./limits.ts\";\nimport {\n workbenchSnapshotSchemaVersion,\n type WorkbenchFrameV1,\n type WorkbenchSnapshotNodeV1,\n type WorkbenchSnapshotSpaceV1,\n type WorkbenchSnapshotV1\n} from \"./types.ts\";\nimport { assertValidWorkbenchSnapshot } from \"./validate.ts\";\n\nexport function normalizeWorkbenchSnapshot(\n value: WorkbenchSnapshotV1\n): WorkbenchSnapshotV1 {\n assertValidWorkbenchSnapshot(value);\n\n const nodes = value.nodes.map(normalizeNode).sort(compareByID);\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const nodeStack = uniqueStrings(value.nodeStack ?? []).filter((id) =>\n nodeIDs.has(id)\n );\n\n for (const node of nodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n\n const activeNodeId =\n value.activeNodeId && nodeIDs.has(value.activeNodeId)\n ? value.activeNodeId\n : (nodeStack.at(-1) ?? null);\n\n const spaces = value.spaces?.map(normalizeSpace).sort(compareByID);\n const spaceIDs = new Set(spaces?.map((space) => space.id) ?? []);\n const activeSpaceId =\n value.activeSpaceId && spaceIDs.has(value.activeSpaceId)\n ? value.activeSpaceId\n : (spaces?.[0]?.id ?? null);\n\n return stripUndefined({\n schemaVersion: workbenchSnapshotSchemaVersion,\n nodes,\n nodeStack,\n activeNodeId,\n spaces,\n activeSpaceId,\n metadata: value.metadata\n });\n}\n\nfunction normalizeNode(node: WorkbenchSnapshotNodeV1): WorkbenchSnapshotNodeV1 {\n return stripUndefined({\n id: node.id.trim(),\n kind: node.kind.trim(),\n title: node.title,\n frame: normalizeFrame(node.frame),\n displayMode: node.displayMode ?? \"floating\",\n restoreFrame: node.restoreFrame ? normalizeFrame(node.restoreFrame) : null,\n isMinimized: node.isMinimized ?? false,\n minimizedAtUnixMs: normalizeMinimizedAtUnixMs(node),\n data: node.data,\n adapterState: node.adapterState\n });\n}\n\nfunction normalizeMinimizedAtUnixMs(\n node: WorkbenchSnapshotNodeV1\n): number | null | undefined {\n if (node.isMinimized !== true) {\n return undefined;\n }\n return node.minimizedAtUnixMs ?? undefined;\n}\n\nfunction normalizeSpace(\n space: WorkbenchSnapshotSpaceV1\n): WorkbenchSnapshotSpaceV1 {\n return stripUndefined({\n id: space.id.trim(),\n name: space.name,\n nodeIds: uniqueStrings(space.nodeIds),\n frame: space.frame ? normalizeFrame(space.frame) : null,\n data: space.data\n });\n}\n\nfunction normalizeFrame(frame: WorkbenchFrameV1): WorkbenchFrameV1 {\n return {\n x: normalizeNumber(frame.x),\n y: normalizeNumber(frame.y),\n width: Math.max(\n workbenchSnapshotLimits.minFrameWidth,\n normalizeNumber(frame.width)\n ),\n height: Math.max(\n workbenchSnapshotLimits.minFrameHeight,\n normalizeNumber(frame.height)\n )\n };\n}\n\nfunction normalizeNumber(value: number): number {\n return Object.is(value, -0) ? 0 : Number(value.toFixed(3));\n}\n\nfunction compareByID<T extends { id: string }>(left: T, right: T): number {\n return left.id.localeCompare(right.id);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean))\n );\n}\n\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined)\n ) as T;\n}\n","import {\n workbenchSnapshotSchemaVersion,\n type WorkbenchSnapshotV1\n} from \"./types.ts\";\nimport { normalizeWorkbenchSnapshot } from \"./normalize.ts\";\nimport { assertValidWorkbenchSnapshot } from \"./validate.ts\";\n\nexport function migrateWorkbenchSnapshot(value: unknown): WorkbenchSnapshotV1 {\n if (!isRecord(value)) {\n throw new Error(\"workbench snapshot must be an object\");\n }\n\n if (value.schemaVersion === workbenchSnapshotSchemaVersion) {\n assertValidWorkbenchSnapshot(value);\n return normalizeWorkbenchSnapshot(value);\n }\n\n throw new Error(\n `unsupported workbench snapshot schema version: ${String(value.schemaVersion)}`\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://tutti.local/schemas/workbench-snapshot.v1.json\",\n \"title\": \"WorkbenchSnapshotV1\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"schemaVersion\", \"nodes\"],\n \"properties\": {\n \"schemaVersion\": { \"const\": 1 },\n \"nodes\": {\n \"type\": \"array\",\n \"maxItems\": 128,\n \"items\": { \"$ref\": \"#/$defs/node\" }\n },\n \"nodeStack\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\", \"minLength\": 1 }\n },\n \"activeNodeId\": { \"type\": [\"string\", \"null\"] },\n \"spaces\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/$defs/space\" }\n },\n \"activeSpaceId\": { \"type\": [\"string\", \"null\"] },\n \"metadata\": { \"type\": \"object\" }\n },\n \"$defs\": {\n \"frame\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"x\", \"y\", \"width\", \"height\"],\n \"properties\": {\n \"x\": { \"type\": \"number\" },\n \"y\": { \"type\": \"number\" },\n \"width\": { \"type\": \"number\", \"minimum\": 160 },\n \"height\": { \"type\": \"number\", \"minimum\": 120 }\n }\n },\n \"node\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"id\", \"kind\", \"title\", \"frame\"],\n \"properties\": {\n \"id\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 160 },\n \"kind\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n \"title\": { \"type\": \"string\", \"maxLength\": 240 },\n \"frame\": { \"$ref\": \"#/$defs/frame\" },\n \"displayMode\": { \"enum\": [\"floating\", \"fullscreen\"] },\n \"restoreFrame\": {\n \"anyOf\": [{ \"$ref\": \"#/$defs/frame\" }, { \"type\": \"null\" }]\n },\n \"isMinimized\": { \"type\": \"boolean\" },\n \"minimizedAtUnixMs\": {\n \"type\": [\"integer\", \"null\"],\n \"minimum\": 0\n },\n \"data\": true,\n \"adapterState\": { \"type\": \"object\" }\n }\n },\n \"space\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"id\", \"name\", \"nodeIds\"],\n \"properties\": {\n \"id\": { \"type\": \"string\", \"minLength\": 1 },\n \"name\": { \"type\": \"string\" },\n \"nodeIds\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\", \"minLength\": 1 }\n },\n \"frame\": {\n \"anyOf\": [{ \"$ref\": \"#/$defs/frame\" }, { \"type\": \"null\" }]\n },\n \"data\": true\n }\n }\n }\n}\n","import { migrateWorkbenchSnapshot } from \"./migrate.ts\";\nimport { normalizeWorkbenchSnapshot } from \"./normalize.ts\";\nimport type { WorkbenchSnapshotV1 } from \"./types.ts\";\nimport { assertValidWorkbenchSnapshot } from \"./validate.ts\";\n\nexport function serializeWorkbenchSnapshot(\n snapshot: WorkbenchSnapshotV1\n): string {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n assertValidWorkbenchSnapshot(normalized);\n return JSON.stringify(normalized);\n}\n\nexport function parseWorkbenchSnapshot(\n serialized: string\n): WorkbenchSnapshotV1 {\n const parsed = JSON.parse(serialized) as unknown;\n return migrateWorkbenchSnapshot(parsed);\n}\n"],"mappings":"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","names":["isRecord"]}
package/dist/schema.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://nextop.local/schemas/workbench-snapshot.v1.json",
3
+ "$id": "https://tutti.local/schemas/workbench-snapshot.v1.json",
4
4
  "title": "WorkbenchSnapshotV1",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workbench-snapshot",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",