@mastra/auth-studio 1.3.5 → 1.3.6

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-B4JkfaNy.js
316
316
  /**
317
317
  * FGA enforcement utility for checking fine-grained authorization.
318
318
  *
@@ -329,6 +329,7 @@ const RESOURCE_EXPANSIONS = { stored: [
329
329
  "stored-prompt-blocks",
330
330
  "stored-scorers",
331
331
  "stored-skills",
332
+ "stored-workflows",
332
333
  "stored-workspaces"
333
334
  ] };
334
335
  /**
@@ -758,16 +759,38 @@ var MastraAuthStudio = class extends MastraAuthProvider {
758
759
  const sessionCookie = this.userSessionCookies.get(userId);
759
760
  if (!sessionCookie) return false;
760
761
  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);
762
+ return isAdminRole(await this.fetchOrganizationRole(sessionCookie, organizationId));
767
763
  } catch {
768
764
  return false;
769
765
  }
770
766
  }
767
+ async fetchOrganizationRole(sessionCookie, organizationId) {
768
+ const me = await this.fetchMe(sessionCookie);
769
+ if (me?.organizationId === organizationId) return me.role;
770
+ return this.fetchMembershipRole(sessionCookie, organizationId);
771
+ }
772
+ async fetchMembershipRole(sessionCookie, organizationId) {
773
+ const res = await fetch(`${this.sharedApiUrl}/auth/orgs`, {
774
+ headers: { Cookie: `${COOKIE_NAME}=${sessionCookie}` },
775
+ signal: AbortSignal.timeout(VERIFY_FETCH_TIMEOUT_MS)
776
+ });
777
+ if (!res.ok) return void 0;
778
+ return (await res.json()).organizations?.find((o) => o.id === organizationId)?.role ?? void 0;
779
+ }
780
+ async asPinnedOrganizationMember(user, sessionCookie) {
781
+ const pinnedOrganizationId = this.organizationId;
782
+ if (!pinnedOrganizationId) return user;
783
+ const sessionAlreadyOnPinnedOrganization = user.organizationId === pinnedOrganizationId;
784
+ const memberOfPinnedOrganization = user.memberOrgIds?.includes(pinnedOrganizationId) ?? false;
785
+ if (sessionAlreadyOnPinnedOrganization || !memberOfPinnedOrganization) return user;
786
+ const roleInPinnedOrganization = await this.fetchMembershipRole(sessionCookie, pinnedOrganizationId);
787
+ return {
788
+ ...user,
789
+ organizationId: pinnedOrganizationId,
790
+ role: roleInPinnedOrganization,
791
+ permissions: void 0
792
+ };
793
+ }
771
794
  /**
772
795
  * Record the sealed session cookie last seen for a user so
773
796
  * {@link ensureOrganization} / {@link isOrganizationAdmin} can act on their
@@ -848,7 +871,7 @@ var MastraAuthStudio = class extends MastraAuthProvider {
848
871
  }
849
872
  const data = await res.json();
850
873
  this.rememberUserSession(data.user.id, sessionCookie);
851
- const user = {
874
+ const sessionUser = {
852
875
  id: data.user.id,
853
876
  email: data.user.email,
854
877
  name: [data.user.firstName, data.user.lastName].filter(Boolean).join(" ") || void 0,
@@ -858,6 +881,7 @@ var MastraAuthStudio = class extends MastraAuthProvider {
858
881
  permissions: data.permissions,
859
882
  memberOrgIds: data.memberOrgIds
860
883
  };
884
+ const user = await this.asPinnedOrganizationMember(sessionUser, sessionCookie);
861
885
  if (user.organizationId) this.cacheVerification(cacheKey, user);
862
886
  return user;
863
887
  } catch (error) {
@@ -880,8 +904,10 @@ var MastraAuthStudio = class extends MastraAuthProvider {
880
904
  const cached = this.getCachedVerification(cacheKey);
881
905
  if (cached) return cached;
882
906
  try {
907
+ const headers = { Authorization: `Bearer ${token}` };
908
+ if (this.organizationId) headers["x-organization-id"] = this.organizationId;
883
909
  const res = await fetch(`${this.sharedApiUrl}/auth/verify`, {
884
- headers: { Authorization: `Bearer ${token}` },
910
+ headers,
885
911
  signal: AbortSignal.timeout(VERIFY_FETCH_TIMEOUT_MS)
886
912
  });
887
913
  if (!res.ok) {