@sixb/core 0.1.13 → 0.1.14

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.
Files changed (97) hide show
  1. package/dist/actions/index.js +9 -9
  2. package/dist/agents/index.js +16 -16
  3. package/dist/auth/errors.d.ts +12 -0
  4. package/dist/auth/errors.d.ts.map +1 -1
  5. package/dist/auth/index.d.ts +1 -1
  6. package/dist/auth/index.d.ts.map +1 -1
  7. package/dist/auth/index.js +5 -3
  8. package/dist/auth/index.js.map +1 -1
  9. package/dist/auth/runtime.d.ts.map +1 -1
  10. package/dist/auth/strategy.d.ts +2 -0
  11. package/dist/auth/strategy.d.ts.map +1 -1
  12. package/dist/auth/strategy.js +4 -2
  13. package/dist/auth/strategy.js.map +1 -1
  14. package/dist/auth/types.d.ts +8 -0
  15. package/dist/auth/types.d.ts.map +1 -1
  16. package/dist/bootstrap/index.js +20 -20
  17. package/dist/{chunk-rqtdtm43.js → chunk-00pfcqh4.js} +1 -1
  18. package/dist/{chunk-cvrbhvtr.js → chunk-16jenmzw.js} +10 -10
  19. package/dist/{chunk-0321g649.js → chunk-2jntasmh.js} +13 -2
  20. package/dist/{chunk-0321g649.js.map → chunk-2jntasmh.js.map} +3 -3
  21. package/dist/{chunk-n33e8dz8.js → chunk-3a338wrp.js} +1 -1
  22. package/dist/{chunk-gc226ten.js → chunk-3fpgxpsq.js} +3 -3
  23. package/dist/{chunk-gmt22nxx.js → chunk-4ypbe95r.js} +1 -1
  24. package/dist/{chunk-9pfw47qx.js → chunk-6rzb1g6h.js} +52 -47
  25. package/dist/{chunk-9pfw47qx.js.map → chunk-6rzb1g6h.js.map} +7 -7
  26. package/dist/{chunk-898y24dd.js → chunk-728fp090.js} +1 -1
  27. package/dist/{chunk-693f3zn8.js → chunk-dv4ct8mp.js} +2 -2
  28. package/dist/{chunk-jhyc777j.js → chunk-e2c5yxfe.js} +1 -1
  29. package/dist/{chunk-darm7eeg.js → chunk-gct3m1da.js} +1 -1
  30. package/dist/{chunk-mf6hwpzh.js → chunk-hj0n3c2p.js} +12 -12
  31. package/dist/{chunk-91wthfwe.js → chunk-hxgj4kzd.js} +4 -4
  32. package/dist/{chunk-w9bp61e7.js → chunk-jfdggg1p.js} +1 -1
  33. package/dist/{chunk-04h4t2b5.js → chunk-kxea54yg.js} +1 -1
  34. package/dist/{chunk-jmwy25mf.js → chunk-ma1mhh7w.js} +5 -5
  35. package/dist/{chunk-63fp9x3q.js → chunk-pvgpckm1.js} +2 -2
  36. package/dist/{chunk-a69fkrtr.js → chunk-q2xghyft.js} +1 -1
  37. package/dist/{chunk-s24qbp32.js → chunk-wn7mznxc.js} +2 -2
  38. package/dist/{chunk-gbcrz0gr.js → chunk-wnxabtn4.js} +2 -2
  39. package/dist/{chunk-bep5rrdq.js → chunk-ww185kt6.js} +1 -1
  40. package/dist/{chunk-2hbhn1ff.js → chunk-yvf2jqj8.js} +1 -1
  41. package/dist/execution/agent.js +16 -16
  42. package/dist/execution/primitive.js +16 -16
  43. package/dist/execution/request.js +16 -16
  44. package/dist/index.js +22 -22
  45. package/dist/materializer/index.js +6 -6
  46. package/dist/models/execution/index.js +6 -6
  47. package/dist/objects/index.js +9 -9
  48. package/dist/objects/query/index.js +6 -6
  49. package/dist/pipelines/index.js +7 -7
  50. package/dist/projections/internal.js +5 -5
  51. package/dist/runtime/internal.js +8 -8
  52. package/dist/shares/internal.js +6 -6
  53. package/dist/storage/auth/errors.d.ts +1 -1
  54. package/dist/storage/auth/errors.d.ts.map +1 -1
  55. package/dist/storage/auth/in-memory/auth-storage.d.ts +2 -1
  56. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  57. package/dist/storage/auth/types.d.ts +15 -7
  58. package/dist/storage/auth/types.d.ts.map +1 -1
  59. package/dist/storage/file-upload-sessions/provider.js +3 -3
  60. package/dist/storage/index.js +5 -5
  61. package/dist/storage/workflow-runs/provider.js +3 -3
  62. package/dist/syncs/index.js +7 -7
  63. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  64. package/dist/testing/index.js +107 -139
  65. package/dist/testing/index.js.map +3 -3
  66. package/dist/webhooks/internal.js +5 -5
  67. package/dist/workflows/index.js +17 -17
  68. package/package.json +1 -1
  69. package/src/auth/errors.ts +23 -0
  70. package/src/auth/index.ts +1 -1
  71. package/src/auth/runtime.ts +56 -22
  72. package/src/auth/strategy.ts +2 -0
  73. package/src/auth/types.ts +8 -0
  74. package/src/storage/auth/errors.ts +0 -1
  75. package/src/storage/auth/in-memory/auth-storage.ts +44 -65
  76. package/src/storage/auth/types.ts +15 -7
  77. package/src/testing/auth-storage-contract.ts +104 -130
  78. /package/dist/{chunk-rqtdtm43.js.map → chunk-00pfcqh4.js.map} +0 -0
  79. /package/dist/{chunk-cvrbhvtr.js.map → chunk-16jenmzw.js.map} +0 -0
  80. /package/dist/{chunk-n33e8dz8.js.map → chunk-3a338wrp.js.map} +0 -0
  81. /package/dist/{chunk-gc226ten.js.map → chunk-3fpgxpsq.js.map} +0 -0
  82. /package/dist/{chunk-gmt22nxx.js.map → chunk-4ypbe95r.js.map} +0 -0
  83. /package/dist/{chunk-898y24dd.js.map → chunk-728fp090.js.map} +0 -0
  84. /package/dist/{chunk-693f3zn8.js.map → chunk-dv4ct8mp.js.map} +0 -0
  85. /package/dist/{chunk-jhyc777j.js.map → chunk-e2c5yxfe.js.map} +0 -0
  86. /package/dist/{chunk-darm7eeg.js.map → chunk-gct3m1da.js.map} +0 -0
  87. /package/dist/{chunk-mf6hwpzh.js.map → chunk-hj0n3c2p.js.map} +0 -0
  88. /package/dist/{chunk-91wthfwe.js.map → chunk-hxgj4kzd.js.map} +0 -0
  89. /package/dist/{chunk-w9bp61e7.js.map → chunk-jfdggg1p.js.map} +0 -0
  90. /package/dist/{chunk-04h4t2b5.js.map → chunk-kxea54yg.js.map} +0 -0
  91. /package/dist/{chunk-jmwy25mf.js.map → chunk-ma1mhh7w.js.map} +0 -0
  92. /package/dist/{chunk-63fp9x3q.js.map → chunk-pvgpckm1.js.map} +0 -0
  93. /package/dist/{chunk-a69fkrtr.js.map → chunk-q2xghyft.js.map} +0 -0
  94. /package/dist/{chunk-s24qbp32.js.map → chunk-wn7mznxc.js.map} +0 -0
  95. /package/dist/{chunk-gbcrz0gr.js.map → chunk-wnxabtn4.js.map} +0 -0
  96. /package/dist/{chunk-bep5rrdq.js.map → chunk-ww185kt6.js.map} +0 -0
  97. /package/dist/{chunk-2hbhn1ff.js.map → chunk-yvf2jqj8.js.map} +0 -0
@@ -2,12 +2,12 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/auth/errors.ts", "../src/auth/audience.ts", "../src/auth/cookies.ts", "../src/auth/validation.ts"],
4
4
  "sourcesContent": [
5
- "export type AuthRuntimeErrorCode =\n | \"authentication_required\"\n | \"auth_storage_missing\"\n | \"authorization_denied\"\n | \"invalid_auth_input\"\n | \"invalid_auth_config\"\n | \"rate_limited\"\n | \"production_auth_required\"\n\nexport class AuthRuntimeError extends Error {\n readonly name = \"AuthRuntimeError\"\n\n constructor(\n readonly code: AuthRuntimeErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n",
5
+ "export type AuthRuntimeErrorCode =\n | \"authentication_required\"\n | \"auth_storage_missing\"\n | \"authorization_denied\"\n | \"invalid_auth_input\"\n | \"invalid_auth_config\"\n | \"rate_limited\"\n | \"production_auth_required\"\n\nexport class AuthRuntimeError extends Error {\n readonly name = \"AuthRuntimeError\"\n\n constructor(\n readonly code: AuthRuntimeErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n\n/** Why a strategy refused someone who authenticated. Each is something a person can act on. */\nexport type SignInRefusalReason =\n | \"not_invited\"\n | \"suspended\"\n | \"domain_not_allowed\"\n | \"no_trusted_address\"\n\n/**\n * Thrown by a strategy that refuses a sign-in for a known reason. The sign-in page tells the\n * person which reason, naming `email` when there is one; `message` is for the server log.\n */\nexport class SignInRefusedError extends Error {\n readonly name = \"SignInRefusedError\"\n\n constructor(\n readonly reason: SignInRefusalReason,\n message: string,\n readonly email?: string\n ) {\n super(message)\n }\n}\n",
6
6
  "import { AuthRuntimeError } from \"./errors\"\n\nexport const DEFAULT_AUTH_SESSION_AUDIENCE = \"atlas\"\n\nexport type AuthSessionAudience = typeof DEFAULT_AUTH_SESSION_AUDIENCE | \"app\"\n\nexport interface AuthSessionAudienceOptions {\n readonly audience?: AuthSessionAudience\n}\n\nexport function isValidAuthSessionAudience(value: string): value is AuthSessionAudience {\n return value === \"atlas\" || value === \"app\"\n}\n\nexport function resolveAuthSessionAudience(\n value: AuthSessionAudience | undefined\n): AuthSessionAudience {\n const audience = value ?? DEFAULT_AUTH_SESSION_AUDIENCE\n\n if (!isValidAuthSessionAudience(audience)) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n `[Sixb] Auth session audience '${audience}' is invalid. Expected 'atlas' or 'app'.`\n )\n }\n\n return audience\n}\n",
7
7
  "import type { AuthSessionAudience } from \"./audience\"\nimport { DEFAULT_AUTH_SESSION_AUDIENCE, resolveAuthSessionAudience } from \"./audience\"\nimport type { AuthCookieOptions } from \"./types\"\n\nexport const DEFAULT_SESSION_COOKIE_NAME = \"sixb_session\"\nexport const DEFAULT_CSRF_COOKIE_NAME = \"sixb_csrf\"\n\nexport interface ResolvedAuthCookieOptions {\n readonly sessionCookieName: string\n readonly csrfCookieName: string\n readonly domain?: string\n readonly secure: boolean | \"auto\"\n readonly sameSite: \"strict\"\n readonly csrfHttpOnly: boolean\n}\n\ninterface CookieSerializationOptions {\n readonly name: string\n readonly value: string\n readonly httpOnly?: boolean\n readonly maxAge?: number\n readonly expires?: Date\n readonly domain?: string\n readonly secure?: boolean\n readonly sameSite: \"strict\"\n}\n\nexport function resolveAuthCookieOptions(\n options: AuthCookieOptions | undefined\n): ResolvedAuthCookieOptions {\n const resolved = {\n sessionCookieName: options?.sessionCookieName ?? DEFAULT_SESSION_COOKIE_NAME,\n csrfCookieName: options?.csrfCookieName ?? DEFAULT_CSRF_COOKIE_NAME,\n domain: options?.cookieDomain,\n secure: options?.secure ?? \"auto\",\n sameSite: options?.sameSite ?? \"strict\",\n csrfHttpOnly: options?.csrfHttpOnly ?? false,\n }\n\n assertValidCookieOptions(resolved)\n return resolved\n}\n\nexport function resolveAuthCookieOptionsForAudience(\n options: ResolvedAuthCookieOptions,\n audience: AuthSessionAudience | undefined\n): ResolvedAuthCookieOptions {\n const resolvedAudience = resolveAuthSessionAudience(audience)\n if (resolvedAudience === DEFAULT_AUTH_SESSION_AUDIENCE) {\n return options\n }\n\n return {\n ...options,\n sessionCookieName: `${options.sessionCookieName}_${resolvedAudience}`,\n csrfCookieName: `${options.csrfCookieName}_${resolvedAudience}`,\n }\n}\n\nexport function parseCookieHeader(header: string | null): ReadonlyMap<string, string> {\n const cookies = new Map<string, string>()\n if (!header) {\n return cookies\n }\n\n for (const part of header.split(\";\")) {\n const separator = part.indexOf(\"=\")\n if (separator <= 0) {\n continue\n }\n\n const name = part.slice(0, separator).trim()\n if (!name || cookies.has(name)) {\n continue\n }\n\n const value = part.slice(separator + 1).trim()\n cookies.set(name, value)\n }\n\n return cookies\n}\n\nexport function getCookie(request: Request, name: string): string | undefined {\n return parseCookieHeader(request.headers.get(\"cookie\")).get(name)\n}\n\nexport function serializeCookie(options: CookieSerializationOptions): string {\n const parts = [`${options.name}=${options.value}`]\n\n parts.push(\"Path=/\")\n parts.push(\"SameSite=Strict\")\n\n if (options.domain) {\n parts.push(`Domain=${options.domain}`)\n }\n\n if (options.httpOnly) {\n parts.push(\"HttpOnly\")\n }\n\n if (options.secure) {\n parts.push(\"Secure\")\n }\n\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${Math.trunc(options.maxAge)}`)\n }\n\n if (options.expires) {\n parts.push(`Expires=${options.expires.toUTCString()}`)\n }\n\n return parts.join(\"; \")\n}\n\nexport function shouldUseSecureCookies(\n request: Request,\n options: ResolvedAuthCookieOptions\n): boolean {\n if (\n requiresSecureCookieName(options.sessionCookieName) ||\n requiresSecureCookieName(options.csrfCookieName)\n ) {\n return true\n }\n\n if (typeof options.secure === \"boolean\") {\n return options.secure\n }\n\n const url = new URL(request.url)\n if (isLocalhost(url.hostname)) {\n return false\n }\n\n return url.protocol === \"https:\" || process.env.NODE_ENV === \"production\"\n}\n\nexport function createSessionCookieHeader(params: {\n readonly request: Request\n readonly value: string\n readonly expiresAt: Date\n readonly options: ResolvedAuthCookieOptions\n}): string {\n const lifetime = resolveCookieLifetime(params.expiresAt)\n return serializeCookie({\n name: params.options.sessionCookieName,\n value: params.value,\n httpOnly: true,\n ...lifetime,\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nexport function createCsrfCookieHeader(params: {\n readonly request: Request\n readonly value: string\n readonly expiresAt: Date\n readonly options: ResolvedAuthCookieOptions\n}): string {\n const lifetime = resolveCookieLifetime(params.expiresAt)\n return serializeCookie({\n name: params.options.csrfCookieName,\n value: params.value,\n httpOnly: params.options.csrfHttpOnly,\n ...lifetime,\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nfunction resolveCookieLifetime(expiresAt: Date): {\n readonly maxAge: number\n readonly expires: Date\n} {\n const expiresAtMs = expiresAt.getTime()\n if (!Number.isFinite(expiresAtMs)) {\n throw new Error(\"[Sixb] Auth cookie expiresAt must be a valid date.\")\n }\n\n return {\n maxAge: Math.max(0, Math.floor((expiresAtMs - Date.now()) / 1000)),\n expires: new Date(expiresAtMs),\n }\n}\n\nexport function clearSessionCookieHeader(params: {\n readonly request: Request\n readonly options: ResolvedAuthCookieOptions\n}): string {\n return serializeCookie({\n name: params.options.sessionCookieName,\n value: \"\",\n httpOnly: true,\n maxAge: 0,\n expires: new Date(0),\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nexport function clearCsrfCookieHeader(params: {\n readonly request: Request\n readonly options: ResolvedAuthCookieOptions\n}): string {\n return serializeCookie({\n name: params.options.csrfCookieName,\n value: \"\",\n maxAge: 0,\n expires: new Date(0),\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nfunction isLocalhost(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n}\n\nfunction assertValidCookieOptions(options: ResolvedAuthCookieOptions): void {\n assertValidCookieName(options.sessionCookieName, \"sessionCookieName\")\n assertValidCookieName(options.csrfCookieName, \"csrfCookieName\")\n\n if (options.sameSite !== \"strict\") {\n throw new Error(\"[Sixb] Auth cookie sameSite must be 'strict'.\")\n }\n\n if (\n options.domain &&\n (isHostPrefixedCookieName(options.sessionCookieName) ||\n isHostPrefixedCookieName(options.csrfCookieName))\n ) {\n throw new Error(\"[Sixb] __Host- auth cookies cannot be configured with cookieDomain.\")\n }\n\n if (\n options.secure === false &&\n (requiresSecureCookieName(options.sessionCookieName) ||\n requiresSecureCookieName(options.csrfCookieName))\n ) {\n throw new Error(\"[Sixb] __Host- auth cookies require secure cookies.\")\n }\n}\n\nfunction assertValidCookieName(name: string, label: string): void {\n if (!/^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(name)) {\n throw new Error(`[Sixb] Auth cookie ${label} '${name}' is not a valid cookie name.`)\n }\n}\n\nfunction isHostPrefixedCookieName(name: string): boolean {\n return name.startsWith(\"__Host-\")\n}\n\nfunction requiresSecureCookieName(name: string): boolean {\n return isHostPrefixedCookieName(name) || name.startsWith(\"__Secure-\")\n}\n",
8
8
  "import { resolveAuthCookieOptions } from \"./cookies\"\nimport { AuthRuntimeError } from \"./errors\"\nimport type {\n AuthSessionOptions,\n AuthStrategy,\n InvitationDeliveryAuthStrategy,\n MagicLinkAuthStrategy,\n OidcAuthStrategy,\n ResolvedAuthConfig,\n SixbAuthConfig,\n} from \"./types\"\n\nconst DAY = 24 * 60 * 60 * 1000\n\nexport const DEFAULT_AUTH_SESSION_IDLE_TIMEOUT_MS = 30 * DAY\nexport const DEFAULT_AUTH_SESSION_RENEWAL_WINDOW_MS = 7 * DAY\nexport const DEFAULT_AUTH_INVITATION_TTL_MS = 7 * DAY\nexport const MAX_AUTH_INVITATION_TTL_MS = 30 * DAY\n/**\n * Default in-process session cache window. Short enough that a revoked session lingers\n * only briefly, long enough to collapse a burst of requests to a single auth resolution.\n */\nexport const DEFAULT_AUTH_SESSION_CACHE_TTL_MS = 5_000\n\nexport { resolveAuthSessionAudience } from \"./audience\"\n\nexport function resolveAuthConfig(config: SixbAuthConfig | undefined): ResolvedAuthConfig {\n if (!config) {\n return {\n strategy: null,\n session: resolveAuthSessionOptions(undefined),\n cookies: resolveAuthCookieOptions(undefined),\n }\n }\n\n const strategy = \"strategy\" in config ? config.strategy : config\n assertValidStrategy(strategy)\n\n return {\n strategy,\n session: resolveAuthSessionOptions(\"strategy\" in config ? config.session : undefined),\n cookies: resolveAuthCookieOptions(\"strategy\" in config ? config.cookies : undefined),\n }\n}\n\nexport function resolveInvitationExpiresAt(value: Date | undefined, now: Date): Date {\n const expiresAt = value\n ? new Date(value)\n : new Date(now.getTime() + DEFAULT_AUTH_INVITATION_TTL_MS)\n const expiresAtTime = expiresAt.getTime()\n\n if (!Number.isFinite(expiresAtTime)) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation expiresAt must be a valid date.\"\n )\n }\n\n if (expiresAtTime <= now.getTime()) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation expiresAt must be in the future.\"\n )\n }\n\n if (expiresAtTime > now.getTime() + MAX_AUTH_INVITATION_TTL_MS) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation expiresAt must be no more than 30 days in the future.\"\n )\n }\n\n return expiresAt\n}\n\nexport function sanitizeReturnTo(value: string | undefined): string {\n if (!value || !value.startsWith(\"/\") || value.startsWith(\"//\")) {\n return \"/\"\n }\n\n try {\n const parsed = new URL(value, \"http://sixb.local\")\n if (parsed.origin !== \"http://sixb.local\") {\n return \"/\"\n }\n\n return `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n return \"/\"\n }\n}\n\nexport function assertNonEmpty(value: string, label: string): string {\n const normalized = value.trim()\n if (!normalized) {\n throw new AuthRuntimeError(\"invalid_auth_input\", `[Sixb] ${label} must be a non-empty string.`)\n }\n return normalized\n}\n\nexport function normalizePagination(input: { readonly limit?: number; readonly offset?: number }): {\n readonly limit?: number\n readonly offset: number\n} {\n if (input.limit !== undefined && (!Number.isInteger(input.limit) || input.limit < 0)) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation list limit must be a non-negative integer.\"\n )\n }\n\n if (input.offset !== undefined && (!Number.isInteger(input.offset) || input.offset < 0)) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation list offset must be a non-negative integer.\"\n )\n }\n\n return {\n limit: input.limit,\n offset: input.offset ?? 0,\n }\n}\n\nfunction resolveAuthSessionOptions(\n options: AuthSessionOptions | undefined\n): ResolvedAuthConfig[\"session\"] {\n const idleTimeoutMs = options?.idleTimeoutMs ?? DEFAULT_AUTH_SESSION_IDLE_TIMEOUT_MS\n if (!Number.isFinite(idleTimeoutMs) || idleTimeoutMs <= 0) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session idleTimeoutMs must be a positive finite number.\"\n )\n }\n\n const renewalWindowMs = options?.renewalWindowMs ?? DEFAULT_AUTH_SESSION_RENEWAL_WINDOW_MS\n if (!Number.isFinite(renewalWindowMs) || renewalWindowMs <= 0) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session renewalWindowMs must be a positive finite number.\"\n )\n }\n if (renewalWindowMs >= idleTimeoutMs) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session renewalWindowMs must be less than idleTimeoutMs.\"\n )\n }\n\n const absoluteTimeoutMs = options?.absoluteTimeoutMs\n if (\n absoluteTimeoutMs !== undefined &&\n (!Number.isFinite(absoluteTimeoutMs) || absoluteTimeoutMs <= 0)\n ) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session absoluteTimeoutMs must be a positive finite number when configured.\"\n )\n }\n if (absoluteTimeoutMs !== undefined && absoluteTimeoutMs < idleTimeoutMs) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session absoluteTimeoutMs must be greater than or equal to idleTimeoutMs.\"\n )\n }\n\n const cacheTtlMs = options?.cacheTtlMs ?? DEFAULT_AUTH_SESSION_CACHE_TTL_MS\n if (!Number.isFinite(cacheTtlMs) || cacheTtlMs < 0) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session cacheTtlMs must be a non-negative finite number.\"\n )\n }\n if (cacheTtlMs >= renewalWindowMs) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session cacheTtlMs must be less than renewalWindowMs.\"\n )\n }\n\n return {\n idleTimeoutMs,\n renewalWindowMs,\n ...(absoluteTimeoutMs === undefined ? {} : { absoluteTimeoutMs }),\n cacheTtlMs,\n }\n}\n\nexport function isMagicLinkAuthStrategy(\n strategy: AuthStrategy | null\n): strategy is MagicLinkAuthStrategy {\n if (!strategy || strategy.kind !== \"magicLink\") {\n return false\n }\n\n const candidate = strategy as {\n readonly requestMagicLink?: unknown\n readonly completeMagicLinkSignIn?: unknown\n }\n\n return (\n typeof candidate.requestMagicLink === \"function\" &&\n typeof candidate.completeMagicLinkSignIn === \"function\"\n )\n}\n\nexport function isInvitationDeliveryAuthStrategy(\n strategy: AuthStrategy | null\n): strategy is InvitationDeliveryAuthStrategy {\n if (!strategy) {\n return false\n }\n\n const candidate = strategy as {\n readonly deliverInvitation?: unknown\n }\n\n return typeof candidate.deliverInvitation === \"function\"\n}\n\nexport function isOidcAuthStrategy(strategy: AuthStrategy | null): strategy is OidcAuthStrategy {\n if (!strategy || strategy.kind !== \"oidc\") {\n return false\n }\n\n const candidate = strategy as {\n readonly startOidcSignIn?: unknown\n readonly completeOidcSignIn?: unknown\n }\n\n return (\n typeof candidate.startOidcSignIn === \"function\" &&\n typeof candidate.completeOidcSignIn === \"function\"\n )\n}\n\nfunction assertValidStrategy(strategy: AuthStrategy): void {\n if (!strategy.id.trim()) {\n throw new AuthRuntimeError(\"invalid_auth_config\", \"[Sixb] Auth strategy id is required.\")\n }\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "2A4ABD70FDDE1E9964756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "E4EC0B2B5EB9DD3264756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  principalsEqual2
4
- } from "./chunk-9pfw47qx.js";
4
+ } from "./chunk-6rzb1g6h.js";
5
5
  import {
6
6
  createFileUploadId2,
7
7
  isFileUploadSessionExpired,
@@ -15,7 +15,7 @@ import {
15
15
  paginate,
16
16
  InMemoryAuthStorage2,
17
17
  principalsEqual2
18
- } from "./chunk-9pfw47qx.js";
18
+ } from "./chunk-6rzb1g6h.js";
19
19
  import {
20
20
  ObjectReadLimitExceededError2,
21
21
  snapshotObjectReadExecutionLimits2,
@@ -80,7 +80,7 @@ import {
80
80
  } from "./chunk-h89wz928.js";
81
81
  import {
82
82
  DurableFileUploadSessions2
83
- } from "./chunk-n33e8dz8.js";
83
+ } from "./chunk-3a338wrp.js";
84
84
  import {
85
85
  ExecutionStorageError2,
86
86
  prepareExecutionRecord2,
@@ -185,7 +185,7 @@ import {
185
185
  WorkflowRunError2,
186
186
  assertWorkflowRunExecution2,
187
187
  assertWorkflowAgentNodeRunExecution2
188
- } from "./chunk-darm7eeg.js";
188
+ } from "./chunk-gct3m1da.js";
189
189
  import {
190
190
  actionSubjectsEqual2,
191
191
  actionRunPhaseRecordsEqual2,
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  ShareDefinitionError2,
8
8
  snapshotShareDefinition
9
- } from "./chunk-9pfw47qx.js";
9
+ } from "./chunk-6rzb1g6h.js";
10
10
  import {
11
11
  snapshotShareAccessPlan
12
12
  } from "./chunk-br3k6qbf.js";
@@ -17,7 +17,7 @@ import {
17
17
  assertNonEmpty3,
18
18
  normalizePagination,
19
19
  isInvitationDeliveryAuthStrategy2
20
- } from "./chunk-0321g649.js";
20
+ } from "./chunk-2jntasmh.js";
21
21
  import {
22
22
  normalizeParams,
23
23
  coerceParamsToTyped
@@ -2375,15 +2375,6 @@ class InMemoryAuthStorage2 {
2375
2375
  });
2376
2376
  throw new AuthStorageError2("user_creation_not_allowed", `[Sixb] Magic link '${input.magicLinkId}' cannot create a user for project '${projectId}'.`);
2377
2377
  }
2378
- if (shouldCreateUser && !activeInvitation && input.allowUserCreationWithoutInvitation && input.requireNoActiveUsersForUserCreation && hasActiveUsers(this.state, projectId)) {
2379
- consumeMagicLinkRecord(this.state, {
2380
- projectId,
2381
- id: input.magicLinkId,
2382
- tokenHash: input.tokenHash,
2383
- consumedAt: completedAt
2384
- });
2385
- throw new AuthStorageError2("user_creation_not_allowed", `[Sixb] Magic link '${input.magicLinkId}' cannot create a user for project '${projectId}'.`);
2386
- }
2387
2378
  validateCompleteSessionInput(this.state, projectId, input.session);
2388
2379
  assertSignInSessionAudience(projectId, input.session.audience, magicLink.audience);
2389
2380
  let newUserId;
@@ -2419,8 +2410,9 @@ class InMemoryAuthStorage2 {
2419
2410
  projectId,
2420
2411
  user
2421
2412
  });
2422
- const memberships = this.applyManualGroups({
2413
+ const memberships = this.applyGroups({
2423
2414
  completedAt,
2415
+ source: "manual",
2424
2416
  groupIds: manualGroupIds,
2425
2417
  projectId,
2426
2418
  userId: user.id,
@@ -2464,26 +2456,14 @@ class InMemoryAuthStorage2 {
2464
2456
  this.consumeOidcAttempt(input, completedAt, projectId);
2465
2457
  throw new AuthStorageError2("missing_user", `[Sixb] User '${identity.userId}' not found for linked OIDC identity.`);
2466
2458
  }
2467
- if (!identity && user && (!input.autoLinkByVerifiedEmail || !input.emailVerified)) {
2468
- this.consumeOidcAttempt(input, completedAt, projectId);
2469
- throw new AuthStorageError2("email_link_not_allowed", `[Sixb] OIDC identity cannot auto-link to user '${user.id}' for project '${projectId}'.`);
2470
- }
2471
2459
  if (user?.status === "suspended") {
2472
2460
  this.consumeOidcAttempt(input, completedAt, projectId);
2473
2461
  throw new AuthStorageError2("suspended_user", `[Sixb] User '${user.id}' is suspended for project '${projectId}'.`);
2474
2462
  }
2475
- if (shouldCreateUser && !input.emailVerified) {
2476
- this.consumeOidcAttempt(input, completedAt, projectId);
2477
- throw new AuthStorageError2("user_creation_not_allowed", `[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`);
2478
- }
2479
2463
  if (shouldCreateUser && !activeInvitation && !input.allowUserCreationWithoutInvitation) {
2480
2464
  this.consumeOidcAttempt(input, completedAt, projectId);
2481
2465
  throw new AuthStorageError2("user_creation_not_allowed", `[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`);
2482
2466
  }
2483
- if (shouldCreateUser && !activeInvitation && input.allowUserCreationWithoutInvitation && input.requireNoActiveUsersForUserCreation && hasActiveUsers(this.state, projectId)) {
2484
- this.consumeOidcAttempt(input, completedAt, projectId);
2485
- throw new AuthStorageError2("user_creation_not_allowed", `[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`);
2486
- }
2487
2467
  validateCompleteSessionInput(this.state, projectId, input.session);
2488
2468
  assertSignInSessionAudience(projectId, input.session.audience, attempt.audience);
2489
2469
  let newUserId;
@@ -2513,12 +2493,19 @@ class InMemoryAuthStorage2 {
2513
2493
  projectId,
2514
2494
  user
2515
2495
  });
2516
- const memberships = this.applyManualGroups({
2496
+ const memberships = this.syncDirectoryGroups({
2517
2497
  completedAt,
2518
- groupIds: manualGroupIds,
2498
+ groupIds: input.directoryGroupIds,
2519
2499
  projectId,
2520
2500
  userId: user.id,
2521
- existing: invitation.memberships
2501
+ existing: this.applyGroups({
2502
+ completedAt,
2503
+ source: "manual",
2504
+ groupIds: manualGroupIds,
2505
+ projectId,
2506
+ userId: user.id,
2507
+ existing: invitation.memberships
2508
+ })
2522
2509
  });
2523
2510
  const nextIdentity = {
2524
2511
  projectId,
@@ -2579,19 +2566,30 @@ class InMemoryAuthStorage2 {
2579
2566
  }));
2580
2567
  return { invitation, memberships };
2581
2568
  }
2582
- applyManualGroups(input) {
2569
+ applyGroups(input) {
2583
2570
  const memberships = [...input.existing];
2584
2571
  for (const groupId of input.groupIds) {
2585
2572
  memberships.push(upsertGroupMembershipRecord(this.state, {
2586
2573
  projectId: input.projectId,
2587
2574
  userId: input.userId,
2588
2575
  groupId,
2589
- source: "manual",
2576
+ source: input.source,
2590
2577
  createdAt: input.completedAt
2591
2578
  }));
2592
2579
  }
2593
2580
  return memberships;
2594
2581
  }
2582
+ syncDirectoryGroups(input) {
2583
+ if (!input.groupIds) {
2584
+ return input.existing;
2585
+ }
2586
+ const groupIds = normalizeGroupIds(input.groupIds);
2587
+ const stale = [...this.state.groupMemberships.values()].filter((membership) => membership.projectId === input.projectId && membership.userId === input.userId && membership.source === "directory" && !groupIds.includes(membership.groupId));
2588
+ for (const membership of stale) {
2589
+ removeGroupMembershipRecord(this.state, membership);
2590
+ }
2591
+ return this.applyGroups({ ...input, groupIds, source: "directory" });
2592
+ }
2595
2593
  createSignInSession(input) {
2596
2594
  return createSessionRecord(this.state, {
2597
2595
  id: input.session.id,
@@ -2622,14 +2620,6 @@ function restoreMap(target, snapshot) {
2622
2620
  target.set(key, value);
2623
2621
  }
2624
2622
  }
2625
- function hasActiveUsers(state, projectId) {
2626
- for (const user of state.users.values()) {
2627
- if (user.projectId === projectId && user.status === "active") {
2628
- return true;
2629
- }
2630
- }
2631
- return false;
2632
- }
2633
2623
  function assertSignInSessionAudience(projectId, sessionAudience, storedAudience) {
2634
2624
  if (sessionAudience === storedAudience) {
2635
2625
  return;
@@ -3298,7 +3288,7 @@ class AuthRuntime2 {
3298
3288
  const result = await storage.users.list({ projectId: this.projectId, order: input.order });
3299
3289
  const members = [];
3300
3290
  for (const user of result.users) {
3301
- const groupIds = (await storage.groupMemberships.listForUser({ projectId: this.projectId, userId: user.id })).map((membership) => membership.groupId);
3291
+ const { groupIds, managedGroupIds } = memberGroups(await storage.groupMemberships.listForUser({ projectId: this.projectId, userId: user.id }));
3302
3292
  const canAssignGroups = canPerformMembershipOperation(scope, "assignGroups", groupIds);
3303
3293
  const canSuspendScope = canPerformMembershipOperation(scope, "suspend", groupIds);
3304
3294
  if (!canAssignGroups && !canSuspendScope) {
@@ -3308,6 +3298,7 @@ class AuthRuntime2 {
3308
3298
  members.push({
3309
3299
  user,
3310
3300
  groupIds,
3301
+ managedGroupIds,
3311
3302
  capabilities: {
3312
3303
  assignGroups: canAssignGroups,
3313
3304
  suspend: canSuspendScope && !isSelf && user.status === "active",
@@ -3322,7 +3313,11 @@ class AuthRuntime2 {
3322
3313
  const storage = this.requireAuthStorage();
3323
3314
  const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds);
3324
3315
  const userId = assertNonEmpty3(input.userId, "User id");
3325
- const { user, groupIds: currentGroupIds } = await this.requireManageableMember(storage, scope, "assignGroups", userId);
3316
+ const {
3317
+ user,
3318
+ groupIds: currentGroupIds,
3319
+ managedGroupIds: currentManagedGroupIds
3320
+ } = await this.requireManageableMember(storage, scope, "assignGroups", userId);
3326
3321
  const requestedGroupIds = this.resolveMemberGroupIds(input.groupIds);
3327
3322
  const missing = missingMembershipGroupIds(scope, "assignGroups", requestedGroupIds);
3328
3323
  if (missing.length > 0) {
@@ -3332,6 +3327,10 @@ class AuthRuntime2 {
3332
3327
  const requested = new Set(requestedGroupIds);
3333
3328
  const additions = requestedGroupIds.filter((groupId) => !current.has(groupId));
3334
3329
  const removals = currentGroupIds.filter((groupId) => !requested.has(groupId));
3330
+ const managedRemovals = removals.filter((groupId) => currentManagedGroupIds.includes(groupId));
3331
+ if (managedRemovals.length > 0) {
3332
+ throw new AuthRuntimeError2("invalid_auth_input", `[Sixb] Group(s) ${managedRemovals.join(", ")} are managed by the identity provider. Change them there; they sync at the user's next sign-in.`);
3333
+ }
3335
3334
  if (user.id === caller.user.id && removals.length > 0) {
3336
3335
  throw new AuthRuntimeError2("authorization_denied", "[Sixb] The current user cannot remove their own groups.");
3337
3336
  }
@@ -3353,14 +3352,14 @@ class AuthRuntime2 {
3353
3352
  });
3354
3353
  }
3355
3354
  this.sessionCache?.invalidateUser(user.id);
3356
- const groupIds = (await storage.groupMemberships.listForUser({ projectId: this.projectId, userId: user.id })).map((membership) => membership.groupId);
3357
- return { user, groupIds };
3355
+ const { groupIds, managedGroupIds } = memberGroups(await storage.groupMemberships.listForUser({ projectId: this.projectId, userId: user.id }));
3356
+ return { user, groupIds, managedGroupIds };
3358
3357
  }
3359
3358
  async suspendMember(caller, input) {
3360
3359
  const storage = this.requireAuthStorage();
3361
3360
  const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds);
3362
3361
  const userId = assertNonEmpty3(input.userId, "User id");
3363
- const { user, groupIds } = await this.requireManageableMember(storage, scope, "suspend", userId);
3362
+ const { user, groupIds, managedGroupIds } = await this.requireManageableMember(storage, scope, "suspend", userId);
3364
3363
  if (user.id === caller.user.id) {
3365
3364
  throw new AuthRuntimeError2("authorization_denied", "[Sixb] The current user cannot suspend themselves.");
3366
3365
  }
@@ -3370,20 +3369,20 @@ class AuthRuntime2 {
3370
3369
  suspendedAt: new Date
3371
3370
  });
3372
3371
  this.sessionCache?.invalidateUser(user.id);
3373
- return { user: suspended, groupIds };
3372
+ return { user: suspended, groupIds, managedGroupIds };
3374
3373
  }
3375
3374
  async reactivateMember(caller, input) {
3376
3375
  const storage = this.requireAuthStorage();
3377
3376
  const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds);
3378
3377
  const userId = assertNonEmpty3(input.userId, "User id");
3379
- const { user, groupIds } = await this.requireManageableMember(storage, scope, "suspend", userId);
3378
+ const { user, groupIds, managedGroupIds } = await this.requireManageableMember(storage, scope, "suspend", userId);
3380
3379
  const reactivated = await storage.users.updateStatus({
3381
3380
  projectId: this.projectId,
3382
3381
  id: user.id,
3383
3382
  status: "active",
3384
3383
  updatedAt: new Date
3385
3384
  });
3386
- return { user: reactivated, groupIds };
3385
+ return { user: reactivated, groupIds, managedGroupIds };
3387
3386
  }
3388
3387
  async listSessions(caller) {
3389
3388
  return this.requireAuthStorage().sessions.listActiveByUserId({
@@ -3426,11 +3425,11 @@ class AuthRuntime2 {
3426
3425
  }
3427
3426
  async requireManageableMember(storage, scope, operation, userId) {
3428
3427
  const user = await storage.users.getById({ projectId: this.projectId, id: userId });
3429
- const groupIds = user ? (await storage.groupMemberships.listForUser({ projectId: this.projectId, userId })).map((membership) => membership.groupId) : [];
3428
+ const { groupIds, managedGroupIds } = memberGroups(user ? await storage.groupMemberships.listForUser({ projectId: this.projectId, userId }) : []);
3430
3429
  if (!user || !canPerformMembershipOperation(scope, operation, groupIds)) {
3431
3430
  throw new AuthStorageError2("missing_user", `[Sixb] User '${userId}' not found for project '${this.projectId}'.`);
3432
3431
  }
3433
- return { user, groupIds };
3432
+ return { user, groupIds, managedGroupIds };
3434
3433
  }
3435
3434
  resolveMemberGroupIds(input) {
3436
3435
  const groupIds = [...new Set(input.map((groupId) => assertNonEmpty3(groupId, "Group id")))];
@@ -3617,6 +3616,12 @@ class AuthRuntime2 {
3617
3616
  throw new AuthRuntimeError2("authorization_denied", `[Sixb] The current user is not allowed to create or manage invitations for group(s): ${missing.join(", ")}.`);
3618
3617
  }
3619
3618
  }
3619
+ function memberGroups(memberships) {
3620
+ return {
3621
+ groupIds: memberships.map((membership) => membership.groupId),
3622
+ managedGroupIds: memberships.filter((membership) => membership.source === "directory").map((membership) => membership.groupId)
3623
+ };
3624
+ }
3620
3625
  function callerSessionId(caller) {
3621
3626
  return caller.credentialSource === "session" ? caller.session.id : undefined;
3622
3627
  }
@@ -3696,4 +3701,4 @@ function principalsEqual2(left, right) {
3696
3701
  }
3697
3702
  export { ActionDefinitionError2, ActionEditCommitError2, missingActionMutationMessage, effectsWithoutEditsMessage, assertNonEmpty2, isActionDefinition2, isGlobalActionDefinition2, isObjectActionDefinition2, normalizeActionParams, coerceActionParamsToTyped2, validateActionSubject, resolveObjectActionSubject, PERSONAL_ACCESS_TOKEN_PREFIX2, SERVICE_ACCOUNT_ACCESS_TOKEN_PREFIX2, generateAccessTokenSecret2, hashAccessTokenSecret2, formatAccessTokenValue2, parseAccessTokenValue2, getBearerAccessTokenValue2, createAccessTokenCredential2, setRequestClientAddress2, getRequestClientAddress2, CSRF_HEADER_NAME2, generateCsrfToken2, isCsrfExemptMethod2, verifyDoubleSubmitCsrf2, verifyCsrfToken2, applications2, SecurityValidationError2, isGroupDefinition, isMembershipPolicyDefinition, isRoleDefinition, defineGroup2, defineRole2, defineMembershipPolicy2, every2, ShareDefinitionError2, defineShare2, isShareDefinition, snapshotShareDefinition, can2, SecurityRegistry, AuthStorageError2, MAX_PENDING_DEVICE_AUTHORIZATIONS2, paginate, InMemoryAuthStorage2, generateSessionSecret2, hashSessionSecret2, formatSessionCookieValue2, parseSessionCookieValue2, createSessionCredential2, AuthRuntime2, SYSTEM_PRINCIPAL2, principalsEqual2 };
3698
3703
 
3699
- //# debugId=934CBDB22AF498A264756E2164756E21
3704
+ //# debugId=73464FD9FDE5971364756E2164756E21