@velajs/studio-protocol 2.0.0
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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/dist/index.d.ts +1285 -0
- package/dist/index.js +775 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/errors.ts","../src/capabilities.ts","../src/data.ts","../src/connection.ts","../src/app.ts","../src/ops.ts","../src/http.ts","../src/responses.ts"],"sourcesContent":["/**\n * Studio error wire shape + the closed catalog of Studio-specific error codes.\n *\n * `AdminErrorBody` is a STRUCTURAL MIRROR of `@velajs/errors` `WireErrorObject`\n * (`errors/src/to-error-body.ts`), enriched with the `title` and `status` the\n * UI renders directly off the error envelope. The server enriches a\n * `WireErrorObject` (from `toErrorBody`) into this shape; a drift guard asserting\n * field compatibility lives in the server package.\n */\n\n/**\n * The client-bound error body carried by a failed {@link AdminRpcResponse}.\n *\n * Shared fields (`code`, `message`, `hint`, `docsUrl`, `details`) mirror\n * `WireErrorObject`; `title` and `status` are the Studio-facing enrichment.\n */\nexport interface AdminErrorBody {\n /** Stable, dot/underscore-namespaced machine code (e.g. `STUDIO_DISABLED`). */\n code: string;\n /** Human-readable, catalog-sourced summary of the error class. */\n title: string;\n /** HTTP status this error maps to. */\n status: number;\n /** Redaction-safe message (unbranded errors carry only their status title). */\n message: string;\n /** Optional actionable remediation hint. */\n hint?: string;\n /** Optional link to documentation for this error class. */\n docsUrl?: string;\n /** Optional wire-encoded structured data (mirrors `WireErrorObject.details`). */\n details?: unknown;\n}\n\n/**\n * The structured payload carried on {@link AdminErrorBody.details} of a\n * `STUDIO_CONFIRM_REQUIRED` (428) error — the server's challenge for a\n * destructive op. The client re-sends the identical op args plus\n * {@link StudioConfirmChallenge.confirmToken} to complete the op.\n *\n * The token is single-use and payload-bound (see the server confirm signer);\n * `summary` is a human line the op handler supplies for the confirm dialog.\n * This is the canonical wire shape for the challenge — producers (server,\n * test fixtures) and consumers (UI decode) MUST use this type rather than\n * re-declaring it, so the two ends cannot drift.\n */\nexport interface StudioConfirmChallenge {\n /** Single-use, op+payload-bound token to echo back on the confirmed retry. */\n confirmToken: string;\n /** Epoch-ms after which the token is rejected. */\n expiresAt: number;\n /** Human-readable description of what the confirmed op will do. */\n summary: string;\n}\n\n/**\n * The closed set of Studio-specific error codes. `const` array + derived union\n * so the compile-time type and any runtime membership check can never drift.\n * Parenthetical statuses document the intended HTTP mapping (the wire carries\n * the concrete status on {@link AdminErrorBody}).\n */\nexport const STUDIO_ERROR_CODES = [\n /** Studio surface disabled (no token configured). */\n 'STUDIO_DISABLED',\n /** Missing or invalid bearer token (401). */\n 'STUDIO_UNAUTHORIZED',\n /** Dispatch target op is not registered (404). */\n 'STUDIO_UNKNOWN_OP',\n /** Op recognized but forbidden for this principal/config (403). */\n 'STUDIO_OP_FORBIDDEN',\n /** Ephemeral WS sub-token failed verification (401). */\n 'STUDIO_SUB_TOKEN_INVALID',\n /** Per-IP token bucket exhausted (429). */\n 'STUDIO_RATE_LIMITED',\n /** A confirmation token is required for this destructive op (428). */\n 'STUDIO_CONFIRM_REQUIRED',\n /** Referenced data model is unknown (404). */\n 'STUDIO_UNKNOWN_MODEL',\n /** Data editing is disabled (read-only Studio) (403). */\n 'DATA_EDIT_DISABLED',\n /** Time travel is unavailable in this environment (409). */\n 'TIMETRAVEL_UNAVAILABLE',\n /** Snapshot schema is incompatible with the current model (409). */\n 'TIMETRAVEL_SCHEMA_MISMATCH',\n /** The backing feature/package is present but not configured (404). */\n 'FEATURE_UNCONFIGURED',\n] as const;\n\n/** Union of every Studio-specific error code. */\nexport type StudioErrorCode = (typeof STUDIO_ERROR_CODES)[number];\n","import type { StudioOp } from './ops';\n/**\n * Capability negotiation shapes. Studio's `studio.capabilities` op returns this\n * derived, wire-facing view: which feature namespaces are live, which write\n * gates are open, and the time-travel capability shape (or `null` when unbound).\n *\n * The server config expresses editable permission in 4 categories\n * (data / schema / identity / ops); the wire carries only the derived\n * {@link StudioWriteGates} below.\n */\nimport type { TimeTravelCapabilities } from './time-travel';\n\n/**\n * The closed set of feature keys the UI navigates by. `const` array + derived\n * union so a feature panel can light up iff the app actually wired that package.\n */\nexport const STUDIO_FEATURE_KEYS = [\n 'app',\n 'openapi',\n 'data',\n 'timeTravel',\n 'transfer',\n 'auth',\n 'authOrganizations',\n 'queue',\n 'schedule',\n 'flags',\n 'logs',\n 'audit',\n 'live',\n 'presence',\n] as const;\n\n/** Union of every Studio feature key. */\nexport type StudioFeatureKey = (typeof STUDIO_FEATURE_KEYS)[number];\n\n/**\n * The derived, wire-facing write gates. Default all `false` -> read-only Studio.\n * Op dispatch gates a write op against the gate named in its meta.\n */\nexport interface StudioWriteGates {\n /** Data-row create/update/delete/generate is permitted. */\n dataEditable: boolean;\n /** Schema-level edits are permitted. */\n schemaEditable: boolean;\n /** Operational actions (queue send/replay, schedule run-now, session revoke). */\n opsEditable: boolean;\n /** Reads/writes may run as a supplied identity. */\n runAsIdentity: boolean;\n /** Time-travel restore/undo/prune is permitted. */\n timeTravelRestore: boolean;\n /** Transfer import (bulk NDJSON ingest) is permitted. */\n transferImport: boolean;\n}\n\n/**\n * The full capability descriptor returned by `studio.capabilities`.\n * `timeTravel` is `null` when no {@link TimeTravelPort} is bound.\n */\nexport interface StudioCapabilities {\n /** Registered operations with a usable implementation; write permission is separate. */\n operations: StudioOp[];\n features: Record<StudioFeatureKey, boolean>;\n writes: StudioWriteGates;\n timeTravel: TimeTravelCapabilities | null;\n}\n","/**\n * Data-browser wire contract. Model discovery + row access shapes.\n *\n * `StudioFilterOperator` is a compatible subset of `@velajs/crud`'s\n * `FilterOperator` (`crud/packages/core/src/adapter/query-types.ts`), and\n * `StudioPageInfo` is a structural mirror of crud's `PageInfo` (snake_case\n * preserved). Drift guards against the real crud package land in the server\n * package; see the report for mirror source paths.\n */\n\n/**\n * Grid filter operators — a subset of crud's `FILTER_OPERATORS`, chosen so every\n * member is assignment-compatible with crud's `FilterOperator`. `const` array +\n * derived union so compile-time type and runtime membership can't drift.\n */\nexport const STUDIO_FILTER_OPERATORS = [\n 'eq',\n 'ne',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'nin',\n 'like',\n 'ilike',\n 'null',\n 'between',\n] as const;\n\n/** Union of every supported grid filter operator. */\nexport type StudioFilterOperator = (typeof STUDIO_FILTER_OPERATORS)[number];\n\n/** One grid filter clause. */\nexport interface StudioGridFilter {\n field: string;\n operator: StudioFilterOperator;\n value: unknown;\n}\n\n/** A single column in a model, derived from the model schema. */\nexport interface StudioColumn {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'json' | 'unknown';\n pk: boolean;\n nullable: boolean;\n unique: boolean;\n /** Foreign-key reference, from `model.relations` foreignKey. */\n fk?: { table: string; relation: string };\n /** Managed field: timestamps / soft-delete / tenant. */\n managed: boolean;\n}\n\n/** Lightweight model listing entry. */\nexport interface StudioModelInfo {\n name: string;\n table: string;\n label: string;\n /** Adapter capability names available for this model (e.g. `search`, `aggregate`). */\n capabilities: string[];\n}\n\n/** Full descriptor for a single model. */\nexport interface StudioModelDescriptor {\n name: string;\n table: string;\n primaryKeys: string[];\n columns: StudioColumn[];\n relations: Array<{\n name: string;\n type: 'hasOne' | 'hasMany' | 'belongsTo';\n target: string;\n foreignKey: string;\n cascade?: string;\n }>;\n flags: { softDelete: boolean; multiTenant: boolean; versioning: boolean; audit: boolean };\n supports: { bulkWrites: boolean; facets: boolean; search: boolean; cascade: boolean };\n}\n\n/** Request to list rows of a model. */\nexport interface ListRowsRequest {\n model: string;\n filters?: StudioGridFilter[];\n sort?: { field: string; order: 'asc' | 'desc' };\n page?: number;\n perPage?: number;\n cursor?: string;\n search?: string;\n withDeleted?: boolean;\n}\n\n/**\n * Pagination metadata — structural mirror of `@velajs/crud` `PageInfo`\n * (snake_case field names preserved for faithful mirroring).\n */\nexport interface StudioPageInfo {\n page: number;\n per_page: number;\n total_count?: number;\n total_pages?: number;\n has_next_page: boolean;\n has_prev_page: boolean;\n /** Next-page cursor (keyset pagination). Walks are next-only. */\n next_cursor?: string;\n}\n\n/** A page of untyped rows plus pagination metadata. */\nexport interface StudioRowPage {\n rows: Array<Record<string, unknown>>;\n info: StudioPageInfo;\n}\n\n/** Request to write (create or patch) a single row. */\nexport interface WriteRowRequest {\n model: string;\n /** Present for an update; absent for a create. */\n id?: string;\n patch: Record<string, unknown>;\n confirmToken?: string;\n}\n\n/** Request to delete rows (soft or hard). Destructive: `confirmToken` required. */\nexport interface DeleteRowsRequest {\n model: string;\n ids: string[];\n mode: 'soft' | 'hard';\n confirmToken: string;\n}\n\n/** Request to clear an entire table. Destructive: `confirmToken` required. */\nexport interface ClearTableRequest {\n model: string;\n confirmToken: string;\n}\n\n/** Request faceted counts for a field. */\nexport interface FacetsRequest {\n model: string;\n field: string;\n filters?: StudioGridFilter[];\n limit?: number;\n}\n\n/** Faceted count buckets. */\nexport interface FacetsResponse {\n buckets: Array<{ value: unknown; count: number }>;\n}\n\n/** Request a cascade-delete preview for the given rows. */\nexport interface CascadePreviewRequest {\n model: string;\n ids: string[];\n}\n\n/** The relations a cascade delete would touch. */\nexport interface CascadePreviewResponse {\n relations: Array<{ relation: string; target: string; action: string; affected: number }>;\n}\n\n/** Request to generate synthetic rows. */\nexport interface GenerateRowsRequest {\n model: string;\n count: number;\n overrides?: Record<string, unknown>;\n}\n\n/** Result of a generate-rows write. */\nexport interface GenerateRowsResponse {\n inserted: number;\n}\n","/** Browser configuration emitted by the loopback host. Never contains the master token. */\nexport interface StudioConnection {\n protocolVersion: 2;\n routerBasePath: string;\n adminBasePath: string;\n apiRequestPath: string;\n sessionToken: string;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isLocalPath(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.startsWith('/') &&\n !value.startsWith('//') &&\n !/[\\\\\\\\?#\\s]/.test(value)\n );\n}\n\nexport function parseStudioConnection(value: unknown): StudioConnection {\n if (\n !isRecord(value) ||\n value.protocolVersion !== 2 ||\n !isLocalPath(value.routerBasePath) ||\n !isLocalPath(value.adminBasePath) ||\n !isLocalPath(value.apiRequestPath) ||\n typeof value.sessionToken !== 'string' ||\n value.sessionToken.length === 0\n ) {\n throw new Error('Invalid Studio connection configuration.');\n }\n return {\n protocolVersion: value.protocolVersion,\n routerBasePath: value.routerBasePath,\n adminBasePath: value.adminBasePath,\n apiRequestPath: value.apiRequestPath,\n sessionToken: value.sessionToken,\n };\n}\n","import { isRecord } from './connection';\n\n/**\n * Application-introspection wire contract (the `app.*` and `api.authorizeTryIt` ops).\n *\n * `RouteRow` mirrors `@velajs/cli` `introspect.ts` `RouteRow`, and `ModuleNode`\n * mirrors vela's `ModuleDescription` (`vela/src/container/types.ts`) field-for-\n * field. `EntrypointRow` intentionally carries `meta?: unknown` (the wire shape)\n * rather than the CLI's serialized `meta: string`. See the report for sources.\n */\n\n/** One row of the app route table. Mirrors `@velajs/cli` `RouteRow`. */\nexport interface RouteRow {\n method: string;\n path: string;\n /** `Controller#handler`, or `(mounted)` for routes vela did not compose itself. */\n handler: string;\n source: 'controller' | 'mounted';\n}\n\n/**\n * One module instance in the loaded graph. Structural mirror of vela's\n * `ModuleDescription` (`Container.getModuleDescriptions()`).\n */\nexport interface ModuleNode {\n moduleId: string;\n /** moduleIds this instance imports. */\n imports: string[];\n isGlobal: boolean;\n lazy: boolean;\n /** Token labels registered in this instance's bucket (registration order). */\n providers: string[];\n /** Token labels this instance exports. */\n exports: string[];\n}\n\n/** One entrypoint entry (queue/cron/etc.). Wire shape: `meta` is optional/unknown. */\nexport interface EntrypointRow {\n kind: string;\n target: string;\n meta?: unknown;\n}\n\n/** An API \"try it\" request proxied against the app. */\nexport interface TryItRequest {\n method: string;\n path: string;\n query?: Record<string, string>;\n headers?: Record<string, string>;\n body?: unknown;\n}\n\n/** The response captured from a \"try it\" request. */\nexport interface TryItResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n}\n\nfunction stringMap(input: unknown): Record<string, string> | undefined {\n if (input === undefined) return undefined;\n if (!isRecord(input)) throw new Error('Expected string-valued headers or query parameters.');\n const result: Record<string, string> = {};\n for (const [key, item] of Object.entries(input)) {\n if (typeof item !== 'string')\n throw new Error('Expected string-valued headers or query parameters.');\n result[key] = item;\n }\n return result;\n}\n\n/** Validate JSON from the local API explorer before any request can be sent. */\nexport function parseTryItRequest(value: unknown): TryItRequest {\n if (\n !isRecord(value) ||\n typeof value.method !== 'string' ||\n !/^(GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS)$/i.test(value.method) ||\n typeof value.path !== 'string' ||\n !value.path.startsWith('/') ||\n value.path.startsWith('//') ||\n /[\\\\\\\\#\\s{}]/.test(value.path)\n ) {\n throw new Error('Expected an HTTP method and a resolved absolute path on the Worker.');\n }\n return {\n method: value.method.toUpperCase(),\n path: value.path,\n query: stringMap(value.query),\n headers: stringMap(value.headers),\n body: value.body,\n };\n}\n\nexport function parseTryItResponse(value: unknown): TryItResponse {\n if (\n !isRecord(value) ||\n typeof value.status !== 'number' ||\n !Number.isInteger(value.status) ||\n value.status < 100 ||\n value.status > 599 ||\n !isRecord(value.headers) ||\n !('body' in value)\n )\n throw new Error('Invalid API response.');\n const headers: Record<string, string> = {};\n for (const [key, item] of Object.entries(value.headers)) {\n if (typeof item !== 'string') throw new Error('Invalid API response headers.');\n headers[key] = item;\n }\n return { status: value.status, headers, body: value.body };\n}\n","/**\n * The closed op catalog: the single source of truth for the Studio RPC surface.\n *\n * `StudioRpcMap` names every op with its `req`/`res` types; `StudioOp` is the op\n * union; `STUDIO_OPS` is the runtime const array; `STUDIO_OP_META` classifies\n * each op for dispatch (read/write), feature negotiation, write-gating, and\n * destructive-confirm handling.\n *\n * Breaking changes increment STUDIO_PROTOCOL_VERSION and update all consumers.\n */\nimport type { StudioCapabilities, StudioFeatureKey, StudioWriteGates } from './capabilities';\nimport type {\n CascadePreviewRequest,\n CascadePreviewResponse,\n ClearTableRequest,\n DeleteRowsRequest,\n FacetsRequest,\n FacetsResponse,\n GenerateRowsRequest,\n GenerateRowsResponse,\n ListRowsRequest,\n StudioModelDescriptor,\n StudioModelInfo,\n StudioRowPage,\n WriteRowRequest,\n} from './data';\nimport type { EntrypointRow, ModuleNode, RouteRow, TryItRequest } from './app';\nimport type {\n AdminAuditEntry,\n AdminLogEntry,\n AuthOrgRow,\n AuthSessionRow,\n AuthUserDetail,\n AuthUserRow,\n CronTriggerRow,\n DlqEntryRow,\n FlagEvaluation,\n FlagRow,\n LiveSubscriptionRow,\n PresenceRoomRow,\n QueueDepthRow,\n QueueRow,\n ScheduleJobRow,\n TransferExportResult,\n TransferImportRequest,\n TransferImportResult,\n} from './panels';\nimport type {\n RestoreOutcome,\n RestorePreview,\n RestoreRequest,\n RestoreTarget,\n RetentionPolicy,\n TimeTravelCapabilities,\n TimeTravelMark,\n TimeTravelMarkPage,\n TimeTravelScope,\n} from './time-travel';\n\n/** A request that carries no arguments. */\nexport type EmptyArgs = Record<string, never>;\n\n/**\n * The closed catalog of every Studio op, keyed by op name. Each entry declares\n * its `req` (dispatch args) and `res` (result) type.\n */\nexport interface StudioRpcMap {\n // capability negotiation\n 'studio.capabilities': { req: EmptyArgs; res: StudioCapabilities };\n\n // application introspection\n 'app.routes': { req: EmptyArgs; res: RouteRow[] };\n 'app.modules': { req: EmptyArgs; res: ModuleNode[] };\n 'app.entrypoints': { req: EmptyArgs; res: EntrypointRow[] };\n 'app.openapi': { req: EmptyArgs; res: unknown };\n 'api.authorizeTryIt': { req: TryItRequest; res: { authorized: true } };\n\n // data browser\n 'data.listModels': { req: EmptyArgs; res: StudioModelInfo[] };\n 'data.describeModel': { req: { model: string }; res: StudioModelDescriptor };\n 'data.listRows': { req: ListRowsRequest; res: StudioRowPage };\n 'data.readRow': { req: { model: string; id: string }; res: Record<string, unknown> | null };\n 'data.facets': { req: FacetsRequest; res: FacetsResponse };\n 'data.cascadePreview': { req: CascadePreviewRequest; res: CascadePreviewResponse };\n 'data.writeRow': { req: WriteRowRequest; res: Record<string, unknown> };\n 'data.deleteRows': { req: DeleteRowsRequest; res: { deleted: number } };\n 'data.clearTable': { req: ClearTableRequest; res: { deleted: number } };\n 'data.generateRows': { req: GenerateRowsRequest; res: GenerateRowsResponse };\n\n // time travel\n 'timeTravel.capabilities': { req: { scope?: TimeTravelScope }; res: TimeTravelCapabilities };\n 'timeTravel.currentMark': { req: { scope?: TimeTravelScope }; res: TimeTravelMark };\n 'timeTravel.markForTime': {\n req: { time: number | string; scope?: TimeTravelScope };\n res: TimeTravelMark | null;\n };\n 'timeTravel.listMarks': {\n req: { scope?: TimeTravelScope; limit?: number; before?: string };\n res: TimeTravelMarkPage;\n };\n 'timeTravel.preview': {\n req: { target: RestoreTarget; scope?: TimeTravelScope };\n res: RestorePreview;\n };\n 'timeTravel.armRestore': { req: RestoreRequest; res: RestoreOutcome };\n 'timeTravel.undo': {\n req: { undoMark: string; scope?: TimeTravelScope; confirmToken: string };\n res: RestoreOutcome;\n };\n 'timeTravel.createSnapshot': {\n req: { scope?: TimeTravelScope; label?: string };\n res: TimeTravelMark;\n };\n 'timeTravel.prune': {\n req: { retention: RetentionPolicy; scope?: TimeTravelScope; confirmToken: string };\n res: { pruned: number };\n };\n\n // transfer (export / import)\n 'transfer.export': { req: { model?: string }; res: TransferExportResult };\n 'transfer.import': { req: TransferImportRequest; res: TransferImportResult };\n\n // auth\n 'auth.users': {\n req: { q?: string; cursor?: string };\n res: { rows: AuthUserRow[]; nextCursor?: string };\n };\n 'auth.userDetail': { req: { id: string }; res: AuthUserDetail };\n 'auth.sessions': { req: { userId?: string }; res: AuthSessionRow[] };\n 'auth.revokeSession': { req: { sessionId: string }; res: { ok: true } };\n 'auth.organizations': { req: EmptyArgs; res: AuthOrgRow[] };\n\n // queue\n 'queue.list': { req: EmptyArgs; res: QueueRow[] };\n 'queue.depths': { req: EmptyArgs; res: QueueDepthRow[] };\n 'queue.dlq': { req: { queue: string }; res: DlqEntryRow[] };\n 'queue.send': { req: { queue: string; payload: unknown }; res: { id: string } };\n 'queue.replay': { req: { queue: string; ids: string[] }; res: { replayed: number } };\n\n // schedule\n 'schedule.jobs': { req: EmptyArgs; res: ScheduleJobRow[] };\n 'schedule.triggers': { req: EmptyArgs; res: CronTriggerRow[] };\n 'schedule.runNow': { req: { id: string }; res: { ok: true } };\n\n // flags\n 'flags.list': { req: EmptyArgs; res: FlagRow[] };\n 'flags.evaluate': {\n req: { key: string; context?: Record<string, unknown> };\n res: FlagEvaluation;\n };\n\n // observability\n 'logs.tail': { req: { level?: AdminLogEntry['level']; limit?: number }; res: AdminLogEntry[] };\n 'live.subscriptions': { req: EmptyArgs; res: LiveSubscriptionRow[] };\n 'presence.rooms': { req: EmptyArgs; res: PresenceRoomRow[] };\n 'audit.tail': { req: { limit?: number }; res: AdminAuditEntry[] };\n}\n\n/** The union of every op name. */\nexport type StudioOp = keyof StudioRpcMap;\n\n/** The `req` type for an op. */\nexport type StudioOpReq<Op extends StudioOp> = StudioRpcMap[Op]['req'];\n\n/** The `res` type for an op. */\nexport type StudioOpRes<Op extends StudioOp> = StudioRpcMap[Op]['res'];\n\n/**\n * Runtime classification of a single op. Single source for dispatch\n * (read/write), capability negotiation (`feature`), write-gating (`gate`), and\n * destructive-confirm handling (`destructive`).\n */\nexport interface StudioOpMeta {\n mode: 'read' | 'write';\n feature: StudioFeatureKey;\n gate?: keyof StudioWriteGates;\n destructive?: true;\n}\n\n/**\n * Op meta for every op. `as const satisfies` enforces total key coverage while\n * preserving literal types (so `destructive` narrows exactly), which drives the\n * type-level destructive-confirm guard in the tests.\n */\nexport const STUDIO_OP_META = {\n 'studio.capabilities': { mode: 'read', feature: 'app' },\n\n 'app.routes': { mode: 'read', feature: 'app' },\n 'app.modules': { mode: 'read', feature: 'app' },\n 'app.entrypoints': { mode: 'read', feature: 'app' },\n 'app.openapi': { mode: 'read', feature: 'openapi' },\n /** Authorizes a host HTTP request; server gates and audits this operational action. */\n 'api.authorizeTryIt': { mode: 'write', feature: 'openapi', gate: 'opsEditable' },\n\n 'data.listModels': { mode: 'read', feature: 'data' },\n 'data.describeModel': { mode: 'read', feature: 'data' },\n 'data.listRows': { mode: 'read', feature: 'data' },\n 'data.readRow': { mode: 'read', feature: 'data' },\n 'data.facets': { mode: 'read', feature: 'data' },\n 'data.cascadePreview': { mode: 'read', feature: 'data' },\n 'data.writeRow': { mode: 'write', feature: 'data', gate: 'dataEditable' },\n 'data.deleteRows': { mode: 'write', feature: 'data', gate: 'dataEditable', destructive: true },\n 'data.clearTable': { mode: 'write', feature: 'data', gate: 'dataEditable', destructive: true },\n 'data.generateRows': { mode: 'write', feature: 'data', gate: 'dataEditable' },\n\n 'timeTravel.capabilities': { mode: 'read', feature: 'timeTravel' },\n 'timeTravel.currentMark': { mode: 'read', feature: 'timeTravel' },\n 'timeTravel.markForTime': { mode: 'read', feature: 'timeTravel' },\n 'timeTravel.listMarks': { mode: 'read', feature: 'timeTravel' },\n 'timeTravel.preview': { mode: 'read', feature: 'timeTravel' },\n 'timeTravel.armRestore': {\n mode: 'write',\n feature: 'timeTravel',\n gate: 'timeTravelRestore',\n destructive: true,\n },\n 'timeTravel.undo': {\n mode: 'write',\n feature: 'timeTravel',\n gate: 'timeTravelRestore',\n destructive: true,\n },\n 'timeTravel.createSnapshot': { mode: 'write', feature: 'timeTravel' },\n 'timeTravel.prune': {\n mode: 'write',\n feature: 'timeTravel',\n gate: 'timeTravelRestore',\n destructive: true,\n },\n\n 'transfer.export': { mode: 'read', feature: 'transfer' },\n 'transfer.import': {\n mode: 'write',\n feature: 'transfer',\n gate: 'transferImport',\n destructive: true,\n },\n\n 'auth.users': { mode: 'read', feature: 'auth' },\n 'auth.userDetail': { mode: 'read', feature: 'auth' },\n 'auth.sessions': { mode: 'read', feature: 'auth' },\n 'auth.revokeSession': { mode: 'write', feature: 'auth', gate: 'opsEditable' },\n 'auth.organizations': { mode: 'read', feature: 'authOrganizations' },\n\n 'queue.list': { mode: 'read', feature: 'queue' },\n 'queue.depths': { mode: 'read', feature: 'queue' },\n 'queue.dlq': { mode: 'read', feature: 'queue' },\n 'queue.send': { mode: 'write', feature: 'queue', gate: 'opsEditable' },\n 'queue.replay': { mode: 'write', feature: 'queue', gate: 'opsEditable' },\n\n 'schedule.jobs': { mode: 'read', feature: 'schedule' },\n 'schedule.triggers': { mode: 'read', feature: 'schedule' },\n 'schedule.runNow': { mode: 'write', feature: 'schedule', gate: 'opsEditable' },\n\n 'flags.list': { mode: 'read', feature: 'flags' },\n 'flags.evaluate': { mode: 'read', feature: 'flags' },\n\n 'logs.tail': { mode: 'read', feature: 'logs' },\n 'live.subscriptions': { mode: 'read', feature: 'live' },\n 'presence.rooms': { mode: 'read', feature: 'presence' },\n 'audit.tail': { mode: 'read', feature: 'audit' },\n} as const satisfies Record<StudioOp, StudioOpMeta>;\n\n/**\n * Every op name as a runtime const array. Kept as a literal tuple (via\n * `as const satisfies`) so the exhaustiveness drift guard can compare its\n * element union against `keyof StudioRpcMap` in both directions.\n */\nexport const STUDIO_OPS = [\n 'studio.capabilities',\n 'app.routes',\n 'app.modules',\n 'app.entrypoints',\n 'app.openapi',\n 'api.authorizeTryIt',\n 'data.listModels',\n 'data.describeModel',\n 'data.listRows',\n 'data.readRow',\n 'data.facets',\n 'data.cascadePreview',\n 'data.writeRow',\n 'data.deleteRows',\n 'data.clearTable',\n 'data.generateRows',\n 'timeTravel.capabilities',\n 'timeTravel.currentMark',\n 'timeTravel.markForTime',\n 'timeTravel.listMarks',\n 'timeTravel.preview',\n 'timeTravel.armRestore',\n 'timeTravel.undo',\n 'timeTravel.createSnapshot',\n 'timeTravel.prune',\n 'transfer.export',\n 'transfer.import',\n 'auth.users',\n 'auth.userDetail',\n 'auth.sessions',\n 'auth.revokeSession',\n 'auth.organizations',\n 'queue.list',\n 'queue.depths',\n 'queue.dlq',\n 'queue.send',\n 'queue.replay',\n 'schedule.jobs',\n 'schedule.triggers',\n 'schedule.runNow',\n 'flags.list',\n 'flags.evaluate',\n 'logs.tail',\n 'live.subscriptions',\n 'presence.rooms',\n 'audit.tail',\n] as const satisfies readonly StudioOp[];\n\n/**\n * The subset of ops flagged destructive (they carry a `confirmToken`). Derived\n * from the op union so it can't drift from {@link STUDIO_OP_META}.\n */\nexport type DestructiveStudioOp = {\n [K in StudioOp]: (typeof STUDIO_OP_META)[K] extends { destructive: true } ? K : never;\n}[StudioOp];\n","/**\n * Transport constants shared by the server module, the UI, and the dev host.\n * String literals + one integer version marker; zero runtime dependencies.\n */\n\n/** Default reserved prefix the admin surface mounts under. */\nexport const STUDIO_DEFAULT_PATH = '/_vela/admin';\n\n/** Unauthenticated health probe suffix (`GET {prefix}/health`). */\nexport const STUDIO_HEALTH_SUFFIX = '/health';\n\n/** RPC dispatch suffix (`POST {prefix}/rpc/:op`). */\nexport const STUDIO_RPC_SUFFIX = '/rpc/';\n\n/** Ephemeral WS sub-token mint suffix (`POST {prefix}/ws-token`). */\nexport const STUDIO_WS_TOKEN_SUFFIX = '/ws-token';\n\n/** Snapshot/transfer export suffix (`GET {prefix}/export`). */\nexport const STUDIO_EXPORT_SUFFIX = '/export';\n\n/** The header carrying the master bearer token (`Authorization: Bearer <token>`). */\nexport const STUDIO_TOKEN_HEADER = 'authorization';\n\n/** The wire protocol version. Bumped only on a breaking envelope change. */\nexport const STUDIO_PROTOCOL_VERSION = 2;\n","import { z } from 'zod';\nimport { STUDIO_FEATURE_KEYS } from './capabilities';\nimport { STUDIO_OPS, STUDIO_OP_META } from './ops';\nimport type { StudioOp, StudioOpRes } from './ops';\nimport type { AdminRpcResponse } from './envelope';\n\nconst row = z.record(z.string(), z.unknown());\nconst strings = z.array(z.string());\nconst timeTravelCapabilities = z.object({\n markByTime: z.boolean(),\n list: z.boolean(),\n undo: z.boolean(),\n inPlace: z.boolean(),\n restartRequired: z.boolean(),\n portableExport: z.boolean(),\n createOnDemand: z.boolean(),\n granularity: z.enum(['bookmark', 'snapshot', 'snapshot+cdc']),\n scopeNote: z.string(),\n});\nconst mark = z.object({\n id: z.string(),\n kind: z.enum(['bookmark', 'snapshot']),\n time: z.number().optional(),\n label: z.string().optional(),\n schemaHash: z.string().optional(),\n sizeBytes: z.number().optional(),\n tables: strings.optional(),\n});\nconst restoreOutcome = z.object({\n restoredTo: z.string(),\n undoMark: mark.optional(),\n applied: z.boolean(),\n restartRequested: z.boolean(),\n});\nconst user = z.object({\n id: z.string(),\n email: z.string(),\n name: z.string().optional(),\n emailVerified: z.boolean(),\n image: z.string().optional(),\n role: z.string().optional(),\n banned: z.boolean().optional(),\n createdAt: z.number(),\n});\nconst session = z.object({\n id: z.string(),\n userId: z.string(),\n createdAt: z.number(),\n expiresAt: z.number(),\n ipAddress: z.string().optional(),\n userAgent: z.string().optional(),\n});\nconst organization = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string().optional(),\n memberCount: z.number().optional(),\n createdAt: z.number(),\n});\nconst flagValue = z.union([z.boolean(), z.string(), z.number(), row, z.array(z.unknown())]);\nconst deleted = z.object({ deleted: z.number() });\nconst acknowledged = z.object({ ok: z.literal(true) });\n\n/** Every operation must supply a concrete validator for its declared output. */\nexport const STUDIO_RESPONSE_PARSERS: {\n readonly [Op in StudioOp]: (value: unknown) => StudioOpRes<Op>;\n} = {\n 'studio.capabilities': z.object({\n operations: z.array(z.enum(STUDIO_OPS)),\n features: z.record(z.enum(STUDIO_FEATURE_KEYS), z.boolean()),\n writes: z.object({\n dataEditable: z.boolean(),\n schemaEditable: z.boolean(),\n opsEditable: z.boolean(),\n runAsIdentity: z.boolean(),\n timeTravelRestore: z.boolean(),\n transferImport: z.boolean(),\n }),\n timeTravel: timeTravelCapabilities.nullable(),\n }).parse,\n 'app.routes': z.array(\n z.object({\n method: z.string(),\n path: z.string(),\n handler: z.string(),\n source: z.enum(['controller', 'mounted']),\n }),\n ).parse,\n 'app.modules': z.array(\n z.object({\n moduleId: z.string(),\n imports: strings,\n isGlobal: z.boolean(),\n lazy: z.boolean(),\n providers: strings,\n exports: strings,\n }),\n ).parse,\n 'app.entrypoints': z.array(\n z.object({\n kind: z.string(),\n target: z.string(),\n meta: z.unknown().optional(),\n }),\n ).parse,\n 'app.openapi': z.unknown().parse,\n 'api.authorizeTryIt': z.object({ authorized: z.literal(true) }).parse,\n 'data.listModels': z.array(\n z.object({\n name: z.string(),\n table: z.string(),\n label: z.string(),\n capabilities: strings,\n }),\n ).parse,\n 'data.describeModel': z.object({\n name: z.string(),\n table: z.string(),\n primaryKeys: strings,\n columns: z.array(\n z.object({\n name: z.string(),\n type: z.enum(['string', 'number', 'boolean', 'date', 'json', 'unknown']),\n pk: z.boolean(),\n nullable: z.boolean(),\n unique: z.boolean(),\n managed: z.boolean(),\n fk: z.object({ table: z.string(), relation: z.string() }).optional(),\n }),\n ),\n relations: z.array(\n z.object({\n name: z.string(),\n type: z.enum(['hasOne', 'hasMany', 'belongsTo']),\n target: z.string(),\n foreignKey: z.string(),\n cascade: z.string().optional(),\n }),\n ),\n flags: z.object({\n softDelete: z.boolean(),\n multiTenant: z.boolean(),\n versioning: z.boolean(),\n audit: z.boolean(),\n }),\n supports: z.object({\n bulkWrites: z.boolean(),\n facets: z.boolean(),\n search: z.boolean(),\n cascade: z.boolean(),\n }),\n }).parse,\n 'data.listRows': z.object({\n rows: z.array(row),\n info: z.object({\n page: z.number(),\n per_page: z.number(),\n total_count: z.number().optional(),\n total_pages: z.number().optional(),\n has_next_page: z.boolean(),\n has_prev_page: z.boolean(),\n next_cursor: z.string().optional(),\n }),\n }).parse,\n 'data.readRow': row.nullable().parse,\n 'data.facets': z.object({ buckets: z.array(z.object({ value: z.unknown(), count: z.number() })) })\n .parse,\n 'data.cascadePreview': z.object({\n relations: z.array(\n z.object({\n relation: z.string(),\n target: z.string(),\n action: z.string(),\n affected: z.number(),\n }),\n ),\n }).parse,\n 'data.writeRow': row.parse,\n 'data.deleteRows': deleted.parse,\n 'data.clearTable': deleted.parse,\n 'data.generateRows': z.object({ inserted: z.number() }).parse,\n 'timeTravel.capabilities': timeTravelCapabilities.parse,\n 'timeTravel.currentMark': mark.parse,\n 'timeTravel.markForTime': mark.nullable().parse,\n 'timeTravel.listMarks': z.object({ marks: z.array(mark), nextCursor: z.string().optional() })\n .parse,\n 'timeTravel.preview': z.object({\n target: mark,\n affectedTables: z.array(z.object({ table: z.string(), approxRows: z.number().optional() })),\n schemaCompatible: z.boolean(),\n incompatibleTables: strings,\n undoAvailable: z.boolean(),\n restartRequired: z.boolean(),\n confirmToken: z.string(),\n expiresAt: z.number(),\n }).parse,\n 'timeTravel.armRestore': restoreOutcome.parse,\n 'timeTravel.undo': restoreOutcome.parse,\n 'timeTravel.createSnapshot': mark.parse,\n 'timeTravel.prune': z.object({ pruned: z.number() }).parse,\n 'transfer.export': z.object({ exportUrl: z.string() }).parse,\n 'transfer.import': z.object({\n imported: z.number(),\n errors: z.array(z.object({ line: z.number(), message: z.string() })),\n }).parse,\n 'auth.users': z.object({ rows: z.array(user), nextCursor: z.string().optional() }).parse,\n 'auth.userDetail': z.object({\n user,\n sessions: z.array(session),\n organizations: z.array(organization),\n }).parse,\n 'auth.sessions': z.array(session).parse,\n 'auth.revokeSession': acknowledged.parse,\n 'auth.organizations': z.array(organization).parse,\n 'queue.list': z.array(\n z.object({ name: z.string(), kind: z.string(), depth: z.number().optional() }),\n ).parse,\n 'queue.depths': z.array(\n z.object({ name: z.string(), depth: z.number(), inFlight: z.number().optional() }),\n ).parse,\n 'queue.dlq': z.array(\n z.object({\n id: z.string(),\n queue: z.string(),\n failedAt: z.number(),\n attempts: z.number(),\n error: z.string().optional(),\n payload: z.unknown().optional(),\n }),\n ).parse,\n 'queue.send': z.object({ id: z.string() }).parse,\n 'queue.replay': z.object({ replayed: z.number() }).parse,\n 'schedule.jobs': z.array(\n z.object({\n name: z.string(),\n kind: z.enum(['cron', 'interval']),\n expression: z.string().optional(),\n ms: z.number().optional(),\n lastRun: z.number().optional(),\n nextRun: z.number().optional(),\n }),\n ).parse,\n 'schedule.triggers': z.array(\n z.object({ name: z.string(), cron: z.string(), nextRun: z.number().optional() }),\n ).parse,\n 'schedule.runNow': acknowledged.parse,\n 'flags.list': z.array(z.object({ key: z.string(), value: flagValue })).parse,\n 'flags.evaluate': z.object({\n flagKey: z.string(),\n value: flagValue,\n reason: z.enum(['STATIC', 'DEFAULT', 'ERROR']),\n errorMessage: z.string().optional(),\n }).parse,\n 'logs.tail': z.array(\n z.object({\n ts: z.number(),\n level: z.enum(['debug', 'info', 'warn', 'error']),\n msg: z.string(),\n source: z.string().optional(),\n fields: row.optional(),\n }),\n ).parse,\n 'live.subscriptions': z.array(\n z.object({\n id: z.string(),\n room: z.string(),\n tags: strings,\n connectedAt: z.number(),\n clientId: z.string().optional(),\n }),\n ).parse,\n 'presence.rooms': z.array(\n z.object({ room: z.string(), count: z.number(), members: strings.optional() }),\n ).parse,\n 'audit.tail': z.array(\n z.object({\n ts: z.number(),\n op: z.string(),\n mode: z.enum(['read', 'write']),\n subject: z.string(),\n status: z.number(),\n ms: z.number(),\n ip: z.string().nullable(),\n detail: z\n .object({\n target: z.string().optional(),\n summary: z.string().optional(),\n extra: row.optional(),\n })\n .optional(),\n }),\n ).parse,\n};\n\n/** The result type comes only from the selected operation and its validator. */\nexport function parseStudioResponse<Op extends StudioOp>(op: Op, value: unknown): StudioOpRes<Op> {\n return STUDIO_RESPONSE_PARSERS[op](value);\n}\n\nconst errorStatus = z.number().int().min(400).max(599);\nconst envelope = z.discriminatedUnion('ok', [\n z.object({\n ok: z.literal(true),\n op: z.string(),\n data: z.unknown(),\n meta: z.object({ ms: z.number(), op: z.string(), mode: z.enum(['read', 'write']) }),\n }),\n z.object({\n ok: z.literal(false),\n op: z.string(),\n status: errorStatus,\n error: z.object({\n code: z.string(),\n title: z.string(),\n status: errorStatus,\n message: z.string(),\n hint: z.string().optional(),\n docsUrl: z.string().optional(),\n details: z.unknown().optional(),\n }),\n }),\n]);\n\n/** Validate the envelope, operation identity, and operation-specific payload. */\nexport function parseStudioRpcResponse<Op extends StudioOp>(\n op: Op,\n value: unknown,\n): AdminRpcResponse<StudioOpRes<Op>> {\n const parsed = envelope.parse(value);\n if (parsed.op !== op) throw new Error('Studio response operation does not match the request.');\n if (!parsed.ok) {\n if (parsed.status !== parsed.error.status) throw new Error('Inconsistent Studio error status.');\n return parsed;\n }\n if (parsed.meta.op !== op || parsed.meta.mode !== STUDIO_OP_META[op].mode) {\n throw new Error('Studio response metadata does not match the request.');\n }\n return { ...parsed, data: parseStudioResponse(op, parsed.data) };\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@velajs/studio-protocol",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Vela Studio wire contract, operation schemas, envelopes, and capabilities",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"admin",
|
|
7
|
+
"protocol",
|
|
8
|
+
"studio",
|
|
9
|
+
"vela"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/velajs/vela/tree/main/studio/packages/protocol#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/velajs/vela/issues"
|
|
14
|
+
},
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"author": "ksh",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/velajs/vela.git",
|
|
20
|
+
"directory": "studio/packages/protocol"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE",
|
|
26
|
+
"CHANGELOG.md"
|
|
27
|
+
],
|
|
28
|
+
"type": "module",
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"import": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"zod": "4.4.3"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"tsdown": "0.23.0",
|
|
43
|
+
"typescript": "7.0.2",
|
|
44
|
+
"vitest": "4.1.10"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=24"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsdown",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"typecheck": "tsc --noEmit"
|
|
56
|
+
}
|
|
57
|
+
}
|