busa-sdk 0.98.0 → 0.99.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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as AssetDetailVO, $t as CREATABLE_NODE_TYPES, A as NodeVO, At as BaseVO, B as UserRefVO, Bt as ViewFilterVO, C as CommentVO, Ct as FormVO, D as MentionInboxItemVO, Dt as UpdateFormDTO, E as LookupRollup, Et as SubmitFormDTO, F as ReviewVerdict, Ft as RecordVO, G as VaultItemInput, Gt as PlaybookAttributionVO, H as UpdateVaultSettingsDTO, Ht as ViewType, I as SearchResponseVO, It as VIEW_FIELD_MAX_WIDTH, J as VaultRuntimeEnv, Jt as cloudContract, K as VaultItemKind, Kt as AgentClientVO, L as SearchResultKind, Lt as VIEW_FIELD_MIN_WIDTH, M as OperationVO, Mt as GalleryCoverFit, N as RestoredSlugChangeVO, Nt as GanttScale, O as MentionInboxPageVO, Ot as AssetAttachmentRef, P as ReviewVO, Pt as RecordLinkVO, Q as FileNodeVO, Qt as resolveNodeIconSource, R as SearchResultVO, Rt as ViewConfigVO, S as CommentSubjectType, St as FormThemeVO, T as FieldType, Tt as ListFormsVO, U as VaultAccessPolicy, Ut as ViewVO, V as UpdatePreviewFileCredentialDTO, Vt as ViewSortVO, W as VaultEnvironment, Wt as AttachmentRef, X as VaultSettingsVO, Xt as NodeIconSchema, Y as VaultScopeType, Yt as NodeIcon, Z as FileNodeMetadata, Zt as NodeIconSource, _ as ChangeRequestVO, _t as FormBoundFieldVO, a as createBusabaseClient, at as FilePreviewConfigVO, b as CommentMentionTargetType, bt as FormShareVO, c as AuditAction, ct as FilePreviewProvider, d as ChangeRequestBatchFailureVO, dt as FileTreeFileVO, en as CreatableNodeType, et as AssetTextStatus, f as ChangeRequestCountsVO, ft as FileTreeNodeVO, g as ChangeRequestTargetType, gt as CreateFormDTO, h as ChangeRequestStatus, ht as ActivityItemVO, i as ResolvedConfig, it as GrepResultVO, j as OperationStatus, jt as GalleryCardSize, k as NodeSearchResultVO, kt as BaseFieldVO, l as AuditEventVO, lt as FilePreviewUnavailableReason, m as ChangeRequestReviewBatchResultVO, mt as NodeDetailVO, n as BusabaseConfig, nn as OperationKind, nt as AssetVO, o as resolveConfig, ot as FilePreviewConfigurationStatus, p as ChangeRequestMergeBatchResultVO, pt as FileTreeReadFileVO, q as VaultItemVO, qt as CloudContract, r as DEFAULT_BASE_URL, rt as GrepInputDTO, s as AgentTaskVO, st as FilePreviewCredentialSource, t as BusabaseClient, tn as NodeType, tt as AssetUsageVO, u as BusabaseSourceChannel, ut as FilePreviewVO, v as CommentMentionDispatchStatus, vt as FormFieldBindingVO, w as CommitVO, wt as ListFormsDTO, x as CommentMentionVO, xt as FormSubmitResultVO, y as CommentMentionInputDTO, yt as FormPageSourceVO, z as SourceAttributionVO, zt as ViewFilterOperator } from "./client-DtzuVlPK.js";
1
+ import { $ as FileNodeMetadata, $t as isViewFilterGroup, A as MentionInboxPageVO, At as AssetAttachmentRef, B as SearchResultVO, Bt as VIEW_FIELD_MAX_WIDTH, C as CommentMentionVO, Ct as FormSubmitResultVO, D as FieldType, Dt as ListFormsVO, E as CommitVO, Et as ListFormsDTO, F as RestoredSlugChangeVO, Ft as GanttScale, G as VaultAccessPolicy, Gt as ViewFilterGroupVO, H as UserRefVO, Ht as ViewConfigVO, I as ReviewVO, It as LOOKUP_SOURCE_LIMIT, J as VaultItemKind, Jt as ViewSortVO, K as VaultEnvironment, Kt as ViewFilterOperator, L as ReviewVerdict, Lt as LookupComputedVO, M as NodeVO, Mt as BaseVO, N as OperationStatus, Nt as GalleryCardSize, O as LookupRollup, Ot as SubmitFormDTO, P as OperationVO, Pt as GalleryCoverFit, Q as VaultSettingsVO, Qt as flattenViewFilters, R as SearchResponseVO, Rt as RecordLinkVO, S as CommentMentionTargetType, St as FormShareVO, T as CommentVO, Tt as FormVO, U as UpdatePreviewFileCredentialDTO, Ut as ViewFilterConditionVO, V as SourceAttributionVO, Vt as VIEW_FIELD_MIN_WIDTH, W as UpdateVaultSettingsDTO, Wt as ViewFilterConjunction, X as VaultRuntimeEnv, Xt as ViewVO, Y as VaultItemVO, Yt as ViewType, Z as VaultScopeType, Zt as combineViewFilters, _ as ChangeRequestStatus, _t as ActivityItemVO, a as createBusabaseClient, an as NodeIconSchema, at as GrepInputDTO, b as CommentMentionDispatchStatus, bt as FormFieldBindingVO, c as cloudContract, cn as CREATABLE_NODE_TYPES, ct as FilePreviewConfigurationStatus, d as AuditEventVO, dn as OperationKind, dt as FilePreviewUnavailableReason, en as mapViewFilters, et as FileNodeVO, f as BusabaseSourceChannel, ft as FilePreviewVO, g as ChangeRequestReviewBatchResultVO, gt as NodeDetailVO, h as ChangeRequestMergeBatchResultVO, ht as FileTreeReadFileVO, i as ResolvedConfig, in as NodeIcon, it as AssetVO, j as NodeSearchResultVO, jt as BaseFieldVO, k as MentionInboxItemVO, kt as UpdateFormDTO, l as AgentTaskVO, ln as CreatableNodeType, lt as FilePreviewCredentialSource, m as ChangeRequestCountsVO, mt as FileTreeNodeVO, n as BusabaseConfig, nn as PlaybookAttributionVO, nt as AssetTextStatus, o as resolveConfig, on as NodeIconSource, ot as GrepResultVO, p as ChangeRequestBatchFailureVO, pt as FileTreeFileVO, q as VaultItemInput, qt as ViewFilterVO, r as DEFAULT_BASE_URL, rn as AgentClientVO, rt as AssetUsageVO, s as CloudContract, sn as resolveNodeIconSource, st as FilePreviewConfigVO, t as BusabaseClient, tn as AttachmentRef, tt as AssetDetailVO, u as AuditAction, un as NodeType, ut as FilePreviewProvider, v as ChangeRequestTargetType, vt as CreateFormDTO, w as CommentSubjectType, wt as FormThemeVO, x as CommentMentionInputDTO, xt as FormPageSourceVO, y as ChangeRequestVO, yt as FormBoundFieldVO, z as SearchResultKind, zt as RecordVO } from "./client-BUzSZV3L.js";
2
2
  import { z } from "zod";
3
3
  //#region src/url.d.ts
4
4
  /**
@@ -567,4 +567,4 @@ declare class Busabase {
567
567
  }>>>>;
568
568
  }
569
569
  //#endregion
570
- export { type ActivityItemVO, type AgentClientVO, type AgentTaskVO, type FileTreeFileVO as AirAppFileVO, type FileTreeFileVO as DriveFileVO, type FileTreeFileVO, type FileTreeFileVO as SkillFileVO, type FileTreeReadFileVO as AirAppReadFileVO, type FileTreeReadFileVO as DriveReadFileVO, type FileTreeReadFileVO, type FileTreeReadFileVO as SkillReadFileVO, type FileTreeNodeVO as AirAppVO, type FileTreeNodeVO as DriveVO, type FileTreeNodeVO, type FileTreeNodeVO as SkillVO, type AssetAttachmentRef, type AssetDetailVO, type AssetTextStatus, type AssetUsageVO, type AssetVO, type AttachmentRef, type AuditAction, type AuditEventVO, type BaseFieldVO, type BaseVO, Busabase, type BusabaseAssetsClient, BusabaseChangeRequestsClient, type BusabaseClient, type BusabaseConfig, type BusabaseRecordsClient, type BusabaseSourceChannel, type BusabaseUploadedAsset, CREATABLE_NODE_TYPES, type ChangeRequestBatchFailureVO, type ChangeRequestCountsVO, type ChangeRequestMergeBatchResultVO, type ChangeRequestReviewBatchResultVO, type ChangeRequestStatus, type ChangeRequestTargetType, type ChangeRequestVO, type CloudContract, type CommentMentionDispatchStatus, type CommentMentionInputDTO, type CommentMentionTargetType, type CommentMentionVO, type CommentSubjectType, type CommentVO, type CommitVO, type CreatableNodeType, type CreateFormDTO, DEFAULT_BASE_URL, type FieldType, type FileNodeMetadata, type FileNodeVO, type FilePreviewConfigVO, type FilePreviewConfigurationStatus, type FilePreviewCredentialSource, type FilePreviewProvider, type FilePreviewUnavailableReason, type FilePreviewVO, type FormBoundFieldVO, type FormFieldBindingVO, type FormPageSourceVO, type FormShareVO, type FormSubmitResultVO, type FormThemeVO, type FormVO, type GalleryCardSize, type GalleryCoverFit, type GanttScale, type ListFormsDTO, type ListFormsVO, type LookupRollup, type MentionInboxItemVO, type MentionInboxPageVO, type NodeDetailVO, type NodeIcon, type NodeIconSchema, type NodeIconSource, type NodeSearchResultVO, type NodeType, type NodeVO, type NodeWebUrlInput, type OperationKind, type OperationStatus, type OperationVO, type PlaybookAttributionVO, type RecordByFieldInput, type RecordLinkVO, type RecordVO, type ResolvedConfig, type RestoredSlugChangeVO, type ReviewVO, type ReviewVerdict, type SearchResponseVO, type SearchResultKind, type SearchResultVO, type SourceAttributionVO, type SubmitFormDTO, type UpdateFormDTO, type UpdatePreviewFileCredentialDTO, type UpdateVaultSettingsDTO, type UploadAssetOptions, type UserRefVO, type VIEW_FIELD_MAX_WIDTH, type VIEW_FIELD_MIN_WIDTH, type VaultAccessPolicy, type VaultEnvironment, type VaultItemInput, type VaultItemKind, type VaultItemVO, type VaultRuntimeEnv, type VaultScopeType, type VaultSettingsVO, type ViewConfigVO, type ViewFilterOperator, type ViewFilterVO, type ViewSortVO, type ViewType, type ViewVO, cloudContract, createBusabaseClient, getRecordByField, grepAssets, hashBytes, nodeWebUrl, normalizeBaseUrl, resolveConfig, type resolveNodeIconSource, toFilesOnlyGrepResult, toUnifiedFilesGrepInput, uploadAsset };
570
+ export { type ActivityItemVO, type AgentClientVO, type AgentTaskVO, type FileTreeFileVO as AirAppFileVO, type FileTreeFileVO as DriveFileVO, type FileTreeFileVO, type FileTreeFileVO as SkillFileVO, type FileTreeReadFileVO as AirAppReadFileVO, type FileTreeReadFileVO as DriveReadFileVO, type FileTreeReadFileVO, type FileTreeReadFileVO as SkillReadFileVO, type FileTreeNodeVO as AirAppVO, type FileTreeNodeVO as DriveVO, type FileTreeNodeVO, type FileTreeNodeVO as SkillVO, type AssetAttachmentRef, type AssetDetailVO, type AssetTextStatus, type AssetUsageVO, type AssetVO, type AttachmentRef, type AuditAction, type AuditEventVO, type BaseFieldVO, type BaseVO, Busabase, type BusabaseAssetsClient, BusabaseChangeRequestsClient, type BusabaseClient, type BusabaseConfig, type BusabaseRecordsClient, type BusabaseSourceChannel, type BusabaseUploadedAsset, CREATABLE_NODE_TYPES, type ChangeRequestBatchFailureVO, type ChangeRequestCountsVO, type ChangeRequestMergeBatchResultVO, type ChangeRequestReviewBatchResultVO, type ChangeRequestStatus, type ChangeRequestTargetType, type ChangeRequestVO, type CloudContract, type CommentMentionDispatchStatus, type CommentMentionInputDTO, type CommentMentionTargetType, type CommentMentionVO, type CommentSubjectType, type CommentVO, type CommitVO, type CreatableNodeType, type CreateFormDTO, DEFAULT_BASE_URL, type FieldType, type FileNodeMetadata, type FileNodeVO, type FilePreviewConfigVO, type FilePreviewConfigurationStatus, type FilePreviewCredentialSource, type FilePreviewProvider, type FilePreviewUnavailableReason, type FilePreviewVO, type FormBoundFieldVO, type FormFieldBindingVO, type FormPageSourceVO, type FormShareVO, type FormSubmitResultVO, type FormThemeVO, type FormVO, type GalleryCardSize, type GalleryCoverFit, type GanttScale, type LOOKUP_SOURCE_LIMIT, type ListFormsDTO, type ListFormsVO, type LookupComputedVO, type LookupRollup, type MentionInboxItemVO, type MentionInboxPageVO, type NodeDetailVO, type NodeIcon, type NodeIconSchema, type NodeIconSource, type NodeSearchResultVO, type NodeType, type NodeVO, type NodeWebUrlInput, type OperationKind, type OperationStatus, type OperationVO, type PlaybookAttributionVO, type RecordByFieldInput, type RecordLinkVO, type RecordVO, type ResolvedConfig, type RestoredSlugChangeVO, type ReviewVO, type ReviewVerdict, type SearchResponseVO, type SearchResultKind, type SearchResultVO, type SourceAttributionVO, type SubmitFormDTO, type UpdateFormDTO, type UpdatePreviewFileCredentialDTO, type UpdateVaultSettingsDTO, type UploadAssetOptions, type UserRefVO, type VIEW_FIELD_MAX_WIDTH, type VIEW_FIELD_MIN_WIDTH, type VaultAccessPolicy, type VaultEnvironment, type VaultItemInput, type VaultItemKind, type VaultItemVO, type VaultRuntimeEnv, type VaultScopeType, type VaultSettingsVO, type ViewConfigVO, type ViewFilterConditionVO, type ViewFilterConjunction, type ViewFilterGroupVO, type ViewFilterOperator, type ViewFilterVO, type ViewSortVO, type ViewType, type ViewVO, cloudContract, type combineViewFilters, createBusabaseClient, type flattenViewFilters, getRecordByField, grepAssets, hashBytes, type isViewFilterGroup, type mapViewFilters, nodeWebUrl, normalizeBaseUrl, resolveConfig, type resolveNodeIconSource, toFilesOnlyGrepResult, toUnifiedFilesGrepInput, uploadAsset };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as uploadAsset, i as hashBytes, n as TemplateLocalesSchema, r as TemplateRiskLevelSchema } from "./template-CMJMkyse.js";
1
+ import { a as hashBytes, i as TemplateVideoSchema, n as TemplateLocalesSchema, o as uploadAsset, r as TemplateRiskLevelSchema } from "./template-Bnkq4diD.js";
2
2
  import { t as normalizeBaseUrl } from "./url-B8GMXalA.js";
3
3
  import { ORPCError, createORPCClient } from "@orpc/client";
4
4
  import { OpenAPILink } from "@orpc/openapi-client/fetch";
@@ -599,6 +599,7 @@ const fieldOptionsSchema = z.object({
599
599
  currency: z.string().regex(/^[A-Z]{3}$/).optional()
600
600
  }).optional(),
601
601
  inverseFieldId: z.string().optional(),
602
+ reverseOfFieldId: z.string().optional().describe("Relation fields only. Makes this a read-only reverse column of the relation field with this id on the target Base, which must point back at this Base. Its value is computed from that field's links; edit the forward field instead."),
602
603
  lookup: z.object({
603
604
  relationFieldSlug: z.string().min(1).describe("Slug of a `relation` field on THIS Base — the hop to follow."),
604
605
  targetFieldSlug: z.string().min(1).describe("Slug of the field on the related Base whose values are pulled over."),
@@ -2100,6 +2101,7 @@ const liveEventSchema = z.object({
2100
2101
  "node.metadata_updated",
2101
2102
  "node.settings_updated"
2102
2103
  ]),
2104
+ reason: z.literal("acl").optional(),
2103
2105
  spaceId: z.string(),
2104
2106
  actorId: z.string(),
2105
2107
  changeRequestId: z.string().nullable(),
@@ -3139,6 +3141,23 @@ const viewFilterSchema = z.object({
3139
3141
  operator: viewFilterOperatorSchema,
3140
3142
  value: z.unknown().optional()
3141
3143
  });
3144
+ const viewFilterConjunctionSchema = z.enum(["and", "or"]);
3145
+ const deepestViewFilterGroupSchema = z.object({
3146
+ conjunction: viewFilterConjunctionSchema,
3147
+ conditions: z.array(viewFilterSchema).min(1).max(100)
3148
+ });
3149
+ const viewFilterGroupSchema = z.object({
3150
+ conjunction: viewFilterConjunctionSchema,
3151
+ conditions: z.array(z.union([viewFilterSchema, deepestViewFilterGroupSchema])).min(1).max(100)
3152
+ });
3153
+ const viewFilterConditionSchema = z.union([viewFilterSchema, viewFilterGroupSchema]);
3154
+ const viewFiltersSchema = z.array(viewFilterConditionSchema).max(100).superRefine((conditions, ctx) => {
3155
+ const count = (items) => items.reduce((total, item) => total + ("conditions" in item ? count(item.conditions) : 1), 0);
3156
+ if (count(conditions) > 100) ctx.addIssue({
3157
+ code: "custom",
3158
+ message: "A view supports at most 100 filter conditions."
3159
+ });
3160
+ });
3142
3161
  const viewSortSchema = z.object({
3143
3162
  direction: z.enum(["asc", "desc"]),
3144
3163
  fieldSlug: z.string(),
@@ -3159,7 +3178,8 @@ const galleryCardSizeSchema = z.enum([
3159
3178
  "large"
3160
3179
  ]);
3161
3180
  const viewConfigSchema = z.object({
3162
- filters: z.array(viewFilterSchema).default([]),
3181
+ filters: viewFiltersSchema.default([]),
3182
+ filterConjunction: viewFilterConjunctionSchema.optional(),
3163
3183
  sorts: z.array(viewSortSchema).default([]),
3164
3184
  visibleFieldSlugs: z.array(z.string()).nullable().optional(),
3165
3185
  fieldWidths: z.record(z.string().min(1), z.number().int().min(92).max(640)).optional(),
@@ -3207,7 +3227,7 @@ const viewConfigPatchSchema = viewConfigSchema.omit({
3207
3227
  filters: true,
3208
3228
  sorts: true
3209
3229
  }).extend({
3210
- filters: z.array(viewFilterSchema).optional(),
3230
+ filters: viewFiltersSchema.optional(),
3211
3231
  sorts: z.array(viewSortSchema).optional()
3212
3232
  });
3213
3233
  const updateViewInputSchema = z.object({
@@ -3256,6 +3276,38 @@ const viewChangeRequestInputSchema = z.discriminatedUnion("operation", [
3256
3276
  ]);
3257
3277
  //#endregion
3258
3278
  //#region ../../packages/busabase-contract/src/domains/base/contract/record-schemas.ts
3279
+ const lookupComputedSchema = z.object({
3280
+ status: z.enum([
3281
+ "ready",
3282
+ "unlinked",
3283
+ "empty",
3284
+ "invalid",
3285
+ "inaccessible"
3286
+ ]),
3287
+ reason: z.enum([
3288
+ "missing_configuration",
3289
+ "missing_relation",
3290
+ "missing_source_configuration",
3291
+ "missing_target_field",
3292
+ "unsupported_source",
3293
+ "unsupported_rollup",
3294
+ "source_base_mismatch",
3295
+ "source_record_archived"
3296
+ ]).optional(),
3297
+ value: z.unknown(),
3298
+ targetField: baseFieldSchema.optional(),
3299
+ sourceBaseId: z.string().optional(),
3300
+ sourceBaseSlug: z.string().optional(),
3301
+ sources: z.array(z.object({
3302
+ recordId: z.string(),
3303
+ title: z.string(),
3304
+ value: z.unknown(),
3305
+ headCommitId: z.string()
3306
+ })).max(25).default([]),
3307
+ sourcesTruncated: z.boolean().optional(),
3308
+ dependencyVersion: z.string(),
3309
+ dependencyReadAt: z.number().finite().nonnegative().optional()
3310
+ });
3259
3311
  const recordSchema = z.object({
3260
3312
  id: z.string(),
3261
3313
  baseId: z.string(),
@@ -3266,6 +3318,7 @@ const recordSchema = z.object({
3266
3318
  createdBy: z.string(),
3267
3319
  createdByUser: userRefSchema.nullable().optional().default(null),
3268
3320
  fieldUsers: z.record(z.string(), userRefSchema).optional().default({}),
3321
+ computedFields: z.record(z.string(), lookupComputedSchema).optional(),
3269
3322
  archivedAt: z.string().nullable(),
3270
3323
  createdAt: z.string(),
3271
3324
  updatedAt: z.string(),
@@ -3843,8 +3896,11 @@ const recordContract = {
3843
3896
  path: "/records/{recordId}/links",
3844
3897
  tags: ["Records"],
3845
3898
  summary: "List record links",
3846
- successDescription: "Active outbound links from a canonical record."
3847
- }).input(z.object({ recordId: z.string() })).output(z.array(recordLinkSchema))
3899
+ successDescription: "Active links of a canonical record: outbound (this record's relation fields) by default, or inbound (other records whose relation fields link here)."
3900
+ }).input(z.object({
3901
+ recordId: z.string(),
3902
+ direction: z.enum(["outbound", "inbound"]).optional().describe("`outbound` (default): links stored on this record. `inbound`: links from other live records that point at this record — the reverse side of a relation, i.e. 'who links here'.")
3903
+ })).output(z.array(recordLinkSchema))
3848
3904
  };
3849
3905
  const viewContract = { changeRequest: oc.route({
3850
3906
  method: "POST",
@@ -4668,7 +4724,14 @@ const TemplateCardVOSchema = z.object({
4668
4724
  */
4669
4725
  video: z.string().optional(),
4670
4726
  /**
4671
- * Per-locale screenshots/clip, absolute URLs like the two fields above,
4727
+ * Every default clip, absolute URLs, in display order. `video` is always the
4728
+ * first of these (kept for clients built before this field existed — the
4729
+ * mobile app ships separately from the server). Render through
4730
+ * `pickTemplateMedia(card, locale)`, never from this directly.
4731
+ */
4732
+ videos: z.array(TemplateVideoSchema).optional(),
4733
+ /**
4734
+ * Per-locale screenshots/clips, absolute URLs like the fields above,
4672
4735
  * keyed by locale. Absent when the template declares none — and on every
4673
4736
  * card an older catalog produced. Never read it directly: render through
4674
4737
  * `pickTemplateMedia(card, locale)` (`domains/templates/media`), which owns
@@ -131,17 +131,35 @@ const TemplateSecretSchema = z.object({
131
131
  required: z.boolean().default(true)
132
132
  });
133
133
  /**
134
+ * One demo clip in a template's gallery.
135
+ *
136
+ * An object rather than a bare path, on purpose, and from the first release: the
137
+ * catalog is read at runtime by servers that were deployed before this existed,
138
+ * so a list of strings that later became a list of objects would break exactly
139
+ * the servers in between. `title` is what tells two clips of one template apart
140
+ * ("30-second tour", "Full walkthrough"); a locale that wants the title in its
141
+ * own language declares its own `videos` list.
142
+ *
143
+ * `src` is package-relative in `busabase.json` and an absolute URL on the card.
144
+ */
145
+ const TemplateVideoSchema = z.object({
146
+ src: z.string().min(1),
147
+ title: z.string().optional()
148
+ });
149
+ /**
134
150
  * One locale's own gallery media — the value side of `template.locales`.
135
151
  *
136
- * Both fields optional and independent: a locale that only re-recorded the clip
137
- * declares just `video` and keeps the default screenshots. Paths are
138
- * package-relative in `busabase.json` and absolute URLs on the catalog card;
152
+ * All fields optional and independent: a locale that only re-recorded the clip
153
+ * declares just `video` (or `videos`) and keeps the default screenshots. Paths
154
+ * are package-relative in `busabase.json` and absolute URLs on the catalog card;
139
155
  * the shape is the same, which is why the card VO reuses this schema.
140
156
  */
141
157
  const TemplateLocaleMediaSchema = z.object({
142
158
  /** Replaces the default list WHOLE for this locale — never merged per index. */
143
159
  screenshots: z.array(z.string()).optional(),
144
- video: z.string().optional()
160
+ video: z.string().optional(),
161
+ /** Replaces the default clips WHOLE for this locale; wins over `video` here. */
162
+ videos: z.array(TemplateVideoSchema).optional()
145
163
  });
146
164
  /**
147
165
  * Per-locale media keyed by locale (`"zh-CN"`, `"ja"`).
@@ -171,8 +189,18 @@ z.object({
171
189
  */
172
190
  video: z.string().optional(),
173
191
  /**
192
+ * Several demo clips, in the order they are shown (cover first, then these,
193
+ * then the screenshots), at most `TEMPLATE_VIDEO_LIMIT`.
194
+ *
195
+ * `video` stays the one-clip shorthand and is unchanged. When `videos` is
196
+ * declared it wins, and the catalog index still writes `video` as the first
197
+ * entry's path so servers deployed before this field existed keep showing one
198
+ * clip instead of none.
199
+ */
200
+ videos: z.array(TemplateVideoSchema).optional(),
201
+ /**
174
202
  * Localized gallery media, the App Store / Google Play rule: a viewer whose
175
- * locale has an entry sees that entry's `screenshots` / `video`; anything the
203
+ * locale has an entry sees that entry's `screenshots` / `video` / `videos`; anything the
176
204
  * entry leaves out, and every locale without an entry, falls back to the two
177
205
  * fields above. Those stay the English/default set — they are what every
178
206
  * deployed server and CLI already reads, so their meaning cannot change.
@@ -271,4 +299,4 @@ z.object({
271
299
  ["isTemplateSkill"]: z.literal(true)
272
300
  });
273
301
  //#endregion
274
- export { uploadAsset as a, hashBytes as i, TemplateLocalesSchema as n, TemplateRiskLevelSchema as r, APP_ROOT_RESOURCE_KEY as t };
302
+ export { hashBytes as a, TemplateVideoSchema as i, TemplateLocalesSchema as n, uploadAsset as o, TemplateRiskLevelSchema as r, APP_ROOT_RESOURCE_KEY as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "busa-sdk",
3
- "version": "0.98.0",
3
+ "version": "0.99.0",
4
4
  "description": "Typed TypeScript/JavaScript SDK for the Busabase OpenAPI REST API. Talks to a local or remote `busabase server` (or Busabase Cloud). Short-name alias for busabase-sdk.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/busabase/busabase/tree/main/apps/busabase-sdk",