@sublay/js 7.6.0 → 7.7.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/README.md CHANGED
@@ -42,7 +42,7 @@ One `SublayClient` with 14 module namespaces (call them as `sublay.<module>.<fn>
42
42
  | `users` | profiles, username lookup, suggestions, updates, and the per-user follow/connection graph |
43
43
  | `entities` | content CRUD, drafts, feeds (`fetchManyEntities`), reactions, saves |
44
44
  | `comments` | threaded comments CRUD, reactions |
45
- | `spaces` | communities: lifecycle, membership, roles, rules, digests, moderation |
45
+ | `spaces` | communities: lifecycle, membership, roles, rules, moderation |
46
46
  | `collections` | saved-entity collections |
47
47
  | `follows` / `connections` | the logged-in user's own follow graph and mutual connections |
48
48
  | `appNotifications` | in-app notifications and unread counts |
package/dist/index.d.mts CHANGED
@@ -967,22 +967,6 @@ interface CheckMyMembershipResponse {
967
967
  }
968
968
  interface DeleteSpaceResponse {
969
969
  message: string;
970
- deletedSpace: {
971
- id: string;
972
- name: string;
973
- };
974
- counts: {
975
- entities: number;
976
- members: number;
977
- childSpaces: number;
978
- };
979
- }
980
- interface DigestConfig {
981
- digestEnabled: boolean;
982
- digestWebhookUrl: string | null;
983
- digestWebhookSecret: string | null;
984
- digestScheduleHour: number | null;
985
- digestTimezone: string | null;
986
970
  }
987
971
  interface SpaceBreadcrumb {
988
972
  breadcrumb: SpacePreview[];
@@ -2043,21 +2027,6 @@ interface ModerateSpaceCommentProps {
2043
2027
  }
2044
2028
  declare function moderateSpaceComment(client: SublayHttpClient, data: ModerateSpaceCommentProps): Promise<ModerationResponse>;
2045
2029
 
2046
- interface FetchDigestConfigProps {
2047
- spaceId: string;
2048
- }
2049
- declare function fetchDigestConfig(client: SublayHttpClient, data: FetchDigestConfigProps): Promise<DigestConfig>;
2050
-
2051
- interface UpdateDigestConfigProps {
2052
- spaceId: string;
2053
- digestEnabled?: boolean;
2054
- digestWebhookUrl?: string;
2055
- digestWebhookSecret?: string;
2056
- digestScheduleHour?: number;
2057
- digestTimezone?: string;
2058
- }
2059
- declare function updateDigestConfig(client: SublayHttpClient, data: UpdateDigestConfigProps): Promise<DigestConfig>;
2060
-
2061
2030
  interface ChatMessage {
2062
2031
  id: string;
2063
2032
  projectId: string;
@@ -2173,7 +2142,6 @@ declare const Spaces_declineMembership: typeof declineMembership;
2173
2142
  declare const Spaces_deleteRule: typeof deleteRule;
2174
2143
  declare const Spaces_deleteSpace: typeof deleteSpace;
2175
2144
  declare const Spaces_fetchChildSpaces: typeof fetchChildSpaces;
2176
- declare const Spaces_fetchDigestConfig: typeof fetchDigestConfig;
2177
2145
  declare const Spaces_fetchManyRules: typeof fetchManyRules;
2178
2146
  declare const Spaces_fetchManySpaces: typeof fetchManySpaces;
2179
2147
  declare const Spaces_fetchMutualSpaces: typeof fetchMutualSpaces;
@@ -2197,12 +2165,11 @@ declare const Spaces_moderateSpaceEntity: typeof moderateSpaceEntity;
2197
2165
  declare const Spaces_reorderRules: typeof reorderRules;
2198
2166
  declare const Spaces_setSpaceEntityNsfw: typeof setSpaceEntityNsfw;
2199
2167
  declare const Spaces_unbanMember: typeof unbanMember;
2200
- declare const Spaces_updateDigestConfig: typeof updateDigestConfig;
2201
2168
  declare const Spaces_updateMemberRole: typeof updateMemberRole;
2202
2169
  declare const Spaces_updateRule: typeof updateRule;
2203
2170
  declare const Spaces_updateSpace: typeof updateSpace;
2204
2171
  declare namespace Spaces {
2205
- export { Spaces_approveMembership as approveMembership, Spaces_banMember as banMember, Spaces_checkMyMembership as checkMyMembership, Spaces_checkSlugAvailability as checkSlugAvailability, Spaces_createRule as createRule, Spaces_createSpace as createSpace, Spaces_declineMembership as declineMembership, Spaces_deleteRule as deleteRule, Spaces_deleteSpace as deleteSpace, Spaces_fetchChildSpaces as fetchChildSpaces, Spaces_fetchDigestConfig as fetchDigestConfig, Spaces_fetchManyRules as fetchManyRules, Spaces_fetchManySpaces as fetchManySpaces, Spaces_fetchMutualSpaces as fetchMutualSpaces, Spaces_fetchRule as fetchRule, Spaces_fetchSpace as fetchSpace, Spaces_fetchSpaceBreadcrumb as fetchSpaceBreadcrumb, Spaces_fetchSpaceByShortId as fetchSpaceByShortId, Spaces_fetchSpaceBySlug as fetchSpaceBySlug, Spaces_fetchSpaceMembers as fetchSpaceMembers, Spaces_fetchSpaceTeam as fetchSpaceTeam, Spaces_fetchUserSpaces as fetchUserSpaces, Spaces_getSpaceConversation as getSpaceConversation, Spaces_handleCommentReport as handleCommentReport, Spaces_handleEntityReport as handleEntityReport, Spaces_handleSpaceChatReport as handleSpaceChatReport, Spaces_joinSpace as joinSpace, Spaces_leaveSpace as leaveSpace, Spaces_moderateSpaceChatMessage as moderateSpaceChatMessage, Spaces_moderateSpaceComment as moderateSpaceComment, Spaces_moderateSpaceEntity as moderateSpaceEntity, Spaces_reorderRules as reorderRules, Spaces_setSpaceEntityNsfw as setSpaceEntityNsfw, Spaces_unbanMember as unbanMember, Spaces_updateDigestConfig as updateDigestConfig, Spaces_updateMemberRole as updateMemberRole, Spaces_updateRule as updateRule, Spaces_updateSpace as updateSpace };
2172
+ export { Spaces_approveMembership as approveMembership, Spaces_banMember as banMember, Spaces_checkMyMembership as checkMyMembership, Spaces_checkSlugAvailability as checkSlugAvailability, Spaces_createRule as createRule, Spaces_createSpace as createSpace, Spaces_declineMembership as declineMembership, Spaces_deleteRule as deleteRule, Spaces_deleteSpace as deleteSpace, Spaces_fetchChildSpaces as fetchChildSpaces, Spaces_fetchManyRules as fetchManyRules, Spaces_fetchManySpaces as fetchManySpaces, Spaces_fetchMutualSpaces as fetchMutualSpaces, Spaces_fetchRule as fetchRule, Spaces_fetchSpace as fetchSpace, Spaces_fetchSpaceBreadcrumb as fetchSpaceBreadcrumb, Spaces_fetchSpaceByShortId as fetchSpaceByShortId, Spaces_fetchSpaceBySlug as fetchSpaceBySlug, Spaces_fetchSpaceMembers as fetchSpaceMembers, Spaces_fetchSpaceTeam as fetchSpaceTeam, Spaces_fetchUserSpaces as fetchUserSpaces, Spaces_getSpaceConversation as getSpaceConversation, Spaces_handleCommentReport as handleCommentReport, Spaces_handleEntityReport as handleEntityReport, Spaces_handleSpaceChatReport as handleSpaceChatReport, Spaces_joinSpace as joinSpace, Spaces_leaveSpace as leaveSpace, Spaces_moderateSpaceChatMessage as moderateSpaceChatMessage, Spaces_moderateSpaceComment as moderateSpaceComment, Spaces_moderateSpaceEntity as moderateSpaceEntity, Spaces_reorderRules as reorderRules, Spaces_setSpaceEntityNsfw as setSpaceEntityNsfw, Spaces_unbanMember as unbanMember, Spaces_updateMemberRole as updateMemberRole, Spaces_updateRule as updateRule, Spaces_updateSpace as updateSpace };
2206
2173
  }
2207
2174
 
2208
2175
  interface Collection {
@@ -3198,8 +3165,8 @@ interface EditMessageProps {
3198
3165
  conversationId: string;
3199
3166
  messageId: string;
3200
3167
  content?: string;
3201
- /** A GIF URL, or null to clear it. */
3202
- gif?: string | null;
3168
+ /** A GIF attachment, or null to clear it. */
3169
+ gif?: GifData | null;
3203
3170
  mentions?: Mention[];
3204
3171
  metadata?: Record<string, any> | null;
3205
3172
  }
@@ -3373,6 +3340,195 @@ declare namespace Push {
3373
3340
  export { Push_getNotificationPreferences as getNotificationPreferences, Push_updateNotificationPreferences as updateNotificationPreferences };
3374
3341
  }
3375
3342
 
3343
+ /**
3344
+ * Workspaces bundle interfaces (client subset). Mirrors the server's
3345
+ * `IWorkspace` / `IWorkspaceMember` / `IWorkspaceInvitation` shapes and the
3346
+ * workspace controller responses.
3347
+ *
3348
+ * `capabilities` is a CLOSED, Sublay-enforced vocabulary (cascades via reach);
3349
+ * `permissions` is opaque free-form developer strings Sublay never consumes
3350
+ * (per-node only, does NOT cascade).
3351
+ */
3352
+ type WorkspaceCapability = "view" | "invite" | "remove-member" | "edit-member-access" | "edit-member-profile" | "create-sub-workspace" | "edit-workspace";
3353
+ type WorkspaceInvitationStatus = "pending" | "accepted" | "declined" | "revoked";
3354
+ type WorkspaceAuthorityReason = "owner" | "ancestor-owner" | "member" | "reach-holder";
3355
+ interface Workspace {
3356
+ id: string;
3357
+ name: string;
3358
+ metadata: Record<string, any>;
3359
+ ownerId: string;
3360
+ parentWorkspaceId: string | null;
3361
+ depth: number;
3362
+ inheritsFromParent: boolean;
3363
+ createdAt: string;
3364
+ updatedAt: string;
3365
+ memberCount?: number;
3366
+ }
3367
+ interface WorkspaceInvitation {
3368
+ id: string;
3369
+ workspaceId: string;
3370
+ invitedBy: string;
3371
+ userId: string | null;
3372
+ email: string | null;
3373
+ capabilities: WorkspaceCapability[];
3374
+ permissions: string[];
3375
+ rank: number;
3376
+ title: string | null;
3377
+ status: WorkspaceInvitationStatus;
3378
+ expiresAt: string;
3379
+ createdAt: string;
3380
+ updatedAt: string;
3381
+ }
3382
+ interface WorkspaceRosterReason {
3383
+ type: "owner" | "member" | "ancestor-owner" | "reach-holder" | "descendant-member";
3384
+ rank?: number;
3385
+ capabilities?: WorkspaceCapability[];
3386
+ permissions?: string[];
3387
+ title?: string | null;
3388
+ metadata?: Record<string, any>;
3389
+ viaWorkspaceId?: string;
3390
+ workspaceId?: string;
3391
+ }
3392
+ interface WorkspaceRosterEntry {
3393
+ user: User;
3394
+ reasons: WorkspaceRosterReason[];
3395
+ }
3396
+ interface WorkspaceRosterResponse {
3397
+ data: WorkspaceRosterEntry[];
3398
+ total: number;
3399
+ }
3400
+ interface WorkspaceRosterCountsResponse {
3401
+ counts: {
3402
+ owner: number;
3403
+ member: number;
3404
+ ancestorOwner: number;
3405
+ reachHolder: number;
3406
+ descendantMember: number;
3407
+ };
3408
+ total: number;
3409
+ distinctUsers: number;
3410
+ }
3411
+ interface WorkspaceAuthority {
3412
+ reasons: WorkspaceAuthorityReason[];
3413
+ capabilities: WorkspaceCapability[];
3414
+ permissions: string[];
3415
+ rank: number | null;
3416
+ }
3417
+
3418
+ interface CreateWorkspaceProps {
3419
+ name: string;
3420
+ metadata?: Record<string, any>;
3421
+ parentWorkspaceId?: string | null;
3422
+ }
3423
+ /**
3424
+ * Create a root or child workspace. The creator (the bearer-token user) becomes
3425
+ * the owner. Root creation requires a verified email.
3426
+ */
3427
+ declare function createWorkspace(client: SublayHttpClient, data: CreateWorkspaceProps): Promise<Workspace>;
3428
+
3429
+ interface FetchWorkspaceProps {
3430
+ workspaceId: string;
3431
+ include?: string;
3432
+ }
3433
+ declare function fetchWorkspace(client: SublayHttpClient, data: FetchWorkspaceProps): Promise<Workspace>;
3434
+
3435
+ interface FetchManyWorkspacesProps {
3436
+ page?: number;
3437
+ limit?: number;
3438
+ include?: string;
3439
+ }
3440
+ /**
3441
+ * List the bearer-token user's direct-membership + owned workspaces. The actor
3442
+ * is derived from the token — no `userId` is sent.
3443
+ */
3444
+ declare function fetchManyWorkspaces(client: SublayHttpClient, data?: FetchManyWorkspacesProps): Promise<PaginatedResponse<Workspace>>;
3445
+
3446
+ interface FetchMembersProps {
3447
+ workspaceId: string;
3448
+ include?: string;
3449
+ countOnly?: boolean;
3450
+ }
3451
+ /**
3452
+ * Unified roster read — one entry per distinct user, each with a `reasons`
3453
+ * array. Always returned in full (never paginated). With `countOnly=true` the
3454
+ * shape is `WorkspaceRosterCountsResponse` instead. Actor from the token.
3455
+ */
3456
+ declare function fetchMembers(client: SublayHttpClient, data: FetchMembersProps): Promise<WorkspaceRosterResponse | WorkspaceRosterCountsResponse>;
3457
+
3458
+ interface CreateInviteProps {
3459
+ workspaceId: string;
3460
+ email?: string;
3461
+ userId?: string;
3462
+ username?: string;
3463
+ capabilities?: WorkspaceCapability[];
3464
+ permissions?: string[];
3465
+ rank: number;
3466
+ title?: string | null;
3467
+ }
3468
+ /**
3469
+ * Create an invitation (requires the `invite` capability on the workspace). The
3470
+ * inviter is the bearer-token user.
3471
+ */
3472
+ declare function createInvite(client: SublayHttpClient, data: CreateInviteProps): Promise<WorkspaceInvitation>;
3473
+
3474
+ interface AcceptInviteProps {
3475
+ inviteId: string;
3476
+ }
3477
+ interface AcceptInviteResponse {
3478
+ success: boolean;
3479
+ workspaceId: string;
3480
+ }
3481
+ /**
3482
+ * Accept an invitation — identity-matched to the bearer-token user + verified
3483
+ * email required. Non-secret id. Idempotent when already a member/owner.
3484
+ */
3485
+ declare function acceptInvite(client: SublayHttpClient, data: AcceptInviteProps): Promise<AcceptInviteResponse>;
3486
+
3487
+ interface DeclineInviteProps {
3488
+ inviteId: string;
3489
+ }
3490
+ interface DeclineInviteResponse {
3491
+ success: boolean;
3492
+ }
3493
+ /**
3494
+ * Decline an invitation — identity-matched to the bearer-token user (not
3495
+ * verification-gated).
3496
+ */
3497
+ declare function declineInvite(client: SublayHttpClient, data: DeclineInviteProps): Promise<DeclineInviteResponse>;
3498
+
3499
+ interface FetchMyInvitesResponse {
3500
+ data: WorkspaceInvitation[];
3501
+ }
3502
+ /**
3503
+ * The bearer-token user's LIVE pending invites (`status='pending' AND expiresAt
3504
+ * > now`), matched by `userId` from the token. Surfacing is NOT
3505
+ * verification-gated (the verified check applies only at accept).
3506
+ */
3507
+ declare function fetchMyInvites(client: SublayHttpClient): Promise<FetchMyInvitesResponse>;
3508
+
3509
+ interface GetAuthorityProps {
3510
+ workspaceId: string;
3511
+ }
3512
+ /**
3513
+ * Authority-as-a-service read — the bearer-token user's resolved standing
3514
+ * (`{ reasons, capabilities, permissions, rank }`) on the workspace. A
3515
+ * permission check is a one-line `.includes()` on the result.
3516
+ */
3517
+ declare function getAuthority(client: SublayHttpClient, data: GetAuthorityProps): Promise<WorkspaceAuthority>;
3518
+
3519
+ declare const Workspaces_acceptInvite: typeof acceptInvite;
3520
+ declare const Workspaces_createInvite: typeof createInvite;
3521
+ declare const Workspaces_createWorkspace: typeof createWorkspace;
3522
+ declare const Workspaces_declineInvite: typeof declineInvite;
3523
+ declare const Workspaces_fetchManyWorkspaces: typeof fetchManyWorkspaces;
3524
+ declare const Workspaces_fetchMembers: typeof fetchMembers;
3525
+ declare const Workspaces_fetchMyInvites: typeof fetchMyInvites;
3526
+ declare const Workspaces_fetchWorkspace: typeof fetchWorkspace;
3527
+ declare const Workspaces_getAuthority: typeof getAuthority;
3528
+ declare namespace Workspaces {
3529
+ export { Workspaces_acceptInvite as acceptInvite, Workspaces_createInvite as createInvite, Workspaces_createWorkspace as createWorkspace, Workspaces_declineInvite as declineInvite, Workspaces_fetchManyWorkspaces as fetchManyWorkspaces, Workspaces_fetchMembers as fetchMembers, Workspaces_fetchMyInvites as fetchMyInvites, Workspaces_fetchWorkspace as fetchWorkspace, Workspaces_getAuthority as getAuthority };
3530
+ }
3531
+
3376
3532
  /**
3377
3533
  * Custom-table types for the `/db` surface (row ops only — the js-sdk holds no
3378
3534
  * service key, so it carries no table-management/DDL surface).
@@ -3455,6 +3611,7 @@ declare class SublayClient {
3455
3611
  oauth: BoundModule<typeof OAuth>;
3456
3612
  chat: BoundModule<typeof Chat>;
3457
3613
  push: BoundModule<typeof Push>;
3614
+ workspaces: BoundModule<typeof Workspaces>;
3458
3615
  private constructor();
3459
3616
  static init(config: ClientConfig): Promise<SublayClient>;
3460
3617
  /**
@@ -3469,4 +3626,4 @@ declare class SublayClient {
3469
3626
  clearTokens(): void;
3470
3627
  }
3471
3628
 
3472
- export { type AuthTokens, type BulkDeleteProps, type BulkDeleteResult, type ClientConfig, type DbFilter, type DbFilterOperator, type DeleteResult, MUTE_DURATIONS, type MuteConversationProps, type MuteConversationResponse, type MuteDuration, type NotificationPreferences, PUSH_EVENT_TYPES, type PaginatedResponse, type PaginationMetadata, type PushEventType, type SpaceReputationContextParams, type SpaceReputationUserParams, SublayClient, type TableAccessor, type TableQuery, type TableRow, type UpdateNotificationPreferencesProps, type UserSearchParams };
3629
+ export { type AuthTokens, type BulkDeleteProps, type BulkDeleteResult, type ClientConfig, type DbFilter, type DbFilterOperator, type DeleteResult, MUTE_DURATIONS, type MuteConversationProps, type MuteConversationResponse, type MuteDuration, type NotificationPreferences, PUSH_EVENT_TYPES, type PaginatedResponse, type PaginationMetadata, type PushEventType, type SpaceReputationContextParams, type SpaceReputationUserParams, SublayClient, type TableAccessor, type TableQuery, type TableRow, type UpdateNotificationPreferencesProps, type UserSearchParams, type Workspace, type WorkspaceAuthority, type WorkspaceAuthorityReason, type WorkspaceCapability, type WorkspaceInvitation, type WorkspaceInvitationStatus, type WorkspaceRosterCountsResponse, type WorkspaceRosterEntry, type WorkspaceRosterReason, type WorkspaceRosterResponse };
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ import * as Storage from "./modules/storage";
15
15
  import * as OAuth from "./modules/oauth";
16
16
  import * as Chat from "./modules/chat";
17
17
  import * as Push from "./modules/push";
18
+ import * as Workspaces from "./modules/workspaces";
18
19
  import { TableAccessor, TableRow } from "./interfaces/Table";
19
20
  type BoundModule<T extends Record<string, (client: SublayHttpClient, ...args: any[]) => any>> = {
20
21
  [K in keyof T]: (...args: Parameters<T[K]> extends [any, ...infer R] ? R : never) => ReturnType<T[K]>;
@@ -37,6 +38,7 @@ export declare class SublayClient {
37
38
  oauth: BoundModule<typeof OAuth>;
38
39
  chat: BoundModule<typeof Chat>;
39
40
  push: BoundModule<typeof Push>;
41
+ workspaces: BoundModule<typeof Workspaces>;
40
42
  private constructor();
41
43
  static init(config: ClientConfig): Promise<SublayClient>;
42
44
  /**
@@ -54,6 +56,7 @@ export type { ClientConfig, AuthTokens } from "./core/client";
54
56
  export type { PaginatedResponse, PaginationMetadata, } from "./interfaces/IPaginatedResponse";
55
57
  export type { SpaceReputationContextParams, SpaceReputationUserParams, } from "./interfaces/SpaceReputation";
56
58
  export type { UserSearchParams } from "./interfaces/UserSearch";
59
+ export type { Workspace, WorkspaceInvitation, WorkspaceCapability, WorkspaceInvitationStatus, WorkspaceAuthorityReason, WorkspaceRosterReason, WorkspaceRosterEntry, WorkspaceRosterResponse, WorkspaceRosterCountsResponse, WorkspaceAuthority, } from "./interfaces/Workspace";
57
60
  export { PUSH_EVENT_TYPES, MUTE_DURATIONS } from "./interfaces/Push";
58
61
  export type { PushEventType, MuteDuration, NotificationPreferences, } from "./interfaces/Push";
59
62
  export type { UpdateNotificationPreferencesProps } from "./modules/push/updateNotificationPreferences";
package/dist/index.js CHANGED
@@ -1233,7 +1233,6 @@ __export(spaces_exports, {
1233
1233
  deleteRule: () => deleteRule,
1234
1234
  deleteSpace: () => deleteSpace,
1235
1235
  fetchChildSpaces: () => fetchChildSpaces,
1236
- fetchDigestConfig: () => fetchDigestConfig,
1237
1236
  fetchManyRules: () => fetchManyRules,
1238
1237
  fetchManySpaces: () => fetchManySpaces,
1239
1238
  fetchMutualSpaces: () => fetchMutualSpaces,
@@ -1257,7 +1256,6 @@ __export(spaces_exports, {
1257
1256
  reorderRules: () => reorderRules,
1258
1257
  setSpaceEntityNsfw: () => setSpaceEntityNsfw,
1259
1258
  unbanMember: () => unbanMember,
1260
- updateDigestConfig: () => updateDigestConfig,
1261
1259
  updateMemberRole: () => updateMemberRole,
1262
1260
  updateRule: () => updateRule,
1263
1261
  updateSpace: () => updateSpace
@@ -1628,25 +1626,6 @@ async function moderateSpaceComment(client, data) {
1628
1626
  return response.data;
1629
1627
  }
1630
1628
 
1631
- // src/modules/spaces/fetchDigestConfig.ts
1632
- async function fetchDigestConfig(client, data) {
1633
- const { spaceId } = data;
1634
- const response = await client.projectInstance.get(
1635
- `/spaces/${spaceId}/digest-config`
1636
- );
1637
- return response.data;
1638
- }
1639
-
1640
- // src/modules/spaces/updateDigestConfig.ts
1641
- async function updateDigestConfig(client, data) {
1642
- const { spaceId, ...body } = data;
1643
- const response = await client.projectInstance.patch(
1644
- `/spaces/${spaceId}/digest-config`,
1645
- body
1646
- );
1647
- return response.data;
1648
- }
1649
-
1650
1629
  // src/modules/spaces/getSpaceConversation.ts
1651
1630
  async function getSpaceConversation(client, data) {
1652
1631
  const { spaceId } = data;
@@ -2557,6 +2536,99 @@ async function updateNotificationPreferences(client, data) {
2557
2536
  return response.data;
2558
2537
  }
2559
2538
 
2539
+ // src/modules/workspaces/index.ts
2540
+ var workspaces_exports = {};
2541
+ __export(workspaces_exports, {
2542
+ acceptInvite: () => acceptInvite,
2543
+ createInvite: () => createInvite,
2544
+ createWorkspace: () => createWorkspace,
2545
+ declineInvite: () => declineInvite,
2546
+ fetchManyWorkspaces: () => fetchManyWorkspaces,
2547
+ fetchMembers: () => fetchMembers,
2548
+ fetchMyInvites: () => fetchMyInvites,
2549
+ fetchWorkspace: () => fetchWorkspace,
2550
+ getAuthority: () => getAuthority
2551
+ });
2552
+
2553
+ // src/modules/workspaces/createWorkspace.ts
2554
+ async function createWorkspace(client, data) {
2555
+ const response = await client.projectInstance.post(
2556
+ "/workspaces",
2557
+ data
2558
+ );
2559
+ return response.data;
2560
+ }
2561
+
2562
+ // src/modules/workspaces/fetchWorkspace.ts
2563
+ async function fetchWorkspace(client, data) {
2564
+ const { workspaceId, include } = data;
2565
+ const response = await client.projectInstance.get(
2566
+ `/workspaces/${workspaceId}`,
2567
+ { params: include ? { include } : void 0 }
2568
+ );
2569
+ return response.data;
2570
+ }
2571
+
2572
+ // src/modules/workspaces/fetchManyWorkspaces.ts
2573
+ async function fetchManyWorkspaces(client, data = {}) {
2574
+ const response = await client.projectInstance.get("/workspaces", { params: data });
2575
+ return response.data;
2576
+ }
2577
+
2578
+ // src/modules/workspaces/fetchMembers.ts
2579
+ async function fetchMembers(client, data) {
2580
+ const { workspaceId, ...params } = data;
2581
+ const response = await client.projectInstance.get(`/workspaces/${workspaceId}/members`, { params });
2582
+ return response.data;
2583
+ }
2584
+
2585
+ // src/modules/workspaces/createInvite.ts
2586
+ async function createInvite(client, data) {
2587
+ const { workspaceId, ...body } = data;
2588
+ const response = await client.projectInstance.post(
2589
+ `/workspaces/${workspaceId}/invites`,
2590
+ body
2591
+ );
2592
+ return response.data;
2593
+ }
2594
+
2595
+ // src/modules/workspaces/acceptInvite.ts
2596
+ async function acceptInvite(client, data) {
2597
+ const { inviteId } = data;
2598
+ const response = await client.projectInstance.post(
2599
+ `/workspace-invites/${inviteId}/accept`,
2600
+ {}
2601
+ );
2602
+ return response.data;
2603
+ }
2604
+
2605
+ // src/modules/workspaces/declineInvite.ts
2606
+ async function declineInvite(client, data) {
2607
+ const { inviteId } = data;
2608
+ const response = await client.projectInstance.post(
2609
+ `/workspace-invites/${inviteId}/decline`,
2610
+ {}
2611
+ );
2612
+ return response.data;
2613
+ }
2614
+
2615
+ // src/modules/workspaces/fetchMyInvites.ts
2616
+ async function fetchMyInvites(client) {
2617
+ const response = await client.projectInstance.get(
2618
+ "/me/workspace-invites"
2619
+ );
2620
+ return response.data;
2621
+ }
2622
+
2623
+ // src/modules/workspaces/getAuthority.ts
2624
+ async function getAuthority(client, data) {
2625
+ const { workspaceId } = data;
2626
+ const response = await client.projectInstance.get(
2627
+ `/workspaces/${workspaceId}/authority/me`
2628
+ );
2629
+ return response.data;
2630
+ }
2631
+
2560
2632
  // src/modules/tables/find.ts
2561
2633
  async function find(client, tableName, query = {}) {
2562
2634
  const { filters, includeDeleted, ...rest } = query;
@@ -2688,6 +2760,7 @@ var SublayClient = class _SublayClient {
2688
2760
  oauth;
2689
2761
  chat;
2690
2762
  push;
2763
+ workspaces;
2691
2764
  constructor(http) {
2692
2765
  this.http = http;
2693
2766
  this.auth = bindModule(auth_exports, this.http);
@@ -2706,6 +2779,7 @@ var SublayClient = class _SublayClient {
2706
2779
  this.oauth = bindModule(oauth_exports, this.http);
2707
2780
  this.chat = bindModule(chat_exports, this.http);
2708
2781
  this.push = bindModule(push_exports, this.http);
2782
+ this.workspaces = bindModule(workspaces_exports, this.http);
2709
2783
  }
2710
2784
  static async init(config) {
2711
2785
  const http = new SublayHttpClient(config);
package/dist/index.mjs CHANGED
@@ -1201,7 +1201,6 @@ __export(spaces_exports, {
1201
1201
  deleteRule: () => deleteRule,
1202
1202
  deleteSpace: () => deleteSpace,
1203
1203
  fetchChildSpaces: () => fetchChildSpaces,
1204
- fetchDigestConfig: () => fetchDigestConfig,
1205
1204
  fetchManyRules: () => fetchManyRules,
1206
1205
  fetchManySpaces: () => fetchManySpaces,
1207
1206
  fetchMutualSpaces: () => fetchMutualSpaces,
@@ -1225,7 +1224,6 @@ __export(spaces_exports, {
1225
1224
  reorderRules: () => reorderRules,
1226
1225
  setSpaceEntityNsfw: () => setSpaceEntityNsfw,
1227
1226
  unbanMember: () => unbanMember,
1228
- updateDigestConfig: () => updateDigestConfig,
1229
1227
  updateMemberRole: () => updateMemberRole,
1230
1228
  updateRule: () => updateRule,
1231
1229
  updateSpace: () => updateSpace
@@ -1596,25 +1594,6 @@ async function moderateSpaceComment(client, data) {
1596
1594
  return response.data;
1597
1595
  }
1598
1596
 
1599
- // src/modules/spaces/fetchDigestConfig.ts
1600
- async function fetchDigestConfig(client, data) {
1601
- const { spaceId } = data;
1602
- const response = await client.projectInstance.get(
1603
- `/spaces/${spaceId}/digest-config`
1604
- );
1605
- return response.data;
1606
- }
1607
-
1608
- // src/modules/spaces/updateDigestConfig.ts
1609
- async function updateDigestConfig(client, data) {
1610
- const { spaceId, ...body } = data;
1611
- const response = await client.projectInstance.patch(
1612
- `/spaces/${spaceId}/digest-config`,
1613
- body
1614
- );
1615
- return response.data;
1616
- }
1617
-
1618
1597
  // src/modules/spaces/getSpaceConversation.ts
1619
1598
  async function getSpaceConversation(client, data) {
1620
1599
  const { spaceId } = data;
@@ -2525,6 +2504,99 @@ async function updateNotificationPreferences(client, data) {
2525
2504
  return response.data;
2526
2505
  }
2527
2506
 
2507
+ // src/modules/workspaces/index.ts
2508
+ var workspaces_exports = {};
2509
+ __export(workspaces_exports, {
2510
+ acceptInvite: () => acceptInvite,
2511
+ createInvite: () => createInvite,
2512
+ createWorkspace: () => createWorkspace,
2513
+ declineInvite: () => declineInvite,
2514
+ fetchManyWorkspaces: () => fetchManyWorkspaces,
2515
+ fetchMembers: () => fetchMembers,
2516
+ fetchMyInvites: () => fetchMyInvites,
2517
+ fetchWorkspace: () => fetchWorkspace,
2518
+ getAuthority: () => getAuthority
2519
+ });
2520
+
2521
+ // src/modules/workspaces/createWorkspace.ts
2522
+ async function createWorkspace(client, data) {
2523
+ const response = await client.projectInstance.post(
2524
+ "/workspaces",
2525
+ data
2526
+ );
2527
+ return response.data;
2528
+ }
2529
+
2530
+ // src/modules/workspaces/fetchWorkspace.ts
2531
+ async function fetchWorkspace(client, data) {
2532
+ const { workspaceId, include } = data;
2533
+ const response = await client.projectInstance.get(
2534
+ `/workspaces/${workspaceId}`,
2535
+ { params: include ? { include } : void 0 }
2536
+ );
2537
+ return response.data;
2538
+ }
2539
+
2540
+ // src/modules/workspaces/fetchManyWorkspaces.ts
2541
+ async function fetchManyWorkspaces(client, data = {}) {
2542
+ const response = await client.projectInstance.get("/workspaces", { params: data });
2543
+ return response.data;
2544
+ }
2545
+
2546
+ // src/modules/workspaces/fetchMembers.ts
2547
+ async function fetchMembers(client, data) {
2548
+ const { workspaceId, ...params } = data;
2549
+ const response = await client.projectInstance.get(`/workspaces/${workspaceId}/members`, { params });
2550
+ return response.data;
2551
+ }
2552
+
2553
+ // src/modules/workspaces/createInvite.ts
2554
+ async function createInvite(client, data) {
2555
+ const { workspaceId, ...body } = data;
2556
+ const response = await client.projectInstance.post(
2557
+ `/workspaces/${workspaceId}/invites`,
2558
+ body
2559
+ );
2560
+ return response.data;
2561
+ }
2562
+
2563
+ // src/modules/workspaces/acceptInvite.ts
2564
+ async function acceptInvite(client, data) {
2565
+ const { inviteId } = data;
2566
+ const response = await client.projectInstance.post(
2567
+ `/workspace-invites/${inviteId}/accept`,
2568
+ {}
2569
+ );
2570
+ return response.data;
2571
+ }
2572
+
2573
+ // src/modules/workspaces/declineInvite.ts
2574
+ async function declineInvite(client, data) {
2575
+ const { inviteId } = data;
2576
+ const response = await client.projectInstance.post(
2577
+ `/workspace-invites/${inviteId}/decline`,
2578
+ {}
2579
+ );
2580
+ return response.data;
2581
+ }
2582
+
2583
+ // src/modules/workspaces/fetchMyInvites.ts
2584
+ async function fetchMyInvites(client) {
2585
+ const response = await client.projectInstance.get(
2586
+ "/me/workspace-invites"
2587
+ );
2588
+ return response.data;
2589
+ }
2590
+
2591
+ // src/modules/workspaces/getAuthority.ts
2592
+ async function getAuthority(client, data) {
2593
+ const { workspaceId } = data;
2594
+ const response = await client.projectInstance.get(
2595
+ `/workspaces/${workspaceId}/authority/me`
2596
+ );
2597
+ return response.data;
2598
+ }
2599
+
2528
2600
  // src/modules/tables/find.ts
2529
2601
  async function find(client, tableName, query = {}) {
2530
2602
  const { filters, includeDeleted, ...rest } = query;
@@ -2656,6 +2728,7 @@ var SublayClient = class _SublayClient {
2656
2728
  oauth;
2657
2729
  chat;
2658
2730
  push;
2731
+ workspaces;
2659
2732
  constructor(http) {
2660
2733
  this.http = http;
2661
2734
  this.auth = bindModule(auth_exports, this.http);
@@ -2674,6 +2747,7 @@ var SublayClient = class _SublayClient {
2674
2747
  this.oauth = bindModule(oauth_exports, this.http);
2675
2748
  this.chat = bindModule(chat_exports, this.http);
2676
2749
  this.push = bindModule(push_exports, this.http);
2750
+ this.workspaces = bindModule(workspaces_exports, this.http);
2677
2751
  }
2678
2752
  static async init(config) {
2679
2753
  const http = new SublayHttpClient(config);
@@ -123,22 +123,6 @@ export interface CheckMyMembershipResponse {
123
123
  }
124
124
  export interface DeleteSpaceResponse {
125
125
  message: string;
126
- deletedSpace: {
127
- id: string;
128
- name: string;
129
- };
130
- counts: {
131
- entities: number;
132
- members: number;
133
- childSpaces: number;
134
- };
135
- }
136
- export interface DigestConfig {
137
- digestEnabled: boolean;
138
- digestWebhookUrl: string | null;
139
- digestWebhookSecret: string | null;
140
- digestScheduleHour: number | null;
141
- digestTimezone: string | null;
142
126
  }
143
127
  export interface SpaceBreadcrumb {
144
128
  breadcrumb: SpacePreview[];
@@ -0,0 +1,75 @@
1
+ import { User } from "./User";
2
+ /**
3
+ * Workspaces bundle interfaces (client subset). Mirrors the server's
4
+ * `IWorkspace` / `IWorkspaceMember` / `IWorkspaceInvitation` shapes and the
5
+ * workspace controller responses.
6
+ *
7
+ * `capabilities` is a CLOSED, Sublay-enforced vocabulary (cascades via reach);
8
+ * `permissions` is opaque free-form developer strings Sublay never consumes
9
+ * (per-node only, does NOT cascade).
10
+ */
11
+ export type WorkspaceCapability = "view" | "invite" | "remove-member" | "edit-member-access" | "edit-member-profile" | "create-sub-workspace" | "edit-workspace";
12
+ export type WorkspaceInvitationStatus = "pending" | "accepted" | "declined" | "revoked";
13
+ export type WorkspaceAuthorityReason = "owner" | "ancestor-owner" | "member" | "reach-holder";
14
+ export interface Workspace {
15
+ id: string;
16
+ name: string;
17
+ metadata: Record<string, any>;
18
+ ownerId: string;
19
+ parentWorkspaceId: string | null;
20
+ depth: number;
21
+ inheritsFromParent: boolean;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ memberCount?: number;
25
+ }
26
+ export interface WorkspaceInvitation {
27
+ id: string;
28
+ workspaceId: string;
29
+ invitedBy: string;
30
+ userId: string | null;
31
+ email: string | null;
32
+ capabilities: WorkspaceCapability[];
33
+ permissions: string[];
34
+ rank: number;
35
+ title: string | null;
36
+ status: WorkspaceInvitationStatus;
37
+ expiresAt: string;
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ }
41
+ export interface WorkspaceRosterReason {
42
+ type: "owner" | "member" | "ancestor-owner" | "reach-holder" | "descendant-member";
43
+ rank?: number;
44
+ capabilities?: WorkspaceCapability[];
45
+ permissions?: string[];
46
+ title?: string | null;
47
+ metadata?: Record<string, any>;
48
+ viaWorkspaceId?: string;
49
+ workspaceId?: string;
50
+ }
51
+ export interface WorkspaceRosterEntry {
52
+ user: User;
53
+ reasons: WorkspaceRosterReason[];
54
+ }
55
+ export interface WorkspaceRosterResponse {
56
+ data: WorkspaceRosterEntry[];
57
+ total: number;
58
+ }
59
+ export interface WorkspaceRosterCountsResponse {
60
+ counts: {
61
+ owner: number;
62
+ member: number;
63
+ ancestorOwner: number;
64
+ reachHolder: number;
65
+ descendantMember: number;
66
+ };
67
+ total: number;
68
+ distinctUsers: number;
69
+ }
70
+ export interface WorkspaceAuthority {
71
+ reasons: WorkspaceAuthorityReason[];
72
+ capabilities: WorkspaceCapability[];
73
+ permissions: string[];
74
+ rank: number | null;
75
+ }
@@ -1,12 +1,13 @@
1
1
  import { SublayHttpClient } from "../../core/client";
2
2
  import { ChatMessage } from "../../interfaces/ChatMessage";
3
+ import { GifData } from "../../interfaces/Comment";
3
4
  import { Mention } from "../../interfaces/Mention";
4
5
  export interface EditMessageProps {
5
6
  conversationId: string;
6
7
  messageId: string;
7
8
  content?: string;
8
- /** A GIF URL, or null to clear it. */
9
- gif?: string | null;
9
+ /** A GIF attachment, or null to clear it. */
10
+ gif?: GifData | null;
10
11
  mentions?: Mention[];
11
12
  metadata?: Record<string, any> | null;
12
13
  }
@@ -31,8 +31,6 @@ export { handleCommentReport } from "./handleCommentReport";
31
31
  export { moderateSpaceEntity } from "./moderateSpaceEntity";
32
32
  export { setSpaceEntityNsfw } from "./setSpaceEntityNsfw";
33
33
  export { moderateSpaceComment } from "./moderateSpaceComment";
34
- export { fetchDigestConfig } from "./fetchDigestConfig";
35
- export { updateDigestConfig } from "./updateDigestConfig";
36
34
  export { getSpaceConversation } from "./getSpaceConversation";
37
35
  export { moderateSpaceChatMessage } from "./moderateSpaceChatMessage";
38
36
  export { handleSpaceChatReport } from "./handleSpaceChatReport";
@@ -0,0 +1,13 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ export interface AcceptInviteProps {
3
+ inviteId: string;
4
+ }
5
+ export interface AcceptInviteResponse {
6
+ success: boolean;
7
+ workspaceId: string;
8
+ }
9
+ /**
10
+ * Accept an invitation — identity-matched to the bearer-token user + verified
11
+ * email required. Non-secret id. Idempotent when already a member/owner.
12
+ */
13
+ export declare function acceptInvite(client: SublayHttpClient, data: AcceptInviteProps): Promise<AcceptInviteResponse>;
@@ -0,0 +1,17 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { WorkspaceCapability, WorkspaceInvitation } from "../../interfaces/Workspace";
3
+ export interface CreateInviteProps {
4
+ workspaceId: string;
5
+ email?: string;
6
+ userId?: string;
7
+ username?: string;
8
+ capabilities?: WorkspaceCapability[];
9
+ permissions?: string[];
10
+ rank: number;
11
+ title?: string | null;
12
+ }
13
+ /**
14
+ * Create an invitation (requires the `invite` capability on the workspace). The
15
+ * inviter is the bearer-token user.
16
+ */
17
+ export declare function createInvite(client: SublayHttpClient, data: CreateInviteProps): Promise<WorkspaceInvitation>;
@@ -0,0 +1,12 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { Workspace } from "../../interfaces/Workspace";
3
+ export interface CreateWorkspaceProps {
4
+ name: string;
5
+ metadata?: Record<string, any>;
6
+ parentWorkspaceId?: string | null;
7
+ }
8
+ /**
9
+ * Create a root or child workspace. The creator (the bearer-token user) becomes
10
+ * the owner. Root creation requires a verified email.
11
+ */
12
+ export declare function createWorkspace(client: SublayHttpClient, data: CreateWorkspaceProps): Promise<Workspace>;
@@ -0,0 +1,12 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ export interface DeclineInviteProps {
3
+ inviteId: string;
4
+ }
5
+ export interface DeclineInviteResponse {
6
+ success: boolean;
7
+ }
8
+ /**
9
+ * Decline an invitation — identity-matched to the bearer-token user (not
10
+ * verification-gated).
11
+ */
12
+ export declare function declineInvite(client: SublayHttpClient, data: DeclineInviteProps): Promise<DeclineInviteResponse>;
@@ -0,0 +1,13 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { Workspace } from "../../interfaces/Workspace";
3
+ import { PaginatedResponse } from "../../interfaces/IPaginatedResponse";
4
+ export interface FetchManyWorkspacesProps {
5
+ page?: number;
6
+ limit?: number;
7
+ include?: string;
8
+ }
9
+ /**
10
+ * List the bearer-token user's direct-membership + owned workspaces. The actor
11
+ * is derived from the token — no `userId` is sent.
12
+ */
13
+ export declare function fetchManyWorkspaces(client: SublayHttpClient, data?: FetchManyWorkspacesProps): Promise<PaginatedResponse<Workspace>>;
@@ -0,0 +1,13 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { WorkspaceRosterResponse, WorkspaceRosterCountsResponse } from "../../interfaces/Workspace";
3
+ export interface FetchMembersProps {
4
+ workspaceId: string;
5
+ include?: string;
6
+ countOnly?: boolean;
7
+ }
8
+ /**
9
+ * Unified roster read — one entry per distinct user, each with a `reasons`
10
+ * array. Always returned in full (never paginated). With `countOnly=true` the
11
+ * shape is `WorkspaceRosterCountsResponse` instead. Actor from the token.
12
+ */
13
+ export declare function fetchMembers(client: SublayHttpClient, data: FetchMembersProps): Promise<WorkspaceRosterResponse | WorkspaceRosterCountsResponse>;
@@ -0,0 +1,11 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { WorkspaceInvitation } from "../../interfaces/Workspace";
3
+ export interface FetchMyInvitesResponse {
4
+ data: WorkspaceInvitation[];
5
+ }
6
+ /**
7
+ * The bearer-token user's LIVE pending invites (`status='pending' AND expiresAt
8
+ * > now`), matched by `userId` from the token. Surfacing is NOT
9
+ * verification-gated (the verified check applies only at accept).
10
+ */
11
+ export declare function fetchMyInvites(client: SublayHttpClient): Promise<FetchMyInvitesResponse>;
@@ -0,0 +1,7 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { Workspace } from "../../interfaces/Workspace";
3
+ export interface FetchWorkspaceProps {
4
+ workspaceId: string;
5
+ include?: string;
6
+ }
7
+ export declare function fetchWorkspace(client: SublayHttpClient, data: FetchWorkspaceProps): Promise<Workspace>;
@@ -0,0 +1,11 @@
1
+ import { SublayHttpClient } from "../../core/client";
2
+ import { WorkspaceAuthority } from "../../interfaces/Workspace";
3
+ export interface GetAuthorityProps {
4
+ workspaceId: string;
5
+ }
6
+ /**
7
+ * Authority-as-a-service read — the bearer-token user's resolved standing
8
+ * (`{ reasons, capabilities, permissions, rank }`) on the workspace. A
9
+ * permission check is a one-line `.includes()` on the result.
10
+ */
11
+ export declare function getAuthority(client: SublayHttpClient, data: GetAuthorityProps): Promise<WorkspaceAuthority>;
@@ -0,0 +1,9 @@
1
+ export { createWorkspace } from "./createWorkspace";
2
+ export { fetchWorkspace } from "./fetchWorkspace";
3
+ export { fetchManyWorkspaces } from "./fetchManyWorkspaces";
4
+ export { fetchMembers } from "./fetchMembers";
5
+ export { createInvite } from "./createInvite";
6
+ export { acceptInvite } from "./acceptInvite";
7
+ export { declineInvite } from "./declineInvite";
8
+ export { fetchMyInvites } from "./fetchMyInvites";
9
+ export { getAuthority } from "./getAuthority";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sublay/js",
3
- "version": "7.6.0",
3
+ "version": "7.7.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [