@mastra/auth-studio 1.3.5 → 1.3.6-alpha.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.
@@ -158,6 +158,8 @@ export declare const PERMISSION_PATTERNS: {
158
158
  readonly 'datasets:write': 'datasets:write';
159
159
  /** View embedders */
160
160
  readonly 'embedders:read': 'embedders:read';
161
+ /** Delete experiments */
162
+ readonly 'experiments:delete': 'experiments:delete';
161
163
  /** View experiments */
162
164
  readonly 'experiments:read': 'experiments:read';
163
165
  /** View infrastructure */
@@ -311,7 +313,7 @@ export type PermissionPattern = keyof typeof PERMISSION_PATTERNS;
311
313
  /**
312
314
  * All valid resource:action permission combinations (excludes wildcards).
313
315
  */
314
- export declare const PERMISSIONS: readonly ['a2a:read', 'a2a:write', 'agent-builder:execute', 'agent-builder:read', 'agent-builder:write', 'agent-controller:execute', 'agent-controller:read', 'agents:create', 'agents:delete', 'agents:execute', 'agents:read', 'agents:write', 'auth:read', 'background-tasks:read', 'channels:read', 'channels:write', 'datasets:delete', 'datasets:execute', 'datasets:read', 'datasets:write', 'embedders:read', 'experiments:read', 'infrastructure:read', 'logs:read', 'mcp:execute', 'mcp:read', 'mcp:write', 'memory:delete', 'memory:execute', 'memory:read', 'memory:write', 'observability:read', 'observability:write', 'processor-providers:read', 'processors:execute', 'processors:read', 'schedules:delete', 'schedules:execute', 'schedules:read', 'schedules:write', 'scores:read', 'scores:write', 'stored-agents:delete', 'stored-agents:publish', 'stored-agents:read', 'stored-agents:write', 'stored-mcp-clients:delete', 'stored-mcp-clients:publish', 'stored-mcp-clients:read', 'stored-mcp-clients:write', 'stored-prompt-blocks:delete', 'stored-prompt-blocks:publish', 'stored-prompt-blocks:read', 'stored-prompt-blocks:write', 'stored-scorers:delete', 'stored-scorers:publish', 'stored-scorers:read', 'stored-scorers:write', 'stored-skills:delete', 'stored-skills:publish', 'stored-skills:read', 'stored-skills:write', 'stored-workflows:read', 'stored-workflows:write', 'stored-workspaces:delete', 'stored-workspaces:read', 'stored-workspaces:write', 'system:read', 'tool-providers:delete', 'tool-providers:read', 'tool-providers:write', 'tools:execute', 'tools:read', 'vector:delete', 'vector:execute', 'vector:read', 'vector:write', 'vectors:read', 'workflows:delete', 'workflows:execute', 'workflows:read', 'workflows:write', 'workspaces:delete', 'workspaces:read', 'workspaces:write'];
316
+ export declare const PERMISSIONS: readonly ['a2a:read', 'a2a:write', 'agent-builder:execute', 'agent-builder:read', 'agent-builder:write', 'agent-controller:execute', 'agent-controller:read', 'agents:create', 'agents:delete', 'agents:execute', 'agents:read', 'agents:write', 'auth:read', 'background-tasks:read', 'channels:read', 'channels:write', 'datasets:delete', 'datasets:execute', 'datasets:read', 'datasets:write', 'embedders:read', 'experiments:delete', 'experiments:read', 'infrastructure:read', 'logs:read', 'mcp:execute', 'mcp:read', 'mcp:write', 'memory:delete', 'memory:execute', 'memory:read', 'memory:write', 'observability:read', 'observability:write', 'processor-providers:read', 'processors:execute', 'processors:read', 'schedules:delete', 'schedules:execute', 'schedules:read', 'schedules:write', 'scores:read', 'scores:write', 'stored-agents:delete', 'stored-agents:publish', 'stored-agents:read', 'stored-agents:write', 'stored-mcp-clients:delete', 'stored-mcp-clients:publish', 'stored-mcp-clients:read', 'stored-mcp-clients:write', 'stored-prompt-blocks:delete', 'stored-prompt-blocks:publish', 'stored-prompt-blocks:read', 'stored-prompt-blocks:write', 'stored-scorers:delete', 'stored-scorers:publish', 'stored-scorers:read', 'stored-scorers:write', 'stored-skills:delete', 'stored-skills:publish', 'stored-skills:read', 'stored-skills:write', 'stored-workflows:read', 'stored-workflows:write', 'stored-workspaces:delete', 'stored-workspaces:read', 'stored-workspaces:write', 'system:read', 'tool-providers:delete', 'tool-providers:read', 'tool-providers:write', 'tools:execute', 'tools:read', 'vector:delete', 'vector:execute', 'vector:read', 'vector:write', 'vectors:read', 'workflows:delete', 'workflows:execute', 'workflows:read', 'workflows:write', 'workspaces:delete', 'workspaces:read', 'workspaces:write'];
315
317
  /**
316
318
  * Specific permission type (e.g., 'agents:read', 'workflows:execute').
317
319
  */
@@ -365,6 +367,8 @@ export declare const MastraFGAPermissions: {
365
367
  readonly DATASETS_WRITE: 'datasets:write';
366
368
  /** View embedders */
367
369
  readonly EMBEDDERS_READ: 'embedders:read';
370
+ /** Delete experiments */
371
+ readonly EXPERIMENTS_DELETE: 'experiments:delete';
368
372
  /** View experiments */
369
373
  readonly EXPERIMENTS_READ: 'experiments:read';
370
374
  /** View infrastructure */
package/dist/index.cjs CHANGED
@@ -312,7 +312,7 @@ var MastraAuthProvider = class extends MastraBase {
312
312
  }
313
313
  };
314
314
  //#endregion
315
- //#region ../../packages/_internals/auth/dist/ee-DXvSoTl7.js
315
+ //#region ../../packages/_internals/auth/dist/ee-BYnTZaqt.js
316
316
  /**
317
317
  * FGA enforcement utility for checking fine-grained authorization.
318
318
  *
@@ -758,16 +758,38 @@ var MastraAuthStudio = class extends MastraAuthProvider {
758
758
  const sessionCookie = this.userSessionCookies.get(userId);
759
759
  if (!sessionCookie) return false;
760
760
  try {
761
- const me = await this.fetchMe(sessionCookie);
762
- if (me?.organizationId === organizationId) return isAdminRole(me.role);
763
- const res = await fetch(`${this.sharedApiUrl}/auth/orgs`, { headers: { Cookie: `${COOKIE_NAME}=${sessionCookie}` } });
764
- if (!res.ok) return false;
765
- const membership = (await res.json()).organizations?.find((o) => o.id === organizationId);
766
- return isAdminRole(membership?.role ?? void 0);
761
+ return isAdminRole(await this.fetchOrganizationRole(sessionCookie, organizationId));
767
762
  } catch {
768
763
  return false;
769
764
  }
770
765
  }
766
+ async fetchOrganizationRole(sessionCookie, organizationId) {
767
+ const me = await this.fetchMe(sessionCookie);
768
+ if (me?.organizationId === organizationId) return me.role;
769
+ return this.fetchMembershipRole(sessionCookie, organizationId);
770
+ }
771
+ async fetchMembershipRole(sessionCookie, organizationId) {
772
+ const res = await fetch(`${this.sharedApiUrl}/auth/orgs`, {
773
+ headers: { Cookie: `${COOKIE_NAME}=${sessionCookie}` },
774
+ signal: AbortSignal.timeout(VERIFY_FETCH_TIMEOUT_MS)
775
+ });
776
+ if (!res.ok) return void 0;
777
+ return (await res.json()).organizations?.find((o) => o.id === organizationId)?.role ?? void 0;
778
+ }
779
+ async asPinnedOrganizationMember(user, sessionCookie) {
780
+ const pinnedOrganizationId = this.organizationId;
781
+ if (!pinnedOrganizationId) return user;
782
+ const sessionAlreadyOnPinnedOrganization = user.organizationId === pinnedOrganizationId;
783
+ const memberOfPinnedOrganization = user.memberOrgIds?.includes(pinnedOrganizationId) ?? false;
784
+ if (sessionAlreadyOnPinnedOrganization || !memberOfPinnedOrganization) return user;
785
+ const roleInPinnedOrganization = await this.fetchMembershipRole(sessionCookie, pinnedOrganizationId);
786
+ return {
787
+ ...user,
788
+ organizationId: pinnedOrganizationId,
789
+ role: roleInPinnedOrganization,
790
+ permissions: void 0
791
+ };
792
+ }
771
793
  /**
772
794
  * Record the sealed session cookie last seen for a user so
773
795
  * {@link ensureOrganization} / {@link isOrganizationAdmin} can act on their
@@ -848,7 +870,7 @@ var MastraAuthStudio = class extends MastraAuthProvider {
848
870
  }
849
871
  const data = await res.json();
850
872
  this.rememberUserSession(data.user.id, sessionCookie);
851
- const user = {
873
+ const sessionUser = {
852
874
  id: data.user.id,
853
875
  email: data.user.email,
854
876
  name: [data.user.firstName, data.user.lastName].filter(Boolean).join(" ") || void 0,
@@ -858,6 +880,7 @@ var MastraAuthStudio = class extends MastraAuthProvider {
858
880
  permissions: data.permissions,
859
881
  memberOrgIds: data.memberOrgIds
860
882
  };
883
+ const user = await this.asPinnedOrganizationMember(sessionUser, sessionCookie);
861
884
  if (user.organizationId) this.cacheVerification(cacheKey, user);
862
885
  return user;
863
886
  } catch (error) {
@@ -880,8 +903,10 @@ var MastraAuthStudio = class extends MastraAuthProvider {
880
903
  const cached = this.getCachedVerification(cacheKey);
881
904
  if (cached) return cached;
882
905
  try {
906
+ const headers = { Authorization: `Bearer ${token}` };
907
+ if (this.organizationId) headers["x-organization-id"] = this.organizationId;
883
908
  const res = await fetch(`${this.sharedApiUrl}/auth/verify`, {
884
- headers: { Authorization: `Bearer ${token}` },
909
+ headers,
885
910
  signal: AbortSignal.timeout(VERIFY_FETCH_TIMEOUT_MS)
886
911
  });
887
912
  if (!res.ok) {