@vibexp/api-client 0.15.0 → 0.17.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.
@@ -2469,6 +2469,10 @@ export type InvitationResponse = {
2469
2469
  created_at?: string;
2470
2470
  invited_by?: InviterInfo;
2471
2471
  };
2472
+ /**
2473
+ * Bare list of team invitations returned by the list endpoint.
2474
+ */
2475
+ export type InvitationResponseList = Array<InvitationResponse>;
2472
2476
  /**
2473
2477
  * Wrapper response for the get-invitation-by-token endpoint
2474
2478
  */
@@ -2962,7 +2966,7 @@ export type CursorRecentActivitiesApiResponse = {
2962
2966
  data: CursorRecentActivitiesResponse;
2963
2967
  };
2964
2968
  /**
2965
- * A team (workspace) in the system. `role` and `member_count` are computed at read time for the requesting user.
2969
+ * A team (workspace) in the system. `role`, `permissions` and `member_count` are computed at read time for the requesting user.
2966
2970
  */
2967
2971
  export type Team = {
2968
2972
  id: string;
@@ -2978,9 +2982,15 @@ export type Team = {
2978
2982
  */
2979
2983
  is_personal: boolean;
2980
2984
  /**
2981
- * The requesting user's role in this team: owner, admin, or member. Populated at runtime on list and single-team reads; empty string on create responses (not an enum constraint for that reason).
2985
+ * The requesting user's role in this team: owner, admin, or member. Populated at runtime on every response that carries a team, including create (where the caller is by definition the owner). Not an enum constraint: older responses may still carry an empty string.
2982
2986
  */
2983
2987
  role?: string;
2988
+ /**
2989
+ * Exactly what `role` permits the requesting user to do in this team, expanded server-side from the role matrix (epic #220). Clients MUST gate their UI on these strings rather than re-deriving them from `role` — the matrix lives on the server and may change without a client release.
2990
+ * Computed at read time for the requesting user, alongside `role`, and always present (an empty array means the role grants nothing). The values are stable API surface: renaming one is a breaking change, and they are kept byte-identical to the `internal/authz` constants by a drift test. Meanings:
2991
+ * * `team.update` — change team name, slug or description. * `team.delete` — delete the team (owner only). * `team.transfer` — transfer ownership to another member (owner only). * `member.invite` — invite new members. * `member.remove` — remove members from the team. * `member.role.update` — change a member's role. * `project.create` — create a project in the team. * `project.update` — update any project in the team. * `project.delete` — delete any project in the team. * `resource.create` — create a prompt, memory, artifact, blueprint or agent. * `resource.update.any` — update any resource, including other members'. * `resource.delete.own` — delete a resource the caller created. * `resource.delete.any` — delete a resource created by someone else. * `feed.delete.any` — delete another member's feed post or reply (moderation).
2992
+ */
2993
+ permissions: Array<'team.update' | 'team.delete' | 'team.transfer' | 'member.invite' | 'member.remove' | 'member.role.update' | 'project.create' | 'project.update' | 'project.delete' | 'resource.create' | 'resource.update.any' | 'resource.delete.own' | 'resource.delete.any' | 'feed.delete.any'>;
2984
2994
  /**
2985
2995
  * Number of members in this team. Populated only on list responses; 0 on create and single-team reads.
2986
2996
  */
@@ -3040,6 +3050,42 @@ export type TeamMemberDetail = {
3040
3050
  */
3041
3051
  invitation_status?: 'pending' | 'accepted';
3042
3052
  };
3053
+ /**
3054
+ * Request body for changing a team member's role. Only `member` and `admin` are
3055
+ * accepted: a team has exactly one owner, and ownership moves solely through
3056
+ * the transfer-ownership operation.
3057
+ *
3058
+ */
3059
+ export type UpdateTeamMemberRoleRequest = {
3060
+ /**
3061
+ * The role to assign to the member
3062
+ */
3063
+ role: 'member' | 'admin';
3064
+ };
3065
+ /**
3066
+ * The team member after the role change
3067
+ */
3068
+ export type UpdateTeamMemberRoleResponse = {
3069
+ member: TeamMemberDetail;
3070
+ };
3071
+ /**
3072
+ * Request body for transferring team ownership. The target must already be a
3073
+ * member of the team; they become the owner and the current owner becomes an
3074
+ * admin, in a single transaction.
3075
+ *
3076
+ */
3077
+ export type TransferTeamOwnershipRequest = {
3078
+ /**
3079
+ * User ID of the member who will become the team owner
3080
+ */
3081
+ new_owner_id: string;
3082
+ };
3083
+ /**
3084
+ * The team after ownership has been transferred
3085
+ */
3086
+ export type TransferTeamOwnershipResponse = {
3087
+ team: Team;
3088
+ };
3043
3089
  /**
3044
3090
  * Paginated list of team members
3045
3091
  */
@@ -3330,6 +3376,145 @@ export type TypeListResponse = {
3330
3376
  */
3331
3377
  total_count: number;
3332
3378
  };
3379
+ /**
3380
+ * A team-visible comment on a resource.
3381
+ */
3382
+ export type Comment = {
3383
+ /**
3384
+ * Unique comment identifier
3385
+ */
3386
+ id: string;
3387
+ /**
3388
+ * Owning team
3389
+ */
3390
+ team_id: string;
3391
+ /**
3392
+ * Type of the commented resource (artifact, memory, prompt, or blueprint)
3393
+ */
3394
+ resource_type: string;
3395
+ /**
3396
+ * Identifier of the commented resource
3397
+ */
3398
+ resource_id: string;
3399
+ /**
3400
+ * Author of the comment
3401
+ */
3402
+ user_id: string;
3403
+ /**
3404
+ * Comment body (markdown, 1–10,000 characters)
3405
+ */
3406
+ content: string;
3407
+ /**
3408
+ * When the comment was created
3409
+ */
3410
+ created_at: string;
3411
+ /**
3412
+ * When the comment was last edited (equals created_at if never edited)
3413
+ */
3414
+ updated_at: string;
3415
+ };
3416
+ /**
3417
+ * Request body for creating a comment on a resource.
3418
+ */
3419
+ export type CreateCommentRequest = {
3420
+ /**
3421
+ * Type of the resource being commented on (artifact, memory, prompt, or blueprint)
3422
+ */
3423
+ resource_type: string;
3424
+ /**
3425
+ * Identifier of the resource being commented on
3426
+ */
3427
+ resource_id: string;
3428
+ /**
3429
+ * Comment body (markdown, 1–10,000 characters)
3430
+ */
3431
+ content: string;
3432
+ };
3433
+ /**
3434
+ * Request body for editing a comment's content.
3435
+ */
3436
+ export type UpdateCommentRequest = {
3437
+ /**
3438
+ * New comment body (markdown, 1–10,000 characters)
3439
+ */
3440
+ content: string;
3441
+ };
3442
+ /**
3443
+ * A page of a resource's comments, newest first.
3444
+ */
3445
+ export type CommentListResponse = {
3446
+ /**
3447
+ * Comments on the resource, newest first
3448
+ */
3449
+ comments: Array<Comment>;
3450
+ /**
3451
+ * Total number of comments on the resource
3452
+ */
3453
+ total_count: number;
3454
+ /**
3455
+ * Current page number
3456
+ */
3457
+ page: number;
3458
+ /**
3459
+ * Number of items per page
3460
+ */
3461
+ per_page: number;
3462
+ /**
3463
+ * Total number of pages
3464
+ */
3465
+ total_pages: number;
3466
+ };
3467
+ /**
3468
+ * A recent comment for the homepage activity card: the comment's latest state plus its resource's resolved title and link fields. No comment body snippet. project_id is present for every resource type; slug is present for artifact/blueprint/prompt and absent for memory.
3469
+ *
3470
+ */
3471
+ export type RecentComment = {
3472
+ /**
3473
+ * Author of the comment
3474
+ */
3475
+ user_id: string;
3476
+ /**
3477
+ * When the comment was created
3478
+ */
3479
+ created_at: string;
3480
+ /**
3481
+ * When the comment was last edited (updated_at > created_at means edited)
3482
+ */
3483
+ updated_at: string;
3484
+ /**
3485
+ * Type of the commented resource
3486
+ */
3487
+ resource_type: string;
3488
+ /**
3489
+ * Identifier of the commented resource
3490
+ */
3491
+ resource_id: string;
3492
+ /**
3493
+ * Resolved display title of the resource
3494
+ */
3495
+ resource_title: string;
3496
+ /**
3497
+ * Project the resource belongs to (for building the detail link)
3498
+ */
3499
+ project_id?: string;
3500
+ /**
3501
+ * Resource slug for the detail link (absent for memories)
3502
+ */
3503
+ slug?: string;
3504
+ };
3505
+ /**
3506
+ * The team's most recent comment activity, latest-activity first.
3507
+ */
3508
+ export type RecentCommentListResponse = {
3509
+ /**
3510
+ * Recent comments across the team, most-recently-active first
3511
+ */
3512
+ comments: Array<RecentComment>;
3513
+ /**
3514
+ * Number of entries in the list
3515
+ */
3516
+ total_count: number;
3517
+ };
3333
3518
  export type ProjectResponse = Project & {
3334
3519
  /**
3335
3520
  * Whether the project's git URL matches a repository accessible via the team's GitHub App installation
@@ -3908,6 +4093,12 @@ export type DevLoginErrors = {
3908
4093
  * Invalid request body or missing required fields
3909
4094
  */
3910
4095
  400: ErrorResponse;
4096
+ /**
4097
+ * Sign-in denied by the access allowlist. The response `code` is the
4098
+ * stable string `access_restricted`.
4099
+ *
4100
+ */
4101
+ 403: ErrorResponse;
3911
4102
  /**
3912
4103
  * Endpoint not available outside development environment
3913
4104
  */
@@ -9429,6 +9620,92 @@ export type RemoveTeamMemberResponses = {
9429
9620
  204: void;
9430
9621
  };
9431
9622
  export type RemoveTeamMemberResponse = RemoveTeamMemberResponses[keyof RemoveTeamMemberResponses];
9623
+ export type UpdateTeamMemberRoleData = {
9624
+ body: UpdateTeamMemberRoleRequest;
9625
+ path: {
9626
+ /**
9627
+ * Team identifier
9628
+ */
9629
+ id: string;
9630
+ /**
9631
+ * User ID of the member whose role is changing
9632
+ */
9633
+ userId: string;
9634
+ };
9635
+ query?: never;
9636
+ url: '/api/v1/teams/{id}/members/{userId}/role';
9637
+ };
9638
+ export type UpdateTeamMemberRoleErrors = {
9639
+ /**
9640
+ * Invalid request body or role value
9641
+ */
9642
+ 400: ErrorResponse;
9643
+ /**
9644
+ * Unauthorized
9645
+ */
9646
+ 401: ErrorResponse;
9647
+ /**
9648
+ * Forbidden — caller is not an owner or admin of the team, or the target is the team owner
9649
+ */
9650
+ 403: ErrorResponse;
9651
+ /**
9652
+ * Team not found, or the target user is not a member of the team
9653
+ */
9654
+ 404: ErrorResponse;
9655
+ /**
9656
+ * Internal server error
9657
+ */
9658
+ 500: ErrorResponse;
9659
+ };
9660
+ export type UpdateTeamMemberRoleError = UpdateTeamMemberRoleErrors[keyof UpdateTeamMemberRoleErrors];
9661
+ export type UpdateTeamMemberRoleResponses = {
9662
+ /**
9663
+ * Role updated successfully
9664
+ */
9665
+ 200: UpdateTeamMemberRoleResponse;
9666
+ };
9667
+ export type UpdateTeamMemberRoleResponse2 = UpdateTeamMemberRoleResponses[keyof UpdateTeamMemberRoleResponses];
9668
+ export type TransferTeamOwnershipData = {
9669
+ body: TransferTeamOwnershipRequest;
9670
+ path: {
9671
+ /**
9672
+ * Team identifier
9673
+ */
9674
+ id: string;
9675
+ };
9676
+ query?: never;
9677
+ url: '/api/v1/teams/{id}/transfer-ownership';
9678
+ };
9679
+ export type TransferTeamOwnershipErrors = {
9680
+ /**
9681
+ * Invalid request body, or the caller is already the target owner
9682
+ */
9683
+ 400: ErrorResponse;
9684
+ /**
9685
+ * Unauthorized
9686
+ */
9687
+ 401: ErrorResponse;
9688
+ /**
9689
+ * Forbidden — caller is not the team owner, or the team is a personal workspace
9690
+ */
9691
+ 403: ErrorResponse;
9692
+ /**
9693
+ * Team not found, or the target user is not a member of the team
9694
+ */
9695
+ 404: ErrorResponse;
9696
+ /**
9697
+ * Internal server error
9698
+ */
9699
+ 500: ErrorResponse;
9700
+ };
9701
+ export type TransferTeamOwnershipError = TransferTeamOwnershipErrors[keyof TransferTeamOwnershipErrors];
9702
+ export type TransferTeamOwnershipResponses = {
9703
+ /**
9704
+ * Ownership transferred successfully
9705
+ */
9706
+ 200: TransferTeamOwnershipResponse;
9707
+ };
9708
+ export type TransferTeamOwnershipResponse2 = TransferTeamOwnershipResponses[keyof TransferTeamOwnershipResponses];
9432
9709
  export type ListTeamInvitationsData = {
9433
9710
  body?: never;
9434
9711
  path: {
@@ -9463,7 +9740,7 @@ export type ListTeamInvitationsResponses = {
9463
9740
  /**
9464
9741
  * Invitations retrieved successfully
9465
9742
  */
9466
- 200: Array<InvitationResponse>;
9743
+ 200: InvitationResponseList;
9467
9744
  };
9468
9745
  export type ListTeamInvitationsResponse = ListTeamInvitationsResponses[keyof ListTeamInvitationsResponses];
9469
9746
  export type SendTeamInvitationsData = {
@@ -9512,7 +9789,7 @@ export type SendTeamInvitationsResponses = {
9512
9789
  /**
9513
9790
  * Invitations created successfully (the `token`, `team_name` and `invited_by` fields are not populated on this response)
9514
9791
  */
9515
- 201: Array<InvitationResponse>;
9792
+ 201: InvitationResponseList;
9516
9793
  };
9517
9794
  export type SendTeamInvitationsResponse = SendTeamInvitationsResponses[keyof SendTeamInvitationsResponses];
9518
9795
  export type RevokeTeamInvitationData = {
@@ -10129,6 +10406,233 @@ export type DeleteTypeResponses = {
10129
10406
  204: void;
10130
10407
  };
10131
10408
  export type DeleteTypeResponse = DeleteTypeResponses[keyof DeleteTypeResponses];
10409
+ export type ListCommentsData = {
10410
+ body?: never;
10411
+ path: {
10412
+ /**
10413
+ * Team identifier
10414
+ */
10415
+ team_id: string;
10416
+ };
10417
+ query: {
10418
+ /**
10419
+ * Type of the commented resource (artifact, memory, prompt, or blueprint)
10420
+ */
10421
+ resource_type: string;
10422
+ /**
10423
+ * Identifier of the commented resource
10424
+ */
10425
+ resource_id: string;
10426
+ /**
10427
+ * Page number (1-based)
10428
+ */
10429
+ page?: number;
10430
+ /**
10431
+ * Items per page
10432
+ */
10433
+ limit?: number;
10434
+ };
10435
+ url: '/api/v1/{team_id}/comments';
10436
+ };
10437
+ export type ListCommentsErrors = {
10438
+ /**
10439
+ * Invalid resource_type or query parameters
10440
+ */
10441
+ 400: ErrorResponse;
10442
+ /**
10443
+ * Unauthorized
10444
+ */
10445
+ 401: ErrorResponse;
10446
+ /**
10447
+ * Caller is not a member of the team
10448
+ */
10449
+ 403: ErrorResponse;
10450
+ /**
10451
+ * Failed to list comments
10452
+ */
10453
+ 500: ErrorResponse;
10454
+ };
10455
+ export type ListCommentsError = ListCommentsErrors[keyof ListCommentsErrors];
10456
+ export type ListCommentsResponses = {
10457
+ /**
10458
+ * Comments retrieved successfully
10459
+ */
10460
+ 200: CommentListResponse;
10461
+ };
10462
+ export type ListCommentsResponse = ListCommentsResponses[keyof ListCommentsResponses];
10463
+ export type CreateCommentData = {
10464
+ body: CreateCommentRequest;
10465
+ path: {
10466
+ /**
10467
+ * Team identifier
10468
+ */
10469
+ team_id: string;
10470
+ };
10471
+ query?: never;
10472
+ url: '/api/v1/{team_id}/comments';
10473
+ };
10474
+ export type CreateCommentErrors = {
10475
+ /**
10476
+ * Invalid resource_type or content
10477
+ */
10478
+ 400: ErrorResponse;
10479
+ /**
10480
+ * Unauthorized
10481
+ */
10482
+ 401: ErrorResponse;
10483
+ /**
10484
+ * Caller may not comment in the team
10485
+ */
10486
+ 403: ErrorResponse;
10487
+ /**
10488
+ * Target resource not found in the team
10489
+ */
10490
+ 404: ErrorResponse;
10491
+ /**
10492
+ * Failed to create comment
10493
+ */
10494
+ 500: ErrorResponse;
10495
+ };
10496
+ export type CreateCommentError = CreateCommentErrors[keyof CreateCommentErrors];
10497
+ export type CreateCommentResponses = {
10498
+ /**
10499
+ * Comment created successfully
10500
+ */
10501
+ 201: Comment;
10502
+ };
10503
+ export type CreateCommentResponse = CreateCommentResponses[keyof CreateCommentResponses];
10504
+ export type ListRecentCommentsData = {
10505
+ body?: never;
10506
+ path: {
10507
+ /**
10508
+ * Team identifier
10509
+ */
10510
+ team_id: string;
10511
+ };
10512
+ query?: {
10513
+ /**
10514
+ * Maximum number of entries to return
10515
+ */
10516
+ limit?: number;
10517
+ };
10518
+ url: '/api/v1/{team_id}/comments/recent';
10519
+ };
10520
+ export type ListRecentCommentsErrors = {
10521
+ /**
10522
+ * Invalid query parameters
10523
+ */
10524
+ 400: ErrorResponse;
10525
+ /**
10526
+ * Unauthorized
10527
+ */
10528
+ 401: ErrorResponse;
10529
+ /**
10530
+ * Caller is not a member of the team
10531
+ */
10532
+ 403: ErrorResponse;
10533
+ /**
10534
+ * Failed to list recent comments
10535
+ */
10536
+ 500: ErrorResponse;
10537
+ };
10538
+ export type ListRecentCommentsError = ListRecentCommentsErrors[keyof ListRecentCommentsErrors];
10539
+ export type ListRecentCommentsResponses = {
10540
+ /**
10541
+ * Recent comments retrieved successfully
10542
+ */
10543
+ 200: RecentCommentListResponse;
10544
+ };
10545
+ export type ListRecentCommentsResponse = ListRecentCommentsResponses[keyof ListRecentCommentsResponses];
10546
+ export type DeleteCommentData = {
10547
+ body?: never;
10548
+ path: {
10549
+ /**
10550
+ * Team identifier
10551
+ */
10552
+ team_id: string;
10553
+ /**
10554
+ * Comment identifier
10555
+ */
10556
+ comment_id: string;
10557
+ };
10558
+ query?: never;
10559
+ url: '/api/v1/{team_id}/comments/{comment_id}';
10560
+ };
10561
+ export type DeleteCommentErrors = {
10562
+ /**
10563
+ * comment_id is not a valid UUID
10564
+ */
10565
+ 400: ErrorResponse;
10566
+ /**
10567
+ * Unauthorized
10568
+ */
10569
+ 401: ErrorResponse;
10570
+ /**
10571
+ * Caller may not delete this comment
10572
+ */
10573
+ 403: ErrorResponse;
10574
+ /**
10575
+ * Comment not found in the team
10576
+ */
10577
+ 404: ErrorResponse;
10578
+ /**
10579
+ * Failed to delete comment
10580
+ */
10581
+ 500: ErrorResponse;
10582
+ };
10583
+ export type DeleteCommentError = DeleteCommentErrors[keyof DeleteCommentErrors];
10584
+ export type DeleteCommentResponses = {
10585
+ /**
10586
+ * Comment deleted (no content)
10587
+ */
10588
+ 204: void;
10589
+ };
10590
+ export type DeleteCommentResponse = DeleteCommentResponses[keyof DeleteCommentResponses];
10591
+ export type UpdateCommentData = {
10592
+ body: UpdateCommentRequest;
10593
+ path: {
10594
+ /**
10595
+ * Team identifier
10596
+ */
10597
+ team_id: string;
10598
+ /**
10599
+ * Comment identifier
10600
+ */
10601
+ comment_id: string;
10602
+ };
10603
+ query?: never;
10604
+ url: '/api/v1/{team_id}/comments/{comment_id}';
10605
+ };
10606
+ export type UpdateCommentErrors = {
10607
+ /**
10608
+ * Invalid content
10609
+ */
10610
+ 400: ErrorResponse;
10611
+ /**
10612
+ * Unauthorized
10613
+ */
10614
+ 401: ErrorResponse;
10615
+ /**
10616
+ * Caller is not the comment's author
10617
+ */
10618
+ 403: ErrorResponse;
10619
+ /**
10620
+ * Comment not found in the team
10621
+ */
10622
+ 404: ErrorResponse;
10623
+ /**
10624
+ * Failed to update comment
10625
+ */
10626
+ 500: ErrorResponse;
10627
+ };
10628
+ export type UpdateCommentError = UpdateCommentErrors[keyof UpdateCommentErrors];
10629
+ export type UpdateCommentResponses = {
10630
+ /**
10631
+ * Comment updated successfully
10632
+ */
10633
+ 200: Comment;
10634
+ };
10635
+ export type UpdateCommentResponse = UpdateCommentResponses[keyof UpdateCommentResponses];
10132
10636
  export type ListEmbeddingProvidersData = {
10133
10637
  body?: never;
10134
10638
  path: {