@anuragpal02/zcl-contracts 0.27.0 → 0.29.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/dist/client.d.ts +10 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -1
- package/dist/projects.d.ts +260 -0
- package/dist/projects.d.ts.map +1 -1
- package/dist/projects.js +170 -1
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { type ApiErrorCode } from './common.js';
|
|
|
4
4
|
import { type CreditBalanceResponse } from './credits.js';
|
|
5
5
|
import { workspaceMemberSchema, type CreateWorkspaceRequest, type InviteMemberRequest, type InviteMemberResponse, type ListMembersResponse, type UpdateMemberRoleRequest, type UpdateWorkspaceRequest, type Workspace, type WorkspaceMembership } from './workspaces.js';
|
|
6
6
|
import { type Asset, type AssetUpload, type CreateAssetUploadRequest, type CreateAssetUploadResponse, type FinalizeAssetUploadRequest, type ListAssetsResponse, type ListWorkspaceAssetsResponse, type WorkspaceAssetFilter } from './assets.js';
|
|
7
|
-
import { projectRunListResponseSchema, projectRunResponseSchema, type CreateProjectRequest, type CreateProjectRunRequest, type LedMapResponse, type ListProjectRunsQuery, type ListProjectsQuery, type Project, type UpdateLedMapRequest, type UpdateProjectRequest, type UpdateProjectRunRequest } from './projects.js';
|
|
7
|
+
import { projectRunListResponseSchema, projectRunResponseSchema, type CreateLedMapRequest, type CreateProjectRequest, type CreateProjectRunRequest, type LedMapListResponse, type LedMapResponse, type LedMapUpdateResponse, type LedMapUsageResponse, type ListLedMapsQuery, type ListProjectRunsQuery, type ListProjectsQuery, type Project, type UpdateLedMapMetadataRequest, type UpdateLedMapRequest, type UpdateProjectRequest, type UpdateProjectRunRequest } from './projects.js';
|
|
8
8
|
import { type CreateGenerationJobRequest, type CreatePanelSetRequest, type CreatePanelSetResponse, type CreateSmartVideoRequest, type CreateSmartVideoResponse, type CreateVideoLoopRequest, type CreateVideoUpscaleRequest, type EditGenerationJobRequest, type GenerationJobResponse, type GenerationJobStatus, type GenerationJobType, type ListGenerationJobsResponse } from './generation.js';
|
|
9
9
|
import { type DescribeImageRequest, type DescribeImageResponse } from './assistant.js';
|
|
10
10
|
import { type AdminAdjustCreditsRequest, type AdminAdjustCreditsResponse, type AdminJobDetailResponse, type AdminJobStatus, type AdminMeResponse, type AdminUsageResponse, type AdminUserDetailResponse, type AdminWorkspaceDetailResponse, type ListAdminAuditResponse, type ListAdminJobsResponse, type ListAdminUsersResponse, type ListAdminWorkspacesResponse, type SetPlatformAdminRequest, type SetPlatformAdminResponse, type SetUserDisabledRequest, type SetUserDisabledResponse, type StepUpStartResponse, type StepUpVerifyResponse } from './admin.js';
|
|
@@ -82,6 +82,15 @@ export declare function createZclApiClient(options: ZclApiClientOptions): {
|
|
|
82
82
|
ledMaps: {
|
|
83
83
|
get(workspaceId: string, projectId: string): Promise<LedMapResponse>;
|
|
84
84
|
update(workspaceId: string, projectId: string, input: UpdateLedMapRequest): Promise<LedMapResponse>;
|
|
85
|
+
list(workspaceId: string, projectId: string, query?: ListLedMapsQuery): Promise<LedMapListResponse>;
|
|
86
|
+
create(workspaceId: string, projectId: string, input?: CreateLedMapRequest): Promise<LedMapResponse>;
|
|
87
|
+
getById(workspaceId: string, projectId: string, ledMapId: string): Promise<LedMapResponse>;
|
|
88
|
+
updateById(workspaceId: string, projectId: string, ledMapId: string, input: UpdateLedMapRequest): Promise<LedMapUpdateResponse>;
|
|
89
|
+
usage(workspaceId: string, projectId: string, ledMapId: string): Promise<LedMapUsageResponse>;
|
|
90
|
+
updateMetadata(workspaceId: string, projectId: string, ledMapId: string, input: UpdateLedMapMetadataRequest): Promise<LedMapResponse>;
|
|
91
|
+
remove(workspaceId: string, projectId: string, ledMapId: string): Promise<{
|
|
92
|
+
data: Record<string, never>;
|
|
93
|
+
}>;
|
|
85
94
|
};
|
|
86
95
|
runs: {
|
|
87
96
|
list(workspaceId: string, projectId: string, query?: ListProjectRunsQuery): Promise<z.infer<typeof projectRunListResponseSchema>>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EASL,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAA;AAClB,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtF,OAAO,EAOL,qBAAqB,EAIrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAOL,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -4,7 +4,7 @@ import { errorResponseSchema, listResponseSchema } from './common.js';
|
|
|
4
4
|
import { creditBalanceResponseSchema } from './credits.js';
|
|
5
5
|
import { createWorkspaceRequestSchema, inviteMemberRequestSchema, inviteMemberResponseSchema, listMembersResponseSchema, updateMemberRoleRequestSchema, updateWorkspaceRequestSchema, workspaceMemberSchema, workspaceMembershipSchema, workspaceResponseSchema, workspaceSchema } from './workspaces.js';
|
|
6
6
|
import { assetSchema, createAssetUploadRequestSchema, createAssetUploadResponseSchema, finalizeAssetUploadRequestSchema, listAssetsResponseSchema, listWorkspaceAssetsResponseSchema } from './assets.js';
|
|
7
|
-
import { createProjectRequestSchema, createProjectRunRequestSchema, ledMapResponseSchema, projectRunListResponseSchema, projectRunResponseSchema, projectSchema, updateLedMapRequestSchema, updateProjectRequestSchema, updateProjectRunRequestSchema } from './projects.js';
|
|
7
|
+
import { createLedMapRequestSchema, createProjectRequestSchema, createProjectRunRequestSchema, ledMapListResponseSchema, ledMapResponseSchema, ledMapUpdateResponseSchema, ledMapUsageResponseSchema, projectRunListResponseSchema, projectRunResponseSchema, projectSchema, updateLedMapMetadataRequestSchema, updateLedMapRequestSchema, updateProjectRequestSchema, updateProjectRunRequestSchema } from './projects.js';
|
|
8
8
|
import { createGenerationJobRequestSchema, createPanelSetRequestSchema, createPanelSetResponseSchema, createSmartVideoRequestSchema, createSmartVideoResponseSchema, createVideoLoopRequestSchema, createVideoUpscaleRequestSchema, editGenerationJobRequestSchema, generationJobResponseSchema, listGenerationJobsResponseSchema } from './generation.js';
|
|
9
9
|
import { describeImageRequestSchema, describeImageResponseSchema } from './assistant.js';
|
|
10
10
|
import { adminAdjustCreditsRequestSchema, adminAdjustCreditsResponseSchema, adminJobDetailResponseSchema, adminMeResponseSchema, adminUsageResponseSchema, adminUserDetailResponseSchema, adminWorkspaceDetailResponseSchema, listAdminAuditResponseSchema, listAdminJobsResponseSchema, listAdminUsersResponseSchema, listAdminWorkspacesResponseSchema, setPlatformAdminRequestSchema, setPlatformAdminResponseSchema, setUserDisabledRequestSchema, setUserDisabledResponseSchema, stepUpStartResponseSchema, stepUpVerifyRequestSchema, stepUpVerifyResponseSchema } from './admin.js';
|
|
@@ -207,11 +207,59 @@ export function createZclApiClient(options) {
|
|
|
207
207
|
get(workspaceId, projectId) {
|
|
208
208
|
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-map`, ledMapResponseSchema);
|
|
209
209
|
},
|
|
210
|
+
// The project-level alias. Legacy: it resolves to the project's OLDEST map, which is
|
|
211
|
+
// how two creations end up silently editing one row. Phase B removes the need for it —
|
|
212
|
+
// prefer the by-id methods below. Its response stays on ledMapResponseSchema because
|
|
213
|
+
// the alias cannot branch (it has no creation to repoint).
|
|
210
214
|
update(workspaceId, projectId, input) {
|
|
211
215
|
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-map`, ledMapResponseSchema, {
|
|
212
216
|
method: 'PATCH',
|
|
213
217
|
body: updateLedMapRequestSchema.parse(input)
|
|
214
218
|
});
|
|
219
|
+
},
|
|
220
|
+
// The project's maps, for the picker and the library listing. Keyset-paginated.
|
|
221
|
+
list(workspaceId, projectId, query = {}) {
|
|
222
|
+
const params = new URLSearchParams();
|
|
223
|
+
if (query.cursor !== undefined) {
|
|
224
|
+
params.set('cursor', query.cursor);
|
|
225
|
+
}
|
|
226
|
+
if (query.limit !== undefined) {
|
|
227
|
+
params.set('limit', String(query.limit));
|
|
228
|
+
}
|
|
229
|
+
const qs = params.toString() ? `?${params.toString()}` : '';
|
|
230
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps${qs}`, ledMapListResponseSchema);
|
|
231
|
+
},
|
|
232
|
+
// "Start a new map". Omit `input` (or `copyFromLedMapId`) for an empty map the
|
|
233
|
+
// creation owns outright, rather than falling back to the project alias above.
|
|
234
|
+
create(workspaceId, projectId, input) {
|
|
235
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps`, ledMapResponseSchema, {
|
|
236
|
+
method: 'POST',
|
|
237
|
+
body: createLedMapRequestSchema.parse(input ?? {})
|
|
238
|
+
});
|
|
239
|
+
},
|
|
240
|
+
// One specific map by id. The projectId in the path is the tenant gate, not a lookup
|
|
241
|
+
// key — the server filters on (id AND project_id) and 404s a map from another project.
|
|
242
|
+
getById(workspaceId, projectId, ledMapId) {
|
|
243
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps/${ledMapId}`, ledMapResponseSchema);
|
|
244
|
+
},
|
|
245
|
+
// Geometry PATCH. Returns the FORK SIGNAL: when the server branches a shared map,
|
|
246
|
+
// `branchedFrom` is the id the edit started from and `data.id` is a NEW row the
|
|
247
|
+
// caller must repoint its creation at. See `ledMapUpdateResponseSchema`.
|
|
248
|
+
updateById(workspaceId, projectId, ledMapId, input) {
|
|
249
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps/${ledMapId}`, ledMapUpdateResponseSchema, { method: 'PATCH', body: updateLedMapRequestSchema.parse(input) });
|
|
250
|
+
},
|
|
251
|
+
// The creations referencing this map — the shared badge and the delete refusal.
|
|
252
|
+
usage(workspaceId, projectId, ledMapId) {
|
|
253
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps/${ledMapId}/usage`, ledMapUsageResponseSchema);
|
|
254
|
+
},
|
|
255
|
+
// Rename only. A separate route from the geometry PATCH because it must NOT bump
|
|
256
|
+
// `version` — see `updateLedMapMetadataRequestSchema`.
|
|
257
|
+
updateMetadata(workspaceId, projectId, ledMapId, input) {
|
|
258
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps/${ledMapId}/metadata`, ledMapResponseSchema, { method: 'PATCH', body: updateLedMapMetadataRequestSchema.parse(input) });
|
|
259
|
+
},
|
|
260
|
+
// Refused with a 409 naming the creations when any creation still references the map.
|
|
261
|
+
remove(workspaceId, projectId, ledMapId) {
|
|
262
|
+
return request(`/workspaces/${workspaceId}/projects/${projectId}/led-maps/${ledMapId}`, z.object({ data: z.object({}) }), { method: 'DELETE' });
|
|
215
263
|
}
|
|
216
264
|
},
|
|
217
265
|
runs: {
|
package/dist/projects.d.ts
CHANGED
|
@@ -40,6 +40,19 @@ export declare const ledPanelsSchema: z.ZodArray<z.ZodObject<{
|
|
|
40
40
|
showLabel: z.ZodOptional<z.ZodBoolean>;
|
|
41
41
|
mirrorOf: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
|
|
42
42
|
}, z.core.$strip>>;
|
|
43
|
+
/**
|
|
44
|
+
* Library membership state of a map. 'draft' = private to one creation;
|
|
45
|
+
* 'library' = saved and reusable.
|
|
46
|
+
*
|
|
47
|
+
* NOTE for Phase B: this is NOT the picker's predicate. The picker filters on
|
|
48
|
+
* `jsonb_array_length(panels_json) > 0` and nothing else — `scripts/backfill-runs.ts`
|
|
49
|
+
* promoted exactly the non-empty set to 'library', but every map created since is
|
|
50
|
+
* 'draft' with panels, so filtering on this enum would hide all of them.
|
|
51
|
+
*/
|
|
52
|
+
export declare const ledMapLibraryStatusSchema: z.ZodEnum<{
|
|
53
|
+
draft: "draft";
|
|
54
|
+
library: "library";
|
|
55
|
+
}>;
|
|
43
56
|
export declare const ledMapSchema: z.ZodObject<{
|
|
44
57
|
id: z.ZodString;
|
|
45
58
|
projectId: z.ZodString;
|
|
@@ -122,6 +135,240 @@ export declare const ledMapResponseSchema: z.ZodObject<{
|
|
|
122
135
|
updatedAt: z.ZodString;
|
|
123
136
|
}, z.core.$strip>;
|
|
124
137
|
}, z.core.$strip>;
|
|
138
|
+
/**
|
|
139
|
+
* A creation that references a map. Powers two Phase B surfaces: the
|
|
140
|
+
* "Shared · used in Day 1 Opener, Day 2 Keynote" badge on a locked editor, and the
|
|
141
|
+
* named refusal when a delete is blocked (`project_runs.led_map_id` is
|
|
142
|
+
* ON DELETE restrict, so the database blocks it either way — this is what turns a
|
|
143
|
+
* bare FK error into a sentence).
|
|
144
|
+
*
|
|
145
|
+
* Deliberately its own aggregate rather than something derived client-side from
|
|
146
|
+
* `runs.list`: that listing is keyset-paginated with a default limit, so a map used
|
|
147
|
+
* by a creation on page 2 would be reported as unshared.
|
|
148
|
+
*/
|
|
149
|
+
export declare const ledMapUsageSchema: z.ZodObject<{
|
|
150
|
+
runId: z.ZodString;
|
|
151
|
+
name: z.ZodString;
|
|
152
|
+
}, z.core.$strip>;
|
|
153
|
+
/**
|
|
154
|
+
* Rename a map (or move it between library states) WITHOUT touching its geometry.
|
|
155
|
+
* `updateLedMapRequestSchema` replaces the whole panel array, so before this there
|
|
156
|
+
* was no way to rename a map at all.
|
|
157
|
+
*
|
|
158
|
+
* DELIBERATELY NO `expectedVersion`, AND THE SERVER MUST NOT BUMP `version` ON IT.
|
|
159
|
+
* This is not stylistic. `version` is not only the geometry concurrency token — it is
|
|
160
|
+
* half the free centre-panel reuse gate (zcl-api
|
|
161
|
+
* services/generation-service.ts:726-739, `if (master.ledMapVersion !== map.version)
|
|
162
|
+
* { return false }`). Bumping it on a rename would make RENAMING A MAP SILENTLY COST
|
|
163
|
+
* THE USER CREDITS on their next Generate All. zcl-web-next's editor already names
|
|
164
|
+
* this exact hazard for panel labels (rebuild-panel-set.ts:568-571: gating on the
|
|
165
|
+
* version counter "would permanently unrestore a user's wall because they renamed
|
|
166
|
+
* 'LED 3'").
|
|
167
|
+
*
|
|
168
|
+
* So a metadata PATCH stays outside the geometry concurrency protocol entirely: no
|
|
169
|
+
* CAS token in, no counter bump out. Concurrent renames are last-write-wins, which is
|
|
170
|
+
* the correct semantics for a scalar. Do not add `expectedVersion` here "for
|
|
171
|
+
* consistency" with the geometry PATCH — the asymmetry is the point.
|
|
172
|
+
*
|
|
173
|
+
* `name: null` clears the name (back to an unnamed working copy). `name: ''` and
|
|
174
|
+
* whitespace-only are rejected. Unknown keys — notably a smuggled `panels` or
|
|
175
|
+
* `expectedVersion` — are STRIPPED by zod rather than rejected, so they never reach
|
|
176
|
+
* the server; a patch whose only keys are unknown fails the refine below.
|
|
177
|
+
*
|
|
178
|
+
* Response reuses `ledMapResponseSchema` — a renamed map is just a map.
|
|
179
|
+
*/
|
|
180
|
+
export declare const updateLedMapMetadataRequestSchema: z.ZodObject<{
|
|
181
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
182
|
+
libraryStatus: z.ZodOptional<z.ZodEnum<{
|
|
183
|
+
draft: "draft";
|
|
184
|
+
library: "library";
|
|
185
|
+
}>>;
|
|
186
|
+
}, z.core.$strip>;
|
|
187
|
+
/**
|
|
188
|
+
* One row in the LED map picker / library listing.
|
|
189
|
+
*
|
|
190
|
+
* Carries `panelCount` and DELIBERATELY NOT the `panels` array: a picker listing N
|
|
191
|
+
* maps must not ship N full panel arrays (up to 200 panels each) just to render "4
|
|
192
|
+
* panels" and a thumbnail. Fetch `ledMaps.getById` when the geometry is actually
|
|
193
|
+
* needed.
|
|
194
|
+
*
|
|
195
|
+
* DELIBERATELY NO `superRefine`, unlike `ledMapSchema`. That schema enforces a
|
|
196
|
+
* panels⇄bounds biconditional (empty maps have null bounds; non-empty maps have
|
|
197
|
+
* bounds that match), and it CANNOT be checked here — `panelCount` is a count, and
|
|
198
|
+
* bounds cannot be recomputed from a count. A summary with `panelCount: 4` and
|
|
199
|
+
* `bounds: null` therefore parses cleanly. Do not "restore" the refinement.
|
|
200
|
+
*
|
|
201
|
+
* `name`, `libraryStatus` and `forkedFromLedMapId` all `.default()`, so — per the
|
|
202
|
+
* house rule spelled out on `ledMapSchema.id` — zcl-api's `z.infer` turns them into
|
|
203
|
+
* REQUIRED output fields. The mapper that will break at compile time until it emits
|
|
204
|
+
* them is the new summary mapper feeding the list route in
|
|
205
|
+
* services/postgres-services.ts (alongside `mapLedMap`), which must also compute
|
|
206
|
+
* `panelCount` and join `usage`. That compile error is the desired failure mode.
|
|
207
|
+
*/
|
|
208
|
+
export declare const ledMapSummarySchema: z.ZodObject<{
|
|
209
|
+
id: z.ZodString;
|
|
210
|
+
projectId: z.ZodString;
|
|
211
|
+
name: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
212
|
+
libraryStatus: z.ZodDefault<z.ZodEnum<{
|
|
213
|
+
draft: "draft";
|
|
214
|
+
library: "library";
|
|
215
|
+
}>>;
|
|
216
|
+
forkedFromLedMapId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
217
|
+
version: z.ZodNumber;
|
|
218
|
+
panelCount: z.ZodNumber;
|
|
219
|
+
bounds: z.ZodNullable<z.ZodObject<{
|
|
220
|
+
minX: z.ZodNumber;
|
|
221
|
+
minY: z.ZodNumber;
|
|
222
|
+
maxX: z.ZodNumber;
|
|
223
|
+
maxY: z.ZodNumber;
|
|
224
|
+
width: z.ZodNumber;
|
|
225
|
+
height: z.ZodNumber;
|
|
226
|
+
aspectRatio: z.ZodNumber;
|
|
227
|
+
}, z.core.$strip>>;
|
|
228
|
+
usage: z.ZodArray<z.ZodObject<{
|
|
229
|
+
runId: z.ZodString;
|
|
230
|
+
name: z.ZodString;
|
|
231
|
+
}, z.core.$strip>>;
|
|
232
|
+
createdAt: z.ZodString;
|
|
233
|
+
updatedAt: z.ZodString;
|
|
234
|
+
}, z.core.$strip>;
|
|
235
|
+
/**
|
|
236
|
+
* LED maps list query. Keyset-paginated, mirroring `listProjectRunsQuerySchema`
|
|
237
|
+
* exactly (minus its `status` filter — the picker's predicate is server-side and
|
|
238
|
+
* not client-selectable).
|
|
239
|
+
*
|
|
240
|
+
* The response is `ledMapListResponseSchema` =
|
|
241
|
+
* { data: LedMapSummary[]; pagination: { nextCursor: string | null } }.
|
|
242
|
+
*/
|
|
243
|
+
export declare const listLedMapsQuerySchema: z.ZodObject<{
|
|
244
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
245
|
+
limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
246
|
+
}, z.core.$strip>;
|
|
247
|
+
/**
|
|
248
|
+
* Create a map a creation owns outright — the picker's "Start a new map".
|
|
249
|
+
*
|
|
250
|
+
* THIS PATH DOES NOT EXIST TODAY, and neither of the two adjacent ones can stand in:
|
|
251
|
+
*
|
|
252
|
+
* - `createProjectRunRequestSchema.copyFromLedMapId` is `.optional()` where ABSENT
|
|
253
|
+
* means "copy the project's oldest map" (zcl-api
|
|
254
|
+
* services/project-run-service.ts:249-271). It therefore cannot distinguish
|
|
255
|
+
* "default" from "explicitly none".
|
|
256
|
+
* - `getLedMap`'s lazy insert fires only when a project has ZERO maps, so it can
|
|
257
|
+
* never mint a second one.
|
|
258
|
+
*
|
|
259
|
+
* Phase B establishes that no creation may carry `ledMapId = null`: null is not "no
|
|
260
|
+
* map", it is "share the project's oldest map by accident" — the silent-sharing
|
|
261
|
+
* defect where two creations edit one row through one alias and one silently reverts
|
|
262
|
+
* the other's work. An explicit create path is what lets a creation own an EMPTY map
|
|
263
|
+
* instead of falling back to that alias.
|
|
264
|
+
*
|
|
265
|
+
* Omit `copyFromLedMapId` for an empty map; supply it to seed from an existing map in
|
|
266
|
+
* the same project. Response reuses `ledMapResponseSchema` — a created map is just a
|
|
267
|
+
* map, so there is no new envelope.
|
|
268
|
+
*/
|
|
269
|
+
export declare const createLedMapRequestSchema: z.ZodObject<{
|
|
270
|
+
name: z.ZodOptional<z.ZodString>;
|
|
271
|
+
copyFromLedMapId: z.ZodOptional<z.ZodString>;
|
|
272
|
+
}, z.core.$strip>;
|
|
273
|
+
export declare const ledMapListResponseSchema: z.ZodObject<{
|
|
274
|
+
data: z.ZodArray<z.ZodObject<{
|
|
275
|
+
id: z.ZodString;
|
|
276
|
+
projectId: z.ZodString;
|
|
277
|
+
name: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
278
|
+
libraryStatus: z.ZodDefault<z.ZodEnum<{
|
|
279
|
+
draft: "draft";
|
|
280
|
+
library: "library";
|
|
281
|
+
}>>;
|
|
282
|
+
forkedFromLedMapId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
283
|
+
version: z.ZodNumber;
|
|
284
|
+
panelCount: z.ZodNumber;
|
|
285
|
+
bounds: z.ZodNullable<z.ZodObject<{
|
|
286
|
+
minX: z.ZodNumber;
|
|
287
|
+
minY: z.ZodNumber;
|
|
288
|
+
maxX: z.ZodNumber;
|
|
289
|
+
maxY: z.ZodNumber;
|
|
290
|
+
width: z.ZodNumber;
|
|
291
|
+
height: z.ZodNumber;
|
|
292
|
+
aspectRatio: z.ZodNumber;
|
|
293
|
+
}, z.core.$strip>>;
|
|
294
|
+
usage: z.ZodArray<z.ZodObject<{
|
|
295
|
+
runId: z.ZodString;
|
|
296
|
+
name: z.ZodString;
|
|
297
|
+
}, z.core.$strip>>;
|
|
298
|
+
createdAt: z.ZodString;
|
|
299
|
+
updatedAt: z.ZodString;
|
|
300
|
+
}, z.core.$strip>>;
|
|
301
|
+
pagination: z.ZodObject<{
|
|
302
|
+
nextCursor: z.ZodNullable<z.ZodString>;
|
|
303
|
+
}, z.core.$strip>;
|
|
304
|
+
}, z.core.$strip>;
|
|
305
|
+
export declare const ledMapUsageResponseSchema: z.ZodObject<{
|
|
306
|
+
data: z.ZodArray<z.ZodObject<{
|
|
307
|
+
runId: z.ZodString;
|
|
308
|
+
name: z.ZodString;
|
|
309
|
+
}, z.core.$strip>>;
|
|
310
|
+
}, z.core.$strip>;
|
|
311
|
+
/**
|
|
312
|
+
* The by-id map PATCH response — and THE FORK SIGNAL.
|
|
313
|
+
*
|
|
314
|
+
* `data` is the map that now holds the geometry, which may be a NEW ROW: editing a
|
|
315
|
+
* map that two or more creations share branches it server-side, inside the PATCH
|
|
316
|
+
* (lazily, on the first geometry-significant change — never on a button click, so a
|
|
317
|
+
* user who opens a shared map and changes nothing keeps free centre-panel reuse).
|
|
318
|
+
*
|
|
319
|
+
* `branchedFrom` is the id the edit STARTED from when the server branched, and null
|
|
320
|
+
* when it edited in place. The client detects a branch with `branchedFrom !== null`
|
|
321
|
+
* and MUST repoint its creation at `data.id` — the id it sent is no longer the map it
|
|
322
|
+
* is editing.
|
|
323
|
+
*
|
|
324
|
+
* DO NOT signal a branch through the 409 instead. That 409's ambiguity across
|
|
325
|
+
* *wrong version / wrong project / no such map* is deliberate anti-tenant-probing
|
|
326
|
+
* (zcl-api services/postgres-services.ts:1662-1664) — it exists so a caller cannot
|
|
327
|
+
* learn whether a map id exists in someone else's tenant. A fork is a SUCCESS, and
|
|
328
|
+
* needs a success-shaped response, not a richer error.
|
|
329
|
+
*
|
|
330
|
+
* `branchedFrom` `.default()`s, so per the house rule on `ledMapSchema.id` it becomes
|
|
331
|
+
* a REQUIRED output field under `z.infer`: zcl-api's `updateLedMapById` route handler
|
|
332
|
+
* (led-map.routes.ts, currently parsing its outbound body through
|
|
333
|
+
* `ledMapResponseSchema`) breaks at compile time until it switches to this schema and
|
|
334
|
+
* emits the field. That is the desired failure mode.
|
|
335
|
+
*/
|
|
336
|
+
export declare const ledMapUpdateResponseSchema: z.ZodObject<{
|
|
337
|
+
data: z.ZodObject<{
|
|
338
|
+
id: z.ZodString;
|
|
339
|
+
projectId: z.ZodString;
|
|
340
|
+
name: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
341
|
+
libraryStatus: z.ZodDefault<z.ZodEnum<{
|
|
342
|
+
draft: "draft";
|
|
343
|
+
library: "library";
|
|
344
|
+
}>>;
|
|
345
|
+
forkedFromLedMapId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
346
|
+
version: z.ZodNumber;
|
|
347
|
+
panels: z.ZodArray<z.ZodObject<{
|
|
348
|
+
id: z.ZodString;
|
|
349
|
+
name: z.ZodString;
|
|
350
|
+
width: z.ZodNumber;
|
|
351
|
+
height: z.ZodNumber;
|
|
352
|
+
x: z.ZodNumber;
|
|
353
|
+
y: z.ZodNumber;
|
|
354
|
+
color: z.ZodOptional<z.ZodString>;
|
|
355
|
+
showLabel: z.ZodOptional<z.ZodBoolean>;
|
|
356
|
+
mirrorOf: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
|
|
357
|
+
}, z.core.$strip>>;
|
|
358
|
+
bounds: z.ZodNullable<z.ZodObject<{
|
|
359
|
+
minX: z.ZodNumber;
|
|
360
|
+
minY: z.ZodNumber;
|
|
361
|
+
maxX: z.ZodNumber;
|
|
362
|
+
maxY: z.ZodNumber;
|
|
363
|
+
width: z.ZodNumber;
|
|
364
|
+
height: z.ZodNumber;
|
|
365
|
+
aspectRatio: z.ZodNumber;
|
|
366
|
+
}, z.core.$strip>>;
|
|
367
|
+
createdAt: z.ZodString;
|
|
368
|
+
updatedAt: z.ZodString;
|
|
369
|
+
}, z.core.$strip>;
|
|
370
|
+
branchedFrom: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
371
|
+
}, z.core.$strip>;
|
|
125
372
|
export declare const projectSchema: z.ZodObject<{
|
|
126
373
|
id: z.ZodString;
|
|
127
374
|
workspaceId: z.ZodString;
|
|
@@ -292,9 +539,22 @@ export type CreateProjectRequest = z.input<typeof createProjectRequestSchema>;
|
|
|
292
539
|
export type UpdateProjectRequest = z.infer<typeof updateProjectRequestSchema>;
|
|
293
540
|
export type LedBounds = z.infer<typeof ledBoundsSchema>;
|
|
294
541
|
export type LedMap = z.infer<typeof ledMapSchema>;
|
|
542
|
+
export type LedMapLibraryStatus = z.infer<typeof ledMapLibraryStatusSchema>;
|
|
295
543
|
export type LedMapResponse = z.infer<typeof ledMapResponseSchema>;
|
|
296
544
|
export type LedPanel = z.infer<typeof ledPanelSchema>;
|
|
545
|
+
export type LedMapSummary = z.infer<typeof ledMapSummarySchema>;
|
|
546
|
+
export type LedMapUsage = z.infer<typeof ledMapUsageSchema>;
|
|
547
|
+
export type LedMapListResponse = z.infer<typeof ledMapListResponseSchema>;
|
|
548
|
+
export type LedMapUsageResponse = z.infer<typeof ledMapUsageResponseSchema>;
|
|
549
|
+
export type LedMapUpdateResponse = z.infer<typeof ledMapUpdateResponseSchema>;
|
|
550
|
+
export type ListLedMapsQuery = z.infer<typeof listLedMapsQuerySchema>;
|
|
551
|
+
/**
|
|
552
|
+
* `z.infer`, not `z.input` (contrast `CreateProjectRequest`): neither field here
|
|
553
|
+
* `.default()`s, so input and output coincide and there is nothing to widen.
|
|
554
|
+
*/
|
|
555
|
+
export type CreateLedMapRequest = z.infer<typeof createLedMapRequestSchema>;
|
|
297
556
|
export type UpdateLedMapRequest = z.infer<typeof updateLedMapRequestSchema>;
|
|
557
|
+
export type UpdateLedMapMetadataRequest = z.infer<typeof updateLedMapMetadataRequestSchema>;
|
|
298
558
|
export type Project = z.infer<typeof projectSchema>;
|
|
299
559
|
export type ProjectStatus = z.infer<typeof projectStatusSchema>;
|
|
300
560
|
export type ProjectVisibility = z.infer<typeof projectVisibilitySchema>;
|
package/dist/projects.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
|
package/dist/projects.js
CHANGED
|
@@ -77,6 +77,16 @@ function boundsMatchPanels(bounds, panels) {
|
|
|
77
77
|
bounds.height === height &&
|
|
78
78
|
Math.abs(bounds.aspectRatio - aspectRatio) < 1e-9);
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Library membership state of a map. 'draft' = private to one creation;
|
|
82
|
+
* 'library' = saved and reusable.
|
|
83
|
+
*
|
|
84
|
+
* NOTE for Phase B: this is NOT the picker's predicate. The picker filters on
|
|
85
|
+
* `jsonb_array_length(panels_json) > 0` and nothing else — `scripts/backfill-runs.ts`
|
|
86
|
+
* promoted exactly the non-empty set to 'library', but every map created since is
|
|
87
|
+
* 'draft' with panels, so filtering on this enum would hide all of them.
|
|
88
|
+
*/
|
|
89
|
+
export const ledMapLibraryStatusSchema = z.enum(['draft', 'library']);
|
|
80
90
|
export const ledMapSchema = z
|
|
81
91
|
.object({
|
|
82
92
|
/**
|
|
@@ -118,7 +128,7 @@ export const ledMapSchema = z
|
|
|
118
128
|
/** Library display name. Null while the map is an unnamed working copy. */
|
|
119
129
|
name: z.string().trim().min(1).max(120).nullable().default(null),
|
|
120
130
|
/** 'draft' = private to one creation; 'library' = saved and reusable. */
|
|
121
|
-
libraryStatus:
|
|
131
|
+
libraryStatus: ledMapLibraryStatusSchema.default('draft'),
|
|
122
132
|
/** The map this one was branched from, or null. */
|
|
123
133
|
forkedFromLedMapId: idSchema.nullable().default(null),
|
|
124
134
|
version: z.number().int().nonnegative(),
|
|
@@ -155,6 +165,165 @@ export const updateLedMapRequestSchema = z.object({
|
|
|
155
165
|
panels: ledPanelsSchema
|
|
156
166
|
});
|
|
157
167
|
export const ledMapResponseSchema = apiSuccessSchema(ledMapSchema);
|
|
168
|
+
/**
|
|
169
|
+
* A creation that references a map. Powers two Phase B surfaces: the
|
|
170
|
+
* "Shared · used in Day 1 Opener, Day 2 Keynote" badge on a locked editor, and the
|
|
171
|
+
* named refusal when a delete is blocked (`project_runs.led_map_id` is
|
|
172
|
+
* ON DELETE restrict, so the database blocks it either way — this is what turns a
|
|
173
|
+
* bare FK error into a sentence).
|
|
174
|
+
*
|
|
175
|
+
* Deliberately its own aggregate rather than something derived client-side from
|
|
176
|
+
* `runs.list`: that listing is keyset-paginated with a default limit, so a map used
|
|
177
|
+
* by a creation on page 2 would be reported as unshared.
|
|
178
|
+
*/
|
|
179
|
+
export const ledMapUsageSchema = z.object({
|
|
180
|
+
runId: idSchema,
|
|
181
|
+
name: z.string().min(1)
|
|
182
|
+
});
|
|
183
|
+
/**
|
|
184
|
+
* Rename a map (or move it between library states) WITHOUT touching its geometry.
|
|
185
|
+
* `updateLedMapRequestSchema` replaces the whole panel array, so before this there
|
|
186
|
+
* was no way to rename a map at all.
|
|
187
|
+
*
|
|
188
|
+
* DELIBERATELY NO `expectedVersion`, AND THE SERVER MUST NOT BUMP `version` ON IT.
|
|
189
|
+
* This is not stylistic. `version` is not only the geometry concurrency token — it is
|
|
190
|
+
* half the free centre-panel reuse gate (zcl-api
|
|
191
|
+
* services/generation-service.ts:726-739, `if (master.ledMapVersion !== map.version)
|
|
192
|
+
* { return false }`). Bumping it on a rename would make RENAMING A MAP SILENTLY COST
|
|
193
|
+
* THE USER CREDITS on their next Generate All. zcl-web-next's editor already names
|
|
194
|
+
* this exact hazard for panel labels (rebuild-panel-set.ts:568-571: gating on the
|
|
195
|
+
* version counter "would permanently unrestore a user's wall because they renamed
|
|
196
|
+
* 'LED 3'").
|
|
197
|
+
*
|
|
198
|
+
* So a metadata PATCH stays outside the geometry concurrency protocol entirely: no
|
|
199
|
+
* CAS token in, no counter bump out. Concurrent renames are last-write-wins, which is
|
|
200
|
+
* the correct semantics for a scalar. Do not add `expectedVersion` here "for
|
|
201
|
+
* consistency" with the geometry PATCH — the asymmetry is the point.
|
|
202
|
+
*
|
|
203
|
+
* `name: null` clears the name (back to an unnamed working copy). `name: ''` and
|
|
204
|
+
* whitespace-only are rejected. Unknown keys — notably a smuggled `panels` or
|
|
205
|
+
* `expectedVersion` — are STRIPPED by zod rather than rejected, so they never reach
|
|
206
|
+
* the server; a patch whose only keys are unknown fails the refine below.
|
|
207
|
+
*
|
|
208
|
+
* Response reuses `ledMapResponseSchema` — a renamed map is just a map.
|
|
209
|
+
*/
|
|
210
|
+
export const updateLedMapMetadataRequestSchema = z
|
|
211
|
+
.object({
|
|
212
|
+
name: z.string().trim().min(1).max(120).nullable().optional(),
|
|
213
|
+
libraryStatus: ledMapLibraryStatusSchema.optional()
|
|
214
|
+
})
|
|
215
|
+
.refine((input) => input.name !== undefined || input.libraryStatus !== undefined, 'At least one field is required');
|
|
216
|
+
/**
|
|
217
|
+
* One row in the LED map picker / library listing.
|
|
218
|
+
*
|
|
219
|
+
* Carries `panelCount` and DELIBERATELY NOT the `panels` array: a picker listing N
|
|
220
|
+
* maps must not ship N full panel arrays (up to 200 panels each) just to render "4
|
|
221
|
+
* panels" and a thumbnail. Fetch `ledMaps.getById` when the geometry is actually
|
|
222
|
+
* needed.
|
|
223
|
+
*
|
|
224
|
+
* DELIBERATELY NO `superRefine`, unlike `ledMapSchema`. That schema enforces a
|
|
225
|
+
* panels⇄bounds biconditional (empty maps have null bounds; non-empty maps have
|
|
226
|
+
* bounds that match), and it CANNOT be checked here — `panelCount` is a count, and
|
|
227
|
+
* bounds cannot be recomputed from a count. A summary with `panelCount: 4` and
|
|
228
|
+
* `bounds: null` therefore parses cleanly. Do not "restore" the refinement.
|
|
229
|
+
*
|
|
230
|
+
* `name`, `libraryStatus` and `forkedFromLedMapId` all `.default()`, so — per the
|
|
231
|
+
* house rule spelled out on `ledMapSchema.id` — zcl-api's `z.infer` turns them into
|
|
232
|
+
* REQUIRED output fields. The mapper that will break at compile time until it emits
|
|
233
|
+
* them is the new summary mapper feeding the list route in
|
|
234
|
+
* services/postgres-services.ts (alongside `mapLedMap`), which must also compute
|
|
235
|
+
* `panelCount` and join `usage`. That compile error is the desired failure mode.
|
|
236
|
+
*/
|
|
237
|
+
export const ledMapSummarySchema = z.object({
|
|
238
|
+
id: idSchema,
|
|
239
|
+
projectId: idSchema,
|
|
240
|
+
/** Library display name. Null while the map is an unnamed working copy. */
|
|
241
|
+
name: z.string().trim().min(1).max(120).nullable().default(null),
|
|
242
|
+
libraryStatus: ledMapLibraryStatusSchema.default('draft'),
|
|
243
|
+
/** The map this one was branched from, or null. */
|
|
244
|
+
forkedFromLedMapId: idSchema.nullable().default(null),
|
|
245
|
+
version: z.number().int().nonnegative(),
|
|
246
|
+
/** Panel count only — see the note above on why `panels` is absent. */
|
|
247
|
+
panelCount: z.number().int().nonnegative(),
|
|
248
|
+
bounds: ledBoundsSchema.nullable(),
|
|
249
|
+
/**
|
|
250
|
+
* The creations using this map. `[]` for an orphan map — orphans stay listed,
|
|
251
|
+
* because their creation may be archived and archived creations can be restored.
|
|
252
|
+
*/
|
|
253
|
+
usage: z.array(ledMapUsageSchema),
|
|
254
|
+
createdAt: isoDateSchema,
|
|
255
|
+
updatedAt: isoDateSchema
|
|
256
|
+
});
|
|
257
|
+
/**
|
|
258
|
+
* LED maps list query. Keyset-paginated, mirroring `listProjectRunsQuerySchema`
|
|
259
|
+
* exactly (minus its `status` filter — the picker's predicate is server-side and
|
|
260
|
+
* not client-selectable).
|
|
261
|
+
*
|
|
262
|
+
* The response is `ledMapListResponseSchema` =
|
|
263
|
+
* { data: LedMapSummary[]; pagination: { nextCursor: string | null } }.
|
|
264
|
+
*/
|
|
265
|
+
export const listLedMapsQuerySchema = z.object({
|
|
266
|
+
cursor: z.string().min(1).optional(),
|
|
267
|
+
limit: z.coerce.number().int().min(1).max(100).optional()
|
|
268
|
+
});
|
|
269
|
+
/**
|
|
270
|
+
* Create a map a creation owns outright — the picker's "Start a new map".
|
|
271
|
+
*
|
|
272
|
+
* THIS PATH DOES NOT EXIST TODAY, and neither of the two adjacent ones can stand in:
|
|
273
|
+
*
|
|
274
|
+
* - `createProjectRunRequestSchema.copyFromLedMapId` is `.optional()` where ABSENT
|
|
275
|
+
* means "copy the project's oldest map" (zcl-api
|
|
276
|
+
* services/project-run-service.ts:249-271). It therefore cannot distinguish
|
|
277
|
+
* "default" from "explicitly none".
|
|
278
|
+
* - `getLedMap`'s lazy insert fires only when a project has ZERO maps, so it can
|
|
279
|
+
* never mint a second one.
|
|
280
|
+
*
|
|
281
|
+
* Phase B establishes that no creation may carry `ledMapId = null`: null is not "no
|
|
282
|
+
* map", it is "share the project's oldest map by accident" — the silent-sharing
|
|
283
|
+
* defect where two creations edit one row through one alias and one silently reverts
|
|
284
|
+
* the other's work. An explicit create path is what lets a creation own an EMPTY map
|
|
285
|
+
* instead of falling back to that alias.
|
|
286
|
+
*
|
|
287
|
+
* Omit `copyFromLedMapId` for an empty map; supply it to seed from an existing map in
|
|
288
|
+
* the same project. Response reuses `ledMapResponseSchema` — a created map is just a
|
|
289
|
+
* map, so there is no new envelope.
|
|
290
|
+
*/
|
|
291
|
+
export const createLedMapRequestSchema = z.object({
|
|
292
|
+
name: z.string().trim().min(1).max(120).optional(),
|
|
293
|
+
/** Seed the new map by copying an existing one in the same project. Omit for an empty map. */
|
|
294
|
+
copyFromLedMapId: idSchema.optional()
|
|
295
|
+
});
|
|
296
|
+
export const ledMapListResponseSchema = listResponseSchema(ledMapSummarySchema);
|
|
297
|
+
export const ledMapUsageResponseSchema = apiSuccessSchema(z.array(ledMapUsageSchema));
|
|
298
|
+
/**
|
|
299
|
+
* The by-id map PATCH response — and THE FORK SIGNAL.
|
|
300
|
+
*
|
|
301
|
+
* `data` is the map that now holds the geometry, which may be a NEW ROW: editing a
|
|
302
|
+
* map that two or more creations share branches it server-side, inside the PATCH
|
|
303
|
+
* (lazily, on the first geometry-significant change — never on a button click, so a
|
|
304
|
+
* user who opens a shared map and changes nothing keeps free centre-panel reuse).
|
|
305
|
+
*
|
|
306
|
+
* `branchedFrom` is the id the edit STARTED from when the server branched, and null
|
|
307
|
+
* when it edited in place. The client detects a branch with `branchedFrom !== null`
|
|
308
|
+
* and MUST repoint its creation at `data.id` — the id it sent is no longer the map it
|
|
309
|
+
* is editing.
|
|
310
|
+
*
|
|
311
|
+
* DO NOT signal a branch through the 409 instead. That 409's ambiguity across
|
|
312
|
+
* *wrong version / wrong project / no such map* is deliberate anti-tenant-probing
|
|
313
|
+
* (zcl-api services/postgres-services.ts:1662-1664) — it exists so a caller cannot
|
|
314
|
+
* learn whether a map id exists in someone else's tenant. A fork is a SUCCESS, and
|
|
315
|
+
* needs a success-shaped response, not a richer error.
|
|
316
|
+
*
|
|
317
|
+
* `branchedFrom` `.default()`s, so per the house rule on `ledMapSchema.id` it becomes
|
|
318
|
+
* a REQUIRED output field under `z.infer`: zcl-api's `updateLedMapById` route handler
|
|
319
|
+
* (led-map.routes.ts, currently parsing its outbound body through
|
|
320
|
+
* `ledMapResponseSchema`) breaks at compile time until it switches to this schema and
|
|
321
|
+
* emits the field. That is the desired failure mode.
|
|
322
|
+
*/
|
|
323
|
+
export const ledMapUpdateResponseSchema = z.object({
|
|
324
|
+
data: ledMapSchema,
|
|
325
|
+
branchedFrom: idSchema.nullable().default(null)
|
|
326
|
+
});
|
|
158
327
|
export const projectSchema = z.object({
|
|
159
328
|
id: idSchema,
|
|
160
329
|
workspaceId: idSchema,
|